moveit2
The MoveIt Motion Planning Framework for ROS 2.
Loading...
Searching...
No Matches
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 <optional>
57#include <thread>
58#include <variant>
59#include <optional>
60#include <rclcpp/rclcpp.hpp>
61
62#include <moveit_planning_scene_export.h>
63
66{
67MOVEIT_CLASS_FORWARD(PlanningScene); // Defines PlanningScenePtr, ConstPtr, WeakPtr... etc
68
73typedef std::function<bool(const moveit::core::RobotState&, bool)> StateFeasibilityFn;
74
80using MotionFeasibilityFn = std::function<bool(const moveit::core::RobotState&, const moveit::core::RobotState&, bool)>;
81
83using ObjectColorMap = std::map<std::string, std_msgs::msg::ColorRGBA>;
84
86using ObjectTypeMap = std::map<std::string, object_recognition_msgs::msg::ObjectType>;
87
91class MOVEIT_PLANNING_SCENE_EXPORT PlanningScene : public std::enable_shared_from_this<PlanningScene>
92{
93public:
97 PlanningScene(const PlanningScene&) = delete;
98
103
105 PlanningScene(const moveit::core::RobotModelConstPtr& robot_model,
106 const collision_detection::WorldPtr& world = std::make_shared<collision_detection::World>());
107
110 PlanningScene(const urdf::ModelInterfaceSharedPtr& urdf_model, const srdf::ModelConstSharedPtr& srdf_model,
111 const collision_detection::WorldPtr& world = std::make_shared<collision_detection::World>());
112
113 static const std::string OCTOMAP_NS;
114 static const std::string DEFAULT_SCENE_NAME;
115
117
119 const std::string& getName() const
120 {
121 return name_;
122 }
123
125 void setName(const std::string& name)
126 {
127 name_ = name;
128 }
129
140 PlanningScenePtr diff() const;
141
144 PlanningScenePtr diff(const moveit_msgs::msg::PlanningScene& msg) const;
145
147 const PlanningSceneConstPtr& getParent() const
148 {
149 return parent_;
150 }
151
153 const moveit::core::RobotModelConstPtr& getRobotModel() const
154 {
155 // the kinematic model does not change
156 return robot_model_;
157 }
158
161 {
162 // if we have an updated state, return it; otherwise, return the parent one
163 return robot_state_.has_value() ? robot_state_.value() : parent_->getCurrentState();
164 }
166 moveit::core::RobotState& getCurrentStateNonConst();
167
169 moveit::core::RobotStatePtr getCurrentStateUpdated(const moveit_msgs::msg::RobotState& update) const;
170
177 const std::string& getPlanningFrame() const
178 {
179 // if we have an updated set of transforms, return it; otherwise, return the parent one
180 return scene_transforms_.has_value() ? scene_transforms_.value()->getTargetFrame() : parent_->getPlanningFrame();
181 }
182
185 {
186 if (scene_transforms_.has_value() || !parent_)
187 {
188 return *scene_transforms_.value();
189 }
190
191 // if this planning scene is a child of another, and doesn't have its own custom transforms
192 return parent_->getTransforms();
193 }
194
197 const moveit::core::Transforms& getTransforms();
198
200 moveit::core::Transforms& getTransformsNonConst();
201
206 const Eigen::Isometry3d& getFrameTransform(const std::string& id) const;
207
213 const Eigen::Isometry3d& getFrameTransform(const std::string& id);
214
220 const Eigen::Isometry3d& getFrameTransform(moveit::core::RobotState& state, const std::string& id) const
221 {
222 state.updateLinkTransforms();
223 return getFrameTransform(static_cast<const moveit::core::RobotState&>(state), id);
224 }
225
230 const Eigen::Isometry3d& getFrameTransform(const moveit::core::RobotState& state, const std::string& id) const;
231
234 bool knowsFrameTransform(const std::string& id) const;
235
238 bool knowsFrameTransform(const moveit::core::RobotState& state, const std::string& id) const;
239
247 const std::string getCollisionDetectorName() const
248 {
249 // If no collision detector is allocated, return an empty string
250 return collision_detector_ ? (collision_detector_->alloc_->getName()) : "";
251 }
252
254 const collision_detection::WorldConstPtr& getWorld() const
255 {
256 // we always have a world representation
257 return world_const_;
258 }
259
261 const collision_detection::WorldPtr& getWorldNonConst()
262 {
263 // we always have a world representation
264 return world_;
265 }
266
268 const collision_detection::CollisionEnvConstPtr& getCollisionEnv() const
269 {
270 return collision_detector_->getCollisionEnv();
271 }
272
274 const collision_detection::CollisionEnvConstPtr& getCollisionEnvUnpadded() const
275 {
276 return collision_detector_->getCollisionEnvUnpadded();
277 }
278
280 const collision_detection::CollisionEnvConstPtr& getCollisionEnv(const std::string& collision_detector_name) const;
281
284 const collision_detection::CollisionEnvConstPtr&
285 getCollisionEnvUnpadded(const std::string& collision_detector_name) const;
286
289 const collision_detection::CollisionEnvPtr& getCollisionEnvNonConst();
290
293 {
294 return acm_.has_value() ? acm_.value() : parent_->getAllowedCollisionMatrix();
295 }
296
298 collision_detection::AllowedCollisionMatrix& getAllowedCollisionMatrixNonConst();
299
301 void setAllowedCollisionMatrix(const collision_detection::AllowedCollisionMatrix& acm);
302
313 bool isStateColliding(const std::string& group = "", bool verbose = false);
314
319 bool isStateColliding(const std::string& group = "", bool verbose = false) const
320 {
321 return isStateColliding(getCurrentState(), group, verbose);
322 }
323
328 bool isStateColliding(moveit::core::RobotState& state, const std::string& group = "", bool verbose = false) const
329 {
331 return isStateColliding(static_cast<const moveit::core::RobotState&>(state), group, verbose);
332 }
333
337 bool isStateColliding(const moveit::core::RobotState& state, const std::string& group = "",
338 bool verbose = false) const;
339
342 bool isStateColliding(const moveit_msgs::msg::RobotState& state, const std::string& group = "",
343 bool verbose = false) const;
344
348
351 {
352 checkCollision(req, res, getCurrentState());
353 }
354
358 moveit::core::RobotState& robot_state) const
359 {
360 robot_state.updateCollisionBodyTransforms();
361 checkCollision(req, res, static_cast<const moveit::core::RobotState&>(robot_state));
362 }
363
368 const moveit::core::RobotState& robot_state) const;
369
374 moveit::core::RobotState& robot_state,
376 {
377 robot_state.updateCollisionBodyTransforms();
378 checkCollision(req, res, static_cast<const moveit::core::RobotState&>(robot_state), acm);
379 }
380
384 const moveit::core::RobotState& robot_state,
386
390 void checkCollisionUnpadded(const collision_detection::CollisionRequest& req,
392
397 {
398 checkCollisionUnpadded(req, res, getCurrentState(), getAllowedCollisionMatrix());
399 }
400
405 const moveit::core::RobotState& robot_state) const
406 {
407 checkCollisionUnpadded(req, res, robot_state, getAllowedCollisionMatrix());
408 }
409
415 {
416 robot_state.updateCollisionBodyTransforms();
417 checkCollisionUnpadded(req, res, static_cast<const moveit::core::RobotState&>(robot_state),
418 getAllowedCollisionMatrix());
419 }
420
427 {
428 robot_state.updateCollisionBodyTransforms();
429 checkCollisionUnpadded(req, res, static_cast<const moveit::core::RobotState&>(robot_state), acm);
430 }
431
434 void checkCollisionUnpadded(const collision_detection::CollisionRequest& req,
437
439 void checkSelfCollision(const collision_detection::CollisionRequest& req, collision_detection::CollisionResult& res);
440
444 {
445 checkSelfCollision(req, res, getCurrentState());
446 }
447
450 moveit::core::RobotState& robot_state) const
451 {
452 robot_state.updateCollisionBodyTransforms();
453 checkSelfCollision(req, res, static_cast<const moveit::core::RobotState&>(robot_state), getAllowedCollisionMatrix());
454 }
455
458 const moveit::core::RobotState& robot_state) const
459 {
460 // do self-collision checking with the unpadded version of the robot
461 getCollisionEnvUnpadded()->checkSelfCollision(req, res, robot_state, getAllowedCollisionMatrix());
462 }
463
467 moveit::core::RobotState& robot_state,
469 {
470 robot_state.updateCollisionBodyTransforms();
471 checkSelfCollision(req, res, static_cast<const moveit::core::RobotState&>(robot_state), acm);
472 }
473
477 const moveit::core::RobotState& robot_state,
479 {
480 // do self-collision checking with the unpadded version of the robot
481 getCollisionEnvUnpadded()->checkSelfCollision(req, res, robot_state, acm);
482 }
483
485 void getCollidingLinks(std::vector<std::string>& links);
486
488 void getCollidingLinks(std::vector<std::string>& links) const
489 {
490 getCollidingLinks(links, getCurrentState(), getAllowedCollisionMatrix());
491 }
492
495 void getCollidingLinks(std::vector<std::string>& links, moveit::core::RobotState& robot_state) const
496 {
497 robot_state.updateCollisionBodyTransforms();
498 getCollidingLinks(links, static_cast<const moveit::core::RobotState&>(robot_state), getAllowedCollisionMatrix());
499 }
500
502 void getCollidingLinks(std::vector<std::string>& links, const moveit::core::RobotState& robot_state) const
503 {
504 getCollidingLinks(links, robot_state, getAllowedCollisionMatrix());
505 }
506
509 void getCollidingLinks(std::vector<std::string>& links, moveit::core::RobotState& robot_state,
511 {
512 robot_state.updateCollisionBodyTransforms();
513 getCollidingLinks(links, static_cast<const moveit::core::RobotState&>(robot_state), acm);
514 }
515
518 void getCollidingLinks(std::vector<std::string>& links, const moveit::core::RobotState& robot_state,
520
523 void getCollidingPairs(collision_detection::CollisionResult::ContactMap& contacts);
524
527 {
528 getCollidingPairs(contacts, getCurrentState(), getAllowedCollisionMatrix());
529 }
530
534 const moveit::core::RobotState& robot_state, const std::string& group_name = "") const
535 {
536 getCollidingPairs(contacts, robot_state, getAllowedCollisionMatrix(), group_name);
537 }
538
543 moveit::core::RobotState& robot_state, const std::string& group_name = "") const
544 {
545 robot_state.updateCollisionBodyTransforms();
546 getCollidingPairs(contacts, static_cast<const moveit::core::RobotState&>(robot_state), getAllowedCollisionMatrix(),
547 group_name);
548 }
549
555 const std::string& group_name = "") const
556 {
557 robot_state.updateCollisionBodyTransforms();
558 getCollidingPairs(contacts, static_cast<const moveit::core::RobotState&>(robot_state), acm, group_name);
559 }
560
563 void getCollidingPairs(collision_detection::CollisionResult::ContactMap& contacts,
564 const moveit::core::RobotState& robot_state,
566 const std::string& group_name = "") const;
567
579 {
580 robot_state.updateCollisionBodyTransforms();
581 return distanceToCollision(static_cast<const moveit::core::RobotState&>(robot_state));
582 }
583
587 double distanceToCollision(const moveit::core::RobotState& robot_state) const
588 {
589 return getCollisionEnv()->distanceRobot(robot_state, getAllowedCollisionMatrix());
590 }
591
595 {
596 robot_state.updateCollisionBodyTransforms();
597 return distanceToCollisionUnpadded(static_cast<const moveit::core::RobotState&>(robot_state));
598 }
599
603 {
604 return getCollisionEnvUnpadded()->distanceRobot(robot_state, getAllowedCollisionMatrix());
605 }
606
612 {
613 robot_state.updateCollisionBodyTransforms();
614 return distanceToCollision(static_cast<const moveit::core::RobotState&>(robot_state), acm);
615 }
616
622 {
623 return getCollisionEnv()->distanceRobot(robot_state, acm);
624 }
625
631 {
632 robot_state.updateCollisionBodyTransforms();
633 return distanceToCollisionUnpadded(static_cast<const moveit::core::RobotState&>(robot_state), acm);
634 }
635
641 {
642 return getCollisionEnvUnpadded()->distanceRobot(robot_state, acm);
643 }
644
648 void saveGeometryToStream(std::ostream& out) const;
649
651 bool loadGeometryFromStream(std::istream& in);
652
654 bool loadGeometryFromStream(std::istream& in, const Eigen::Isometry3d& offset);
655
660 void getPlanningSceneDiffMsg(moveit_msgs::msg::PlanningScene& scene) const;
661
665 void getPlanningSceneMsg(moveit_msgs::msg::PlanningScene& scene) const;
666
669 void getPlanningSceneMsg(moveit_msgs::msg::PlanningScene& scene,
670 const moveit_msgs::msg::PlanningSceneComponents& comp) const;
671
674 bool getCollisionObjectMsg(moveit_msgs::msg::CollisionObject& collision_obj, const std::string& ns) const;
675
678 void getCollisionObjectMsgs(std::vector<moveit_msgs::msg::CollisionObject>& collision_objs) const;
679
682 bool getAttachedCollisionObjectMsg(moveit_msgs::msg::AttachedCollisionObject& attached_collision_obj,
683 const std::string& ns) const;
684
687 void
688 getAttachedCollisionObjectMsgs(std::vector<moveit_msgs::msg::AttachedCollisionObject>& attached_collision_objs) const;
689
691 bool getOctomapMsg(octomap_msgs::msg::OctomapWithPose& octomap) const;
692
694 void getObjectColorMsgs(std::vector<moveit_msgs::msg::ObjectColor>& object_colors) const;
695
701 bool setPlanningSceneDiffMsg(const moveit_msgs::msg::PlanningScene& scene);
702
705 bool setPlanningSceneMsg(const moveit_msgs::msg::PlanningScene& scene);
706
709 bool usePlanningSceneMsg(const moveit_msgs::msg::PlanningScene& scene);
710
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);
719
720 bool processCollisionObjectMsg(const moveit_msgs::msg::CollisionObject& object);
721 bool processAttachedCollisionObjectMsg(const moveit_msgs::msg::AttachedCollisionObject& object);
722
723 bool processPlanningSceneWorldMsg(const moveit_msgs::msg::PlanningSceneWorld& world);
724
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);
728
732 void removeAllCollisionObjects();
733
737 void setCurrentState(const moveit_msgs::msg::RobotState& state);
738
740 void setCurrentState(const moveit::core::RobotState& state);
741
743 void setAttachedBodyUpdateCallback(const moveit::core::AttachedBodyCallback& callback);
744
746 void setCollisionObjectUpdateCallback(const collision_detection::World::ObserverCallbackFn& callback);
747
748 bool hasObjectColor(const std::string& id) const;
749
755 const std_msgs::msg::ColorRGBA& getObjectColor(const std::string& id) const;
756
762 std::optional<std_msgs::msg::ColorRGBA> getOriginalObjectColor(const std::string& id) const;
763
764 void setObjectColor(const std::string& id, const std_msgs::msg::ColorRGBA& color);
765 void removeObjectColor(const std::string& id);
766 void getKnownObjectColors(ObjectColorMap& kc) const;
767
768 bool hasObjectType(const std::string& id) const;
769
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);
773 void getKnownObjectTypes(ObjectTypeMap& kc) const;
774
779 void clearDiffs();
780
784 void pushDiffs(const PlanningScenePtr& scene);
785
789 void decoupleParent();
790
795 {
796 state_feasibility_ = fn;
797 }
798
802 {
803 return state_feasibility_;
804 }
805
809 {
810 motion_feasibility_ = fn;
811 }
812
816 {
817 return motion_feasibility_;
818 }
819
822 bool isStateFeasible(const moveit_msgs::msg::RobotState& state, bool verbose = false) const;
823
826 bool isStateFeasible(const moveit::core::RobotState& state, bool verbose = false) const;
827
829 bool isStateConstrained(const moveit_msgs::msg::RobotState& state, const moveit_msgs::msg::Constraints& constr,
830 bool verbose = false) const;
831
833 bool isStateConstrained(const moveit::core::RobotState& state, const moveit_msgs::msg::Constraints& constr,
834 bool verbose = false) const;
835
837 bool isStateConstrained(const moveit_msgs::msg::RobotState& state,
838 const kinematic_constraints::KinematicConstraintSet& constr, bool verbose = false) const;
839
841 bool isStateConstrained(const moveit::core::RobotState& state,
842 const kinematic_constraints::KinematicConstraintSet& constr, bool verbose = false) const;
843
846 bool isStateValid(const moveit_msgs::msg::RobotState& state, const std::string& group = "",
847 bool verbose = false) const;
848
851 bool isStateValid(const moveit::core::RobotState& state, const std::string& group = "", bool verbose = false) const;
852
855 bool isStateValid(const moveit_msgs::msg::RobotState& state, const moveit_msgs::msg::Constraints& constr,
856 const std::string& group = "", bool verbose = false) const;
857
860 bool isStateValid(const moveit::core::RobotState& state, const moveit_msgs::msg::Constraints& constr,
861 const std::string& group = "", bool verbose = false) const;
862
865 bool isStateValid(const moveit::core::RobotState& state, const kinematic_constraints::KinematicConstraintSet& constr,
866 const std::string& group = "", bool verbose = false) const;
867
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;
873
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;
880
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;
888
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;
896
900 bool isPathValid(const robot_trajectory::RobotTrajectory& trajectory,
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;
904
908 bool isPathValid(const robot_trajectory::RobotTrajectory& trajectory,
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;
912
915 bool isPathValid(const robot_trajectory::RobotTrajectory& trajectory,
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;
918
921 bool isPathValid(const robot_trajectory::RobotTrajectory& trajectory, const std::string& group = "",
922 bool verbose = false, std::vector<std::size_t>* invalid_index = nullptr) const;
923
926 void getCostSources(const robot_trajectory::RobotTrajectory& trajectory, std::size_t max_costs,
927 std::set<collision_detection::CostSource>& costs, double overlap_fraction = 0.9) const;
928
931 void getCostSources(const robot_trajectory::RobotTrajectory& trajectory, std::size_t max_costs,
932 const std::string& group_name, std::set<collision_detection::CostSource>& costs,
933 double overlap_fraction = 0.9) const;
934
936 void getCostSources(const moveit::core::RobotState& state, std::size_t max_costs,
937 std::set<collision_detection::CostSource>& costs) const;
938
941 void getCostSources(const moveit::core::RobotState& state, std::size_t max_costs, const std::string& group_name,
942 std::set<collision_detection::CostSource>& costs) const;
943
945 void printKnownObjects(std::ostream& out = std::cout) const;
946
948 static PlanningScenePtr clone(const PlanningSceneConstPtr& scene);
949
963 void allocateCollisionDetector(const collision_detection::CollisionDetectorAllocatorPtr& allocator)
964 {
965 allocateCollisionDetector(allocator, nullptr /* no parent_detector */);
966 }
967
968private:
969 /* Private constructor used by the diff() methods. */
970 PlanningScene(const PlanningSceneConstPtr& parent);
971
972 /* Initialize the scene. This should only be called by the constructors.
973 * Requires a valid robot_model_ */
974 void initialize();
975
976 /* Helper functions for processing collision objects */
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);
980
982
983 /* Construct a new CollisionDector from allocator, copy-construct environments from parent_detector if not nullptr */
984 void allocateCollisionDetector(const collision_detection::CollisionDetectorAllocatorPtr& allocator,
985 const CollisionDetectorPtr& parent_detector);
986
987 /* \brief A set of compatible collision detectors */
988 struct CollisionDetector
989 {
990 collision_detection::CollisionDetectorAllocatorPtr alloc_;
991 collision_detection::CollisionEnvPtr cenv_; // never nullptr
992 collision_detection::CollisionEnvConstPtr cenv_const_;
993
994 collision_detection::CollisionEnvPtr cenv_unpadded_;
995 collision_detection::CollisionEnvConstPtr cenv_unpadded_const_;
996
997 const collision_detection::CollisionEnvConstPtr& getCollisionEnv() const
998 {
999 return cenv_const_;
1000 }
1001 const collision_detection::CollisionEnvConstPtr& getCollisionEnvUnpadded() const
1002 {
1003 return cenv_unpadded_const_;
1004 }
1005 void copyPadding(const CollisionDetector& src);
1006 };
1007 friend struct CollisionDetector;
1008
1009 std::string name_; // may be empty
1010
1011 PlanningSceneConstPtr parent_; // Null unless this is a diff scene
1012
1013 moveit::core::RobotModelConstPtr robot_model_; // Never null (may point to same model as parent)
1014
1015 std::optional<moveit::core::RobotState> robot_state_; // if there is no value use parent's
1016
1017 // Called when changes are made to attached bodies
1018 moveit::core::AttachedBodyCallback current_state_attached_body_callback_;
1019
1020 // This variable is not necessarily used by child planning scenes
1021 // This Transforms class is actually a SceneTransforms class
1022 std::optional<moveit::core::TransformsPtr> scene_transforms_; // if there is no value use parent's
1023
1024 collision_detection::WorldPtr world_; // never nullptr, never shared with parent/child
1025 collision_detection::WorldConstPtr world_const_; // copy of world_
1026 collision_detection::WorldDiffPtr world_diff_; // nullptr unless this is a diff scene
1027 collision_detection::World::ObserverCallbackFn current_world_object_update_callback_;
1028 collision_detection::World::ObserverHandle current_world_object_update_observer_handle_;
1029
1030 CollisionDetectorPtr collision_detector_; // Never nullptr.
1031
1032 std::optional<collision_detection::AllowedCollisionMatrix> acm_; // if there is no value use parent's
1033
1034 StateFeasibilityFn state_feasibility_;
1035 MotionFeasibilityFn motion_feasibility_;
1036
1037 // Maps of current and original object colors (to manage attaching/detaching objects)
1038 std::unique_ptr<ObjectColorMap> object_colors_;
1039 std::unique_ptr<ObjectColorMap> original_object_colors_;
1040
1041 // a map of object types
1042 std::optional<ObjectTypeMap> object_types_;
1043};
1044} // namespace planning_scene
#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
Definition world.h:304
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 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.
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
A map returning the pairs of body ids in contact, plus their contact details.