@@ -1857,6 +1857,7 @@ bool PlanningScene::processCollisionObjectMove(const moveit_msgs::msg::Collision
1857
1857
{
1858
1858
if (world_->hasObject (object.id ))
1859
1859
{
1860
+ // update object pose
1860
1861
if (!object.primitives .empty () || !object.meshes .empty () || !object.planes .empty ())
1861
1862
{
1862
1863
RCLCPP_WARN (getLogger (), " Move operation for object '%s' ignores the geometry specified in the message." ,
@@ -1870,6 +1871,45 @@ bool PlanningScene::processCollisionObjectMove(const moveit_msgs::msg::Collision
1870
1871
1871
1872
const Eigen::Isometry3d object_frame_transform = world_to_object_header_transform * header_to_pose_transform;
1872
1873
world_->setObjectPose (object.id , object_frame_transform);
1874
+
1875
+ // update shape poses
1876
+ if (!object.primitive_poses .empty () || !object.mesh_poses .empty () || !object.plane_poses .empty ())
1877
+ {
1878
+ auto world_object = world_->getObject (object.id ); // object exists, checked earlier
1879
+
1880
+ std::size_t shape_size = object.primitive_poses .size () + object.mesh_poses .size () + object.plane_poses .size ();
1881
+ if (shape_size != world_object->shape_poses_ .size ())
1882
+ {
1883
+ ROS_ERROR_NAMED (LOGNAME, " Move operation for object '%s' must have same number of geometry poses. Cannot move." ,
1884
+ object.id .c_str ());
1885
+ return false ;
1886
+ }
1887
+
1888
+ // order matters -> primitive, mesh and plane
1889
+ EigenSTL::vector_Isometry3d shape_poses;
1890
+ for (const auto & shape_pose : object.primitive_poses )
1891
+ {
1892
+ shape_poses.emplace_back ();
1893
+ PlanningScene::poseMsgToEigen (shape_pose, shape_poses.back ());
1894
+ }
1895
+ for (const auto & shape_pose : object.mesh_poses )
1896
+ {
1897
+ shape_poses.emplace_back ();
1898
+ PlanningScene::poseMsgToEigen (shape_pose, shape_poses.back ());
1899
+ }
1900
+ for (const auto & shape_pose : object.plane_poses )
1901
+ {
1902
+ shape_poses.emplace_back ();
1903
+ PlanningScene::poseMsgToEigen (shape_pose, shape_poses.back ());
1904
+ }
1905
+
1906
+ if (!world_->moveShapesInObject (object.id , shape_poses))
1907
+ {
1908
+ ROS_ERROR_NAMED (LOGNAME, " Move operation for object '%s' internal world error. Cannot move." , object.id .c_str ());
1909
+ return false ;
1910
+ }
1911
+ }
1912
+
1873
1913
return true ;
1874
1914
}
1875
1915
0 commit comments