|
38 | 38 | #include <moveit/move_group/capability_names.h>
|
39 | 39 | #include <moveit_msgs/GetPlanningScene.h>
|
40 | 40 | #include <ros/ros.h>
|
| 41 | +#include <algorithm> |
41 | 42 |
|
42 | 43 | namespace moveit
|
43 | 44 | {
|
@@ -140,29 +141,73 @@ class PlanningSceneInterface::PlanningSceneInterfaceImpl
|
140 | 141 | return result;
|
141 | 142 | }
|
142 | 143 |
|
143 |
| - for(std::size_t i=0; i < object_ids.size(); ++i) |
| 144 | + for (std::size_t i = 0; i < response.scene.world.collision_objects.size(); ++i) |
144 | 145 | {
|
145 |
| - for (std::size_t j=0; j < response.scene.world.collision_objects.size() ; ++j) |
| 146 | + if (std::find(object_ids.begin(), object_ids.end(), response.scene.world.collision_objects[i].id) != object_ids.end()) |
146 | 147 | {
|
147 |
| - if(response.scene.world.collision_objects[j].id == object_ids[i]) |
148 |
| - { |
149 |
| - if (response.scene.world.collision_objects[j].mesh_poses.empty() && |
150 |
| - response.scene.world.collision_objects[j].primitive_poses.empty()) |
151 |
| - continue; |
152 |
| - if(!response.scene.world.collision_objects[j].mesh_poses.empty()) |
153 |
| - result[response.scene.world.collision_objects[j].id] = response.scene.world.collision_objects[j].mesh_poses[0]; |
154 |
| - else |
155 |
| - result[response.scene.world.collision_objects[j].id] = response.scene.world.collision_objects[j].primitive_poses[0]; |
156 |
| - } |
| 148 | + if (response.scene.world.collision_objects[i].mesh_poses.empty() && |
| 149 | + response.scene.world.collision_objects[i].primitive_poses.empty()) |
| 150 | + continue; |
| 151 | + if(!response.scene.world.collision_objects[i].mesh_poses.empty()) |
| 152 | + result[response.scene.world.collision_objects[i].id] = response.scene.world.collision_objects[i].mesh_poses[0]; |
| 153 | + else |
| 154 | + result[response.scene.world.collision_objects[i].id] = response.scene.world.collision_objects[i].primitive_poses[0]; |
| 155 | + } |
| 156 | + } |
| 157 | + return result; |
| 158 | + } |
| 159 | + |
| 160 | + std::map<std::string, moveit_msgs::CollisionObject> getObjects(const std::vector<std::string> &object_ids) |
| 161 | + { |
| 162 | + moveit_msgs::GetPlanningScene::Request request; |
| 163 | + moveit_msgs::GetPlanningScene::Response response; |
| 164 | + std::map<std::string, moveit_msgs::CollisionObject> result; |
| 165 | + request.components.components = request.components.WORLD_OBJECT_GEOMETRY; |
| 166 | + if (!planning_scene_service_.call(request, response)) |
| 167 | + { |
| 168 | + ROS_WARN("Could not call planning scene service to get object geometries"); |
| 169 | + return result; |
| 170 | + } |
| 171 | + |
| 172 | + for (std::size_t i = 0; i < response.scene.world.collision_objects.size(); ++i) |
| 173 | + { |
| 174 | + if (object_ids.empty() || std::find(object_ids.begin(), object_ids.end(), response.scene.world.collision_objects[i].id) != object_ids.end()) |
| 175 | + { |
| 176 | + result[response.scene.world.collision_objects[i].id] = response.scene.world.collision_objects[i]; |
| 177 | + } |
| 178 | + } |
| 179 | + return result; |
| 180 | + } |
| 181 | + |
| 182 | + std::map<std::string, moveit_msgs::AttachedCollisionObject> getAttachedObjects(const std::vector<std::string> &object_ids) |
| 183 | + { |
| 184 | + moveit_msgs::GetPlanningScene::Request request; |
| 185 | + moveit_msgs::GetPlanningScene::Response response; |
| 186 | + std::map<std::string, moveit_msgs::AttachedCollisionObject> result; |
| 187 | + request.components.components = request.components.ROBOT_STATE_ATTACHED_OBJECTS; |
| 188 | + if (!planning_scene_service_.call(request, response)) |
| 189 | + { |
| 190 | + ROS_WARN("Could not call planning scene service to get attached object geometries"); |
| 191 | + return result; |
| 192 | + } |
| 193 | + |
| 194 | + for (std::size_t i = 0; i < response.scene.robot_state.attached_collision_objects.size(); ++i) |
| 195 | + { |
| 196 | + if (object_ids.empty() || |
| 197 | + std::find(object_ids.begin(), object_ids.end(), response.scene.robot_state.attached_collision_objects[i].object.id) != object_ids.end()) |
| 198 | + { |
| 199 | + result[response.scene.robot_state.attached_collision_objects[i].object.id] = response.scene.robot_state.attached_collision_objects[i]; |
157 | 200 | }
|
158 | 201 | }
|
159 | 202 | return result;
|
160 | 203 | }
|
161 | 204 |
|
162 |
| - void addCollisionObjects(const std::vector<moveit_msgs::CollisionObject> &collision_objects) const |
| 205 | + void addCollisionObjects(const std::vector<moveit_msgs::CollisionObject> &collision_objects, |
| 206 | + const std::vector<moveit_msgs::ObjectColor> &object_colors) const |
163 | 207 | {
|
164 | 208 | moveit_msgs::PlanningScene planning_scene;
|
165 | 209 | planning_scene.world.collision_objects = collision_objects;
|
| 210 | + planning_scene.object_colors = object_colors; |
166 | 211 | planning_scene.is_diff = true;
|
167 | 212 | planning_scene_diff_publisher_.publish(planning_scene);
|
168 | 213 | }
|
@@ -214,9 +259,20 @@ std::map<std::string, geometry_msgs::Pose> PlanningSceneInterface::getObjectPose
|
214 | 259 | return impl_->getObjectPoses(object_ids);
|
215 | 260 | }
|
216 | 261 |
|
217 |
| -void PlanningSceneInterface::addCollisionObjects(const std::vector<moveit_msgs::CollisionObject> &collision_objects) const |
| 262 | +std::map<std::string, moveit_msgs::CollisionObject> PlanningSceneInterface::getObjects(const std::vector<std::string> &object_ids) |
| 263 | +{ |
| 264 | + return impl_->getObjects(object_ids); |
| 265 | +} |
| 266 | + |
| 267 | +std::map<std::string, moveit_msgs::AttachedCollisionObject> PlanningSceneInterface::getAttachedObjects(const std::vector<std::string> &object_ids) |
| 268 | +{ |
| 269 | + return impl_->getAttachedObjects(object_ids); |
| 270 | +} |
| 271 | + |
| 272 | +void PlanningSceneInterface::addCollisionObjects(const std::vector<moveit_msgs::CollisionObject> &collision_objects, |
| 273 | + const std::vector<moveit_msgs::ObjectColor> &object_colors) const |
218 | 274 | {
|
219 |
| - return impl_->addCollisionObjects(collision_objects); |
| 275 | + return impl_->addCollisionObjects(collision_objects, object_colors); |
220 | 276 | }
|
221 | 277 |
|
222 | 278 | void PlanningSceneInterface::removeCollisionObjects(const std::vector<std::string> &object_ids) const
|
|
0 commit comments