49 #include <moveit_msgs/msg/planning_scene.hpp>
50 #include <moveit_msgs/msg/robot_trajectory.hpp>
51 #include <moveit_msgs/msg/constraints.hpp>
52 #include <moveit_msgs/msg/planning_scene_components.hpp>
53 #include <octomap_msgs/msg/octomap_with_pose.hpp>
58 #include <rclcpp/rclcpp.hpp>
60 #include <moveit_planning_scene_export.h>
84 using ObjectTypeMap = std::map<std::string, object_recognition_msgs::msg::ObjectType>;
89 class MOVEIT_PLANNING_SCENE_EXPORT
PlanningScene :
public std::enable_shared_from_this<PlanningScene>
103 PlanningScene(
const moveit::core::RobotModelConstPtr& robot_model,
104 const collision_detection::WorldPtr& world = std::make_shared<collision_detection::World>());
108 PlanningScene(
const urdf::ModelInterfaceSharedPtr& urdf_model,
const srdf::ModelConstSharedPtr& srdf_model,
109 const collision_detection::WorldPtr& world = std::make_shared<collision_detection::World>());
138 PlanningScenePtr diff()
const;
142 PlanningScenePtr diff(
const moveit_msgs::msg::PlanningScene& msg)
const;
161 return robot_state_ ? *robot_state_ : parent_->getCurrentState();
167 moveit::core::RobotStatePtr getCurrentStateUpdated(
const moveit_msgs::msg::RobotState&
update)
const;
178 return scene_transforms_ ? scene_transforms_->getTargetFrame() : parent_->getPlanningFrame();
184 if (scene_transforms_ || !parent_)
186 return *scene_transforms_;
190 return parent_->getTransforms();
232 bool knowsFrameTransform(
const std::string&
id)
const;
248 return collision_detector_ ? (collision_detector_->alloc_->getName()) :
"";
252 const collision_detection::WorldConstPtr&
getWorld()
const
268 return collision_detector_->getCollisionEnv();
274 return collision_detector_->getCollisionEnvUnpadded();
278 const collision_detection::CollisionEnvConstPtr& getCollisionEnv(
const std::string& collision_detector_name)
const;
282 const collision_detection::CollisionEnvConstPtr&
283 getCollisionEnvUnpadded(
const std::string& collision_detector_name)
const;
287 const collision_detection::CollisionEnvPtr& getCollisionEnvNonConst();
292 return acm_ ? *acm_ : parent_->getAllowedCollisionMatrix();
332 bool verbose =
false)
const;
337 bool verbose =
false)
const;
346 checkCollision(req, res, getCurrentState());
392 checkCollisionUnpadded(req, res, getCurrentState(), getAllowedCollisionMatrix());
401 checkCollisionUnpadded(req, res, robot_state, getAllowedCollisionMatrix());
412 getAllowedCollisionMatrix());
439 checkSelfCollision(req, res, getCurrentState());
447 checkSelfCollision(req, res,
static_cast<const moveit::core::RobotState&
>(robot_state), getAllowedCollisionMatrix());
455 getCollisionEnvUnpadded()->checkSelfCollision(req, res, robot_state, getAllowedCollisionMatrix());
475 getCollisionEnvUnpadded()->checkSelfCollision(req, res, robot_state, acm);
479 void getCollidingLinks(std::vector<std::string>& links);
484 getCollidingLinks(links, getCurrentState(), getAllowedCollisionMatrix());
498 getCollidingLinks(links, robot_state, getAllowedCollisionMatrix());
522 getCollidingPairs(contacts, getCurrentState(), getAllowedCollisionMatrix());
530 getCollidingPairs(contacts, robot_state, getAllowedCollisionMatrix(), group_name);
549 const std::string& group_name =
"")
const
560 const std::string& group_name =
"")
const;
583 return getCollisionEnv()->distanceRobot(robot_state, getAllowedCollisionMatrix());
598 return getCollisionEnvUnpadded()->distanceRobot(robot_state, getAllowedCollisionMatrix());
617 return getCollisionEnv()->distanceRobot(robot_state, acm);
636 return getCollisionEnvUnpadded()->distanceRobot(robot_state, acm);
642 void saveGeometryToStream(std::ostream& out)
const;
645 bool loadGeometryFromStream(std::istream& in);
648 bool loadGeometryFromStream(std::istream& in,
const Eigen::Isometry3d& offset);
654 void getPlanningSceneDiffMsg(moveit_msgs::msg::PlanningScene& scene)
const;
664 const moveit_msgs::msg::PlanningSceneComponents& comp)
const;
668 bool getCollisionObjectMsg(moveit_msgs::msg::CollisionObject& collision_obj,
const std::string& ns)
const;
672 void getCollisionObjectMsgs(std::vector<moveit_msgs::msg::CollisionObject>& collision_objs)
const;
676 bool getAttachedCollisionObjectMsg(moveit_msgs::msg::AttachedCollisionObject& attached_collision_obj,
677 const std::string& ns)
const;
682 getAttachedCollisionObjectMsgs(std::vector<moveit_msgs::msg::AttachedCollisionObject>& attached_collision_objs)
const;
685 bool getOctomapMsg(octomap_msgs::msg::OctomapWithPose&
octomap)
const;
688 void getObjectColorMsgs(std::vector<moveit_msgs::msg::ObjectColor>& object_colors)
const;
695 bool setPlanningSceneDiffMsg(
const moveit_msgs::msg::PlanningScene& scene);
699 bool setPlanningSceneMsg(
const moveit_msgs::msg::PlanningScene& scene);
703 bool usePlanningSceneMsg(
const moveit_msgs::msg::PlanningScene& scene);
709 bool shapesAndPosesFromCollisionObjectMessage(
const moveit_msgs::msg::CollisionObject&
object,
710 Eigen::Isometry3d& object_pose_in_header_frame,
711 std::vector<shapes::ShapeConstPtr>&
shapes,
712 EigenSTL::vector_Isometry3d& shape_poses);
714 bool processCollisionObjectMsg(
const moveit_msgs::msg::CollisionObject&
object);
715 bool processAttachedCollisionObjectMsg(
const moveit_msgs::msg::AttachedCollisionObject&
object);
717 bool processPlanningSceneWorldMsg(
const moveit_msgs::msg::PlanningSceneWorld& world);
719 void processOctomapMsg(
const octomap_msgs::msg::OctomapWithPose& map);
720 void processOctomapMsg(
const octomap_msgs::msg::Octomap& map);
721 void processOctomapPtr(
const std::shared_ptr<const octomap::OcTree>& octree,
const Eigen::Isometry3d& t);
726 void removeAllCollisionObjects();
731 void setCurrentState(
const moveit_msgs::msg::RobotState& state);
742 bool hasObjectColor(
const std::string&
id)
const;
744 const std_msgs::msg::ColorRGBA& getObjectColor(
const std::string&
id)
const;
745 void setObjectColor(
const std::string&
id,
const std_msgs::msg::ColorRGBA& color);
746 void removeObjectColor(
const std::string&
id);
749 bool hasObjectType(
const std::string&
id)
const;
751 const object_recognition_msgs::msg::ObjectType& getObjectType(
const std::string&
id)
const;
752 void setObjectType(
const std::string&
id,
const object_recognition_msgs::msg::ObjectType& type);
753 void removeObjectType(
const std::string&
id);
765 void pushDiffs(
const PlanningScenePtr& scene);
770 void decoupleParent();
777 state_feasibility_ = fn;
784 return state_feasibility_;
791 motion_feasibility_ = fn;
798 return motion_feasibility_;
803 bool isStateFeasible(
const moveit_msgs::msg::RobotState& state,
bool verbose =
false)
const;
810 bool isStateConstrained(
const moveit_msgs::msg::RobotState& state,
const moveit_msgs::msg::Constraints& constr,
811 bool verbose =
false)
const;
815 bool verbose =
false)
const;
818 bool isStateConstrained(
const moveit_msgs::msg::RobotState& state,
827 bool isStateValid(
const moveit_msgs::msg::RobotState& state,
const std::string&
group =
"",
828 bool verbose =
false)
const;
836 bool isStateValid(
const moveit_msgs::msg::RobotState& state,
const moveit_msgs::msg::Constraints& constr,
837 const std::string&
group =
"",
bool verbose =
false)
const;
842 const std::string&
group =
"",
bool verbose =
false)
const;
847 const std::string&
group =
"",
bool verbose =
false)
const;
851 bool isPathValid(
const moveit_msgs::msg::RobotState& start_state,
const moveit_msgs::msg::RobotTrajectory& trajectory,
852 const std::string&
group =
"",
bool verbose =
false,
853 std::vector<std::size_t>* invalid_index =
nullptr)
const;
858 bool isPathValid(
const moveit_msgs::msg::RobotState& start_state,
const moveit_msgs::msg::RobotTrajectory& trajectory,
859 const moveit_msgs::msg::Constraints& path_constraints,
const std::string&
group =
"",
860 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
865 bool isPathValid(
const moveit_msgs::msg::RobotState& start_state,
const moveit_msgs::msg::RobotTrajectory& trajectory,
866 const moveit_msgs::msg::Constraints& path_constraints,
867 const moveit_msgs::msg::Constraints& goal_constraints,
const std::string&
group =
"",
868 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
873 bool isPathValid(
const moveit_msgs::msg::RobotState& start_state,
const moveit_msgs::msg::RobotTrajectory& trajectory,
874 const moveit_msgs::msg::Constraints& path_constraints,
875 const std::vector<moveit_msgs::msg::Constraints>& goal_constraints,
const std::string&
group =
"",
876 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
882 const moveit_msgs::msg::Constraints& path_constraints,
883 const std::vector<moveit_msgs::msg::Constraints>& goal_constraints,
const std::string&
group =
"",
884 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
890 const moveit_msgs::msg::Constraints& path_constraints,
891 const moveit_msgs::msg::Constraints& goal_constraints,
const std::string&
group =
"",
892 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
897 const moveit_msgs::msg::Constraints& path_constraints,
const std::string&
group =
"",
898 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
903 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
908 std::set<collision_detection::CostSource>& costs,
double overlap_fraction = 0.9)
const;
913 const std::string& group_name, std::set<collision_detection::CostSource>& costs,
914 double overlap_fraction = 0.9)
const;
918 std::set<collision_detection::CostSource>& costs)
const;
923 std::set<collision_detection::CostSource>& costs)
const;
926 void printKnownObjects(std::ostream& out = std::cout)
const;
929 static PlanningScenePtr clone(
const PlanningSceneConstPtr& scene);
946 allocateCollisionDetector(allocator,
nullptr );
958 bool processCollisionObjectAdd(
const moveit_msgs::msg::CollisionObject&
object);
959 bool processCollisionObjectRemove(
const moveit_msgs::msg::CollisionObject&
object);
960 bool processCollisionObjectMove(
const moveit_msgs::msg::CollisionObject&
object);
965 void allocateCollisionDetector(
const collision_detection::CollisionDetectorAllocatorPtr& allocator,
966 const CollisionDetectorPtr& parent_detector);
971 collision_detection::CollisionDetectorAllocatorPtr alloc_;
972 collision_detection::CollisionEnvPtr cenv_;
973 collision_detection::CollisionEnvConstPtr cenv_const_;
975 collision_detection::CollisionEnvPtr cenv_unpadded_;
976 collision_detection::CollisionEnvConstPtr cenv_unpadded_const_;
978 const collision_detection::CollisionEnvConstPtr& getCollisionEnv()
const
982 const collision_detection::CollisionEnvConstPtr& getCollisionEnvUnpadded()
const
984 return cenv_unpadded_const_;
992 PlanningSceneConstPtr parent_;
994 moveit::core::RobotModelConstPtr robot_model_;
996 moveit::core::RobotStatePtr robot_state_;
1003 moveit::core::TransformsPtr scene_transforms_;
1005 collision_detection::WorldPtr world_;
1006 collision_detection::WorldConstPtr world_const_;
1007 collision_detection::WorldDiffPtr world_diff_;
1011 CollisionDetectorPtr collision_detector_;
1013 collision_detection::AllowedCollisionMatrixPtr acm_;
1018 std::unique_ptr<ObjectColorMap> object_colors_;
1021 std::unique_ptr<ObjectTypeMap> object_types_;
#define MOVEIT_STRUCT_FORWARD(C)
Definition of a structure for the allowed collision matrix. All elements in the collision world are r...
std::function< void(const ObjectConstPtr &, Action)> ObserverCallbackFn
A class that contains many different constraints, and can check RobotState *versus the full set....
Representation of a robot's state. This includes position, velocity, acceleration and effort.
void updateLinkTransforms()
Update the reference frame transforms for links. This call is needed before using the transforms of l...
void updateCollisionBodyTransforms()
Update the transforms for the collision bodies. This call is needed before calling collision checking...
This class maintains the representation of the environment as seen by a planning instance....
void checkSelfCollision(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res) const
Check whether the current state is in self collision.
void setName(const std::string &name)
Set the name of the planning scene.
double distanceToCollisionUnpadded(const moveit::core::RobotState &robot_state) const
The distance between the robot model at state robot_state to the nearest collision (ignoring self-col...
void checkSelfCollision(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res, moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm) const
Check whether a specified state (robot_state) is in self collision, with respect to a given allowed c...
double distanceToCollision(moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm) const
The distance between the robot model at state robot_state to the nearest collision,...
void getCollidingPairs(collision_detection::CollisionResult::ContactMap &contacts) const
Get the names of the links that are involved in collisions for the current state.
void getCollidingPairs(collision_detection::CollisionResult::ContactMap &contacts, moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm, const std::string &group_name="") const
Get the names of the links that are involved in collisions for the state robot_state given the allowe...
double distanceToCollision(moveit::core::RobotState &robot_state) const
The distance between the robot model at state robot_state to the nearest collision (ignoring self-col...
bool isStateColliding(moveit::core::RobotState &state, const std::string &group="", bool verbose=false) const
Check if a given state is in collision (with the environment or self collision) If a group name is sp...
const std::string & getName() const
Get the name of the planning scene. This is empty by default.
const std::string & getPlanningFrame() const
Get the frame in which planning is performed.
void getCollidingLinks(std::vector< std::string > &links, const moveit::core::RobotState &robot_state) const
Get the names of the links that are involved in collisions for the state robot_state.
const MotionFeasibilityFn & getMotionFeasibilityPredicate() const
Get the predicate that decides whether motion segments are considered valid or invalid for reasons be...
void getCollidingPairs(collision_detection::CollisionResult::ContactMap &contacts, const moveit::core::RobotState &robot_state, const std::string &group_name="") const
Get the names of the links that are involved in collisions for the state robot_state....
void setMotionFeasibilityPredicate(const MotionFeasibilityFn &fn)
Specify a predicate that decides whether motion segments are considered valid or invalid for reasons ...
void checkCollision(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res, moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm) const
Check whether a specified state (robot_state) is in collision, with respect to a given allowed collis...
const collision_detection::CollisionEnvConstPtr & getCollisionEnvUnpadded() const
Get the active collision detector for the robot.
void getCollidingLinks(std::vector< std::string > &links, moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm) const
Get the names of the links that are involved in collisions for the state robot_state given the allowe...
void checkCollisionUnpadded(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res) const
Check whether the current state is in collision, but use a collision_detection::CollisionRobot instan...
const collision_detection::AllowedCollisionMatrix & getAllowedCollisionMatrix() const
Get the allowed collision matrix.
PlanningScene(const PlanningScene &)=delete
PlanningScene cannot be copy-constructed.
double distanceToCollisionUnpadded(moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm) const
The distance between the robot model at state robot_state to the nearest collision,...
double distanceToCollision(const moveit::core::RobotState &robot_state) const
The distance between the robot model at state robot_state to the nearest collision (ignoring self-col...
const std::string getCollisionDetectorName() const
void getCollidingPairs(collision_detection::CollisionResult::ContactMap &contacts, moveit::core::RobotState &robot_state, const std::string &group_name="") const
Get the names of the links that are involved in collisions for the state robot_state....
PlanningScene & operator=(const PlanningScene &)=delete
PlanningScene cannot be copy-assigned.
void checkCollision(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res, moveit::core::RobotState &robot_state) const
Check whether a specified state (robot_state) is in collision. This variant of the function takes a n...
void getCollidingLinks(std::vector< std::string > &links) const
Get the names of the links that are involved in collisions for the current state.
const StateFeasibilityFn & getStateFeasibilityPredicate() const
Get the predicate that decides whether states are considered valid or invalid for reasons beyond ones...
void getCollidingLinks(std::vector< std::string > &links, moveit::core::RobotState &robot_state) const
Get the names of the links that are involved in collisions for the state robot_state....
void allocateCollisionDetector(const collision_detection::CollisionDetectorAllocatorPtr &allocator)
Allocate a new collision detector and replace the previous one if there was any.
void checkSelfCollision(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res, const moveit::core::RobotState &robot_state) const
Check whether a specified state (robot_state) is in self collision.
double distanceToCollisionUnpadded(const moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm) const
The distance between the robot model at state robot_state to the nearest collision,...
const Eigen::Isometry3d & getFrameTransform(moveit::core::RobotState &state, const std::string &id) const
Get the transform corresponding to the frame id. This will be known if id is a link name,...
void checkCollisionUnpadded(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res, moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm) const
Check whether a specified state (robot_state) is in collision, with respect to a given allowed collis...
double distanceToCollision(const moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm) const
The distance between the robot model at state robot_state to the nearest collision,...
const moveit::core::RobotState & getCurrentState() const
Get the state at which the robot is assumed to be.
bool isStateColliding(const std::string &group="", bool verbose=false) const
Check if the current state is in collision (with the environment or self collision)....
void checkCollisionUnpadded(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res, moveit::core::RobotState &robot_state) const
Check whether a specified state (robot_state) is in collision, but use a collision_detection::Collisi...
const collision_detection::WorldConstPtr & getWorld() const
Get the representation of the world.
const moveit::core::Transforms & getTransforms() const
Get the set of fixed transforms from known frames to the planning frame.
const collision_detection::WorldPtr & getWorldNonConst()
Get the representation of the world.
void checkCollisionUnpadded(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res, const moveit::core::RobotState &robot_state) const
Check whether a specified state (robot_state) is in collision, but use a collision_detection::Collisi...
const PlanningSceneConstPtr & getParent() const
Get the parent scene (with respect to which the diffs are maintained). This may be empty.
void checkSelfCollision(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res, const moveit::core::RobotState &robot_state, const collision_detection::AllowedCollisionMatrix &acm) const
Check whether a specified state (robot_state) is in self collision, with respect to a given allowed c...
const moveit::core::RobotModelConstPtr & getRobotModel() const
Get the kinematic model for which the planning scene is maintained.
void checkCollision(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res) const
Check whether the current state is in collision. The current state is expected to be updated.
void setStateFeasibilityPredicate(const StateFeasibilityFn &fn)
Specify a predicate that decides whether states are considered valid or invalid for reasons beyond on...
double distanceToCollisionUnpadded(moveit::core::RobotState &robot_state) const
The distance between the robot model at state robot_state to the nearest collision (ignoring self-col...
const collision_detection::CollisionEnvConstPtr & getCollisionEnv() const
Get the active collision environment.
static const std::string OCTOMAP_NS
static const std::string DEFAULT_SCENE_NAME
void checkSelfCollision(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res, moveit::core::RobotState &robot_state) const
Check whether a specified state (robot_state) is in self collision.
Maintain a sequence of waypoints and the time durations between these waypoints.
CollisionDetector
Enumerates the available collision detectors.
std::function< void(AttachedBody *body, bool attached)> AttachedBodyCallback
Eigen::MatrixXd getFrameTransform(std::shared_ptr< planning_scene::PlanningScene > &planning_scene, const std::string &id)
moveit_msgs::msg::PlanningScene getPlanningSceneMsg(std::shared_ptr< planning_scene::PlanningScene > &planning_scene)
void update(moveit::core::RobotState *self, bool force, std::string &category)
bool isStateColliding(const bool test_for_self_collision, const planning_scene::PlanningSceneConstPtr &scene, moveit::core::RobotState *state, const moveit::core::JointModelGroup *const group, const double *const ik_solution)
Checks if current robot state is in self collision.
This namespace includes the central class for representing planning contexts.
std::function< bool(const moveit::core::RobotState &, bool)> StateFeasibilityFn
This is the function signature for additional feasibility checks to be imposed on states (in addition...
std::map< std::string, std_msgs::msg::ColorRGBA > ObjectColorMap
A map from object names (e.g., attached bodies, collision objects) to their colors.
std::function< bool(const moveit::core::RobotState &, const moveit::core::RobotState &, bool)> MotionFeasibilityFn
This is the function signature for additional feasibility checks to be imposed on motions segments be...
MOVEIT_CLASS_FORWARD(PlanningScene)
std::map< std::string, object_recognition_msgs::msg::ObjectType > ObjectTypeMap
A map from object names (e.g., attached bodies, collision objects) to their types.
Representation of a collision checking request.
Representation of a collision checking result.
std::map< std::pair< std::string, std::string >, std::vector< Contact > > ContactMap