### Clearpath Husky Example Launch Configuration Source: https://github.com/manankharwar/fusioncore/blob/main/docs/migration_from_robot_localization.md This example demonstrates how to launch FusionCore with specific topic remappings for a Clearpath Husky robot, where odometry is published at '/husky_velocity_controller/odom' and GPS fix at '/fix'. ```bash ros2 launch fusioncore_ros fusioncore_nav2.launch.py \ fusioncore_config:=$(ros2 pkg prefix fusioncore_ros)/share/fusioncore_ros/config/clearpath_husky.yaml \ --ros-args \ -r /odom/wheels:=/husky_velocity_controller/odom \ -r /gnss/fix:=/fix ``` -------------------------------- ### Quick Test FusionCore Installation Source: https://github.com/manankharwar/fusioncore/blob/main/README.md Run this script after installation to verify FusionCore's functionality with fake sensors. It checks all outputs and should complete in about 15 seconds. ```bash bash tools/quick_test.sh ``` -------------------------------- ### FusionCore Sensor Waiting Log Example Source: https://github.com/manankharwar/fusioncore/blob/main/docs/how-it-works.md Example log messages showing FusionCore waiting for sensors and then starting the filter once all are ready. ```text [INFO] Waiting for sensors (1.4s / 10.0s): missing [GNSS, GPSVel] [INFO] All 4 configured sensors ready. Starting filter. ``` -------------------------------- ### F1/10 Indoor Setup Launch Command Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/ackermann.md Launches FusionCore for an F1/10 indoor setup using VESC wheel encoder and RealSense D435i IMU. Remaps topics for odometry and IMU data. ```bash ros2 launch fusioncore_ros fusioncore.launch.py \ fusioncore_config:=$(ros2 pkg prefix fusioncore_ros)/share/fusioncore_ros/config/f1tenth_indoor.yaml \ --ros-args \ -r /odom/wheels:=/vesc/odom \ -r /imu/data:=/camera/imu ``` -------------------------------- ### Quick Start FusionCore for Indoor Wheels Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/wheels-indoor.md Launches FusionCore with a configuration file for indoor wheel odometry. Remaps the wheel odometry topic to the expected '/odom/wheels' topic. ```bash 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:=/your/wheel/odom/topic ``` -------------------------------- ### Run FusionCore Demo with Data Source: https://github.com/manankharwar/fusioncore/blob/main/docs/index.md Clone the repository, install Python dependencies, and run a demo script to visualize GPS spike rejection. ```bash git clone https://github.com/manankharwar/fusioncore && cd fusioncore pip install numpy matplotlib python3 tools/demo_quick.py --open ``` -------------------------------- ### Install and Run FusionCore + ICP Odometry Demo Source: https://github.com/manankharwar/fusioncore/blob/main/docs/blog/posts/rtabmap-fusioncore-icp-loop.md Commands to install necessary ROS 2 packages and launch the TurtleBot3 Gazebo demo with FusionCore and ICP odometry feedback loop. Ensure the TURTLEBOT3_MODEL environment variable is set. ```bash sudo apt install ros-jazzy-fusioncore-ros ros-jazzy-rtabmap-ros \ ros-jazzy-turtlebot3-gazebo ros-jazzy-nav2-bringup export TURTLEBOT3_MODEL=waffle ros2 launch rtabmap_demos turtlebot3_sim_fusioncore_icp_demo.launch.py ``` -------------------------------- ### Install FusionCore using Docker Source: https://github.com/manankharwar/fusioncore/blob/main/README.md Pull the latest FusionCore Docker image and run it. This option does not require a local ROS 2 installation. ```bash docker pull ghcr.io/manankharwar/fusioncore:latest docker run --rm -it ghcr.io/manankharwar/fusioncore:latest bash ``` -------------------------------- ### Build and Install FusionCore ROS 2 Package Source: https://github.com/manankharwar/fusioncore/blob/main/docs/blog/posts/fusioncore-ros2-sensor-fusion-launch.md Steps to clone the FusionCore repository, install dependencies, and build the package within a ROS 2 workspace. Ensure you source your ROS 2 installation before running these commands. ```bash mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src git clone https://github.com/manankharwar/fusioncore.git cd ~/ros2_ws source /opt/ros/jazzy/setup.bash rosdep install --from-paths src --ignore-src -r -y colcon build --packages-up-to fusioncore_ros source install/setup.bash ``` -------------------------------- ### Install Gazebo and ROS-Gazebo Bridge Source: https://github.com/manankharwar/fusioncore/blob/main/docs/simulation.md Install Gazebo Harmonic and the ROS-Gazebo bridge. These are not automatically installed by rosdep. ```bash sudo apt install ros-jazzy-ros-gz ``` -------------------------------- ### Quick FusionCore Demo (No ROS) Source: https://github.com/manankharwar/fusioncore/blob/main/demo/README.md Clone the repository, install dependencies, and run a Python script to generate a comparison plot of FusionCore, robot_localization EKF, and RTK GPS ground truth. This method uses pre-baked results and requires Python 3 with numpy and matplotlib. ```bash git clone https://github.com/manankharwar/fusioncore && cd fusioncore pip install numpy matplotlib python3 tools/demo_quick.py --open ``` ```text FusionCore demo: NCLT 2012-01-08 (pre-baked results) FusionCore ATE RMSE: 5.55 m RL-EKF ATE RMSE: 13.01 m FusionCore is 2.3x more accurate Saved: demo_result.png ``` -------------------------------- ### Clone and Build FusionCore Source: https://github.com/manankharwar/fusioncore/blob/main/CONTRIBUTING.md Clone the FusionCore repository, set up the ROS environment, install dependencies, and build the project. Ensure to replace 'jazzy' with 'humble' if using Ubuntu 22.04. ```bash git clone https://github.com/manankharwar/fusioncore.git cd fusioncore source /opt/ros/jazzy/setup.sh # replace jazzy with humble on Ubuntu 22.04 rosdep install -r --from-paths . --ignore-src --rosdistro jazzy -y # replace jazzy with humble on Ubuntu 22.04 colcon build --packages-up-to compass_msgs fusioncore_core fusioncore_ros --cmake-args -DBUILD_TESTING=ON ``` -------------------------------- ### Install FusionCore from Source (ROS 2) Source: https://github.com/manankharwar/fusioncore/blob/main/README.md Follow these steps to build FusionCore from source on ROS 2 Jazzy (Ubuntu 24.04) or Humble (Ubuntu 22.04). Ensure you have the correct ROS 2 distribution sourced. ```bash mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src git clone https://github.com/manankharwar/fusioncore.git cd ~/ros2_ws source /opt/ros/jazzy/setup.bash # or /opt/ros/humble/setup.bash rosdep install --from-paths src --ignore-src -r -y colcon build --packages-up-to fusioncore_ros source install/setup.bash ``` -------------------------------- ### Install FusionCore Monorepo Source: https://github.com/manankharwar/fusioncore/blob/main/docs/getting-started.md Clones the FusionCore repository into your ROS 2 workspace and installs dependencies. Ensure you are in the workspace root before running colcon build. ```bash mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src git clone https://github.com/manankharwar/fusioncore.git cd ~/ros2_ws source /opt/ros/jazzy/setup.bash rosdep install --from-paths src --ignore-src -r -y colcon build --packages-up-to fusioncore_ros source install/setup.bash ``` -------------------------------- ### FusionCore and SLAM Launch Commands Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/wheels-indoor.md Launches FusionCore for odometry and separately launches a SLAM system like slam_toolbox. This setup assumes FusionCore provides the 'odom' to 'base_link' transform, and SLAM provides 'map' to 'odom'. ```bash # FusionCore (odometry) ros2 launch fusioncore_ros fusioncore.launch.py \ fusioncore_config:=wheels_indoor.yaml \ --ros-args -r /odom/wheels:=/diff_controller/odom # SLAM ros2 launch slam_toolbox online_async_launch.py ``` -------------------------------- ### Build FusionCore Project Source: https://github.com/manankharwar/fusioncore/blob/main/docs/reference/benchmark.md Builds the necessary packages for FusionCore. Ensure you have the colcon build system installed. ```bash colcon build --packages-select fusioncore_core fusioncore_ros fusioncore_datasets ``` -------------------------------- ### Van/Large Vehicle Outdoor Setup Launch Command Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/ackermann.md Launches FusionCore for a van or large vehicle outdoor setup using ZED 2i (IMU + visual odom), wheel encoder, and GPS. Remaps topics for wheel odometry, IMU, and GPS fix. ```bash ros2 launch fusioncore_ros fusioncore.launch.py \ fusioncore_config:=$(ros2 pkg prefix fusioncore_ros)/share/fusioncore_ros/config/van_outdoor_gps.yaml \ --ros-args \ -r /odom/wheels:=/your/wheel/odom \ -r /imu/data:=/zed/zed_node/imu/data \ -r /gnss/fix:=/your/gps/fix ``` -------------------------------- ### Configure Second Encoder Topic for F1/10 Indoor Setup Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/ackermann.md Optional configuration for the F1/10 indoor setup to use a second velocity source, such as KISS-ICP or RealSense T265 visual odometry. Requires a nav_msgs/Odometry topic with velocity in the twist field. ```yaml encoder2.topic: "/kiss/odometry" # KISS-ICP on LiDAR # or encoder2.topic: "/camera/odom/sample" # RealSense T265 visual odometry ``` -------------------------------- ### Launch FusionCore with ICP Indoor Configuration Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/icp-indoor.md Launches FusionCore using a specific ICP indoor configuration file and remaps the wheel odometry topic to the ICP pipeline's output. Use this to start FusionCore when GPS is unavailable and ICP odometry is the primary source. ```bash ros2 launch fusioncore_ros fusioncore.launch.py \ fusioncore_config:=$(ros2 pkg prefix fusioncore_ros)/share/fusioncore_ros/config/icp_indoor.yaml \ --ros-args \ -r /odom/wheels:=/kiss/odometry ``` -------------------------------- ### 6-Axis IMU Configuration Example Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/vslam-imu.md Configuration snippet for a 6-axis IMU (e.g., MPU-6050) that lacks a magnetometer. Yaw from these IMUs will drift and be corrected by VSLAM. ```yaml imu.has_magnetometer: false ``` -------------------------------- ### FusionCore Base and IMU Configuration Source: https://github.com/manankharwar/fusioncore/blob/main/docs/configuration.md Configure the core parameters like base frame, publish rate, and IMU settings including noise, magnetometer usage, and gravitational acceleration handling. Use this for basic setup and IMU calibration. ```yaml fusioncore: ros__parameters: base_frame: base_link # must match your robot's base TF frame odom_frame: odom publish_rate: 100.0 publish.force_2d: true # zeroes Z position and Z velocity in published output. Use for ground robots. publish.tf: true # set false to suppress the odom->base_link TF broadcast. # /fusion/odom keeps publishing. Use when another node owns # the odom->base_link transform, or when running two # FusionCore instances where only one should broadcast TF. # ── IMU ────────────────────────────────────────────────────────────────── imu.gyro_noise: 0.005 # rad/s: from your IMU datasheet (ARW spec) imu.accel_noise: 0.1 # m/s² : from your IMU datasheet (VRW spec) imu.has_magnetometer: false # true for 9-axis (BNO08x, VectorNav, Xsens) # false for 6-axis: yaw comes from gyro integration imu.remove_gravitational_acceleration: false # Set true if your IMU driver already subtracted gravity. # Check: echo linear_acceleration.z at rest. # ~9.8 m/s² → leave false (driver publishes raw) # ~0.0 m/s² → set true (driver already removed it) # NOTE: opposite of robot_localization's imu0_remove_gravitational_acceleration. imu.frame_id: "" # override IMU TF frame. Leave empty (default) to use msg->header.frame_id. # # When to set this: # Gazebo Harmonic TurtleBot3 publishes "waffle/imu_link/tb3_imu" instead # of "imu_link". FusionCore can't find that frame in the TF tree. # Fix: set imu.frame_id to your URDF frame name (e.g. "imu_link"). # # WARNING: do NOT set this to "base_link". # When imu.frame_id equals base_frame, FusionCore skips the TF lookup # entirely and treats IMU measurements as already in base_link frame. # If your IMU is mounted at any angle relative to base_link, its # measurements will be fused with the wrong rotation, silently # corrupting the orientation estimate. Leave empty unless your driver # publishes with no frame_id at all. # Optional second IMU. When non-empty, FusionCore subscribes to this topic # and fuses each message as an independent measurement of the same state. # Both IMUs must be in (or TF-transformable to) base_link frame. # The second IMU uses the same noise model as the primary. # Useful when your platform has two IMUs and you want redundancy without # pre-merging them with imu_filter_madgwick or similar. Leave empty to disable. imu2.topic: "" imu2.frame_id: "" imu2.remove_gravitational_acceleration: false ``` -------------------------------- ### Update Odom Topic in Nav2 Parameters Source: https://github.com/manankharwar/fusioncore/blob/main/docs/nav2.md Example of updating the `odom_topic` parameter in `nav2_params.yaml` to use FusionCore's output (`/fusion/odom`). This is necessary when integrating FusionCore with an existing Nav2 setup. ```yaml # before bt_navigator: ros__parameters: odom_topic: /odometry/filtered velocity_smoother: ros__parameters: odom_topic: /odometry/filtered # after bt_navigator: ros__parameters: odom_topic: /fusion/odom velocity_smoother: ros__parameters: odom_topic: /fusion/odom ``` -------------------------------- ### GNSS Fix Rejection Log Example Source: https://github.com/manankharwar/fusioncore/blob/main/docs/how-it-works.md Example log message indicating a GNSS fix was rejected due to quality checks or Mahalanobis gating. ```log [WARN] GNSS fix rejected (fix_type=1, min=4, hdop=1.20, quality check or Mahalanobis gate) ``` -------------------------------- ### Live FusionCore Demo with ROS 2 Source: https://github.com/manankharwar/fusioncore/blob/main/demo/README.md Build FusionCore within a ROS 2 workspace and run a demo script that replays sensor data, runs FusionCore live, and generates a comparison plot. This requires ROS 2 Jazzy or Humble and a built FusionCore. ```bash # Step 1: build (once) mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src git clone https://github.com/manankharwar/fusioncore.git cd ~/ros2_ws source /opt/ros/jazzy/setup.bash rosdep install --from-paths src --ignore-src -r -y colcon build && source install/setup.bash # Step 2: run demo (downloads bag automatically, runs FusionCore live) cd ~/ros2_ws/src/fusioncore bash demo/run_demo.sh ``` -------------------------------- ### Launch FusionCore Simulation Source: https://github.com/manankharwar/fusioncore/blob/main/docs/simulation.md Build the workspace and launch the FusionCore simulation using the provided Gazebo launch file. Ensure ROS 2 environment is sourced. ```bash cd ~/ros2_ws source /opt/ros/jazzy/setup.bash colcon build source install/setup.bash ros2 launch fusioncore_gazebo fusioncore_gazebo.launch.py ``` -------------------------------- ### Manual Step-by-Step ROS 2 Demo Source: https://github.com/manankharwar/fusioncore/blob/main/demo/README.md Manually download the demo bag file, launch FusionCore, replay the bag, convert the output, and plot the results. This provides a more detailed control over the live ROS 2 demo process. ```bash # Download the bag wget -O demo/nclt_demo_120s.mcap \ https://github.com/manankharwar/fusioncore/releases/download/demo-data/nclt_demo_120s.mcap # Terminal 1: run FusionCore + replay ros2 launch fusioncore demo/nclt_demo.launch.py # Wait for bag to finish, then Ctrl+C, then: # Terminal 2: convert output to TUM and plot python3 tools/odom_to_tum.py \ --bag /tmp/fc_demo_out --topic /fusion/odom --out /tmp/fc_live.tum python3 tools/demo_quick.py --live_tum /tmp/fc_live.tum --open ``` -------------------------------- ### Launching FusionCore with Bundled Nav2 Parameters Source: https://github.com/manankharwar/fusioncore/blob/main/docs/migration_from_robot_localization.md Launch FusionCore with Nav2 integration using the default bundled Nav2 parameters. This configuration is pre-wired for `/fusion/odom` and optimized for outdoor GPS navigation with differential drive robots. ```bash # This already uses the bundled nav2_params.yaml: nothing else needed ros2 launch fusioncore_ros fusioncore_nav2.launch.py \ fusioncore_config:=your_robot.yaml ``` -------------------------------- ### Launch FusionCore and Nav2 with Custom Nav2 Parameters Source: https://github.com/manankharwar/fusioncore/blob/main/docs/nav2.md Launches FusionCore and Nav2 using a custom Nav2 parameter file. This allows for fine-grained control over Nav2's behavior. ```bash ros2 launch fusioncore_ros fusioncore_nav2.launch.py \ fusioncore_config:=your_robot.yaml \ nav2_params:=/path/to/your_nav2_params.yaml ``` -------------------------------- ### Launch FusionCore with Nav2 Source: https://github.com/manankharwar/fusioncore/blob/main/docs/getting-started.md Launches FusionCore with Nav2 integration, requiring a robot configuration YAML file. ```bash ros2 launch fusioncore_ros fusioncore_nav2.launch.py \ fusioncore_config:=/path/to/your_robot.yaml ``` -------------------------------- ### Wait for all sensors during initialization Source: https://github.com/manankharwar/fusioncore/blob/main/docs/configuration.md Replace `sleep()` in launch files by setting `init.wait_for_all_sensors` to true. FusionCore will wait for at least one message from each configured sensor before starting. ```yaml init.wait_for_all_sensors: true init.sensor_wait_timeout: 10.0 ``` -------------------------------- ### Launch FusionCore for Manual Verification Source: https://github.com/manankharwar/fusioncore/blob/main/docs/getting-started.md Launches FusionCore using its launch file in the first terminal. Ensure ROS environment is sourced. ```bash source /opt/ros/jazzy/setup.bash && source ~/ros2_ws/install/setup.bash ros2 launch fusioncore_ros fusioncore.launch.py ``` -------------------------------- ### Configure and Run FusionCore with Custom Bag Source: https://github.com/manankharwar/fusioncore/blob/main/demo/README.md Configure FusionCore by copying and editing a YAML file with your robot's IMU noise parameters, then launch FusionCore with your configuration and replay your robot's bag file. This is for testing FusionCore with your own sensor data. ```bash # Configure FusionCore for your robot cp fusioncore_ros/config/example.yaml my_robot.yaml # Edit my_robot.yaml: set imu.gyro_noise, imu.accel_noise from your IMU datasheet # Run FusionCore against your bag ros2 launch fusioncore_ros fusioncore.launch.py \ fusioncore_config:=my_robot.yaml # In another terminal: replay your bag ros2 bag play your_robot_bag.mcap --clock # Record the output ros2 bag record /fusion/odom /fusion/pose -o my_robot_result ``` -------------------------------- ### Launch FusionCore with a specific configuration Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/index.md Launches the FusionCore ROS 2 node using a specified configuration file. Ensure the path to the config file is correct. ```bash ros2 launch fusioncore_ros fusioncore.launch.py \ fusioncore_config:=$(ros2 pkg prefix fusioncore_ros)/share/fusioncore_ros/config/wheels_indoor.yaml ``` -------------------------------- ### 9-Axis IMU Configuration Example Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/vslam-imu.md Configuration snippet for a 9-axis IMU (e.g., VectorNav, Xsens) that includes a magnetometer. Setting `imu.has_magnetometer` to true enables heading validation from IMU orientation messages. ```yaml imu.has_magnetometer: true imu.gyro_noise: 0.005 # rad/s (VectorNav VN-100 typical) imu.accel_noise: 0.1 # m/s² ``` -------------------------------- ### Configuring LiDAR ICP as a Second Velocity Source Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/wheels-indoor.md Example configuration snippet for enabling LiDAR ICP as a secondary odometry source in FusionCore. Uncomment the desired topic for your ICP odometry source. ```yaml encoder2.topic: "/kiss/odometry" # KISS-ICP # encoder2.topic: "/icp_odom" # rtabmap icp_odometry ``` -------------------------------- ### Run NCLT Benchmark Source: https://github.com/manankharwar/fusioncore/blob/main/benchmarks/nclt/2012-01-08/results/README.md Launches the NCLT benchmark using a specified data directory. Ensure you are in the repository root. ```bash # 1. Run the benchmark (from repo root) ros2 launch fusioncore_datasets nclt_benchmark.launch.py \ data_dir:=/path/to/nclt/2012-01-08 ``` -------------------------------- ### FusionCore IMU Data Handling with Madgwick Filter Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/icp-indoor.md Demonstrates the correct setup for FusionCore and RTABMAP when using the Madgwick filter. FusionCore should receive raw IMU data, while RTABMAP uses the Madgwick-filtered output. ```python # FusionCore reads raw IMU directly fc = LifecycleNode( ... remappings=[ ("/imu/data", "/imu"), # raw, not Madgwick output ] ) # Madgwick runs separately for RTABMAP and ICP Node( package='imu_filter_madgwick', executable='imu_filter_madgwick_node', parameters=[{'use_mag': False, 'world_frame': 'enu', 'publish_tf': False}], remappings=[('imu/data_raw', '/imu')], # reads same raw /imu ), ``` -------------------------------- ### Wait for All Sensors Configuration Source: https://github.com/manankharwar/fusioncore/blob/main/docs/how-it-works.md Configure FusionCore to wait for all specified sensors before starting the filter. This prevents initial drift by ensuring all sensor data is available from the outset. Set a timeout to prevent indefinite waiting. ```yaml init.wait_for_all_sensors: true init.sensor_wait_timeout: 10.0 # give up and start anyway after this many seconds ``` -------------------------------- ### Launch Navigation with Environment Preset Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/environment-presets.md Launches the FusionCore navigation stack using a specified hardware configuration and an environment preset. The `env_config` argument points to the desired preset YAML file, overriding GPS noise parameters. ```bash ros2 launch fusioncore_ros fusioncore_nav2.launch.py \ fusioncore_config:=your_robot.yaml \ env_config:=$(ros2 pkg prefix fusioncore_ros)/share/fusioncore_ros/config/env_urban.yaml ``` -------------------------------- ### Check Camera Topic Heartbeat Source: https://github.com/manankharwar/fusioncore/blob/main/docs/troubleshooting.md Verify that your camera topics are publishing data before RTABMAP starts. Use 'ros2 topic hz' to check the message rate. If topics are silent, 'rgbd_sync' may not be functioning correctly. ```bash ros2 topic hz /right/image_rect ros2 topic hz /stereo/depth ros2 topic hz /rgbd_image ``` -------------------------------- ### Launch FusionCore with topic remappings Source: https://github.com/manankharwar/fusioncore/blob/main/docs/hardware/index.md Launches FusionCore with a specific configuration and redefines default topic names for IMU and odometry. Use this when your sensor topics differ from FusionCore's expected names. ```bash 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 ``` -------------------------------- ### Launch FusionCore for Odometry and slam_toolbox for Mapping Source: https://github.com/manankharwar/fusioncore/blob/main/docs/nav2.md Launches FusionCore for providing odometry data and slam_toolbox for simultaneous localization and mapping (SLAM) in an indoor navigation scenario without GPS. ```bash # FusionCore for odometry ros2 launch fusioncore_ros fusioncore.launch.py \ fusioncore_config:=your_robot.yaml # slam_toolbox for map → odom ros2 launch slam_toolbox online_async_launch.py ``` -------------------------------- ### Build and Test FusionCore Core Package Source: https://github.com/manankharwar/fusioncore/blob/main/docs/getting-started.md Builds only the fusioncore_core package with testing enabled and then runs the tests. Finally, it displays the test results verbosely. ```bash cd ~/ros2_ws colcon build --packages-select fusioncore_core --cmake-args -DBUILD_TESTING=ON colcon test --packages-select fusioncore_core colcon test-result --verbose ``` -------------------------------- ### Reproduce NCLT Benchmark Source: https://github.com/manankharwar/fusioncore/blob/main/benchmarks/nclt/2013-02-23/results/BENCHMARK.md Commands to download the NCLT sequence, run the benchmark, convert ground truth data, extract trajectories from ROS bags, and evaluate the results using the provided tools. ```bash # 1. Download NCLT sequence # 2. Run benchmark ros2 launch fusioncore_datasets nclt_benchmark.launch.py \ data_dir:=/path/to/nclt/2013-02-23 output_bag:=./nclt_results # 3. Convert ground truth python3 tools/nclt_rtk_to_tum.py --rtk gps_rtk.csv --out gt.tum # 4. Extract trajectories python3 tools/odom_to_tum.py --bag ./nclt_results --topic /fusion/odom --out fc.tum python3 tools/odom_to_tum.py --bag ./nclt_results --topic /rl/odometry --out rl.tum # 5. Evaluate python3 tools/evaluate.py --gt gt.tum --fusioncore fc.tum --rl rl.tum --sequence 2013-02-23 ``` -------------------------------- ### Configure FusionCore for Magnetometer Heading Source: https://github.com/manankharwar/fusioncore/blob/main/docs/troubleshooting.md For indoor robots with a 9-axis IMU, enable the magnetometer to provide an absolute heading at startup, correcting potential 30° heading errors. ```yaml imu.has_magnetometer: true ```