2 #include <std_msgs/Time.h> 9 m_node_handle.subscribe<sensor_msgs::LaserScan>(
TOPIC_LASER_SCAN, 1, &EmergencyStop::lidarCallback,
this);
12 this->updateDynamicConfig();
14 m_dyn_cfg_server.setCallback([&](emergency_stop::emergency_stopConfig& cfg, uint32_t) {
15 m_range_threshold = cfg.range_threshold;
16 m_car_bumper_length = cfg.car_bumper_length;
17 m_max_range = cfg.max_range;
21 bool EmergencyStop::emergencyStop(
const sensor_msgs::LaserScan::ConstPtr& lidar)
23 ROS_ASSERT_MSG(m_range_threshold <= m_max_range,
24 "Threshold is bigger then max range. Function will always return false.");
25 ROS_ASSERT_MSG(m_max_range > 0,
"Max range is zero or below. Function will mostly return true.");
26 ROS_ASSERT_MSG(m_range_threshold > 0,
"Threshold is zero or below. Function will mostly return false.");
28 int available_samples = (lidar->angle_max - lidar->angle_min) / lidar->angle_increment;
33 float sample_angle = std::atan(m_car_bumper_length / 2 / m_range_threshold);
35 int index_start = available_samples / 2 - sample_angle / lidar->angle_increment / 2;
36 int index_end = available_samples / 2 + sample_angle / lidar->angle_increment / 2;
37 ROS_ASSERT_MSG(index_start >= 0 && index_end < available_samples,
38 "sample_angle is too big. Trying to access lidar samples out of bounds.");
44 auto min_range = std::min(m_max_range, *std::min_element(lidar->ranges.begin() + index_start,
45 lidar->ranges.begin() + index_end));
46 ROS_ASSERT_MSG(min_range >= 0,
"The minimal distance between the car and a potential obstacle is below zero.");
48 const float car_bumper_length_half = m_car_bumper_length / 2;
55 if (!(min_range < m_range_threshold))
63 this->m_debug_geometry.
drawLine(0,
createPoint(m_range_threshold, -car_bumper_length_half, 0),
64 createPoint(m_range_threshold, car_bumper_length_half, 0),
68 return min_range < m_range_threshold;
71 void EmergencyStop::lidarCallback(
const sensor_msgs::LaserScan::ConstPtr& lidar)
73 bool emergency_stop_active = emergencyStop(lidar);
77 : this->m_emergency_status;
79 if (emergency_stop_active)
83 ROS_WARN_STREAM(
"Wall detected. Emergency stop is active.");
88 message.data = ros::Time::now();
90 m_emergency_stop_publisher.publish(message);
96 ROS_WARN_STREAM(
"Emergency stop is inactive.");
102 void EmergencyStop::updateDynamicConfig()
104 emergency_stop::emergency_stopConfig cfg;
106 cfg.range_threshold = m_range_threshold;
107 cfg.car_bumper_length = m_car_bumper_length;
108 cfg.max_range = m_max_range;
110 m_dyn_cfg_server.updateConfig(cfg);
113 int main(
int argc,
char** argv)
115 ros::init(argc, argv,
"emergency_stop");
constexpr const char * TOPIC_LASER_SCAN
int main(int argc, char **argv)
constexpr const char * LIDAR_FRAME
std_msgs::ColorRGBA createColor(double r, double g, double b, double a)
constexpr const char * TOPIC_VISUALIZATION
void drawLine(int id, geometry_msgs::Point point1, geometry_msgs::Point point2, std_msgs::ColorRGBA color, float width)
geometry_msgs::Point createPoint(float x, float y, float z)
constexpr const char * TOPIC_EMERGENCY_STOP