collision_check.cpp
Go to the documentation of this file.
1 /*******************************************************************************
2  * BSD 3-Clause License
3  *
4  * Copyright (c) 2019, Los Alamos National Security, LLC
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 are met:
9  *
10  * * Redistributions of source code must retain the above copyright notice, this
11  * list of conditions and the following disclaimer.
12  *
13  * * Redistributions in binary form must reproduce the above copyright notice,
14  * this list of conditions and the following disclaimer in the documentation
15  * and/or other materials provided with the distribution.
16  *
17  * * Neither the name of the copyright holder nor the names of its
18  * contributors may be used to endorse or promote products derived from
19  * this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *******************************************************************************/
33 
34 /* Title : collision_check.cpp
35  * Project : moveit_servo
36  * Created : 1/11/2019
37  * Author : Brian O'Neil, Andy Zelenak, Blake Anderson
38  */
39 
40 #include <std_msgs/Float64.h>
41 
44 
45 static const char LOGNAME[] = "collision_check";
46 static const double MIN_RECOMMENDED_COLLISION_RATE = 10;
47 constexpr double EPSILON = 1e-6; // For very small numeric comparisons
48 constexpr size_t ROS_LOG_THROTTLE_PERIOD = 30; // Seconds to throttle logs inside loops
49 
50 namespace moveit_servo
51 {
52 // Constructor for the class that handles collision checking
54  const planning_scene_monitor::PlanningSceneMonitorPtr& planning_scene_monitor)
55  : nh_(nh)
56  , parameters_(parameters)
57  , planning_scene_monitor_(planning_scene_monitor)
58  , self_velocity_scale_coefficient_(-log(0.001) / parameters.self_collision_proximity_threshold)
59  , scene_velocity_scale_coefficient_(-log(0.001) / parameters.scene_collision_proximity_threshold)
60  , period_(1. / parameters_.collision_check_rate)
61 {
62  // Init collision request
64  collision_request_.distance = true; // enable distance-based collision checking
65  collision_request_.contacts = true; // Record the names of collision pairs
66 
69  "Collision check rate is low, increase it in yaml file if CPU allows");
70 
74 
75  // Internal namespace
76  ros::NodeHandle internal_nh(nh_, "internal");
77  collision_velocity_scale_pub_ = internal_nh.advertise<std_msgs::Float64>("collision_velocity_scale", ROS_QUEUE_SIZE);
79  internal_nh.subscribe("worst_case_stop_time", ROS_QUEUE_SIZE, &CollisionCheck::worstCaseStopTimeCB, this);
80 
81  // initialize current state buffer
82  current_state_ = planning_scene_monitor_->getStateMonitor()->getCurrentState();
83 }
84 
86 {
88 }
89 
91 {
93 }
94 
95 void CollisionCheck::run(const ros::TimerEvent& timer_event)
96 {
97  // Log warning when the last loop duration was longer than the period
98  if (timer_event.profile.last_duration.toSec() > period_.toSec())
99  {
101  "last_duration: " << timer_event.profile.last_duration.toSec() << " ("
102  << period_.toSec() << ")");
103  }
104 
105  if (paused_)
106  {
107  return;
108  }
109 
110  // Get the latest current state (bypassing scene update throttling)
111  planning_scene_monitor_->getStateMonitor()->setToCurrentState(*current_state_);
112  current_state_->updateCollisionBodyTransforms();
113  collision_detected_ = false;
114 
115  {
116  auto scene = getLockedPlanningSceneRO();
117  auto& acm = scene->getAllowedCollisionMatrix();
118 
119  // Do a timer-safe distance-based collision detection
121  scene->getCollisionEnv()->checkRobotCollision(collision_request_, collision_result_, *current_state_, acm);
125 
126  // Self-collisions and scene collisions are checked separately so different thresholds can be used
128  scene->getCollisionEnvUnpadded()->checkSelfCollision(collision_request_, collision_result_, *current_state_, acm);
132  }
133 
134  velocity_scale_ = 1;
135  // If we're definitely in collision, stop immediately
137  {
138  velocity_scale_ = 0;
139  }
140  // If threshold distances were specified
142  {
143  // If we are far from a collision, velocity_scale should be 1.
144  // If we are very close to a collision, velocity_scale should be ~zero.
145  // When scene_collision_proximity_threshold is breached, start decelerating exponentially.
147  {
148  // velocity_scale = e ^ k * (collision_distance - threshold)
149  // k = - ln(0.001) / collision_proximity_threshold
150  // velocity_scale should equal one when collision_distance is at collision_proximity_threshold.
151  // velocity_scale should equal 0.001 when collision_distance is at zero.
155  }
156 
158  {
162  }
163  }
164  // Else, we stop based on worst-case stopping distance
165  else
166  {
167  // Retrieve the worst-case time to stop, based on current joint velocities
168 
169  // Calculate rate of change of distance to nearest collision
172 
175  {
176  velocity_scale_ = 0;
177  }
178  // Only bother doing calculations if we are moving toward the nearest collision
180  {
181  // At the rate the collision distance is decreasing, how long until we collide?
183 
184  // halt if we can't stop fast enough (including the safety factor)
186  {
187  velocity_scale_ = 0;
188  }
189  }
190 
191  // Update for the next iteration
193  }
194 
195  // publish message
196  {
197  auto msg = moveit::util::make_shared_from_pool<std_msgs::Float64>();
198  msg->data = velocity_scale_;
200  }
201 }
202 
203 void CollisionCheck::worstCaseStopTimeCB(const std_msgs::Float64ConstPtr& msg)
204 {
205  worst_case_stop_time_ = msg->data;
206 }
207 
208 void CollisionCheck::setPaused(bool paused)
209 {
210  paused_ = paused;
211 }
212 
213 } // namespace moveit_servo
ROS_WARN_STREAM_THROTTLE_NAMED
#define ROS_WARN_STREAM_THROTTLE_NAMED(period, name, args)
planning_scene_monitor
moveit_servo::CollisionCheck::parameters_
const ServoParameters & parameters_
Definition: collision_check.h:129
moveit_servo::K_STOP_DISTANCE
@ K_STOP_DISTANCE
Definition: collision_check.h:127
moveit_servo::CollisionCheck::setPaused
void setPaused(bool paused)
Pause or unpause processing servo commands while keeping the timers alive.
Definition: collision_check.cpp:208
moveit_servo::ROS_QUEUE_SIZE
constexpr size_t ROS_QUEUE_SIZE
Definition: servo_parameters.h:80
moveit_servo::CollisionCheck::current_state_
robot_state::RobotStatePtr current_state_
Definition: collision_check.h:135
moveit_servo::CollisionCheck::start
void start()
start the Timer that regulates collision check rate
Definition: collision_check.cpp:90
ros::TimerEvent::last_duration
WallDuration last_duration
moveit_servo::CollisionCheck::self_velocity_scale_coefficient_
const double self_velocity_scale_coefficient_
Definition: collision_check.h:155
moveit_servo::ServoParameters::self_collision_proximity_threshold
double self_collision_proximity_threshold
Definition: servo_parameters.h:116
moveit_servo::ServoParameters::move_group_name
std::string move_group_name
Definition: servo_parameters.h:85
moveit_servo::CollisionCheck::scene_velocity_scale_coefficient_
const double scene_velocity_scale_coefficient_
Definition: collision_check.h:156
moveit_servo::CollisionCheck::nh_
ros::NodeHandle nh_
Definition: collision_check.h:126
moveit_servo::CollisionCheck::prev_collision_distance_
double prev_collision_distance_
Definition: collision_check.h:150
moveit_servo::CollisionCheck::current_collision_distance_
double current_collision_distance_
Definition: collision_check.h:148
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
make_shared_from_pool.h
ROS_LOG_THROTTLE_PERIOD
constexpr size_t ROS_LOG_THROTTLE_PERIOD
Definition: collision_check.cpp:48
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
moveit_servo::CollisionCheck::CollisionCheck
CollisionCheck(ros::NodeHandle &nh, const moveit_servo::ServoParameters &parameters, const planning_scene_monitor::PlanningSceneMonitorPtr &planning_scene_monitor)
Constructor.
Definition: collision_check.cpp:53
moveit_servo::CollisionCheck::collision_detected_
bool collision_detected_
Definition: collision_check.h:144
moveit_servo::ServoParameters::collision_check_type
std::string collision_check_type
Definition: servo_parameters.h:113
moveit_servo::CollisionCheck::planning_scene_monitor_
planning_scene_monitor::PlanningSceneMonitorPtr planning_scene_monitor_
Definition: collision_check.h:132
collision_detection::CollisionRequest::distance
bool distance
LOGNAME
static const char LOGNAME[]
Definition: collision_check.cpp:45
moveit_servo::ServoParameters
Definition: servo_parameters.h:83
moveit_servo::K_THRESHOLD_DISTANCE
@ K_THRESHOLD_DISTANCE
Definition: collision_check.h:126
moveit_servo::CollisionCheck::collision_result_
collision_detection::CollisionResult collision_result_
Definition: collision_check.h:160
moveit_servo
Definition: collision_check.h:50
moveit_servo::CollisionCheck::velocity_scale_
double velocity_scale_
Definition: collision_check.h:141
collision_detection::CollisionRequest::group_name
std::string group_name
moveit_servo::CollisionCheck::collision_request_
collision_detection::CollisionRequest collision_request_
Definition: collision_check.h:159
moveit_servo::CollisionCheck::worst_case_stop_time_sub_
ros::Subscriber worst_case_stop_time_sub_
Definition: collision_check.h:167
moveit_servo::CollisionCheck::run
void run(const ros::TimerEvent &timer_event)
Run one iteration of collision checking.
Definition: collision_check.cpp:95
ros::NodeHandle::subscribe
Subscriber subscribe(const std::string &topic, uint32_t queue_size, const boost::function< void(C)> &callback, const VoidConstPtr &tracked_object=VoidConstPtr(), const TransportHints &transport_hints=TransportHints())
ros::TimerEvent
moveit_servo::CollisionCheck::est_time_to_collision_
double est_time_to_collision_
Definition: collision_check.h:151
moveit_servo::ServoParameters::scene_collision_proximity_threshold
double scene_collision_proximity_threshold
Definition: servo_parameters.h:115
moveit_servo::ServoParameters::collision_check_rate
double collision_check_rate
Definition: servo_parameters.h:114
ros::TimerEvent::profile
struct ros::TimerEvent::@0 profile
moveit_servo::ServoParameters::min_allowable_collision_distance
double min_allowable_collision_distance
Definition: servo_parameters.h:118
moveit_servo::CollisionCheck::safety_factor_
double safety_factor_
Definition: collision_check.h:152
collision_check.h
EPSILON
constexpr double EPSILON
Definition: collision_check.cpp:47
moveit_servo::CollisionCheck::worst_case_stop_time_
double worst_case_stop_time_
Definition: collision_check.h:153
moveit_servo::CollisionCheck::scene_collision_distance_
double scene_collision_distance_
Definition: collision_check.h:143
moveit_servo::CollisionCheck::worstCaseStopTimeCB
void worstCaseStopTimeCB(const std_msgs::Float64ConstPtr &msg)
Callback for stopping time, from the thread that is aware of velocity and acceleration.
Definition: collision_check.cpp:203
moveit_servo::ServoParameters::collision_distance_safety_factor
double collision_distance_safety_factor
Definition: servo_parameters.h:117
planning_scene_monitor::LockedPlanningSceneRO
collision_detection::CollisionRequest::contacts
bool contacts
moveit_servo::CollisionCheck::paused_
bool paused_
Definition: collision_check.h:145
moveit_servo::CollisionCheck::collision_check_type_
CollisionCheckType collision_check_type_
Definition: collision_check.h:140
collision_detection::CollisionResult::collision
bool collision
DurationBase< WallDuration >::toSec
double toSec() const
moveit_servo::CollisionCheck::self_collision_distance_
double self_collision_distance_
Definition: collision_check.h:142
collision_detection::CollisionResult::print
void print() const
moveit_servo::CollisionCheck::getLockedPlanningSceneRO
planning_scene_monitor::LockedPlanningSceneRO getLockedPlanningSceneRO() const
Get a read-only copy of the planning scene.
Definition: collision_check.cpp:85
collision_detection::CollisionResult::clear
EIGEN_MAKE_ALIGNED_OPERATOR_NEW void clear()
moveit_servo::CollisionCheck::collision_velocity_scale_pub_
ros::Publisher collision_velocity_scale_pub_
Definition: collision_check.h:166
ros::NodeHandle::createTimer
Timer createTimer(Duration period, const TimerCallback &callback, bool oneshot=false, bool autostart=true) const
moveit_servo::CollisionCheck::derivative_of_collision_distance_
double derivative_of_collision_distance_
Definition: collision_check.h:149
MIN_RECOMMENDED_COLLISION_RATE
static const double MIN_RECOMMENDED_COLLISION_RATE
Definition: collision_check.cpp:46
collision_detection::CollisionResult::distance
double distance
moveit_servo::CollisionCheck::timer_
ros::Timer timer_
Definition: collision_check.h:163
ros::NodeHandle
moveit_servo::CollisionCheck::period_
ros::Duration period_
Definition: collision_check.h:164


moveit_servo
Author(s): Brian O'Neil, Andy Zelenak , Blake Anderson, Alexander Rössler , Tyler Weaver
autogenerated on Sat May 3 2025 02:27:56