Skip to content

Commit 33dbf96

Browse files
Initial thoughts for ObstacleLayer
Signed-off-by: elsayedelsheikh <elsayed.elsheikh97@gmail.com>
1 parent 2a80675 commit 33dbf96

File tree

4 files changed

+86
-37
lines changed

4 files changed

+86
-37
lines changed

nav2_costmap_2d/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ find_package(tf2_geometry_msgs REQUIRED)
2424
find_package(tf2_ros REQUIRED)
2525
find_package(tf2_sensor_msgs REQUIRED)
2626
find_package(visualization_msgs REQUIRED)
27+
find_package(point_cloud_transport REQUIRED)
2728

2829
nav2_package()
2930

@@ -82,6 +83,7 @@ target_link_libraries(layers PUBLIC
8283
nav2_voxel_grid::voxel_grid
8384
nav2_costmap_2d_core
8485
tf2::tf2
86+
point_cloud_transport::point_cloud_transport
8587
)
8688
target_link_libraries(layers PRIVATE
8789
pluginlib::pluginlib
@@ -201,6 +203,7 @@ ament_export_dependencies(
201203
tf2
202204
tf2_ros
203205
tf2_sensor_msgs
206+
point_cloud_transport
204207
)
205208
pluginlib_export_plugin_description_file(nav2_costmap_2d costmap_plugins.xml)
206209
ament_package()

nav2_costmap_2d/include/nav2_costmap_2d/obstacle_layer.hpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#pragma GCC diagnostic pop
5252

5353
#include "message_filters/subscriber.hpp"
54+
#include "point_cloud_transport/subscriber_filter.hpp"
5455

5556
#include "nav_msgs/msg/occupancy_grid.hpp"
5657
#include "sensor_msgs/msg/laser_scan.hpp"
@@ -236,12 +237,14 @@ class ObstacleLayer : public CostmapLayer
236237
laser_geometry::LaserProjection projector_;
237238
/// @brief Used for the observation message filters
238239
#if RCLCPP_VERSION_GTE(29, 6, 0)
239-
std::vector<std::shared_ptr<message_filters::SubscriberBase>>
240-
observation_subscribers_;
240+
std::shared_ptr<message_filters::Subscriber<sensor_msgs::msg::LaserScan>>
241+
observation_subscribers_laser_;
241242
#else
242-
std::vector<std::shared_ptr<message_filters::SubscriberBase<rclcpp_lifecycle::LifecycleNode>>>
243-
observation_subscribers_;
243+
std::shared_ptr<message_filters::Subscriber<sensor_msgs::msg::LaserScan,
244+
rclcpp_lifecycle::LifecycleNode>> observation_subscribers_laser_;
244245
#endif
246+
std::shared_ptr<point_cloud_transport::SubscriberFilter>
247+
observation_subscribers_pointcloud_;
245248
/// @brief Used to make sure that transforms are available for each sensor
246249
std::vector<std::shared_ptr<tf2_ros::MessageFilterBase>> observation_notifiers_;
247250
/// @brief Used to store observations from various sensors

nav2_costmap_2d/package.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
<depend>tf2_ros</depend>
4141
<depend>tf2_sensor_msgs</depend>
4242
<depend>visualization_msgs</depend>
43+
<depend>point_cloud_transport</depend>
44+
<depend>point_cloud_transport_plugins</depend>
4345

4446
<test_depend>ament_lint_common</test_depend>
4547
<test_depend>ament_lint_auto</test_depend>

nav2_costmap_2d/plugins/obstacle_layer.cpp

Lines changed: 74 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ void ObstacleLayer::onInitialize()
142142
while (ss >> source) {
143143
// get the parameters for the specific topic
144144
double observation_keep_time, expected_update_rate, min_obstacle_height, max_obstacle_height;
145-
std::string topic, sensor_frame, data_type;
145+
std::string topic, sensor_frame, data_type, point_cloud_transport;
146146
bool inf_is_valid, clearing, marking;
147147

148148
declareParameter(source + "." + "topic", rclcpp::ParameterValue(source));
@@ -159,6 +159,8 @@ void ObstacleLayer::onInitialize()
159159
declareParameter(source + "." + "obstacle_min_range", rclcpp::ParameterValue(0.0));
160160
declareParameter(source + "." + "raytrace_max_range", rclcpp::ParameterValue(3.0));
161161
declareParameter(source + "." + "raytrace_min_range", rclcpp::ParameterValue(0.0));
162+
declareParameter(source + "." + "point_cloud_transport",
163+
rclcpp::ParameterValue(std::string("raw")));
162164

163165
node->get_parameter(name_ + "." + source + "." + "topic", topic);
164166
node->get_parameter(name_ + "." + source + "." + "sensor_frame", sensor_frame);
@@ -174,6 +176,8 @@ void ObstacleLayer::onInitialize()
174176
node->get_parameter(name_ + "." + source + "." + "inf_is_valid", inf_is_valid);
175177
node->get_parameter(name_ + "." + source + "." + "marking", marking);
176178
node->get_parameter(name_ + "." + source + "." + "clearing", clearing);
179+
node->get_parameter(name_ + "." + source + "." + "point_cloud_transport",
180+
point_cloud_transport);
177181

178182
if (!(data_type == "PointCloud2" || data_type == "LaserScan")) {
179183
RCLCPP_FATAL(
@@ -278,36 +282,35 @@ void ObstacleLayer::onInitialize()
278282
observation_buffers_.back()));
279283
}
280284

281-
observation_subscribers_.push_back(sub);
285+
observation_subscribers_laser_ = std::move(sub);
282286

283287
observation_notifiers_.push_back(filter);
284288
observation_notifiers_.back()->setTolerance(rclcpp::Duration::from_seconds(
285289
tf_filter_tolerance));
286290

287291
} else {
288-
// For Kilted and Older Support from Message Filters API change
289-
#if RCLCPP_VERSION_GTE(29, 6, 0)
290-
std::shared_ptr<message_filters::Subscriber<sensor_msgs::msg::PointCloud2>> sub;
291-
#else
292-
std::shared_ptr<message_filters::Subscriber<sensor_msgs::msg::PointCloud2,
293-
rclcpp_lifecycle::LifecycleNode>> sub;
294-
#endif
295-
296-
// For Kilted compatibility in Message Filters API change
297-
#if RCLCPP_VERSION_GTE(29, 6, 0)
298-
sub = std::make_shared<message_filters::Subscriber<sensor_msgs::msg::PointCloud2>>(
299-
node, topic, custom_qos_profile, sub_opt);
300-
// For Jazzy compatibility in Message Filters API change
301-
#elif RCLCPP_VERSION_GTE(29, 0, 0)
302-
sub = std::make_shared<message_filters::Subscriber<sensor_msgs::msg::PointCloud2,
303-
rclcpp_lifecycle::LifecycleNode>>(node, topic, custom_qos_profile, sub_opt);
304-
// For Humble and Older compatibility in Message Filters API change
305-
#else
306-
sub = std::make_shared<message_filters::Subscriber<sensor_msgs::msg::PointCloud2,
307-
rclcpp_lifecycle::LifecycleNode>>(
308-
node, topic, custom_qos_profile.get_rmw_qos_profile(), sub_opt);
309-
#endif
310-
292+
std::shared_ptr<rclcpp::node_interfaces::NodeInterfaces<
293+
rclcpp::node_interfaces::NodeBaseInterface,
294+
rclcpp::node_interfaces::NodeParametersInterface,
295+
rclcpp::node_interfaces::NodeTopicsInterface,
296+
rclcpp::node_interfaces::NodeLoggingInterface
297+
>> node_interfaces = std::make_shared<
298+
rclcpp::node_interfaces::NodeInterfaces<
299+
rclcpp::node_interfaces::NodeBaseInterface,
300+
rclcpp::node_interfaces::NodeParametersInterface,
301+
rclcpp::node_interfaces::NodeTopicsInterface,
302+
rclcpp::node_interfaces::NodeLoggingInterface
303+
>
304+
>(
305+
node->get_node_base_interface(),
306+
node->get_node_parameters_interface(),
307+
node->get_node_topics_interface(),
308+
node->get_node_logging_interface()
309+
);
310+
std::shared_ptr<point_cloud_transport::SubscriberFilter> sub;
311+
sub = std::make_shared<point_cloud_transport::SubscriberFilter>(
312+
node_interfaces, topic,
313+
point_cloud_transport);
311314
sub->unsubscribe();
312315

313316
if (inf_is_valid) {
@@ -327,7 +330,7 @@ void ObstacleLayer::onInitialize()
327330
&ObstacleLayer::pointCloud2Callback, this, std::placeholders::_1,
328331
observation_buffers_.back()));
329332

330-
observation_subscribers_.push_back(sub);
333+
observation_subscribers_pointcloud_ = std::move(sub);
331334
observation_notifiers_.push_back(filter);
332335
}
333336

@@ -771,21 +774,59 @@ ObstacleLayer::activate()
771774
}
772775

773776
// if we're stopped we need to re-subscribe to topics
774-
for (unsigned int i = 0; i < observation_subscribers_.size(); ++i) {
775-
if (observation_subscribers_[i] != NULL) {
776-
observation_subscribers_[i]->subscribe();
777+
if (observation_subscribers_laser_ != NULL) {
778+
observation_subscribers_laser_->subscribe();
779+
}
780+
781+
if (observation_subscribers_pointcloud_ != NULL) {
782+
auto node = node_.lock();
783+
if (!node) {
784+
throw std::runtime_error{"Failed to lock node"};
777785
}
786+
std::shared_ptr<rclcpp::node_interfaces::NodeInterfaces<
787+
rclcpp::node_interfaces::NodeBaseInterface,
788+
rclcpp::node_interfaces::NodeParametersInterface,
789+
rclcpp::node_interfaces::NodeTopicsInterface,
790+
rclcpp::node_interfaces::NodeLoggingInterface
791+
>> node_interfaces = std::make_shared<
792+
rclcpp::node_interfaces::NodeInterfaces<
793+
rclcpp::node_interfaces::NodeBaseInterface,
794+
rclcpp::node_interfaces::NodeParametersInterface,
795+
rclcpp::node_interfaces::NodeTopicsInterface,
796+
rclcpp::node_interfaces::NodeLoggingInterface
797+
>
798+
>(
799+
node->get_node_base_interface(),
800+
node->get_node_parameters_interface(),
801+
node->get_node_topics_interface(),
802+
node->get_node_logging_interface()
803+
);
804+
805+
rmw_qos_profile_t custom_qos = rmw_qos_profile_sensor_data;
806+
custom_qos.depth = 50;
807+
auto sub_opt = rclcpp::SubscriptionOptions();
808+
sub_opt.callback_group = callback_group_;
809+
810+
// PCT->getTopic() method doesn't work correctly
811+
observation_subscribers_pointcloud_->subscribe(
812+
node_interfaces,
813+
"/rgbd_camera/points",
814+
observation_subscribers_pointcloud_->getTransport(),
815+
custom_qos,
816+
sub_opt
817+
);
778818
}
779819
resetBuffersLastUpdated();
780820
}
781821

782822
void
783823
ObstacleLayer::deactivate()
784824
{
785-
for (unsigned int i = 0; i < observation_subscribers_.size(); ++i) {
786-
if (observation_subscribers_[i] != NULL) {
787-
observation_subscribers_[i]->unsubscribe();
788-
}
825+
if (observation_subscribers_laser_ != NULL) {
826+
observation_subscribers_laser_->unsubscribe();
827+
}
828+
if (observation_subscribers_pointcloud_ != NULL) {
829+
observation_subscribers_pointcloud_->unsubscribe();
789830
}
790831
}
791832

0 commit comments

Comments
 (0)