Software stack for MAB and Unitree quadrupeds, powering robust localization, mapping and navigation:
- Neural locomotion
- Visual Inertial Kinematic aided odometry
- Velocity Constrained SLAM
- Navigation, Planning & Exploration
To clone
git clone https://github.com/dyumanaditya/quad-stack --recursiveTo install all the necessary dependencies run the following
chmod +x setup.sh
./setup.shThis repository supports the
- MAB Silver Badger (
silver_badger) - MAB Honey Badger (
honey_badger) - Unitree A1 (
a1) - Unitree Go1 (
go1) - Unitree Go2 (
go2)
To bringup a particular robot add the argument
robot:=<name>To specify the initial position of the robot in the world, use the x_pose and y_pose arguments when launching.
By default there are two main worlds:
- AWS Small Warehouse
- AWS Small House
You can add more worlds by putting them inside the quadstack_gazebo/worlds folder. To launch the simulation with the AWS worlds, follow the next steps
AWS Warehouse
export GAZEBO_MODEL_PATH=/home/ws/src/quad-stack/quad_stack/quadstack_gazebo/worlds/aws-robomaker-small-warehouse-world/modelsAWS House
export GAZEBO_MODEL_PATH=/home/ws/src/quad-stack/quad_stack/quadstack_gazebo/worlds/aws-robomaker-small-house-world/modelsAWS Warehouse
world:=aws-robomaker-small-warehouse-world/worlds/no_roof_small_warehouse.worldAWS House
world:=aws-robomaker-small-house-world/worlds/small_house.worldCustom worlds can be used similarly.
To teleoperate the robot to collect rosbags or for any other purpose, use the following command. You can specify the robot and world parameter as described in the previous section
ros2 launch quadstack_bringup teleop.launch.pyTo launch visual odometry, the main launch line is as follows
ros2 launch quadstack_bringup odometry.launch.pyAlong with this, there are several command line arguments that can be specified:
robotas usualworldas usualx_pose,y_poseas usual for the initial robot positionuse_kinematics_odom(bool, default=true): this allows you to use leg odometry to reset the VO if it gets lost.rosbag(bool, default=false): this specifies whether a rosbag is going to be played after launching instead of real time simulationreal_robot(bool, default=false, only works when rosbag=trueandrobot:=silver_badger/go2): this specifies if the rosbag is from a real robot or from simulation
To launch SLAM, the main launch line is as follows
ros2 launch quadstack_bringup slam.launch.pyAlong with this and similar to the VO launch, there are several command line arguments that can be specified:
robotas usualworldas usualx_pose,y_poseas usual for the initial robot positionuse_kinematics_odom(bool, default=true): this allows you to use leg odometry to reset the VO if it gets lost.rosbag(bool, default=false): this specifies whether a rosbag is going to be played after launching instead of real time simulationreal_robot(bool, default=false, only works when rosbag=trueandrobot:=silver_badger/go2): this specifies if the rosbag is from a real robot or from simulationuse_laser_stabilization(bool, default=true): whether to stabilize laser scan from depth images based on IMU valuesuse_vel_map_constraints(bool, default=true): whether to add leg odometry computed velocity constraints to the SLAM factor graph.
To launch navigation, the main launch line is as follows
ros2 launch quadstack_bringup navigation.launch.pyThere are two ways to perform navigation:
- Navigation and SLAM
- Navigation on a known map
If option 1. is used, then the launch arguments are the same as in the SLAM launch section. If not, there is an additional argument:
map (string, default=''): Allows you to specify the path to a known yaml map. To use this option specify the full absolute path to the map.
Autononous exploration is the combined process of navigation and mapping an unknown environment. We use a frontier based exploration strategy implemented here. This repository should have already been installed as part of the setup process.
Launch the navigation, and in another terminal launch the following
ros2 launch explore_lite explore.launch.pyA separate set of SLAM and navigation parameters for exploration are available:
1.For Navigation params: this line needs to be changed to use the file nav2_unitree_explore.yaml (similarly for the mab robots).
2. For SLAM params: this line needs to be changed to use the file slam_toolbox_params_explore_sim.yaml.
If you use this in your work please cite
@INPROCEEDINGS{adityaRobustQuad2025,
author={Aditya, Dyuman and Huang, Junning and Bohlinger, Nico and Kicki, Piotr and Walas, Krzysztof and Peters, Jan and Luperto, Matteo and Tateo, Davide},
booktitle={2025 European Conference on Mobile Robots (ECMR)},
title={Robust Localization, Mapping, and Navigation for Quadruped Robots},
year={2025},
volume={},
number={},
pages={1-8},
keywords={Location awareness;Accuracy;Navigation;Pipelines;Reinforcement learning;Robot sensing systems;Stability analysis;Sensors;Quadrupedal robots;Robots},
doi={10.1109/ECMR65884.2025.11163249}}
}




