39 #include <moveit_msgs/GetPlanningScene.h>
40 #include <moveit_msgs/ApplyPlanningScene.h>
49 static const std::string
LOGNAME =
"planning_scene_interface";
51 class PlanningSceneInterface::PlanningSceneInterfaceImpl
73 moveit_msgs::GetPlanningScene::Request request;
74 moveit_msgs::GetPlanningScene::Response
response;
75 std::vector<std::string> result;
76 request.components.components = request.components.WORLD_OBJECT_NAMES;
82 for (
const moveit_msgs::CollisionObject& collision_object :
response.scene.world.collision_objects)
83 if (!collision_object.type.key.empty())
84 result.push_back(collision_object.id);
88 for (
const moveit_msgs::CollisionObject& collision_object :
response.scene.world.collision_objects)
89 result.push_back(collision_object.id);
95 double maxz,
bool with_type, std::vector<std::string>& types)
97 moveit_msgs::GetPlanningScene::Request request;
98 moveit_msgs::GetPlanningScene::Response
response;
99 std::vector<std::string> result;
100 request.components.components = request.components.WORLD_OBJECT_GEOMETRY;
108 for (
const moveit_msgs::CollisionObject& collision_object :
response.scene.world.collision_objects)
110 if (with_type && collision_object.type.key.empty())
112 if (collision_object.mesh_poses.empty() && collision_object.primitive_poses.empty())
116 geometry_msgs::Pose pose_tf;
117 geometry_msgs::TransformStamped
tf;
118 tf.header = collision_object.header;
119 tf.transform.translation.x = collision_object.pose.position.x;
120 tf.transform.translation.y = collision_object.pose.position.y;
121 tf.transform.translation.z = collision_object.pose.position.z;
122 tf.transform.rotation.x = collision_object.pose.orientation.x;
123 tf.transform.rotation.y = collision_object.pose.orientation.y;
124 tf.transform.rotation.z = collision_object.pose.orientation.z;
125 tf.transform.rotation.w = collision_object.pose.orientation.w;
128 for (
const geometry_msgs::Pose& mesh_pose : collision_object.mesh_poses)
131 if (!(pose_tf.position.x >= minx && pose_tf.position.x <= maxx && pose_tf.position.y >= miny &&
132 pose_tf.position.y <= maxy && pose_tf.position.z >= minz && pose_tf.position.z <= maxz))
138 for (
const geometry_msgs::Pose& primitive_pose : collision_object.primitive_poses)
141 if (!(pose_tf.position.x >= minx && pose_tf.position.x <= maxx && pose_tf.position.y >= miny &&
142 pose_tf.position.y <= maxy && pose_tf.position.z >= minz && pose_tf.position.z <= maxz))
150 result.push_back(collision_object.id);
152 types.push_back(collision_object.type.key);
158 std::map<std::string, geometry_msgs::Pose>
getObjectPoses(
const std::vector<std::string>& object_ids)
160 moveit_msgs::GetPlanningScene::Request request;
161 moveit_msgs::GetPlanningScene::Response
response;
162 std::map<std::string, geometry_msgs::Pose> result;
163 request.components.components = request.components.WORLD_OBJECT_GEOMETRY;
171 for (
const moveit_msgs::CollisionObject& collision_object :
response.scene.world.collision_objects)
173 if (std::find(object_ids.begin(), object_ids.end(), collision_object.id) != object_ids.end())
175 result[collision_object.id] = collision_object.pose;
181 std::map<std::string, moveit_msgs::CollisionObject>
getObjects(
const std::vector<std::string>& object_ids)
183 moveit_msgs::GetPlanningScene::Request request;
184 moveit_msgs::GetPlanningScene::Response
response;
185 std::map<std::string, moveit_msgs::CollisionObject> result;
186 request.components.components = request.components.WORLD_OBJECT_GEOMETRY;
194 for (
const moveit_msgs::CollisionObject& collision_object :
response.scene.world.collision_objects)
196 if (object_ids.empty() || std::find(object_ids.begin(), object_ids.end(), collision_object.id) != object_ids.end())
198 result[collision_object.id] = collision_object;
204 std::map<std::string, moveit_msgs::AttachedCollisionObject>
207 moveit_msgs::GetPlanningScene::Request request;
208 moveit_msgs::GetPlanningScene::Response
response;
209 std::map<std::string, moveit_msgs::AttachedCollisionObject> result;
210 request.components.components = request.components.ROBOT_STATE_ATTACHED_OBJECTS;
218 for (
const moveit_msgs::AttachedCollisionObject& attached_collision_object :
219 response.scene.robot_state.attached_collision_objects)
221 if (object_ids.empty() ||
222 std::find(object_ids.begin(), object_ids.end(), attached_collision_object.object.id) != object_ids.end())
224 result[attached_collision_object.object.id] = attached_collision_object;
232 moveit_msgs::GetPlanningScene::Request request;
233 moveit_msgs::GetPlanningScene::Response
response;
234 request.components.components = components;
239 return moveit_msgs::PlanningScene();
246 moveit_msgs::ApplyPlanningScene::Request request;
247 moveit_msgs::ApplyPlanningScene::Response
response;
258 void addCollisionObjects(
const std::vector<moveit_msgs::CollisionObject>& collision_objects,
259 const std::vector<moveit_msgs::ObjectColor>& object_colors)
const
267 if (
planning_scene.object_colors[i].id.empty() && i < collision_objects.size())
280 moveit_msgs::CollisionObject object;
281 for (
const std::string& object_id : object_ids)
283 object.id = object_id;
284 object.operation =
object.REMOVE;
293 moveit_msgs::PlanningScene clear_scene;
294 clear_scene.is_diff =
true;
295 clear_scene.robot_state.is_diff =
true;
296 clear_scene.robot_state.attached_collision_objects.resize(1);
297 clear_scene.robot_state.attached_collision_objects[0].object.operation = moveit_msgs::CollisionObject::REMOVE;
298 clear_scene.world.collision_objects.resize(1);
299 clear_scene.world.collision_objects[0].operation = moveit_msgs::CollisionObject::REMOVE;
334 throw std::runtime_error(
"ROS service not available");
357 throw std::runtime_error(
"ROS service not available");
363 moveit_msgs::GetPlanningScene::Response& response)
372 moveit_msgs::ApplyPlanningScene::Response& response)
406 double maxx,
double maxy,
double maxz,
408 std::vector<std::string>& types)
413 std::map<std::string, geometry_msgs::Pose>
419 std::map<std::string, moveit_msgs::CollisionObject>
425 std::map<std::string, moveit_msgs::AttachedCollisionObject>
433 moveit_msgs::PlanningScene ps;
434 ps.robot_state.is_diff =
true;
436 ps.world.collision_objects.reserve(1);
437 ps.world.collision_objects.push_back(collision_object);
442 const std_msgs::ColorRGBA& object_color)
444 moveit_msgs::PlanningScene ps;
445 ps.robot_state.is_diff =
true;
447 ps.world.collision_objects.reserve(1);
448 ps.world.collision_objects.push_back(collision_object);
449 moveit_msgs::ObjectColor oc;
450 oc.id = collision_object.id;
451 oc.color = object_color;
452 ps.object_colors.push_back(oc);
457 const std::vector<moveit_msgs::ObjectColor>& object_colors)
459 moveit_msgs::PlanningScene ps;
460 ps.robot_state.is_diff =
true;
462 ps.world.collision_objects = collision_objects;
463 ps.object_colors = object_colors;
465 for (
size_t i = 0; i < ps.object_colors.size(); ++i)
467 if (ps.object_colors[i].id.empty() && i < collision_objects.size())
468 ps.object_colors[i].id = collision_objects[i].id;
478 moveit_msgs::PlanningScene ps;
479 ps.robot_state.is_diff =
true;
481 ps.robot_state.attached_collision_objects.reserve(1);
482 ps.robot_state.attached_collision_objects.push_back(collision_object);
487 const std::vector<moveit_msgs::AttachedCollisionObject>& collision_objects)
489 moveit_msgs::PlanningScene ps;
490 ps.robot_state.is_diff =
true;
492 ps.robot_state.attached_collision_objects = collision_objects;
507 const std::vector<moveit_msgs::ObjectColor>& object_colors)
const