moveit2
The MoveIt Motion Planning Framework for ROS 2.
planning_scene.h
Go to the documentation of this file.
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2011, Willow Garage, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of Willow Garage nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *********************************************************************/
34 
35 /* Author: Ioan Sucan, Acorn Pooley */
36 
37 #pragma once
38 
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>
54 #include <memory>
55 #include <functional>
56 #include <thread>
57 #include <variant>
58 #include <rclcpp/rclcpp.hpp>
59 
60 #include <moveit_planning_scene_export.h>
61 
63 namespace planning_scene
64 {
65 MOVEIT_CLASS_FORWARD(PlanningScene); // Defines PlanningScenePtr, ConstPtr, WeakPtr... etc
66 
71 typedef std::function<bool(const moveit::core::RobotState&, bool)> StateFeasibilityFn;
72 
78 using MotionFeasibilityFn = std::function<bool(const moveit::core::RobotState&, const moveit::core::RobotState&, bool)>;
79 
81 using ObjectColorMap = std::map<std::string, std_msgs::msg::ColorRGBA>;
82 
84 using ObjectTypeMap = std::map<std::string, object_recognition_msgs::msg::ObjectType>;
85 
89 class MOVEIT_PLANNING_SCENE_EXPORT PlanningScene : public std::enable_shared_from_this<PlanningScene>
90 {
91 public:
95  PlanningScene(const PlanningScene&) = delete;
96 
101 
103  PlanningScene(const moveit::core::RobotModelConstPtr& robot_model,
104  const collision_detection::WorldPtr& world = std::make_shared<collision_detection::World>());
105 
108  PlanningScene(const urdf::ModelInterfaceSharedPtr& urdf_model, const srdf::ModelConstSharedPtr& srdf_model,
109  const collision_detection::WorldPtr& world = std::make_shared<collision_detection::World>());
110 
111  static const std::string OCTOMAP_NS;
112  static const std::string DEFAULT_SCENE_NAME;
113 
114  ~PlanningScene();
115 
117  const std::string& getName() const
118  {
119  return name_;
120  }
121 
123  void setName(const std::string& name)
124  {
125  name_ = name;
126  }
127 
138  PlanningScenePtr diff() const;
139 
142  PlanningScenePtr diff(const moveit_msgs::msg::PlanningScene& msg) const;
143 
145  const PlanningSceneConstPtr& getParent() const
146  {
147  return parent_;
148  }
149 
151  const moveit::core::RobotModelConstPtr& getRobotModel() const
152  {
153  // the kinematic model does not change
154  return robot_model_;
155  }
156 
159  {
160  // if we have an updated state, return it; otherwise, return the parent one
161  return robot_state_ ? *robot_state_ : parent_->getCurrentState();
162  }
164  moveit::core::RobotState& getCurrentStateNonConst();
165 
167  moveit::core::RobotStatePtr getCurrentStateUpdated(const moveit_msgs::msg::RobotState& update) const;
168 
175  const std::string& getPlanningFrame() const
176  {
177  // if we have an updated set of transforms, return it; otherwise, return the parent one
178  return scene_transforms_ ? scene_transforms_->getTargetFrame() : parent_->getPlanningFrame();
179  }
180 
183  {
184  if (scene_transforms_ || !parent_)
185  {
186  return *scene_transforms_;
187  }
188 
189  // if this planning scene is a child of another, and doesn't have its own custom transforms
190  return parent_->getTransforms();
191  }
192 
195  const moveit::core::Transforms& getTransforms();
196 
198  moveit::core::Transforms& getTransformsNonConst();
199 
204  const Eigen::Isometry3d& getFrameTransform(const std::string& id) const;
205 
211  const Eigen::Isometry3d& getFrameTransform(const std::string& id);
212 
218  const Eigen::Isometry3d& getFrameTransform(moveit::core::RobotState& state, const std::string& id) const
219  {
220  state.updateLinkTransforms();
221  return getFrameTransform(static_cast<const moveit::core::RobotState&>(state), id);
222  }
223 
228  const Eigen::Isometry3d& getFrameTransform(const moveit::core::RobotState& state, const std::string& id) const;
229 
232  bool knowsFrameTransform(const std::string& id) const;
233 
236  bool knowsFrameTransform(const moveit::core::RobotState& state, const std::string& id) const;
237 
245  const std::string getCollisionDetectorName() const
246  {
247  // If no collision detector is allocated, return an empty string
248  return collision_detector_ ? (collision_detector_->alloc_->getName()) : "";
249  }
250 
252  const collision_detection::WorldConstPtr& getWorld() const
253  {
254  // we always have a world representation
255  return world_const_;
256  }
257 
259  const collision_detection::WorldPtr& getWorldNonConst()
260  {
261  // we always have a world representation
262  return world_;
263  }
264 
266  const collision_detection::CollisionEnvConstPtr& getCollisionEnv() const
267  {
268  return collision_detector_->getCollisionEnv();
269  }
270 
272  const collision_detection::CollisionEnvConstPtr& getCollisionEnvUnpadded() const
273  {
274  return collision_detector_->getCollisionEnvUnpadded();
275  }
276 
278  const collision_detection::CollisionEnvConstPtr& getCollisionEnv(const std::string& collision_detector_name) const;
279 
282  const collision_detection::CollisionEnvConstPtr&
283  getCollisionEnvUnpadded(const std::string& collision_detector_name) const;
284 
287  const collision_detection::CollisionEnvPtr& getCollisionEnvNonConst();
288 
291  {
292  return acm_ ? *acm_ : parent_->getAllowedCollisionMatrix();
293  }
295  collision_detection::AllowedCollisionMatrix& getAllowedCollisionMatrixNonConst();
296 
307  bool isStateColliding(const std::string& group = "", bool verbose = false);
308 
313  bool isStateColliding(const std::string& group = "", bool verbose = false) const
314  {
315  return isStateColliding(getCurrentState(), group, verbose);
316  }
317 
322  bool isStateColliding(moveit::core::RobotState& state, const std::string& group = "", bool verbose = false) const
323  {
325  return isStateColliding(static_cast<const moveit::core::RobotState&>(state), group, verbose);
326  }
327 
331  bool isStateColliding(const moveit::core::RobotState& state, const std::string& group = "",
332  bool verbose = false) const;
333 
336  bool isStateColliding(const moveit_msgs::msg::RobotState& state, const std::string& group = "",
337  bool verbose = false) const;
338 
342 
345  {
346  checkCollision(req, res, getCurrentState());
347  }
348 
352  moveit::core::RobotState& robot_state) const
353  {
354  robot_state.updateCollisionBodyTransforms();
355  checkCollision(req, res, static_cast<const moveit::core::RobotState&>(robot_state));
356  }
357 
362  const moveit::core::RobotState& robot_state) const;
363 
368  moveit::core::RobotState& robot_state,
370  {
371  robot_state.updateCollisionBodyTransforms();
372  checkCollision(req, res, static_cast<const moveit::core::RobotState&>(robot_state), acm);
373  }
374 
378  const moveit::core::RobotState& robot_state,
380 
384  void checkCollisionUnpadded(const collision_detection::CollisionRequest& req,
386 
391  {
392  checkCollisionUnpadded(req, res, getCurrentState(), getAllowedCollisionMatrix());
393  }
394 
399  const moveit::core::RobotState& robot_state) const
400  {
401  checkCollisionUnpadded(req, res, robot_state, getAllowedCollisionMatrix());
402  }
403 
409  {
410  robot_state.updateCollisionBodyTransforms();
411  checkCollisionUnpadded(req, res, static_cast<const moveit::core::RobotState&>(robot_state),
412  getAllowedCollisionMatrix());
413  }
414 
421  {
422  robot_state.updateCollisionBodyTransforms();
423  checkCollisionUnpadded(req, res, static_cast<const moveit::core::RobotState&>(robot_state), acm);
424  }
425 
428  void checkCollisionUnpadded(const collision_detection::CollisionRequest& req,
431 
433  void checkSelfCollision(const collision_detection::CollisionRequest& req, collision_detection::CollisionResult& res);
434 
438  {
439  checkSelfCollision(req, res, getCurrentState());
440  }
441 
444  moveit::core::RobotState& robot_state) const
445  {
446  robot_state.updateCollisionBodyTransforms();
447  checkSelfCollision(req, res, static_cast<const moveit::core::RobotState&>(robot_state), getAllowedCollisionMatrix());
448  }
449 
452  const moveit::core::RobotState& robot_state) const
453  {
454  // do self-collision checking with the unpadded version of the robot
455  getCollisionEnvUnpadded()->checkSelfCollision(req, res, robot_state, getAllowedCollisionMatrix());
456  }
457 
461  moveit::core::RobotState& robot_state,
463  {
464  robot_state.updateCollisionBodyTransforms();
465  checkSelfCollision(req, res, static_cast<const moveit::core::RobotState&>(robot_state), acm);
466  }
467 
471  const moveit::core::RobotState& robot_state,
473  {
474  // do self-collision checking with the unpadded version of the robot
475  getCollisionEnvUnpadded()->checkSelfCollision(req, res, robot_state, acm);
476  }
477 
479  void getCollidingLinks(std::vector<std::string>& links);
480 
482  void getCollidingLinks(std::vector<std::string>& links) const
483  {
484  getCollidingLinks(links, getCurrentState(), getAllowedCollisionMatrix());
485  }
486 
489  void getCollidingLinks(std::vector<std::string>& links, moveit::core::RobotState& robot_state) const
490  {
491  robot_state.updateCollisionBodyTransforms();
492  getCollidingLinks(links, static_cast<const moveit::core::RobotState&>(robot_state), getAllowedCollisionMatrix());
493  }
494 
496  void getCollidingLinks(std::vector<std::string>& links, const moveit::core::RobotState& robot_state) const
497  {
498  getCollidingLinks(links, robot_state, getAllowedCollisionMatrix());
499  }
500 
503  void getCollidingLinks(std::vector<std::string>& links, moveit::core::RobotState& robot_state,
505  {
506  robot_state.updateCollisionBodyTransforms();
507  getCollidingLinks(links, static_cast<const moveit::core::RobotState&>(robot_state), acm);
508  }
509 
512  void getCollidingLinks(std::vector<std::string>& links, const moveit::core::RobotState& robot_state,
514 
517  void getCollidingPairs(collision_detection::CollisionResult::ContactMap& contacts);
518 
521  {
522  getCollidingPairs(contacts, getCurrentState(), getAllowedCollisionMatrix());
523  }
524 
528  const moveit::core::RobotState& robot_state, const std::string& group_name = "") const
529  {
530  getCollidingPairs(contacts, robot_state, getAllowedCollisionMatrix(), group_name);
531  }
532 
537  moveit::core::RobotState& robot_state, const std::string& group_name = "") const
538  {
539  robot_state.updateCollisionBodyTransforms();
540  getCollidingPairs(contacts, static_cast<const moveit::core::RobotState&>(robot_state), getAllowedCollisionMatrix(),
541  group_name);
542  }
543 
549  const std::string& group_name = "") const
550  {
551  robot_state.updateCollisionBodyTransforms();
552  getCollidingPairs(contacts, static_cast<const moveit::core::RobotState&>(robot_state), acm, group_name);
553  }
554 
557  void getCollidingPairs(collision_detection::CollisionResult::ContactMap& contacts,
558  const moveit::core::RobotState& robot_state,
560  const std::string& group_name = "") const;
561 
573  {
574  robot_state.updateCollisionBodyTransforms();
575  return distanceToCollision(static_cast<const moveit::core::RobotState&>(robot_state));
576  }
577 
581  double distanceToCollision(const moveit::core::RobotState& robot_state) const
582  {
583  return getCollisionEnv()->distanceRobot(robot_state, getAllowedCollisionMatrix());
584  }
585 
589  {
590  robot_state.updateCollisionBodyTransforms();
591  return distanceToCollisionUnpadded(static_cast<const moveit::core::RobotState&>(robot_state));
592  }
593 
596  double distanceToCollisionUnpadded(const moveit::core::RobotState& robot_state) const
597  {
598  return getCollisionEnvUnpadded()->distanceRobot(robot_state, getAllowedCollisionMatrix());
599  }
600 
606  {
607  robot_state.updateCollisionBodyTransforms();
608  return distanceToCollision(static_cast<const moveit::core::RobotState&>(robot_state), acm);
609  }
610 
616  {
617  return getCollisionEnv()->distanceRobot(robot_state, acm);
618  }
619 
625  {
626  robot_state.updateCollisionBodyTransforms();
627  return distanceToCollisionUnpadded(static_cast<const moveit::core::RobotState&>(robot_state), acm);
628  }
629 
635  {
636  return getCollisionEnvUnpadded()->distanceRobot(robot_state, acm);
637  }
638 
642  void saveGeometryToStream(std::ostream& out) const;
643 
645  bool loadGeometryFromStream(std::istream& in);
646 
648  bool loadGeometryFromStream(std::istream& in, const Eigen::Isometry3d& offset);
649 
654  void getPlanningSceneDiffMsg(moveit_msgs::msg::PlanningScene& scene) const;
655 
659  void getPlanningSceneMsg(moveit_msgs::msg::PlanningScene& scene) const;
660 
663  void getPlanningSceneMsg(moveit_msgs::msg::PlanningScene& scene,
664  const moveit_msgs::msg::PlanningSceneComponents& comp) const;
665 
668  bool getCollisionObjectMsg(moveit_msgs::msg::CollisionObject& collision_obj, const std::string& ns) const;
669 
672  void getCollisionObjectMsgs(std::vector<moveit_msgs::msg::CollisionObject>& collision_objs) const;
673 
676  bool getAttachedCollisionObjectMsg(moveit_msgs::msg::AttachedCollisionObject& attached_collision_obj,
677  const std::string& ns) const;
678 
681  void
682  getAttachedCollisionObjectMsgs(std::vector<moveit_msgs::msg::AttachedCollisionObject>& attached_collision_objs) const;
683 
685  bool getOctomapMsg(octomap_msgs::msg::OctomapWithPose& octomap) const;
686 
688  void getObjectColorMsgs(std::vector<moveit_msgs::msg::ObjectColor>& object_colors) const;
689 
695  bool setPlanningSceneDiffMsg(const moveit_msgs::msg::PlanningScene& scene);
696 
699  bool setPlanningSceneMsg(const moveit_msgs::msg::PlanningScene& scene);
700 
703  bool usePlanningSceneMsg(const moveit_msgs::msg::PlanningScene& scene);
704 
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);
713 
714  bool processCollisionObjectMsg(const moveit_msgs::msg::CollisionObject& object);
715  bool processAttachedCollisionObjectMsg(const moveit_msgs::msg::AttachedCollisionObject& object);
716 
717  bool processPlanningSceneWorldMsg(const moveit_msgs::msg::PlanningSceneWorld& world);
718 
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);
722 
726  void removeAllCollisionObjects();
727 
731  void setCurrentState(const moveit_msgs::msg::RobotState& state);
732 
734  void setCurrentState(const moveit::core::RobotState& state);
735 
737  void setAttachedBodyUpdateCallback(const moveit::core::AttachedBodyCallback& callback);
738 
740  void setCollisionObjectUpdateCallback(const collision_detection::World::ObserverCallbackFn& callback);
741 
742  bool hasObjectColor(const std::string& id) const;
743 
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);
747  void getKnownObjectColors(ObjectColorMap& kc) const;
748 
749  bool hasObjectType(const std::string& id) const;
750 
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);
754  void getKnownObjectTypes(ObjectTypeMap& kc) const;
755 
760  void clearDiffs();
761 
765  void pushDiffs(const PlanningScenePtr& scene);
766 
770  void decoupleParent();
771 
776  {
777  state_feasibility_ = fn;
778  }
779 
783  {
784  return state_feasibility_;
785  }
786 
790  {
791  motion_feasibility_ = fn;
792  }
793 
797  {
798  return motion_feasibility_;
799  }
800 
803  bool isStateFeasible(const moveit_msgs::msg::RobotState& state, bool verbose = false) const;
804 
807  bool isStateFeasible(const moveit::core::RobotState& state, bool verbose = false) const;
808 
810  bool isStateConstrained(const moveit_msgs::msg::RobotState& state, const moveit_msgs::msg::Constraints& constr,
811  bool verbose = false) const;
812 
814  bool isStateConstrained(const moveit::core::RobotState& state, const moveit_msgs::msg::Constraints& constr,
815  bool verbose = false) const;
816 
818  bool isStateConstrained(const moveit_msgs::msg::RobotState& state,
819  const kinematic_constraints::KinematicConstraintSet& constr, bool verbose = false) const;
820 
822  bool isStateConstrained(const moveit::core::RobotState& state,
823  const kinematic_constraints::KinematicConstraintSet& constr, bool verbose = false) const;
824 
827  bool isStateValid(const moveit_msgs::msg::RobotState& state, const std::string& group = "",
828  bool verbose = false) const;
829 
832  bool isStateValid(const moveit::core::RobotState& state, const std::string& group = "", bool verbose = false) const;
833 
836  bool isStateValid(const moveit_msgs::msg::RobotState& state, const moveit_msgs::msg::Constraints& constr,
837  const std::string& group = "", bool verbose = false) const;
838 
841  bool isStateValid(const moveit::core::RobotState& state, const moveit_msgs::msg::Constraints& constr,
842  const std::string& group = "", bool verbose = false) const;
843 
846  bool isStateValid(const moveit::core::RobotState& state, const kinematic_constraints::KinematicConstraintSet& constr,
847  const std::string& group = "", bool verbose = false) const;
848 
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;
854 
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;
861 
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;
869 
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;
877 
881  bool isPathValid(const robot_trajectory::RobotTrajectory& trajectory,
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;
885 
889  bool isPathValid(const robot_trajectory::RobotTrajectory& trajectory,
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;
893 
896  bool isPathValid(const robot_trajectory::RobotTrajectory& trajectory,
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;
899 
902  bool isPathValid(const robot_trajectory::RobotTrajectory& trajectory, const std::string& group = "",
903  bool verbose = false, std::vector<std::size_t>* invalid_index = nullptr) const;
904 
907  void getCostSources(const robot_trajectory::RobotTrajectory& trajectory, std::size_t max_costs,
908  std::set<collision_detection::CostSource>& costs, double overlap_fraction = 0.9) const;
909 
912  void getCostSources(const robot_trajectory::RobotTrajectory& trajectory, std::size_t max_costs,
913  const std::string& group_name, std::set<collision_detection::CostSource>& costs,
914  double overlap_fraction = 0.9) const;
915 
917  void getCostSources(const moveit::core::RobotState& state, std::size_t max_costs,
918  std::set<collision_detection::CostSource>& costs) const;
919 
922  void getCostSources(const moveit::core::RobotState& state, std::size_t max_costs, const std::string& group_name,
923  std::set<collision_detection::CostSource>& costs) const;
924 
926  void printKnownObjects(std::ostream& out = std::cout) const;
927 
929  static PlanningScenePtr clone(const PlanningSceneConstPtr& scene);
930 
944  void allocateCollisionDetector(const collision_detection::CollisionDetectorAllocatorPtr& allocator)
945  {
946  allocateCollisionDetector(allocator, nullptr /* no parent_detector */);
947  }
948 
949 private:
950  /* Private constructor used by the diff() methods. */
951  PlanningScene(const PlanningSceneConstPtr& parent);
952 
953  /* Initialize the scene. This should only be called by the constructors.
954  * Requires a valid robot_model_ */
955  void initialize();
956 
957  /* Helper functions for processing collision objects */
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);
961 
963 
964  /* Construct a new CollisionDector from allocator, copy-construct environments from parent_detector if not nullptr */
965  void allocateCollisionDetector(const collision_detection::CollisionDetectorAllocatorPtr& allocator,
966  const CollisionDetectorPtr& parent_detector);
967 
968  /* \brief A set of compatible collision detectors */
969  struct CollisionDetector
970  {
971  collision_detection::CollisionDetectorAllocatorPtr alloc_;
972  collision_detection::CollisionEnvPtr cenv_; // never nullptr
973  collision_detection::CollisionEnvConstPtr cenv_const_;
974 
975  collision_detection::CollisionEnvPtr cenv_unpadded_;
976  collision_detection::CollisionEnvConstPtr cenv_unpadded_const_;
977 
978  const collision_detection::CollisionEnvConstPtr& getCollisionEnv() const
979  {
980  return cenv_const_;
981  }
982  const collision_detection::CollisionEnvConstPtr& getCollisionEnvUnpadded() const
983  {
984  return cenv_unpadded_const_;
985  }
986  void copyPadding(const CollisionDetector& src);
987  };
988  friend struct CollisionDetector;
989 
990  std::string name_; // may be empty
991 
992  PlanningSceneConstPtr parent_; // Null unless this is a diff scene
993 
994  moveit::core::RobotModelConstPtr robot_model_; // Never null (may point to same model as parent)
995 
996  moveit::core::RobotStatePtr robot_state_; // if nullptr use parent's
997 
998  // Called when changes are made to attached bodies
999  moveit::core::AttachedBodyCallback current_state_attached_body_callback_;
1000 
1001  // This variable is not necessarily used by child planning scenes
1002  // This Transforms class is actually a SceneTransforms class
1003  moveit::core::TransformsPtr scene_transforms_; // if nullptr use parent's
1004 
1005  collision_detection::WorldPtr world_; // never nullptr, never shared with parent/child
1006  collision_detection::WorldConstPtr world_const_; // copy of world_
1007  collision_detection::WorldDiffPtr world_diff_; // nullptr unless this is a diff scene
1008  collision_detection::World::ObserverCallbackFn current_world_object_update_callback_;
1009  collision_detection::World::ObserverHandle current_world_object_update_observer_handle_;
1010 
1011  CollisionDetectorPtr collision_detector_; // Never nullptr.
1012 
1013  collision_detection::AllowedCollisionMatrixPtr acm_; // if nullptr use parent's
1014 
1015  StateFeasibilityFn state_feasibility_;
1016  MotionFeasibilityFn motion_feasibility_;
1017 
1018  std::unique_ptr<ObjectColorMap> object_colors_;
1019 
1020  // a map of object types
1021  std::unique_ptr<ObjectTypeMap> object_types_;
1022 };
1023 } // namespace planning_scene
#define MOVEIT_STRUCT_FORWARD(C)
Definition: class_forward.h:55
Definition of a structure for the allowed collision matrix. All elements in the collision world are r...
std::function< void(const ObjectConstPtr &, Action)> ObserverCallbackFn
Definition: world.h:301
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.
Definition: robot_state.h:90
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...
Provides an implementation of a snapshot of a transform tree that can be easily queried for transform...
Definition: transforms.h:59
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
Definition: attached_body.h:51
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)
Definition: robot_state.cpp:47
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.
name
Definition: setup.py:7
Definition: world.h:49
Representation of a collision checking request.
Representation of a collision checking result.
std::map< std::pair< std::string, std::string >, std::vector< Contact > > ContactMap