11#include <shared_mutex>
15#include <message_filters/subscriber.h>
16#include <message_filters/sync_policies/approximate_time.h>
17#include <message_filters/synchronizer.h>
18#include <pcl/point_cloud.h>
19#include <pcl/point_types.h>
20#include <pcl_conversions/pcl_conversions.h>
21#include <tf2_ros/buffer.h>
22#include <tf2_ros/transform_listener.h>
23#include <geometry_msgs/msg/transform_stamped.hpp>
24#include <point_cloud_transport/point_cloud_transport.hpp>
25#include <point_cloud_transport/subscriber_filter.hpp>
26#include <rclcpp/rclcpp.hpp>
27#include <tf2_sensor_msgs/tf2_sensor_msgs.hpp>
37template <
typename T,
typename A>
38struct is_vector<std::vector<T, A>> : std::true_type {};
73 const std::string& description,
74 const bool add_to_auto_reconfigurable_params =
true,
75 const bool is_required =
false,
76 const bool read_only =
false,
77 const std::optional<double>& from_value = std::nullopt,
78 const std::optional<double>& to_value = std::nullopt,
79 const std::optional<double>& step_value = std::nullopt,
80 const std::string& additional_constraints =
"");
88 rcl_interfaces::msg::SetParametersResult
parametersCallback(
const std::vector<rclcpp::Parameter>& parameters);
108 template <std::
size_t N>
134 bool collectTimingInfo(
const std::vector<PointCloudMsg::ConstSharedPtr>& msgs, FusionTiming& timing)
const;
145 PointCloudMsg::UniquePtr
fusePointCloudBatch(
const std::vector<PointCloudMsg::ConstSharedPtr>& msgs,
146 const FusionTiming& timing,
147 std::size_t& valid_point_count)
const;
150 PointCloudMsg::UniquePtr fusePointCloudBatchCUDA(
const std::vector<PointCloudMsg::ConstSharedPtr>& msgs,
151 const FusionTiming& timing,
152 std::size_t& valid_point_count)
const;
168 const FusionTiming& timing,
169 std::size_t input_count,
170 std::size_t total_points,
171 std::chrono::steady_clock::time_point callback_start,
172 std::chrono::steady_clock::time_point processing_start,
173 std::chrono::steady_clock::time_point processing_end,
174 const char* event_name);
272 std::unique_ptr<cuda::CudaTransformContext> cuda_context_;
273 std::mutex cuda_context_mutex_;
double range_limits_z_min_
static constexpr int32_t kMaxSyncQueueSize
void validateInputTopicsParameter() const
Validate that the configured input topic list is usable.
double max_time_diff_sec_
ROS parameters.
double range_limits_x_min_
static constexpr int32_t kStepSizeOutputQueueSize
double range_limits_y_max_
static constexpr int32_t kMinSyncQueueSize
static constexpr int32_t kMaxOutputQueueSize
static constexpr std::size_t kMaxInputTopics
static constexpr const char * kAllowedOutputStampModes
PointCloudMsg::UniquePtr fusePointCloudBatch(const std::vector< PointCloudMsg::ConstSharedPtr > &msgs, const FusionTiming &timing, std::size_t &valid_point_count) const
Fuse a synchronized point-cloud batch using the CPU path.
void validateRangeLimits()
Validate configured XYZ range limits and disable filtering when invalid.
static constexpr double kMinRangeZ
int64_t fixed_points_per_input_cloud_
std::vector< std::string > output_fields_
void handleSynchronizedPointClouds(const std::vector< sensor_msgs::msg::PointCloud2::ConstSharedPtr > &msgs)
Process synchronized point clouds.
void configureOutputStampMode(const std::string &mode)
Parse and store the configured output timestamp mode.
std::string target_frame_
void declareAndLoadParameter(const std::string &name, T ¶m, const std::string &description, const bool add_to_auto_reconfigurable_params=true, const bool is_required=false, const bool read_only=false, const std::optional< double > &from_value=std::nullopt, const std::optional< double > &to_value=std::nullopt, const std::optional< double > &step_value=std::nullopt, const std::string &additional_constraints="")
Declares and loads a ROS parameter.
bool range_limits_enable_
double range_limits_x_max_
void setup()
Sets up subscribers, publishers, etc. to configure the node.
rclcpp::TimerBase::SharedPtr setup_timer_
Timer to delay setup.
std::vector< std::string > input_topics_
OnSetParametersCallbackHandle::SharedPtr parameters_callback_
Callback handle for dynamic parameter reconfiguration.
std::shared_mutex config_mutex_
static constexpr const char * kDefaultTransportHint
std::string output_stamp_mode_param_
static constexpr double kMaxRangeXY
rcl_interfaces::msg::SetParametersResult parametersCallback(const std::vector< rclcpp::Parameter > ¶meters)
Validate and apply dynamic parameter updates.
static constexpr int32_t kMinOutputQueueSize
std::vector< std::string > input_transport_hints_
static constexpr int64_t kMaxFixedPointsPerInputCloud
static constexpr int32_t kStepSizeSyncQueueSize
std::shared_ptr< tf2_ros::Buffer > tf_buffer_
TF2 buffer and transform listener.
double range_limits_z_max_
std::shared_ptr< tf2_ros::TransformListener > tf_listener_
static constexpr int64_t kMinFixedPointsPerInputCloud
bool collectTimingInfo(const std::vector< PointCloudMsg::ConstSharedPtr > &msgs, FusionTiming &timing) const
Collect timestamp statistics for synchronized input clouds.
static constexpr double kMaxRangeZ
std::shared_ptr< void > synchronizer_
OutputStampMode output_stamp_mode_
void publishFusedCloud(PointCloudMsg::UniquePtr cloud, const FusionTiming &timing, std::size_t input_count, std::size_t total_points, std::chrono::steady_clock::time_point callback_start, std::chrono::steady_clock::time_point processing_start, std::chrono::steady_clock::time_point processing_end, const char *event_name)
Publish a fused point cloud and emit tracing/timing diagnostics.
static constexpr int64_t kStepSizeFixedPointsPerInputCloud
void setupSynchronizer()
Create the approximate-time synchronizer for a fixed number of input topics.
int64_t output_queue_size_
std::vector< std::tuple< std::string, std::function< void(const rclcpp::Parameter &)> > > auto_reconfigurable_params_
Auto-reconfigurable parameters for dynamic reconfiguration.
std::vector< rclcpp::CallbackGroup::SharedPtr > cloud_subscriber_callback_groups_
sensor_msgs::msg::PointCloud2 PointCloudMsg
std::shared_ptr< point_cloud_transport::Publisher > cloud_publisher_
Publisher.
static constexpr double kMinRangeXY
std::vector< std::shared_ptr< point_cloud_transport::SubscriberFilter > > cloud_subscribers_
PointCloudFusion(const rclcpp::NodeOptions &options)
Constructor.
double range_limits_y_min_
constexpr bool is_vector_v
Timing metadata for one synchronized fusion batch.
rclcpp::Time input0_stamp
rclcpp::Time earliest_stamp
double max_dt_from_input0_sec
FusionTiming()=default
Construct timing metadata with zero-initialized stamps and deltas.
rclcpp::Time latest_stamp