Skip to content

Hardware Configs

Which setup are you?

Pick the row that matches your sensors. Everything else follows from there.

My sensors Use case Start here
IMU + wheel odometry Indoor, no GPS: warehouse, home robot, lab wheels_indoor.yaml
IMU + LiDAR ICP Indoor, no wheel odom: using KISS-ICP or rtabmap icp_indoor.yaml
IMU + wheel odom + LiDAR ICP Indoor, both velocity sources for redundancy wheels_indoor.yaml + uncomment encoder2.topic
IMU + wheel odom + GPS Outdoor, field robots, GPS navigation bno085_custom.yaml or clearpath_husky.yaml
IMU + VESC encoder + RealSense D435i, Ackermann F1/10 scale car, indoor f1tenth_indoor.yaml
IMU + ZED 2i visual odom + GPS, Ackermann Van or large vehicle, outdoor van_outdoor_gps.yaml
IMU + VSLAM (ORB-SLAM3, RTAB-Map, Kimera) Indoor, GPS-denied, no wheel odom vslam_imu.yaml

Variations within each setup: one-line changes, not separate configs:

Variation Parameter to change
Standard GPS → RTK float gnss.base_noise_xy: 0.5, gnss.min_fix_type: 2
Standard GPS → RTK fixed gnss.base_noise_xy: 0.015, gnss.min_fix_type: 4
NavSatFix → GPSFix (RTK_FLOAT status, native HDOP/VDOP) gnss.use_gps_fix: true (requires driver that publishes gps_msgs/GPSFix)
6-axis IMU → 9-axis (BNO085, VectorNav) imu.has_magnetometer: true
Add dual GPS antenna heading gnss.heading_topic: "/gnss/heading"
Add a second IMU (dual IMU redundancy) imu2.topic: "/your/second/imu"
Add Nav2 Use fusioncore_nav2.launch.py instead of fusioncore.launch.py
Urban vs open sky GPS noise Layer an environment preset on top

All config files

Config Setup Platform IMU GPS
wheels_indoor.yaml IMU + wheels Any differential drive (generic) Any 6-axis MEMS none
icp_indoor.yaml IMU + LiDAR ICP Any indoor robot with LiDAR Any 6-axis MEMS none
bno085_custom.yaml IMU + wheels + GPS Any differential drive (DIY) Bosch BNO085 u-blox M8N class
clearpath_husky.yaml IMU + wheels + GPS Clearpath Husky A200 Microstrain 3DM-GX5-25 u-blox F9P
duatic_mecanum.yaml IMU + wheels Duatic mecanum platform BNO085 none
f1tenth_indoor.yaml IMU + VESC encoder, Ackermann F1/10 scale car (indoor) RealSense D435i none
van_outdoor_gps.yaml IMU + visual odom + GPS, Ackermann Full-size van / large vehicle ZED 2i any NavSatFix
vslam_imu.yaml IMU + VSLAM pose Any robot with visual SLAM, indoor GPS-denied VectorNav / 9-axis none

Using a config

ros2 launch fusioncore_ros fusioncore.launch.py \
  fusioncore_config:=$(ros2 pkg prefix fusioncore_ros)/share/fusioncore_ros/config/wheels_indoor.yaml

Add remaps if your topics differ from the defaults:

ros2 launch fusioncore_ros fusioncore.launch.py \
  fusioncore_config:=$(ros2 pkg prefix fusioncore_ros)/share/fusioncore_ros/config/wheels_indoor.yaml \
  --ros-args \
  -r /odom/wheels:=/diff_controller/odom \
  -r /imu/data:=/imu

Indoor / GPS-denied robots

See Indoor / LiDAR ICP for detailed setup instructions: KISS-ICP, rtabmap, OAK-D IMU remaps, SLAM integration.

See VSLAM + IMU for ORB-SLAM3, RTAB-Map, Kimera, and other visual SLAM systems: covariance requirements, VectorNav setup, ORB-SLAM3 reinitialization handling.


Ackermann / car-like robots

See Ackermann vehicles for F1/10 racers, vans, and anything with front-wheel steering: wheelbase measurement, VESC covariance handling, ZED 2i gravity removal, multiple IMU guidance, and publish.tf.


Layering environment presets

See Environment Presets to tune GPS noise for your operating conditions without editing the hardware config.


Don't see your hardware?

Open a Hardware Config Request with your sensor datasheets and the community will help put one together.