rtabmap_sync tests and doc (#1454)

* rtabmap_sync tests and doc

* Added some diagrams

* cleanup some diagrams

* fixing running tests in parallels
This commit is contained in:
matlabbe
2026-09-13 11:25:32 -07:00
committed by GitHub
parent 61edb4ee85
commit 5062bf0614
45 changed files with 4481 additions and 76 deletions
+34
View File
@@ -44,6 +44,26 @@ Node(
('odom', 'icp_odom')]),
```
The deskewing and `icp_odometry` both measure motion against the `odom` frame, while the assembler takes the pose from the `icp_odom` topic instead; the assembled cloud, not the raw sweep, is what `rtabmap` stores:
```mermaid
flowchart LR
LIDAR["lidar driver"]
DESKEW["lidar_deskewing<br>fixed_frame_id: odom"]
ICP["icp_odometry<br>guess_frame_id: odom"]
ASM["point_cloud_assembler<br>fixed_frame_id: ''"]
MAP["rtabmap"]
DESKEWED(["deskewed cloud"])
ICPODOM(["icp_odom"])
LIDAR -->|points| DESKEW
DESKEW --> DESKEWED
DESKEWED -->|scan_cloud| ICP
DESKEWED -->|cloud| ASM
ICP --> ICPODOM
ICPODOM -->|odom| ASM & MAP
ASM -->|assembled_cloud| MAP
```
Note `fixed_frame_id: ''`. Clearing it switches the node from TF to the `odom` topic, pairing each cloud with the exact odometry message that goes with it rather than an interpolated TF lookup — see [Where the poses come from](#where-the-poses-come-from). Feeding the result to `rtabmap` as `scan_cloud` means the assembled cloud, not the raw sweep, is what gets stored.
### Widening a narrow field of view
@@ -62,10 +82,24 @@ Node(
remappings=[('cloud', '/camera/scan/deskewed')]),
```
Here the pose comes from the robot's wheel odometry, through the `odom` frame in TF. Nothing is being deskewed — `lidar_deskewing` is in the chain purely because this node takes `PointCloud2` and `depthimage_to_laserscan` emits a `LaserScan`:
```mermaid
flowchart LR
D2S["depthimage_to_laserscan"]
CONV["lidar_deskewing<br>LaserScan → PointCloud2"]
ASM["point_cloud_assembler<br>circular_buffer<br>max_clouds: 20<br>frame_id: base_link<br>fixed_frame_id: odom"]
MAP["rtabmap"]
D2S -->|input_scan| CONV
CONV -->|cloud| ASM
ASM -->|assembled_cloud| MAP
```
`circular_buffer` is what makes this work as a live input: the window rolls, so every incoming scan produces a full assembled cloud rather than one per twenty. `linear_update` and `angular_update` stop a stationary robot from filling the buffer with twenty copies of the same view, which would leave it with nothing but the current scan the moment it moved off again.
The cloud goes to `rtabmap` as `scan_cloud`, with `scan_cloud_is_2d` set since the points all came from one row of pixels.
## Subscribed Topics
| Topic | Type | Description |