moveit2
The MoveIt Motion Planning Framework for ROS 2.
planning_scene_monitor.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 */
36 
37 #pragma once
38 
39 #include <rclcpp/rclcpp.hpp>
40 #include <tf2_ros/buffer.h>
41 #include <tf2_ros/transform_listener.h>
48 #include <moveit_msgs/srv/get_planning_scene.hpp>
49 #include <memory>
50 #include <thread>
51 #include <shared_mutex>
52 #include <mutex>
53 #include <thread>
54 
55 #include <moveit_planning_scene_monitor_export.h>
56 
57 namespace planning_scene_monitor
58 {
59 MOVEIT_CLASS_FORWARD(PlanningSceneMonitor); // Defines PlanningSceneMonitorPtr, ConstPtr, WeakPtr... etc
60 
64 class MOVEIT_PLANNING_SCENE_MONITOR_EXPORT PlanningSceneMonitor
65 {
66 public:
71 
76 
78  {
80  UPDATE_NONE = 0,
81 
83  UPDATE_STATE = 1,
84 
86  UPDATE_TRANSFORMS = 2,
87 
90  UPDATE_GEOMETRY = 4,
91 
93  UPDATE_SCENE = 8 + UPDATE_STATE + UPDATE_TRANSFORMS + UPDATE_GEOMETRY
94  };
95 
97  static const std::string DEFAULT_JOINT_STATES_TOPIC; // "/joint_states"
98 
100  static const std::string DEFAULT_ATTACHED_COLLISION_OBJECT_TOPIC; // "/attached_collision_object"
101 
103  static const std::string DEFAULT_COLLISION_OBJECT_TOPIC; // "/collision_object"
104 
107  static const std::string DEFAULT_PLANNING_SCENE_WORLD_TOPIC; // "/planning_scene_world"
108 
110  static const std::string DEFAULT_PLANNING_SCENE_TOPIC; // "/planning_scene"
111 
113  static const std::string DEFAULT_PLANNING_SCENE_SERVICE; // "/get_planning_scene"
114 
117  static const std::string MONITORED_PLANNING_SCENE_TOPIC; // "monitored_planning_scene"
118 
123  PlanningSceneMonitor(const rclcpp::Node::SharedPtr& node, const std::string& robot_description,
124  const std::string& name = "");
125 
130  PlanningSceneMonitor(const rclcpp::Node::SharedPtr& node, const robot_model_loader::RobotModelLoaderPtr& rml,
131  const std::string& name = "");
132 
138  PlanningSceneMonitor(const rclcpp::Node::SharedPtr& node, const planning_scene::PlanningScenePtr& scene,
139  const std::string& robot_description, const std::string& name = "");
140 
146  PlanningSceneMonitor(const rclcpp::Node::SharedPtr& node, const planning_scene::PlanningScenePtr& scene,
147  const robot_model_loader::RobotModelLoaderPtr& rml, const std::string& name = "");
148 
150 
152  const std::string& getName() const
153  {
154  return monitor_name_;
155  }
156 
158  const robot_model_loader::RobotModelLoaderPtr& getRobotModelLoader() const
159  {
160  return rm_loader_;
161  }
162 
163  const moveit::core::RobotModelConstPtr& getRobotModel() const
164  {
165  return robot_model_;
166  }
167 
182  const planning_scene::PlanningScenePtr& getPlanningScene()
183  {
184  return scene_;
185  }
186 
190  const planning_scene::PlanningSceneConstPtr& getPlanningScene() const
191  {
192  return scene_const_;
193  }
194 
199  bool updatesScene(const planning_scene::PlanningSceneConstPtr& scene) const;
200 
205  bool updatesScene(const planning_scene::PlanningScenePtr& scene) const;
206 
209  const std::string& getRobotDescription() const
210  {
211  return robot_description_;
212  }
213 
215  double getDefaultRobotPadding() const
216  {
217  return default_robot_padd_;
218  }
219 
221  double getDefaultRobotScale() const
222  {
223  return default_robot_scale_;
224  }
225 
227  double getDefaultObjectPadding() const
228  {
229  return default_object_padd_;
230  }
231 
234  {
235  return default_attached_padd_;
236  }
237 
239  const std::shared_ptr<tf2_ros::Buffer>& getTFClient() const
240  {
241  return tf_buffer_;
242  }
243 
249  void monitorDiffs(bool flag);
250 
254  void startPublishingPlanningScene(SceneUpdateType event,
255  const std::string& planning_scene_topic = MONITORED_PLANNING_SCENE_TOPIC);
256 
258  void stopPublishingPlanningScene();
259 
261  void setPlanningScenePublishingFrequency(double hz);
262 
265  {
266  return publish_planning_scene_frequency_;
267  }
268 
271  const CurrentStateMonitorPtr& getStateMonitor() const
272  {
273  return current_state_monitor_;
274  }
275 
276  CurrentStateMonitorPtr& getStateMonitorNonConst()
277  {
278  return current_state_monitor_;
279  }
280 
286  void updateFrameTransforms();
287 
291  void startStateMonitor(const std::string& joint_states_topic = DEFAULT_JOINT_STATES_TOPIC,
292  const std::string& attached_objects_topic = DEFAULT_ATTACHED_COLLISION_OBJECT_TOPIC);
293 
295  void stopStateMonitor();
296 
300  void updateSceneWithCurrentState();
301 
307  void setStateUpdateFrequency(double hz);
308 
310  double getStateUpdateFrequency() const
311  {
312  if (dt_state_update_.count() > 0.0)
313  {
314  return 1.0 / dt_state_update_.count();
315  }
316  else
317  {
318  return 0.0;
319  }
320  }
321 
325  void startSceneMonitor(const std::string& scene_topic = DEFAULT_PLANNING_SCENE_TOPIC);
326 
334  bool requestPlanningSceneState(const std::string& service_name = DEFAULT_PLANNING_SCENE_SERVICE);
335 
343  void providePlanningSceneService(const std::string& service_name = DEFAULT_PLANNING_SCENE_SERVICE);
344 
346  void stopSceneMonitor();
347 
356  void startWorldGeometryMonitor(const std::string& collision_objects_topic = DEFAULT_COLLISION_OBJECT_TOPIC,
357  const std::string& planning_scene_world_topic = DEFAULT_PLANNING_SCENE_WORLD_TOPIC,
358  const bool load_octomap_monitor = true);
359 
361  void stopWorldGeometryMonitor();
362 
364  void addUpdateCallback(const std::function<void(SceneUpdateType)>& fn);
365 
367  void clearUpdateCallbacks();
368 
370  void getMonitoredTopics(std::vector<std::string>& topics) const;
371 
373  const rclcpp::Time& getLastUpdateTime() const
374  {
375  return last_update_time_;
376  }
377 
378  void publishDebugInformation(bool flag);
379 
381  void triggerSceneUpdateEvent(SceneUpdateType update_type);
382 
388  bool waitForCurrentRobotState(const rclcpp::Time& t, double wait_time = 1.);
389 
390  void clearOctomap();
391 
392  // Called to update the planning scene with a new message.
393  bool newPlanningSceneMessage(const moveit_msgs::msg::PlanningScene& scene);
394 
395  // Called to update a collision object in the planning scene.
396  bool processCollisionObjectMsg(const moveit_msgs::msg::CollisionObject::ConstSharedPtr& collision_object_msg);
397 
398  // Called to update an attached collision object in the planning scene.
400  const moveit_msgs::msg::AttachedCollisionObject::ConstSharedPtr& attached_collision_object_msg);
401 
402 protected:
406  void initialize(const planning_scene::PlanningScenePtr& scene);
407 
409  void lockSceneRead();
410 
412  void unlockSceneRead();
413 
416  void lockSceneWrite();
417 
420  void unlockSceneWrite();
421 
423  void configureCollisionMatrix(const planning_scene::PlanningScenePtr& scene);
424 
426  void configureDefaultPadding();
427 
429  void newPlanningSceneWorldCallback(const moveit_msgs::msg::PlanningSceneWorld::ConstSharedPtr& world);
430 
432  void octomapUpdateCallback();
433 
435  void currentStateAttachedBodyUpdateCallback(moveit::core::AttachedBody* attached_body, bool just_attached);
436 
438  void currentWorldObjectUpdateCallback(const collision_detection::World::ObjectConstPtr& object,
440 
441  void includeRobotLinksInOctree();
442  void excludeRobotLinksFromOctree();
443 
444  void excludeWorldObjectsFromOctree();
445  void includeWorldObjectsInOctree();
446  void excludeWorldObjectFromOctree(const collision_detection::World::ObjectConstPtr& obj);
447  void includeWorldObjectInOctree(const collision_detection::World::ObjectConstPtr& obj);
448 
449  void excludeAttachedBodiesFromOctree();
450  void includeAttachedBodiesInOctree();
451  void excludeAttachedBodyFromOctree(const moveit::core::AttachedBody* attached_body);
452  void includeAttachedBodyInOctree(const moveit::core::AttachedBody* attached_body);
453 
454  bool getShapeTransformCache(const std::string& target_frame, const rclcpp::Time& target_time,
456 
458  std::string monitor_name_;
459 
460  planning_scene::PlanningScenePtr scene_;
461  planning_scene::PlanningSceneConstPtr scene_const_;
462  planning_scene::PlanningScenePtr parent_scene_;
463  std::shared_mutex scene_update_mutex_;
464  rclcpp::Time last_update_time_;
465  rclcpp::Time last_robot_motion_time_;
466 
467  std::shared_ptr<rclcpp::Node> node_;
468 
469  // TODO: (anasarrak) callbacks on ROS2?
470  // https://answers.ros.org/question/300874/how-do-you-use-callbackgroups-as-a-replacement-for-callbackqueues-in-ros2/
471  // ros::CallbackQueue queue_;
472  std::shared_ptr<rclcpp::Node> pnode_;
473  std::shared_ptr<rclcpp::executors::SingleThreadedExecutor> private_executor_;
475 
476  std::shared_ptr<tf2_ros::Buffer> tf_buffer_;
477  std::shared_ptr<tf2_ros::TransformListener> tf_listener_;
478 
479  std::string robot_description_;
480 
490  std::map<std::string, double> default_robot_link_padd_;
492  std::map<std::string, double> default_robot_link_scale_;
493 
494  // variables for planning scene publishing
495  rclcpp::Publisher<moveit_msgs::msg::PlanningScene>::SharedPtr planning_scene_publisher_;
496  std::unique_ptr<std::thread> publish_planning_scene_;
499  std::atomic<SceneUpdateType> new_scene_update_;
500  std::condition_variable_any new_scene_update_condition_;
501 
502  // subscribe to various sources of data
503  rclcpp::Subscription<moveit_msgs::msg::PlanningScene>::SharedPtr planning_scene_subscriber_;
504  rclcpp::Subscription<moveit_msgs::msg::PlanningSceneWorld>::SharedPtr planning_scene_world_subscriber_;
505 
506  rclcpp::Subscription<moveit_msgs::msg::AttachedCollisionObject>::SharedPtr attached_collision_object_subscriber_;
507  rclcpp::Subscription<moveit_msgs::msg::CollisionObject>::SharedPtr collision_object_subscriber_;
508 
509  // provide an optional service to get the full planning scene state
510  // this is used by MoveGroup and related application nodes
511  rclcpp::Service<moveit_msgs::srv::GetPlanningScene>::SharedPtr get_scene_service_;
512 
513  // include a octomap monitor
514  std::unique_ptr<occupancy_map_monitor::OccupancyMapMonitor> octomap_monitor_;
515 
516  // include a current state monitor
517  CurrentStateMonitorPtr current_state_monitor_;
518 
519  typedef std::map<const moveit::core::LinkModel*,
520  std::vector<std::pair<occupancy_map_monitor::ShapeHandle, std::size_t> > >
523  std::vector<std::pair<occupancy_map_monitor::ShapeHandle, std::size_t> > >;
525  std::map<std::string, std::vector<std::pair<occupancy_map_monitor::ShapeHandle, const Eigen::Isometry3d*> > >;
526 
530  mutable std::recursive_mutex shape_handles_lock_;
531 
533  std::recursive_mutex update_lock_;
534  std::vector<std::function<void(SceneUpdateType)> > update_callbacks_;
536 
537 private:
538  void getUpdatedFrameTransforms(std::vector<geometry_msgs::msg::TransformStamped>& transforms);
539 
540  // publish planning scene update diffs (runs in its own thread)
541  void scenePublishingThread();
542 
543  // called by current_state_monitor_ when robot state (as monitored on joint state topic) changes
544  void onStateUpdate(const sensor_msgs::msg::JointState::ConstSharedPtr& joint_state);
545 
546  // called by state_update_timer_ when a state update it pending
547  void stateUpdateTimerCallback();
548 
549  // Callback for a new planning scene msg
550  void newPlanningSceneCallback(const moveit_msgs::msg::PlanningScene::ConstSharedPtr& scene);
551 
552  // Callback for requesting the full planning scene via service
553  void getPlanningSceneServiceCallback(const moveit_msgs::srv::GetPlanningScene::Request::SharedPtr& req,
554  const moveit_msgs::srv::GetPlanningScene::Response::SharedPtr& res);
555 
556  void updatePublishSettings(bool publish_geom_updates, bool publish_state_updates, bool publish_transform_updates,
557  bool publish_planning_scene, double publish_planning_scene_hz);
558 
559  // Lock for state_update_pending_ and dt_state_update_
560  std::mutex state_pending_mutex_;
561 
563  // This field is protected by state_pending_mutex_
564  volatile bool state_update_pending_;
565 
567  // This field is protected by state_pending_mutex_
568  std::chrono::duration<double> dt_state_update_; // 1hz
569 
571  // Setting this to a non-zero value resolves issues when the sensor data is
572  // arriving so fast that it is preceding the transform state.
573  rclcpp::Duration shape_transform_cache_lookup_wait_time_;
574 
576  // Check if last_state_update_ is true and if so call updateSceneWithCurrentState()
577  // Not safe to access from callback functions.
578 
579  rclcpp::TimerBase::SharedPtr state_update_timer_;
580 
582  // Only access this from callback functions (and constructor)
583  std::chrono::system_clock::time_point last_robot_state_update_wall_time_;
584 
585  robot_model_loader::RobotModelLoaderPtr rm_loader_;
586  moveit::core::RobotModelConstPtr robot_model_;
587 
589 
590  rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr callback_handler_;
591 
592  bool use_sim_time_;
593 
594  friend class LockedPlanningSceneRO;
595  friend class LockedPlanningSceneRW;
596 
597  rclcpp::Logger logger_;
598 };
599 
622 {
623 public:
624  LockedPlanningSceneRO(const PlanningSceneMonitorPtr& planning_scene_monitor)
626  {
627  initialize(true);
628  }
629 
630  const PlanningSceneMonitorPtr& getPlanningSceneMonitor()
631  {
633  }
634 
635  operator bool() const
636  {
637  return planning_scene_monitor_ && planning_scene_monitor_->getPlanningScene();
638  }
639 
640  operator const planning_scene::PlanningSceneConstPtr&() const
641  {
642  return static_cast<const PlanningSceneMonitor*>(planning_scene_monitor_.get())->getPlanningScene();
643  }
644 
645  const planning_scene::PlanningSceneConstPtr& operator->() const
646  {
647  return static_cast<const PlanningSceneMonitor*>(planning_scene_monitor_.get())->getPlanningScene();
648  }
649 
650 protected:
651  LockedPlanningSceneRO(const PlanningSceneMonitorPtr& planning_scene_monitor, bool read_only)
653  {
654  initialize(read_only);
655  }
656 
657  void initialize(bool read_only)
658  {
660  lock_ = std::make_shared<SingleUnlock>(planning_scene_monitor_.get(), read_only);
661  }
662 
664 
665  // we use this struct so that lock/unlock are called only once
666  // even if the LockedPlanningScene instance is copied around
668  {
671  {
672  if (read_only)
673  {
675  }
676  else
677  {
679  }
680  }
682  {
683  if (read_only_)
684  {
686  }
687  else
688  {
690  }
691  }
694  };
695 
696  PlanningSceneMonitorPtr planning_scene_monitor_;
697  SingleUnlockPtr lock_;
698 };
699 
722 {
723 public:
724  LockedPlanningSceneRW(const PlanningSceneMonitorPtr& planning_scene_monitor)
726  {
727  }
728 
729  operator const planning_scene::PlanningScenePtr&()
730  {
731  return planning_scene_monitor_->getPlanningScene();
732  }
733 
734  const planning_scene::PlanningScenePtr& operator->()
735  {
736  return planning_scene_monitor_->getPlanningScene();
737  }
738 };
739 } // namespace planning_scene_monitor
Represents an action that occurred on an object in the world. Several bits may be set indicating seve...
Definition: world.h:265
Object defining bodies that can be attached to robot links.
Definition: attached_body.h:58
A link from the robot. Contains the constant transform applied to the link and its geometry.
Definition: link_model.h:72
This is a convenience class for obtaining access to an instance of a locked PlanningScene.
const planning_scene::PlanningSceneConstPtr & operator->() const
LockedPlanningSceneRO(const PlanningSceneMonitorPtr &planning_scene_monitor, bool read_only)
LockedPlanningSceneRO(const PlanningSceneMonitorPtr &planning_scene_monitor)
const PlanningSceneMonitorPtr & getPlanningSceneMonitor()
This is a convenience class for obtaining access to an instance of a locked PlanningScene.
const planning_scene::PlanningScenePtr & operator->()
LockedPlanningSceneRW(const PlanningSceneMonitorPtr &planning_scene_monitor)
PlanningSceneMonitor Subscribes to the topic planning_scene.
static const std::string DEFAULT_PLANNING_SCENE_TOPIC
The name of the topic used by default for receiving full planning scenes or planning scene diffs.
const planning_scene::PlanningScenePtr & getPlanningScene()
Avoid this function! Returns an unsafe pointer to the current planning scene.
void lockSceneRead()
Lock the scene for reading (multiple threads can lock for reading at the same time)
void lockSceneWrite()
Lock the scene for writing (only one thread can lock for writing and no other thread can lock for rea...
void unlockSceneRead()
Unlock the scene from reading (multiple threads can lock for reading at the same time)
static const std::string DEFAULT_PLANNING_SCENE_SERVICE
The name of the service used by default for requesting full planning scene state.
double default_attached_padd_
default attached padding
std::unique_ptr< occupancy_map_monitor::OccupancyMapMonitor > octomap_monitor_
const moveit::core::RobotModelConstPtr & getRobotModel() const
const std::string & getRobotDescription() const
Get the stored robot description.
std::map< std::string, double > default_robot_link_padd_
default robot link padding
static const std::string DEFAULT_ATTACHED_COLLISION_OBJECT_TOPIC
The name of the topic used by default for attached collision objects.
PlanningSceneMonitor & operator=(const PlanningSceneMonitor &)=delete
PlanningSceneMonitor cannot be copy-assigned.
static const std::string DEFAULT_COLLISION_OBJECT_TOPIC
The name of the topic used by default for receiving collision objects in the world.
PlanningSceneMonitor(const PlanningSceneMonitor &)=delete
PlanningSceneMonitor cannot be copy-constructed.
rclcpp::Subscription< moveit_msgs::msg::AttachedCollisionObject >::SharedPtr attached_collision_object_subscriber_
std::map< std::string, std::vector< std::pair< occupancy_map_monitor::ShapeHandle, const Eigen::Isometry3d * > > > CollisionBodyShapeHandles
const std::string & getName() const
Get the name of this monitor.
rclcpp::Service< moveit_msgs::srv::GetPlanningScene >::SharedPtr get_scene_service_
std::map< const moveit::core::LinkModel *, std::vector< std::pair< occupancy_map_monitor::ShapeHandle, std::size_t > > > LinkShapeHandles
double getDefaultAttachedObjectPadding() const
Get the default attached padding.
planning_scene::PlanningSceneConstPtr scene_const_
const std::shared_ptr< tf2_ros::Buffer > & getTFClient() const
Get the instance of the TF client that was passed to the constructor of this class.
rclcpp::Subscription< moveit_msgs::msg::CollisionObject >::SharedPtr collision_object_subscriber_
rclcpp::Subscription< moveit_msgs::msg::PlanningScene >::SharedPtr planning_scene_subscriber_
double getDefaultRobotPadding() const
Get the default robot padding.
std::shared_mutex scene_update_mutex_
if diffs are monitored, this is the pointer to the parent scene
std::shared_ptr< tf2_ros::TransformListener > tf_listener_
double getStateUpdateFrequency() const
Get the maximum frequency (Hz) at which the current state of the planning scene is updated.
std::shared_ptr< rclcpp::executors::SingleThreadedExecutor > private_executor_
const CurrentStateMonitorPtr & getStateMonitor() const
Get the stored instance of the stored current state monitor.
const planning_scene::PlanningSceneConstPtr & getPlanningScene() const
Avoid this function! Returns an unsafe pointer to the current planning scene.
std::map< const moveit::core::AttachedBody *, std::vector< std::pair< occupancy_map_monitor::ShapeHandle, std::size_t > > > AttachedBodyShapeHandles
double getDefaultObjectPadding() const
Get the default object padding.
std::map< std::string, double > default_robot_link_scale_
default robot link scale
rclcpp::Time last_robot_motion_time_
Last time the state was updated.
double getDefaultRobotScale() const
Get the default robot scaling.
const rclcpp::Time & getLastUpdateTime() const
Return the time when the last update was made to the planning scene (by any monitor)
std::string monitor_name_
The name of this scene monitor.
std::recursive_mutex update_lock_
lock access to update_callbacks_
rclcpp::Time last_update_time_
mutex for stored scene
std::unique_ptr< std::thread > publish_planning_scene_
std::shared_ptr< rclcpp::Node > node_
Last time the robot has moved.
rclcpp::Publisher< moveit_msgs::msg::PlanningScene >::SharedPtr planning_scene_publisher_
static const std::string DEFAULT_JOINT_STATES_TOPIC
The name of the topic used by default for receiving joint states.
std::vector< std::function< void(SceneUpdateType)> > update_callbacks_
double getPlanningScenePublishingFrequency() const
Get the maximum frequency at which planning scenes are published (Hz)
planning_scene::PlanningScenePtr parent_scene_
std::shared_ptr< tf2_ros::Buffer > tf_buffer_
void unlockSceneWrite()
Lock the scene from writing (only one thread can lock for writing and no other thread can lock for re...
rclcpp::Subscription< moveit_msgs::msg::PlanningSceneWorld >::SharedPtr planning_scene_world_subscriber_
const robot_model_loader::RobotModelLoaderPtr & getRobotModelLoader() const
Get the user kinematic model loader.
bool processAttachedCollisionObjectMsg(const planning_scene_monitor::PlanningSceneMonitorPtr &planning_scene_monitor, moveit_msgs::msg::AttachedCollisionObject &attached_collision_object_msg)
std::map< ShapeHandle, Eigen::Isometry3d, std::less< ShapeHandle >, Eigen::aligned_allocator< std::pair< const ShapeHandle, Eigen::Isometry3d > > > ShapeTransformCache
MOVEIT_CLASS_FORWARD(PlanningSceneMonitor)
name
Definition: setup.py:7
SingleUnlock(PlanningSceneMonitor *planning_scene_monitor, bool read_only)