Examples
We provide several examples for using the holistic fusion library in ROS1 and ROS2 workspaces.
ROS1 Examples
The majority of the development over the past years has been done in ROS1. We provide several examples for using the holistic fusion library in ROS1 workspaces, which can be found in the ROS1 examples.
ANYmal Example
This is the ANYmal example from the holisitic fusion paper.
The corresponding example is called anymal_estimator_graph.
Excavator Example
This is the excavator example from the holisitic fusion paper.
The corresponding example is called excavator_holistic_graph.
SuperMegaBot Example
This is the SuperMegaBot example as used during the ETH Robotics Summer School 2023 and 2024.
The corresponding example is called smb_estimator_graph.
Ground Generation Example
This is an example for generating ground truth trajectories from a Leica Total Station and GNSS measurements.
Note that in this example two non-drifting measurement sources are used, which is not the case in the other examples.
Holistic fusion is used to align the two reference frames, fuse the measurements and generate a ground truth trajectory.
The corresponding example is called atn_position3_fuser.
Other Examples
Some other more simplified examples are:
imu_pose3_fuser: Simple example for fusing IMU and pose3 measurements.pure_imu_integration: Simple example for integrating IMU measurements without any fusion.
ROS2 Examples
SuperMegaBot ROS2 Example
The ROS2 port of the SMB estimator is available in the smb_estimator_graph_ros2 package. It demonstrates fusing IMU, LiDAR odometry, wheel odometry, and optionally VIO for the Super Mega Bot.
Fused Measurements
The example supports the following measurement sources (individually toggleable via parameters):
Measurement |
Type |
ROS Topic |
Factor Type |
|---|---|---|---|
IMU |
Core |
|
Preintegrated IMU factor |
LiDAR Odometry |
Absolute (6D) |
|
Unary Pose3 Absolute |
Wheel Odometry |
Binary (6D) |
|
Binary Pose3 Between |
Wheel Velocities |
Local (3D) |
|
Unary Velocity3 Local |
VIO Odometry |
Binary (6D) |
|
Binary Pose3 Between |
Running
Launch the estimator with:
ros2 launch smb_estimator_graph_ros2 smb_estimator_graph.launch.py
Topic names can be remapped via launch arguments:
ros2 launch smb_estimator_graph_ros2 smb_estimator_graph.launch.py \
imu_topic_name:=/my_imu/data \
lidar_odometry_topic_name:=/my_lidar/odom
Additional launch files are provided for replay and simulation:
smb_estimator_graph_replay.launch.py— for playing back rosbags.smb_estimator_graph_sim.launch.py— for simulation environments.
Configuration
Parameters are split into two layers:
Core parameters (
config/core/): General graph settings shared across applications.core_graph_config.yaml— high-level graph configuration.core_graph_params.yaml— IMU noise parameters and graph tuning.core_extrinsic_params.yaml— reference frame names.
SMB-specific parameters (
config/smb_specific/): Sensor noise and extrinsics specific to SMB.smb_graph_params.yaml— sensor noise values and feature flags (e.g.,useLioOdometry,useWheelOdometryBetween).smb_extrinsic_params.yaml— sensor frame extrinsic calibrations.
Differences from the ROS1 Version
The ROS2 SMB example is architecturally equivalent to the ROS1 version but uses:
rclcpp::Nodeandament_cmakebuild system.Python-based launch files instead of XML.
Dedicated worker threads for publishing to minimize latency.
Layered YAML parameter files loaded in the launch description.