Skip to content

Commit 1039a9e

Browse files
captain-yoshisjahr
authored andcommitted
Allow moving of all shapes of an object in one go (#3599)
1 parent 35fd7c6 commit 1039a9e

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

moveit_core/collision_detection/include/moveit/collision_detection/world.h

+3
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,9 @@ class World
217217
bool moveShapeInObject(const std::string& object_id, const shapes::ShapeConstPtr& shape,
218218
const Eigen::Isometry3d& shape_pose);
219219

220+
/** \brief Update the pose of all shapes in an object. Shape size is verified. Returns true on success. */
221+
bool moveShapesInObject(const std::string& object_id, const EigenSTL::vector_Isometry3d& shape_poses);
222+
220223
/** \brief Move the object pose (thus moving all shapes and subframes in the object)
221224
* according to the given transform specified in world frame.
222225
* The transform is relative to and changes the object pose. It does not replace it.

moveit_core/collision_detection/src/world.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,26 @@ bool World::moveShapeInObject(const std::string& object_id, const shapes::ShapeC
259259
return false;
260260
}
261261

262+
bool World::moveShapesInObject(const std::string& object_id, const EigenSTL::vector_Isometry3d& shape_poses)
263+
{
264+
auto it = objects_.find(object_id);
265+
if (it != objects_.end())
266+
{
267+
if (shape_poses.size() == it->second->shapes_.size())
268+
{
269+
for (std::size_t i = 0; i < shape_poses.size(); ++i)
270+
{
271+
ASSERT_ISOMETRY(shape_poses[i]) // unsanitized input, could contain a non-isometry
272+
it->second->shape_poses_[i] = shape_poses[i];
273+
it->second->global_shape_poses_[i] = it->second->pose_ * shape_poses[i];
274+
}
275+
notify(it->second, MOVE_SHAPE);
276+
return true;
277+
}
278+
}
279+
return false;
280+
}
281+
262282
bool World::moveObject(const std::string& object_id, const Eigen::Isometry3d& transform)
263283
{
264284
const auto it = objects_.find(object_id);

moveit_core/planning_scene/src/planning_scene.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -1857,6 +1857,7 @@ bool PlanningScene::processCollisionObjectMove(const moveit_msgs::msg::Collision
18571857
{
18581858
if (world_->hasObject(object.id))
18591859
{
1860+
// update object pose
18601861
if (!object.primitives.empty() || !object.meshes.empty() || !object.planes.empty())
18611862
{
18621863
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
18701871

18711872
const Eigen::Isometry3d object_frame_transform = world_to_object_header_transform * header_to_pose_transform;
18721873
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+
18731913
return true;
18741914
}
18751915

0 commit comments

Comments
 (0)