Skip to content

Commit 15c261c

Browse files
author
Tony Najjar
committed
Merge branch 'add-collision-points-debug' into add-polygon-source
2 parents 5a63584 + 58a394e commit 15c261c

File tree

8 files changed

+111
-4
lines changed

8 files changed

+111
-4
lines changed

nav2_collision_monitor/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ find_package(nav2_common REQUIRED)
1515
find_package(nav2_util REQUIRED)
1616
find_package(nav2_costmap_2d REQUIRED)
1717
find_package(nav2_msgs REQUIRED)
18+
find_package(visualization_msgs REQUIRED)
1819

1920
### Header ###
2021

@@ -37,6 +38,7 @@ set(dependencies
3738
nav2_util
3839
nav2_costmap_2d
3940
nav2_msgs
41+
visualization_msgs
4042
)
4143

4244
set(monitor_executable_name collision_monitor)

nav2_collision_monitor/include/nav2_collision_monitor/collision_detector_node.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#include "nav2_util/lifecycle_node.hpp"
3030
#include "nav2_msgs/msg/collision_detector_state.hpp"
31+
#include "visualization_msgs/msg/marker_array.hpp"
3132

3233
#include "nav2_collision_monitor/types.hpp"
3334
#include "nav2_collision_monitor/polygon.hpp"
@@ -147,11 +148,16 @@ class CollisionDetector : public nav2_util::LifecycleNode
147148
/// @brief collision monitor state publisher
148149
rclcpp_lifecycle::LifecyclePublisher<nav2_msgs::msg::CollisionDetectorState>::SharedPtr
149150
state_pub_;
151+
/// @brief Collision points marker publisher
152+
rclcpp_lifecycle::LifecyclePublisher<visualization_msgs::msg::MarkerArray>::SharedPtr
153+
collision_points_marker_pub_;
150154
/// @brief timer that runs actions
151155
rclcpp::TimerBase::SharedPtr timer_;
152156

153157
/// @brief main loop frequency
154158
double frequency_;
159+
/// @brief whether to publish collision points
160+
bool visualize_collision_points_;
155161
}; // class CollisionDetector
156162

157163
} // namespace nav2_collision_monitor

nav2_collision_monitor/include/nav2_collision_monitor/collision_monitor_node.hpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "rclcpp/rclcpp.hpp"
2323
#include "geometry_msgs/msg/twist.hpp"
24+
#include "visualization_msgs/msg/marker_array.hpp"
2425

2526
#include "tf2/time.h"
2627
#include "tf2_ros/buffer.h"
@@ -108,12 +109,15 @@ class CollisionMonitor : public nav2_util::LifecycleNode
108109
* @param cmd_vel_in_topic Output name of cmd_vel_in topic
109110
* @param cmd_vel_out_topic Output name of cmd_vel_out topic
110111
* is required.
112+
* @param state_topic topic name for publishing collision monitor state
113+
* @param visualize_collision_points boolean flag to enable/disable collision points visualization
111114
* @return True if all parameters were obtained or false in failure case
112115
*/
113116
bool getParameters(
114117
std::string & cmd_vel_in_topic,
115118
std::string & cmd_vel_out_topic,
116-
std::string & state_topic);
119+
std::string & state_topic,
120+
bool & visualize_collision_points);
117121
/**
118122
* @brief Supporting routine creating and configuring all polygons
119123
* @param base_frame_id Robot base frame ID
@@ -211,6 +215,10 @@ class CollisionMonitor : public nav2_util::LifecycleNode
211215
rclcpp_lifecycle::LifecyclePublisher<nav2_msgs::msg::CollisionMonitorState>::SharedPtr
212216
state_pub_;
213217

218+
/// @brief Collision points marker publisher
219+
rclcpp_lifecycle::LifecyclePublisher<visualization_msgs::msg::MarkerArray>::SharedPtr
220+
collision_points_marker_pub_;
221+
214222
/// @brief Whether main routine is active
215223
bool process_active_;
216224

nav2_collision_monitor/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<depend>nav2_util</depend>
2222
<depend>nav2_costmap_2d</depend>
2323
<depend>nav2_msgs</depend>
24+
<depend>visualization_msgs</depend>
2425

2526
<test_depend>ament_cmake_gtest</test_depend>
2627
<test_depend>ament_lint_common</test_depend>

nav2_collision_monitor/params/collision_detector_params.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ collision_detector:
66
transform_tolerance: 0.5
77
source_timeout: 5.0
88
base_shift_correction: True
9+
visualize_collision_points: False
910
polygons: ["PolygonFront"]
1011
PolygonFront:
1112
type: "polygon"

nav2_collision_monitor/params/collision_monitor_params.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ collision_monitor:
88
transform_tolerance: 0.5
99
source_timeout: 5.0
1010
base_shift_correction: True
11+
visualize_collision_points: False
1112
stop_pub_timeout: 2.0
1213
# Polygons represent zone around the robot for "stop", "slowdown" and "limit" action types,
1314
# and robot footprint for "approach" action type.

nav2_collision_monitor/src/collision_detector_node.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ CollisionDetector::on_configure(const rclcpp_lifecycle::State & /*state*/)
5555
state_pub_ = this->create_publisher<nav2_msgs::msg::CollisionDetectorState>(
5656
"collision_detector_state", rclcpp::SystemDefaultsQoS());
5757

58+
if (visualize_collision_points_) {
59+
collision_points_marker_pub_ = this->create_publisher<visualization_msgs::msg::MarkerArray>(
60+
"collision_points_marker", 1);
61+
}
62+
5863
// Obtaining ROS parameters
5964
if (!getParameters()) {
6065
return nav2_util::CallbackReturn::FAILURE;
@@ -70,6 +75,9 @@ CollisionDetector::on_activate(const rclcpp_lifecycle::State & /*state*/)
7075

7176
// Activating lifecycle publisher
7277
state_pub_->on_activate();
78+
if (collision_points_marker_pub_) {
79+
collision_points_marker_pub_->on_activate();
80+
}
7381

7482
// Activating polygons
7583
for (std::shared_ptr<Polygon> polygon : polygons_) {
@@ -97,6 +105,9 @@ CollisionDetector::on_deactivate(const rclcpp_lifecycle::State & /*state*/)
97105

98106
// Deactivating lifecycle publishers
99107
state_pub_->on_deactivate();
108+
if (collision_points_marker_pub_) {
109+
collision_points_marker_pub_->on_deactivate();
110+
}
100111

101112
// Deactivating polygons
102113
for (std::shared_ptr<Polygon> polygon : polygons_) {
@@ -115,6 +126,7 @@ CollisionDetector::on_cleanup(const rclcpp_lifecycle::State & /*state*/)
115126
RCLCPP_INFO(get_logger(), "Cleaning up");
116127

117128
state_pub_.reset();
129+
collision_points_marker_pub_.reset();
118130

119131
polygons_.clear();
120132
sources_.clear();
@@ -143,6 +155,9 @@ bool CollisionDetector::getParameters()
143155
nav2_util::declare_parameter_if_not_declared(
144156
node, "frequency", rclcpp::ParameterValue(10.0));
145157
frequency_ = get_parameter("frequency").as_double();
158+
nav2_util::declare_parameter_if_not_declared(
159+
node, "visualize_collision_points", rclcpp::ParameterValue(false));
160+
visualize_collision_points_ = get_parameter("visualize_collision_points").as_bool();
146161
nav2_util::declare_parameter_if_not_declared(
147162
node, "base_frame_id", rclcpp::ParameterValue("base_footprint"));
148163
base_frame_id = get_parameter("base_frame_id").as_string();
@@ -309,6 +324,33 @@ void CollisionDetector::process()
309324
}
310325
}
311326

327+
if (collision_points_marker_pub_) {
328+
// visualize collision points with markers
329+
visualization_msgs::msg::MarkerArray marker_array;
330+
visualization_msgs::msg::Marker marker;
331+
marker.header.frame_id = get_parameter("base_frame_id").as_string();
332+
marker.header.stamp = rclcpp::Time(0, 0);
333+
marker.ns = "collision_points";
334+
marker.id = 0;
335+
marker.type = visualization_msgs::msg::Marker::POINTS;
336+
marker.action = visualization_msgs::msg::Marker::ADD;
337+
marker.scale.x = 0.02;
338+
marker.scale.y = 0.02;
339+
marker.color.r = 1.0;
340+
marker.color.a = 1.0;
341+
marker.lifetime = rclcpp::Duration(0, 0);
342+
343+
for (const auto & point : collision_points) {
344+
geometry_msgs::msg::Point p;
345+
p.x = point.x;
346+
p.y = point.y;
347+
p.z = 0.0;
348+
marker.points.push_back(p);
349+
}
350+
marker_array.markers.push_back(marker);
351+
collision_points_marker_pub_->publish(marker_array);
352+
}
353+
312354
std::unique_ptr<nav2_msgs::msg::CollisionDetectorState> state_msg =
313355
std::make_unique<nav2_msgs::msg::CollisionDetectorState>();
314356

nav2_collision_monitor/src/collision_monitor_node.cpp

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,13 @@ CollisionMonitor::on_configure(const rclcpp_lifecycle::State & /*state*/)
5757
std::string cmd_vel_in_topic;
5858
std::string cmd_vel_out_topic;
5959
std::string state_topic;
60+
bool visualize_collision_points;
6061

6162
// Obtaining ROS parameters
62-
if (!getParameters(cmd_vel_in_topic, cmd_vel_out_topic, state_topic)) {
63+
if (!getParameters(
64+
cmd_vel_in_topic, cmd_vel_out_topic, state_topic,
65+
visualize_collision_points))
66+
{
6367
return nav2_util::CallbackReturn::FAILURE;
6468
}
6569

@@ -68,11 +72,16 @@ CollisionMonitor::on_configure(const rclcpp_lifecycle::State & /*state*/)
6872
std::bind(&CollisionMonitor::cmdVelInCallback, this, std::placeholders::_1));
6973
cmd_vel_out_pub_ = this->create_publisher<geometry_msgs::msg::Twist>(
7074
cmd_vel_out_topic, 1);
75+
7176
if (!state_topic.empty()) {
7277
state_pub_ = this->create_publisher<nav2_msgs::msg::CollisionMonitorState>(
7378
state_topic, 1);
7479
}
7580

81+
if (visualize_collision_points) {
82+
collision_points_marker_pub_ = this->create_publisher<visualization_msgs::msg::MarkerArray>(
83+
"collision_points_marker", 1);
84+
}
7685
return nav2_util::CallbackReturn::SUCCESS;
7786
}
7887

@@ -86,6 +95,9 @@ CollisionMonitor::on_activate(const rclcpp_lifecycle::State & /*state*/)
8695
if (state_pub_) {
8796
state_pub_->on_activate();
8897
}
98+
if (collision_points_marker_pub_) {
99+
collision_points_marker_pub_->on_activate();
100+
}
89101

90102
// Activating polygons
91103
for (std::shared_ptr<Polygon> polygon : polygons_) {
@@ -126,7 +138,9 @@ CollisionMonitor::on_deactivate(const rclcpp_lifecycle::State & /*state*/)
126138
if (state_pub_) {
127139
state_pub_->on_deactivate();
128140
}
129-
141+
if (collision_points_marker_pub_) {
142+
collision_points_marker_pub_->on_deactivate();
143+
}
130144
// Destroying bond connection
131145
destroyBond();
132146

@@ -141,6 +155,7 @@ CollisionMonitor::on_cleanup(const rclcpp_lifecycle::State & /*state*/)
141155
cmd_vel_in_sub_.reset();
142156
cmd_vel_out_pub_.reset();
143157
state_pub_.reset();
158+
collision_points_marker_pub_.reset();
144159

145160
polygons_.clear();
146161
sources_.clear();
@@ -196,7 +211,8 @@ void CollisionMonitor::publishVelocity(const Action & robot_action)
196211
bool CollisionMonitor::getParameters(
197212
std::string & cmd_vel_in_topic,
198213
std::string & cmd_vel_out_topic,
199-
std::string & state_topic)
214+
std::string & state_topic,
215+
bool & visualize_collision_points)
200216
{
201217
std::string base_frame_id, odom_frame_id;
202218
tf2::Duration transform_tolerance;
@@ -213,6 +229,9 @@ bool CollisionMonitor::getParameters(
213229
nav2_util::declare_parameter_if_not_declared(
214230
node, "state_topic", rclcpp::ParameterValue(""));
215231
state_topic = get_parameter("state_topic").as_string();
232+
nav2_util::declare_parameter_if_not_declared(
233+
node, "visualize_collision_points", rclcpp::ParameterValue(false));
234+
visualize_collision_points = get_parameter("visualize_collision_points").as_bool();
216235

217236
nav2_util::declare_parameter_if_not_declared(
218237
node, "base_frame_id", rclcpp::ParameterValue("base_footprint"));
@@ -385,6 +404,33 @@ void CollisionMonitor::process(const Velocity & cmd_vel_in)
385404
}
386405
}
387406

407+
if (collision_points_marker_pub_) {
408+
// visualize collision points with markers
409+
visualization_msgs::msg::MarkerArray marker_array;
410+
visualization_msgs::msg::Marker marker;
411+
marker.header.frame_id = get_parameter("base_frame_id").as_string();
412+
marker.header.stamp = rclcpp::Time(0, 0);
413+
marker.ns = "collision_points";
414+
marker.id = 0;
415+
marker.type = visualization_msgs::msg::Marker::POINTS;
416+
marker.action = visualization_msgs::msg::Marker::ADD;
417+
marker.scale.x = 0.02;
418+
marker.scale.y = 0.02;
419+
marker.color.r = 1.0;
420+
marker.color.a = 1.0;
421+
marker.lifetime = rclcpp::Duration(0, 0);
422+
423+
for (const auto & point : collision_points) {
424+
geometry_msgs::msg::Point p;
425+
p.x = point.x;
426+
p.y = point.y;
427+
p.z = 0.0;
428+
marker.points.push_back(p);
429+
}
430+
marker_array.markers.push_back(marker);
431+
collision_points_marker_pub_->publish(marker_array);
432+
}
433+
388434
// By default - there is no action
389435
Action robot_action{DO_NOTHING, cmd_vel_in, ""};
390436
// Polygon causing robot action (if any)

0 commit comments

Comments
 (0)