Skip to content

Commit 855d440

Browse files
committed
feat: make concatenate node to publish pointclouds in sensor frame
Signed-off-by: yoshiri <yoshiyoshidetteiu@gmail.com>
1 parent 7081a61 commit 855d440

File tree

4 files changed

+47
-20
lines changed

4 files changed

+47
-20
lines changed

sensing/pointcloud_preprocessor/include/pointcloud_preprocessor/concatenate_data/concatenate_and_time_sync_nodelet.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class PointCloudConcatenateDataSynchronizerComponent : public rclcpp::Node
126126
double timeout_sec_ = 0.1;
127127

128128
bool publish_synchronized_pointcloud_;
129+
bool keep_input_frame_in_synchronized_pointcloud_;
129130
std::string synchronized_pointcloud_postfix_;
130131

131132
std::set<std::string> not_subscribed_topic_names_;

sensing/pointcloud_preprocessor/include/pointcloud_preprocessor/time_synchronizer/time_synchronizer_nodelet.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ class PointCloudDataSynchronizerComponent : public rclcpp::Node
138138

139139
/** \brief Output TF frame the concatenated points should be transformed to. */
140140
std::string output_frame_;
141+
bool keep_input_frame_in_synchronized_pointcloud_;
141142

142143
/** \brief Input point cloud topics. */
143144
// XmlRpc::XmlRpcValue input_topics_;

sensing/pointcloud_preprocessor/src/concatenate_data/concatenate_and_time_sync_nodelet.cpp

+32-19
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,9 @@ PointCloudConcatenateDataSynchronizerComponent::PointCloudConcatenateDataSynchro
112112
}
113113

114114
// Check if publish synchronized pointcloud
115-
publish_synchronized_pointcloud_ = declare_parameter("publish_synchronized_pointcloud", false);
115+
publish_synchronized_pointcloud_ = declare_parameter("publish_synchronized_pointcloud", true);
116+
keep_input_frame_in_synchronized_pointcloud_ =
117+
declare_parameter("keep_input_frame_in_synchronized_pointcloud", true);
116118
synchronized_pointcloud_postfix_ =
117119
declare_parameter("synchronized_pointcloud_postfix", "pointcloud");
118120
}
@@ -397,10 +399,22 @@ PointCloudConcatenateDataSynchronizerComponent::combineClouds(
397399
pcl::concatenatePointCloud(
398400
*concat_cloud_ptr, *transformed_delay_compensated_cloud_ptr, *concat_cloud_ptr);
399401
}
400-
// gather transformed clouds
401-
transformed_delay_compensated_cloud_ptr->header.stamp = oldest_stamp;
402-
transformed_delay_compensated_cloud_ptr->header.frame_id = output_frame_;
403-
transformed_clouds[e.first] = transformed_delay_compensated_cloud_ptr;
402+
// convert to original sensor frame if necessary
403+
if (keep_input_frame_in_synchronized_pointcloud_) {
404+
sensor_msgs::msg::PointCloud2::SharedPtr transformed_cloud_ptr_in_sensor_frame(
405+
new sensor_msgs::msg::PointCloud2());
406+
pcl_ros::transformPointCloud(
407+
(std::string)e.second->header.frame_id, *transformed_delay_compensated_cloud_ptr,
408+
*transformed_cloud_ptr_in_sensor_frame, *tf2_buffer_);
409+
transformed_cloud_ptr_in_sensor_frame->header.stamp = oldest_stamp;
410+
transformed_cloud_ptr_in_sensor_frame->header.frame_id = e.second->header.frame_id;
411+
transformed_clouds[e.first] = transformed_cloud_ptr_in_sensor_frame;
412+
} else {
413+
transformed_delay_compensated_cloud_ptr->header.stamp = oldest_stamp;
414+
transformed_delay_compensated_cloud_ptr->header.frame_id = output_frame_;
415+
transformed_clouds[e.first] = transformed_delay_compensated_cloud_ptr;
416+
}
417+
404418
} else {
405419
not_subscribed_topic_names_.insert(e.first);
406420
}
@@ -418,20 +432,6 @@ void PointCloudConcatenateDataSynchronizerComponent::publish()
418432
const auto & transformed_raw_points =
419433
PointCloudConcatenateDataSynchronizerComponent::combineClouds(concat_cloud_ptr);
420434

421-
for (const auto & e : cloud_stdmap_) {
422-
if (e.second != nullptr) {
423-
if (debug_publisher_) {
424-
const auto pipeline_latency_ms =
425-
std::chrono::duration<double, std::milli>(
426-
std::chrono::nanoseconds(
427-
(this->get_clock()->now() - e.second->header.stamp).nanoseconds()))
428-
.count();
429-
debug_publisher_->publish<tier4_debug_msgs::msg::Float64Stamped>(
430-
"debug" + e.first + "/pipeline_latency_ms", pipeline_latency_ms);
431-
}
432-
}
433-
}
434-
435435
// publish concatenated pointcloud
436436
if (concat_cloud_ptr) {
437437
auto output = std::make_unique<sensor_msgs::msg::PointCloud2>(*concat_cloud_ptr);
@@ -469,6 +469,19 @@ void PointCloudConcatenateDataSynchronizerComponent::publish()
469469
debug_publisher_->publish<tier4_debug_msgs::msg::Float64Stamped>(
470470
"debug/processing_time_ms", processing_time_ms);
471471
}
472+
for (const auto & e : cloud_stdmap_) {
473+
if (e.second != nullptr) {
474+
if (debug_publisher_) {
475+
const auto pipeline_latency_ms =
476+
std::chrono::duration<double, std::milli>(
477+
std::chrono::nanoseconds(
478+
(this->get_clock()->now() - e.second->header.stamp).nanoseconds()))
479+
.count();
480+
debug_publisher_->publish<tier4_debug_msgs::msg::Float64Stamped>(
481+
"debug" + e.first + "/pipeline_latency_ms", pipeline_latency_ms);
482+
}
483+
}
484+
}
472485
}
473486

474487
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

sensing/pointcloud_preprocessor/src/time_synchronizer/time_synchronizer_nodelet.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ PointCloudDataSynchronizerComponent::PointCloudDataSynchronizerComponent(
5858
std::string synchronized_pointcloud_postfix;
5959
{
6060
output_frame_ = static_cast<std::string>(declare_parameter("output_frame", ""));
61-
if (output_frame_.empty()) {
61+
keep_input_frame_in_synchronized_pointcloud_ =
62+
static_cast<bool>(declare_parameter("keep_input_frame_in_synchronized_pointcloud", false));
63+
if (output_frame_.empty() && !keep_input_frame_in_synchronized_pointcloud_) {
6264
RCLCPP_ERROR(get_logger(), "Need an 'output_frame' parameter to be set before continuing!");
6365
return;
6466
}
@@ -352,6 +354,16 @@ PointCloudDataSynchronizerComponent::synchronizeClouds()
352354
adjust_to_old_data_transform, *transformed_cloud_ptr,
353355
*transformed_delay_compensated_cloud_ptr);
354356

357+
if (keep_input_frame_in_synchronized_pointcloud_) {
358+
sensor_msgs::msg::PointCloud2::SharedPtr
359+
transformed_delay_compensated_cloud_ptr_in_input_frame(
360+
new sensor_msgs::msg::PointCloud2());
361+
transformPointCloud(
362+
transformed_delay_compensated_cloud_ptr,
363+
transformed_delay_compensated_cloud_ptr_in_input_frame, e.second->header.frame_id);
364+
transformed_delay_compensated_cloud_ptr =
365+
transformed_delay_compensated_cloud_ptr_in_input_frame;
366+
}
355367
// gather transformed clouds
356368
transformed_delay_compensated_cloud_ptr->header.stamp = oldest_stamp;
357369
transformed_delay_compensated_cloud_ptr->header.frame_id = output_frame_;

0 commit comments

Comments
 (0)