Skip to content

Commit b3b215a

Browse files
authored
Add ability to add/remove objects to/from planning scene (#165)
1 parent 2d99017 commit b3b215a

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

core/include/moveit/task_constructor/stages/modify_planning_scene.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include <moveit/task_constructor/stage.h>
4242
#include <moveit/task_constructor/properties.h>
4343
#include <moveit/task_constructor/type_traits.h>
44+
#include <moveit_msgs/CollisionObject.h>
4445
#include <map>
4546

4647
namespace moveit {
@@ -77,6 +78,10 @@ class ModifyPlanningScene : public PropagatingEitherWay
7778

7879
/// attach or detach a list of objects to the given link
7980
void attachObjects(const Names& objects, const std::string& attach_link, bool attach);
81+
/// Add an object to the planning scene
82+
void addObject(const moveit_msgs::CollisionObject& collision_object);
83+
/// Remove an object from the planning scene
84+
void removeObject(const std::string& object_name);
8085

8186
/// conviency methods accepting a single object name
8287
inline void attachObject(const std::string& object, const std::string& link);
@@ -130,6 +135,8 @@ class ModifyPlanningScene : public PropagatingEitherWay
130135
protected:
131136
// list of objects to attach (true) / detach (false) to a given link
132137
std::map<std::string, std::pair<Names, bool>> attach_objects_;
138+
// list of objects to add / remove to the planning scene
139+
std::vector<moveit_msgs::CollisionObject> collision_objects_;
133140

134141
// list of objects to mutually
135142
struct CollisionMatrixPairs
@@ -144,6 +151,7 @@ class ModifyPlanningScene : public PropagatingEitherWay
144151
protected:
145152
// apply stored modifications to scene
146153
InterfaceState apply(const InterfaceState& from, bool invert);
154+
void processCollisionObject(planning_scene::PlanningScene& scene, const moveit_msgs::CollisionObject& object);
147155
void attachObjects(planning_scene::PlanningScene& scene, const std::pair<std::string, std::pair<Names, bool>>& pair,
148156
bool invert);
149157
void allowCollisions(planning_scene::PlanningScene& scene, const CollisionMatrixPairs& pairs, bool invert);

core/src/stages/modify_planning_scene.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,22 @@ void ModifyPlanningScene::attachObjects(const Names& objects, const std::string&
5252
o.insert(o.end(), objects.begin(), objects.end());
5353
}
5454

55+
void ModifyPlanningScene::addObject(const moveit_msgs::CollisionObject& collision_object) {
56+
if (collision_object.operation != moveit_msgs::CollisionObject::ADD) {
57+
ROS_ERROR_STREAM_NAMED("ModifyPlanningScene", name() << ": addObject is called with object's operation not set "
58+
"to ADD -- ignoring the object");
59+
return;
60+
}
61+
collision_objects_.push_back(collision_object);
62+
}
63+
64+
void ModifyPlanningScene::removeObject(const std::string& object_name) {
65+
moveit_msgs::CollisionObject obj;
66+
obj.id = object_name;
67+
obj.operation = moveit_msgs::CollisionObject::REMOVE;
68+
collision_objects_.push_back(obj);
69+
}
70+
5571
void ModifyPlanningScene::allowCollisions(const Names& first, const Names& second, bool allow) {
5672
collision_matrix_edits_.push_back(CollisionMatrixPairs({ first, second, allow }));
5773
}
@@ -102,6 +118,9 @@ void ModifyPlanningScene::allowCollisions(planning_scene::PlanningScene& scene,
102118
InterfaceState ModifyPlanningScene::apply(const InterfaceState& from, bool invert) {
103119
planning_scene::PlanningScenePtr scene = from.scene()->diff();
104120
InterfaceState result(scene);
121+
// add/remove objects
122+
for (const auto& collision_object : collision_objects_)
123+
processCollisionObject(*scene, collision_object);
105124

106125
// attach/detach objects
107126
for (const auto& pair : attach_objects_)
@@ -116,6 +135,11 @@ InterfaceState ModifyPlanningScene::apply(const InterfaceState& from, bool inver
116135

117136
return result;
118137
}
138+
139+
void ModifyPlanningScene::processCollisionObject(planning_scene::PlanningScene& scene,
140+
const moveit_msgs::CollisionObject& object) {
141+
scene.processCollisionObjectMsg(object);
142+
}
119143
}
120144
}
121145
}

0 commit comments

Comments
 (0)