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>
60#include <rclcpp/rclcpp.hpp>
62#include <moveit_planning_scene_export.h>
86using ObjectTypeMap = std::map<std::string, object_recognition_msgs::msg::ObjectType>;
91class MOVEIT_PLANNING_SCENE_EXPORT
PlanningScene :
public std::enable_shared_from_this<PlanningScene>
105 PlanningScene(
const moveit::core::RobotModelConstPtr& robot_model,
106 const collision_detection::WorldPtr& world = std::make_shared<collision_detection::World>());
110 PlanningScene(
const urdf::ModelInterfaceSharedPtr& urdf_model,
const srdf::ModelConstSharedPtr& srdf_model,
111 const collision_detection::WorldPtr& world = std::make_shared<collision_detection::World>());
140 PlanningScenePtr diff()
const;
144 PlanningScenePtr diff(
const moveit_msgs::msg::PlanningScene& msg)
const;
163 return robot_state_.has_value() ? robot_state_.value() : parent_->getCurrentState();
169 moveit::core::RobotStatePtr getCurrentStateUpdated(
const moveit_msgs::msg::RobotState& update)
const;
180 return scene_transforms_.has_value() ? scene_transforms_.value()->getTargetFrame() : parent_->getPlanningFrame();
186 if (scene_transforms_.has_value() || !parent_)
188 return *scene_transforms_.value();
192 return parent_->getTransforms();
206 const Eigen::Isometry3d& getFrameTransform(
const std::string&
id)
const;
213 const Eigen::Isometry3d& getFrameTransform(
const std::string&
id);
234 bool knowsFrameTransform(
const std::string&
id)
const;
250 return collision_detector_ ? (collision_detector_->alloc_->getName()) :
"";
254 const collision_detection::WorldConstPtr&
getWorld()
const
270 return collision_detector_->getCollisionEnv();
276 return collision_detector_->getCollisionEnvUnpadded();
280 const collision_detection::CollisionEnvConstPtr& getCollisionEnv(
const std::string& collision_detector_name)
const;
284 const collision_detection::CollisionEnvConstPtr&
285 getCollisionEnvUnpadded(
const std::string& collision_detector_name)
const;
289 const collision_detection::CollisionEnvPtr& getCollisionEnvNonConst();
294 return acm_.has_value() ? acm_.value() : parent_->getAllowedCollisionMatrix();
313 bool isStateColliding(
const std::string& group =
"",
bool verbose =
false);
321 return isStateColliding(getCurrentState(), group, verbose);
338 bool verbose =
false)
const;
342 bool isStateColliding(
const moveit_msgs::msg::RobotState& state,
const std::string& group =
"",
343 bool verbose =
false)
const;
352 checkCollision(req, res, getCurrentState());
398 checkCollisionUnpadded(req, res, getCurrentState(), getAllowedCollisionMatrix());
407 checkCollisionUnpadded(req, res, robot_state, getAllowedCollisionMatrix());
418 getAllowedCollisionMatrix());
445 checkSelfCollision(req, res, getCurrentState());
453 checkSelfCollision(req, res,
static_cast<const moveit::core::RobotState&
>(robot_state), getAllowedCollisionMatrix());
461 getCollisionEnvUnpadded()->checkSelfCollision(req, res, robot_state, getAllowedCollisionMatrix());
481 getCollisionEnvUnpadded()->checkSelfCollision(req, res, robot_state, acm);
485 void getCollidingLinks(std::vector<std::string>& links);
490 getCollidingLinks(links, getCurrentState(), getAllowedCollisionMatrix());
504 getCollidingLinks(links, robot_state, getAllowedCollisionMatrix());
528 getCollidingPairs(contacts, getCurrentState(), getAllowedCollisionMatrix());
536 getCollidingPairs(contacts, robot_state, getAllowedCollisionMatrix(), group_name);
555 const std::string& group_name =
"")
const
566 const std::string& group_name =
"")
const;
589 return getCollisionEnv()->distanceRobot(robot_state, getAllowedCollisionMatrix());
604 return getCollisionEnvUnpadded()->distanceRobot(robot_state, getAllowedCollisionMatrix());
623 return getCollisionEnv()->distanceRobot(robot_state, acm);
642 return getCollisionEnvUnpadded()->distanceRobot(robot_state, acm);
648 void saveGeometryToStream(std::ostream& out)
const;
651 bool loadGeometryFromStream(std::istream& in);
654 bool loadGeometryFromStream(std::istream& in,
const Eigen::Isometry3d& offset);
660 void getPlanningSceneDiffMsg(moveit_msgs::msg::PlanningScene& scene)
const;
665 void getPlanningSceneMsg(moveit_msgs::msg::PlanningScene& scene)
const;
669 void getPlanningSceneMsg(moveit_msgs::msg::PlanningScene& scene,
670 const moveit_msgs::msg::PlanningSceneComponents& comp)
const;
674 bool getCollisionObjectMsg(moveit_msgs::msg::CollisionObject& collision_obj,
const std::string& ns)
const;
678 void getCollisionObjectMsgs(std::vector<moveit_msgs::msg::CollisionObject>& collision_objs)
const;
682 bool getAttachedCollisionObjectMsg(moveit_msgs::msg::AttachedCollisionObject& attached_collision_obj,
683 const std::string& ns)
const;
688 getAttachedCollisionObjectMsgs(std::vector<moveit_msgs::msg::AttachedCollisionObject>& attached_collision_objs)
const;
691 bool getOctomapMsg(octomap_msgs::msg::OctomapWithPose&
octomap)
const;
694 void getObjectColorMsgs(std::vector<moveit_msgs::msg::ObjectColor>& object_colors)
const;
701 bool setPlanningSceneDiffMsg(
const moveit_msgs::msg::PlanningScene& scene);
705 bool setPlanningSceneMsg(
const moveit_msgs::msg::PlanningScene& scene);
709 bool usePlanningSceneMsg(
const moveit_msgs::msg::PlanningScene& scene);
715 bool shapesAndPosesFromCollisionObjectMessage(
const moveit_msgs::msg::CollisionObject&
object,
716 Eigen::Isometry3d& object_pose_in_header_frame,
717 std::vector<shapes::ShapeConstPtr>&
shapes,
718 EigenSTL::vector_Isometry3d& shape_poses);
720 bool processCollisionObjectMsg(
const moveit_msgs::msg::CollisionObject&
object);
721 bool processAttachedCollisionObjectMsg(
const moveit_msgs::msg::AttachedCollisionObject&
object);
723 bool processPlanningSceneWorldMsg(
const moveit_msgs::msg::PlanningSceneWorld& world);
725 void processOctomapMsg(
const octomap_msgs::msg::OctomapWithPose& map);
726 void processOctomapMsg(
const octomap_msgs::msg::Octomap& map);
727 void processOctomapPtr(
const std::shared_ptr<const octomap::OcTree>& octree,
const Eigen::Isometry3d& t);
732 void removeAllCollisionObjects();
737 void setCurrentState(
const moveit_msgs::msg::RobotState& state);
748 bool hasObjectColor(
const std::string&
id)
const;
755 const std_msgs::msg::ColorRGBA& getObjectColor(
const std::string&
id)
const;
762 std::optional<std_msgs::msg::ColorRGBA> getOriginalObjectColor(
const std::string&
id)
const;
764 void setObjectColor(
const std::string&
id,
const std_msgs::msg::ColorRGBA& color);
765 void removeObjectColor(
const std::string&
id);
768 bool hasObjectType(
const std::string&
id)
const;
770 const object_recognition_msgs::msg::ObjectType& getObjectType(
const std::string&
id)
const;
771 void setObjectType(
const std::string&
id,
const object_recognition_msgs::msg::ObjectType& type);
772 void removeObjectType(
const std::string&
id);
784 void pushDiffs(
const PlanningScenePtr& scene);
789 void decoupleParent();
796 state_feasibility_ = fn;
803 return state_feasibility_;
810 motion_feasibility_ = fn;
817 return motion_feasibility_;
822 bool isStateFeasible(
const moveit_msgs::msg::RobotState& state,
bool verbose =
false)
const;
829 bool isStateConstrained(
const moveit_msgs::msg::RobotState& state,
const moveit_msgs::msg::Constraints& constr,
830 bool verbose =
false)
const;
834 bool verbose =
false)
const;
837 bool isStateConstrained(
const moveit_msgs::msg::RobotState& state,
846 bool isStateValid(
const moveit_msgs::msg::RobotState& state,
const std::string& group =
"",
847 bool verbose =
false)
const;
851 bool isStateValid(
const moveit::core::RobotState& state,
const std::string& group =
"",
bool verbose =
false)
const;
855 bool isStateValid(
const moveit_msgs::msg::RobotState& state,
const moveit_msgs::msg::Constraints& constr,
856 const std::string& group =
"",
bool verbose =
false)
const;
861 const std::string& group =
"",
bool verbose =
false)
const;
866 const std::string& group =
"",
bool verbose =
false)
const;
870 bool isPathValid(
const moveit_msgs::msg::RobotState& start_state,
const moveit_msgs::msg::RobotTrajectory& trajectory,
871 const std::string& group =
"",
bool verbose =
false,
872 std::vector<std::size_t>* invalid_index =
nullptr)
const;
877 bool isPathValid(
const moveit_msgs::msg::RobotState& start_state,
const moveit_msgs::msg::RobotTrajectory& trajectory,
878 const moveit_msgs::msg::Constraints& path_constraints,
const std::string& group =
"",
879 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
884 bool isPathValid(
const moveit_msgs::msg::RobotState& start_state,
const moveit_msgs::msg::RobotTrajectory& trajectory,
885 const moveit_msgs::msg::Constraints& path_constraints,
886 const moveit_msgs::msg::Constraints& goal_constraints,
const std::string& group =
"",
887 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
892 bool isPathValid(
const moveit_msgs::msg::RobotState& start_state,
const moveit_msgs::msg::RobotTrajectory& trajectory,
893 const moveit_msgs::msg::Constraints& path_constraints,
894 const std::vector<moveit_msgs::msg::Constraints>& goal_constraints,
const std::string& group =
"",
895 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
901 const moveit_msgs::msg::Constraints& path_constraints,
902 const std::vector<moveit_msgs::msg::Constraints>& goal_constraints,
const std::string& group =
"",
903 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
909 const moveit_msgs::msg::Constraints& path_constraints,
910 const moveit_msgs::msg::Constraints& goal_constraints,
const std::string& group =
"",
911 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
916 const moveit_msgs::msg::Constraints& path_constraints,
const std::string& group =
"",
917 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
922 bool verbose =
false, std::vector<std::size_t>* invalid_index =
nullptr)
const;
927 std::set<collision_detection::CostSource>& costs,
double overlap_fraction = 0.9)
const;
932 const std::string& group_name, std::set<collision_detection::CostSource>& costs,
933 double overlap_fraction = 0.9)
const;
937 std::set<collision_detection::CostSource>& costs)
const;
942 std::set<collision_detection::CostSource>& costs)
const;
945 void printKnownObjects(std::ostream& out = std::cout)
const;
948 static PlanningScenePtr clone(
const PlanningSceneConstPtr& scene);
965 allocateCollisionDetector(allocator,
nullptr );
977 bool processCollisionObjectAdd(
const moveit_msgs::msg::CollisionObject&
object);
978 bool processCollisionObjectRemove(
const moveit_msgs::msg::CollisionObject&
object);
979 bool processCollisionObjectMove(
const moveit_msgs::msg::CollisionObject&
object);
984 void allocateCollisionDetector(
const collision_detection::CollisionDetectorAllocatorPtr& allocator,
985 const CollisionDetectorPtr& parent_detector);
990 collision_detection::CollisionDetectorAllocatorPtr alloc_;
991 collision_detection::CollisionEnvPtr cenv_;
992 collision_detection::CollisionEnvConstPtr cenv_const_;
994 collision_detection::CollisionEnvPtr cenv_unpadded_;
995 collision_detection::CollisionEnvConstPtr cenv_unpadded_const_;
997 const collision_detection::CollisionEnvConstPtr& getCollisionEnv()
const
1001 const collision_detection::CollisionEnvConstPtr& getCollisionEnvUnpadded()
const
1003 return cenv_unpadded_const_;
1011 PlanningSceneConstPtr parent_;
1013 moveit::core::RobotModelConstPtr robot_model_;
1015 std::optional<moveit::core::RobotState> robot_state_;
1022 std::optional<moveit::core::TransformsPtr> scene_transforms_;
1024 collision_detection::WorldPtr world_;
1025 collision_detection::WorldConstPtr world_const_;
1026 collision_detection::WorldDiffPtr world_diff_;
1030 CollisionDetectorPtr collision_detector_;
1032 std::optional<collision_detection::AllowedCollisionMatrix> acm_;
1038 std::unique_ptr<ObjectColorMap> object_colors_;
1039 std::unique_ptr<ObjectColorMap> original_object_colors_;
1042 std::optional<ObjectTypeMap> object_types_;
#define MOVEIT_CLASS_FORWARD(C)
#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 moveit::core::RobotModelConstPtr & getRobotModel() const
Get the kinematic model for which the planning scene is maintained.
const collision_detection::CollisionEnvConstPtr & getCollisionEnv() const
Get the active collision environment.
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 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 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....
const PlanningSceneConstPtr & getParent() const
Get the parent scene (with respect to which the diffs are maintained). This may be empty.
void setMotionFeasibilityPredicate(const MotionFeasibilityFn &fn)
Specify a predicate that decides whether motion segments are considered valid or invalid for reasons ...
const collision_detection::WorldConstPtr & getWorld() const
Get the representation of the world.
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...
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 moveit::core::RobotState & getCurrentState() const
Get the state at which the robot is assumed to be.
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....
const collision_detection::CollisionEnvConstPtr & getCollisionEnvUnpadded() const
Get the active collision detector for the robot.
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 std::string & getPlanningFrame() const
Get the frame in which planning is performed.
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.
const moveit::core::Transforms & getTransforms() const
Get the set of fixed transforms from known frames to the planning frame.
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,...
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,...
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 std::string & getName() const
Get the name of the planning scene. This is empty by default.
const StateFeasibilityFn & getStateFeasibilityPredicate() const
Get the predicate that decides whether states are considered valid or invalid for reasons beyond ones...
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...
PlanningScene & operator=(const PlanningScene &)=delete
PlanningScene cannot be copy-assigned.
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 collision_detection::WorldPtr & getWorldNonConst()
Get the representation of the world.
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...
static const std::string OCTOMAP_NS
static const std::string DEFAULT_SCENE_NAME
const MotionFeasibilityFn & getMotionFeasibilityPredicate() const
Get the predicate that decides whether motion segments are considered valid or invalid for reasons be...
const collision_detection::AllowedCollisionMatrix & getAllowedCollisionMatrix() const
Get the allowed collision matrix.
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
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...
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
A map returning the pairs of body ids in contact, plus their contact details.