// // Created by Sebastian Ebert // #include <moveit/move_group_interface/move_group_interface.h> #include <moveit_msgs/CollisionObject.h> #include <moveit_visual_tools/moveit_visual_tools.h> class SafetyEnvironmentCreator { private: double safety_zone_width; double safety_zone_height; double safety_zone_depth; public: // ctor SafetyEnvironmentCreator(double zone_width, double zone_height, double zone_depth) { safety_zone_width = zone_width; safety_zone_height = zone_height; safety_zone_depth = zone_depth; } double getZoneWidth() { return safety_zone_width; } double getZoneHeight() { return safety_zone_height; } double getZoneDepth() { return safety_zone_depth; } std::vector<moveit_msgs::CollisionObject> createCentralizedSafetyEnvironment(moveit::planning_interface::MoveGroupInterface &move_group) { std::vector<moveit_msgs::CollisionObject> collision_objects; // OBJECT 1 ( left box / -y ) // ^^^^^^^^ // Define a collision object ROS message. moveit_msgs::CollisionObject collision_object; collision_object.header.frame_id = move_group.getPlanningFrame(); // The id of the object is used to identify it. collision_object.id = "box1"; // Define a box to add to the world. shape_msgs::SolidPrimitive primitive; primitive.type = primitive.BOX; primitive.dimensions.resize(3); primitive.dimensions[0] = getZoneDepth() + 0.2; // x primitive.dimensions[1] = 0.1; // y primitive.dimensions[2] = getZoneHeight(); // z // Define a pose for the box (specified relative to frame_id) geometry_msgs::Pose box_pose; box_pose.orientation.w = 1.0; box_pose.position.x = 0.0; box_pose.position.y = -1 * ((getZoneWidth() / 2) + 0.05); box_pose.position.z = primitive.dimensions[2] / 2; collision_object.primitives.push_back(primitive); collision_object.primitive_poses.push_back(box_pose); collision_object.operation = collision_object.ADD; collision_objects.push_back(collision_object); // OBJECT 2 right box / +y ) // ^^^^^^^^ moveit_msgs::CollisionObject collision_object_2; collision_object_2.header.frame_id = move_group.getPlanningFrame(); // The id of the object is used to identify it. collision_object_2.id = "box2"; // Define a box to add to the world. shape_msgs::SolidPrimitive primitive_2; primitive_2.type = primitive.BOX; primitive_2.dimensions.resize(3); primitive_2.dimensions[0] = getZoneDepth() + 0.2; primitive_2.dimensions[1] = 0.1; primitive_2.dimensions[2] = getZoneHeight(); // Define a pose for the box (specified relative to frame_id) geometry_msgs::Pose box_pose_2; box_pose_2.orientation.w = 1.0; box_pose_2.position.x = 0.0; box_pose_2.position.y = ((getZoneWidth() / 2) + 0.05); box_pose_2.position.z = primitive_2.dimensions[2] / 2; collision_object_2.primitives.push_back(primitive_2); collision_object_2.primitive_poses.push_back(box_pose_2); collision_object_2.operation = collision_object_2.ADD; collision_objects.push_back(collision_object_2); // OBJECT 3 (front box / +x) // ^^^^^^^^ moveit_msgs::CollisionObject collision_object_3; collision_object_3.header.frame_id = move_group.getPlanningFrame(); // The id of the object is used to identify it. collision_object_3.id = "box3"; // Define a box to add to the world. shape_msgs::SolidPrimitive primitive_3; primitive_3.type = primitive.BOX; primitive_3.dimensions.resize(3); primitive_3.dimensions[0] = 0.1; primitive_3.dimensions[1] = getZoneWidth() + 0.2; primitive_3.dimensions[2] = getZoneHeight(); // Define a pose for the box (specified relative to frame_id) geometry_msgs::Pose box_pose_3; box_pose_3.orientation.w = 1.0; box_pose_3.position.x = ((getZoneDepth() / 2) + 0.05); box_pose_3.position.y = 0.0; box_pose_3.position.z = primitive_3.dimensions[2] / 2; collision_object_3.primitives.push_back(primitive_3); collision_object_3.primitive_poses.push_back(box_pose_3); collision_object_3.operation = collision_object_3.ADD; collision_objects.push_back(collision_object_3); // OBJECT 4 (back box / -x) // ^^^^^^^^ moveit_msgs::CollisionObject collision_object_4; collision_object_4.header.frame_id = move_group.getPlanningFrame(); // The id of the object is used to identify it. collision_object_4.id = "box4"; // Define a box to add to the world. shape_msgs::SolidPrimitive primitive_4; primitive_4.type = primitive.BOX; primitive_4.dimensions.resize(3); primitive_4.dimensions[0] = 0.1; primitive_4.dimensions[1] = getZoneWidth() + 0.2; primitive_4.dimensions[2] = getZoneHeight(); // Define a pose for the box (specified relative to frame_id) geometry_msgs::Pose box_pose_4; box_pose_4.orientation.w = 1.0; box_pose_4.position.x = -1 * ((getZoneDepth() / 2) + 0.05); box_pose_4.position.y = 0.0; box_pose_4.position.z = primitive_4.dimensions[2] / 2; collision_object_4.primitives.push_back(primitive_4); collision_object_4.primitive_poses.push_back(box_pose_4); collision_object_4.operation = collision_object_4.ADD; collision_objects.push_back(collision_object_4); // OBJECT 5 (floor / -z) // ^^^^^^^^ moveit_msgs::CollisionObject collision_object_5; collision_object_5.header.frame_id = move_group.getPlanningFrame(); // The id of the object is used to identify it. collision_object_5.id = "box5"; // Define a box to add to the world. shape_msgs::SolidPrimitive primitive_5; primitive_5.type = primitive.BOX; primitive_5.dimensions.resize(3); primitive_5.dimensions[0] = getZoneDepth() + 0.2; primitive_5.dimensions[1] = getZoneWidth() + 0.2; primitive_5.dimensions[2] = 0.1; // Define a pose for the box (specified relative to frame_id) geometry_msgs::Pose box_pose_5; box_pose_5.orientation.w = 1.0; box_pose_5.position.x = 0.0; box_pose_5.position.y = 0.0; box_pose_5.position.z = -0.05; collision_object_5.primitives.push_back(primitive_5); collision_object_5.primitive_poses.push_back(box_pose_5); collision_object_5.operation = collision_object_5.ADD; collision_objects.push_back(collision_object_5); // OBJECT 5 (floor / -z) // ^^^^^^^^ moveit_msgs::CollisionObject collision_object_6; collision_object_6.header.frame_id = move_group.getPlanningFrame(); // The id of the object is used to identify it. collision_object_6.id = "box5"; // Define a box to add to the world. shape_msgs::SolidPrimitive primitive_6; primitive_6.type = primitive.BOX; primitive_6.dimensions.resize(3); primitive_6.dimensions[0] = getZoneDepth() + 0.2; primitive_6.dimensions[1] = getZoneWidth() + 0.2; primitive_6.dimensions[2] = 0.1; // Define a pose for the box (specified relative to frame_id) geometry_msgs::Pose box_pose_6; box_pose_6.orientation.w = 1.0; box_pose_6.position.x = 0.0; box_pose_6.position.y = 0.0; box_pose_6.position.z = getZoneHeight() + 0.05; collision_object_6.primitives.push_back(primitive_6); collision_object_6.primitive_poses.push_back(box_pose_6); collision_object_6.operation = collision_object_6.ADD; collision_objects.push_back(collision_object_6); return collision_objects; } };