IEEE Robotics and Automation Letters · Paper
Branch note (
unitree_sdk): this branch is developed for full compatibility with the Unitree SDK and ROS2 communication. The code has been tested on the Unitree Go2 and A2 robots in both simulation and real-world experiments.
MUSE estimates quadruped robot state from IMU measurements and joint states using ROS2. This branch provides proprioceptive state estimation, with Pixi (recommended, locked dependencies) and Conda environments.
- Simulation: basic-locomotion-dls-isaaclab.
- Real robots: To run this code on Unitree robots connect through unitree_ros2_dls. For control, we recommend basic-locomotion-dls-isaaclab or Quadruped-PyMPC.
Linux x86-64 and Pixi or Conda. Both environments include ROS2 Humble, Eigen, Pinocchio, vcstool, and the C++ toolchain.
Clone the repository:
git clone https://github.com/iit-DLSLab/muse.git -b unitree_sdk
cd museFrom the repository root, in a terminal without another Conda or ROS environment activated:
pixi install --locked
pixi run --locked build
pixi run --locked launchTasks source ROS and the workspace automatically. --locked uses the committed dependency versions and rejects manifest/lockfile mismatches. To clean build artifacts, run pixi run --locked clean.
Alternatively, build and launch manually in a Pixi shell, starting from the repository root:
pixi install --locked
pixi shell --locked
source "$CONDA_PREFIX/setup.bash"
cd muse_ws
colcon build --symlink-install
source install/setup.bash
ros2 launch state_estimator state_estimator.launch.pySkip colcon build if the workspace is already built. Use exit to leave the Pixi shell.
conda env create -f environment.yml
conda activate muse-ros2
source "$CONDA_PREFIX/setup.bash"
cd muse_ws
colcon build --symlink-install
source install/setup.bash
ros2 launch state_estimator state_estimator.launch.pyFresh builds default to Release. To switch to Debug, clean first to clear CMake's cached configuration:
pixi run --locked clean
pixi run --locked build --cmake-args -DCMAKE_BUILD_TYPE=DebugUse Release to switch back; with Conda, pass the same --cmake-args to colcon build.
To update dependencies, edit pixi.toml, keep shared constraints aligned with environment.yml, run pixi lock, then install, clean, and rebuild. Commit pixi.toml and pixi.lock together. Both environments pin Python 3.11, CMake 3.26, GCC/G++ 14, and Empy 3 for ROS 2 Humble compatibility.
The default configuration uses A2 with unitree_hg/msg/LowState on /lowstate. Select your robot and input topic in robot.yaml; adjust output topics in the config folder. For another robot, add its URDF and configure joint mappings and foot frames.
With the estimator running and compatible robot data or a ROS 2 bag, inspect output from a separate terminal. For Pixi, start at the repository root:
pixi shell --locked
source "$CONDA_PREFIX/setup.bash"
source muse_ws/install/setup.bash
ros2 node info /state_estimator
ros2 topic hz /base_state
ros2 topic echo /muse/proprioceptive_sensor_fusion --onceFrom a sourced environment, run colcon test --return-code-on-test-failure and colcon test-result --verbose in muse_ws. The iit_commons numerical tests are currently disabled, so passing tests alone do not validate estimator accuracy.
Visualize data with PlotJuggler:
ros2 run plotjuggler plotjuggler- Extend the code to include exteroception
- Conda-based environment
- Full Support for ROS2 (on going)
Contributions to this repository are welcome.
@ARTICLE{10933515,
author={Nisticò, Ylenia and Soares, João Carlos Virgolino and Amatucci, Lorenzo and Fink, Geoff and Semini, Claudio},
journal={IEEE Robotics and Automation Letters},
title={MUSE: A Real-Time Multi-Sensor State Estimator for Quadruped Robots},
year={2025},
volume={10},
number={5},
pages={4620-4627},
keywords={Robots;Sensors;Robot sensing systems;Legged locomotion;Odometry;Cameras;Laser radar;Robot vision systems;Robot kinematics;Quadrupedal robots;State estimation;localization;sensor fusion;quadruped robots},
doi={10.1109/LRA.2025.3553047}}| Avatar | Name |
|---|---|
| Ylenia Nisticò |