Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |
Launch files
Messages
Services
Plugins
Recent questions tagged lidar_aggregator at Robotics Stack Exchange
Package Summary
| Version | 0.0.0 |
| License | Apache 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/WATonomous/wato_monorepo.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-25 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- WATonomous
Authors
lidar_aggregator
Synchronizes, motion-compensates, and merges the three vehicle LiDAR point clouds (center, NE, NW) into a single output cloud.
Overview
The vehicle carries three Velodyne LiDARs that spin asynchronously and have small timing offsets relative to each other. Before merging them, two problems must be solved:
- Synchronization — the three scan streams must be paired so they correspond to the same moment in time.
- Deskewing (motion compensation) — each scan takes ~100 ms to complete. If the vehicle is turning, points at the start and end of a scan are captured at different vehicle poses. Without correction, the merged cloud would be smeared.
lidar_aggregator handles both using IMU orientation data. An optional online timing offset estimator can refine the initial timing offsets using voxel overlap scoring.
Architecture
/lidar_cc/velodyne_points ─┐
/lidar_ne/velodyne_points ─┤──► ApproximateTime sync ──► deskew each cloud ──► merge ──► /lidar/merged
/lidar_nw/velodyne_points ─┘ ▲
│
/novatel/oem7/imu/data_raw ──────► IMU buffer (SLERP interpolation)
/novatel/oem7/bestpos ──────────► clock offset estimation (GPS↔IMU)
Deskew works per-point using the time field in each PointCloud2 message (offset from scan start). Each point is rotated back to the scan-start pose using interpolated IMU orientation deltas. If no per-point time field is present, scan-level deskew is applied as a fallback.
Online timing offset estimation is optional. When enabled, the node searches over candidate timing offsets for NE/NW clouds, scores each candidate by voxel overlap with the center cloud, and updates the active offsets using exponential moving average. Only activates when yaw rate exceeds a minimum threshold (rotation provides signal for overlap scoring).
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclcpp | |
| rclcpp_components | |
| sensor_msgs | |
| geometry_msgs | |
| tf2 | |
| tf2_ros | |
| tf2_geometry_msgs | |
| message_filters | |
| pcl_conversions | |
| novatel_oem7_msgs |
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| interfacing_bringup |