@@ -142,7 +142,7 @@ void ObstacleLayer::onInitialize()
142
142
while (ss >> source) {
143
143
// get the parameters for the specific topic
144
144
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 ;
146
146
bool inf_is_valid, clearing, marking;
147
147
148
148
declareParameter (source + " ." + " topic" , rclcpp::ParameterValue (source));
@@ -159,6 +159,8 @@ void ObstacleLayer::onInitialize()
159
159
declareParameter (source + " ." + " obstacle_min_range" , rclcpp::ParameterValue (0.0 ));
160
160
declareParameter (source + " ." + " raytrace_max_range" , rclcpp::ParameterValue (3.0 ));
161
161
declareParameter (source + " ." + " raytrace_min_range" , rclcpp::ParameterValue (0.0 ));
162
+ declareParameter (source + " ." + " point_cloud_transport" ,
163
+ rclcpp::ParameterValue (std::string (" raw" )));
162
164
163
165
node->get_parameter (name_ + " ." + source + " ." + " topic" , topic);
164
166
node->get_parameter (name_ + " ." + source + " ." + " sensor_frame" , sensor_frame);
@@ -174,6 +176,8 @@ void ObstacleLayer::onInitialize()
174
176
node->get_parameter (name_ + " ." + source + " ." + " inf_is_valid" , inf_is_valid);
175
177
node->get_parameter (name_ + " ." + source + " ." + " marking" , marking);
176
178
node->get_parameter (name_ + " ." + source + " ." + " clearing" , clearing);
179
+ node->get_parameter (name_ + " ." + source + " ." + " point_cloud_transport" ,
180
+ point_cloud_transport);
177
181
178
182
if (!(data_type == " PointCloud2" || data_type == " LaserScan" )) {
179
183
RCLCPP_FATAL (
@@ -278,36 +282,35 @@ void ObstacleLayer::onInitialize()
278
282
observation_buffers_.back ()));
279
283
}
280
284
281
- observation_subscribers_. push_back (sub);
285
+ observation_subscribers_laser_ = std::move (sub);
282
286
283
287
observation_notifiers_.push_back (filter);
284
288
observation_notifiers_.back ()->setTolerance (rclcpp::Duration::from_seconds (
285
289
tf_filter_tolerance));
286
290
287
291
} 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);
311
314
sub->unsubscribe ();
312
315
313
316
if (inf_is_valid) {
@@ -327,7 +330,7 @@ void ObstacleLayer::onInitialize()
327
330
&ObstacleLayer::pointCloud2Callback, this , std::placeholders::_1,
328
331
observation_buffers_.back ()));
329
332
330
- observation_subscribers_. push_back (sub);
333
+ observation_subscribers_pointcloud_ = std::move (sub);
331
334
observation_notifiers_.push_back (filter);
332
335
}
333
336
@@ -771,21 +774,59 @@ ObstacleLayer::activate()
771
774
}
772
775
773
776
// 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" };
777
785
}
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
+ );
778
818
}
779
819
resetBuffersLastUpdated ();
780
820
}
781
821
782
822
void
783
823
ObstacleLayer::deactivate ()
784
824
{
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 ();
789
830
}
790
831
}
791
832
0 commit comments