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 --recursive
To install all the necessary dependencies run the following
chmod +x setup.sh
./setup.sh
This 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/models
AWS House
export GAZEBO_MODEL_PATH=/home/ws/src/quad-stack/quad_stack/quadstack_gazebo/worlds/aws-robomaker-small-house-world/models
AWS Warehouse
world:=aws-robomaker-small-warehouse-world/worlds/no_roof_small_warehouse.world
AWS House
world:=aws-robomaker-small-house-world/worlds/small_house.world
Custom 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.py
To launch visual odometry, the main launch line is as follows
ros2 launch quadstack_bringup odometry.launch.py
Along with this, there are several command line arguments that can be specified:
robot
as usualworld
as usualx_pose
,y_pose
as 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=true
androbot:=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.py
Along with this and similar to the VO launch, there are several command line arguments that can be specified:
robot
as usualworld
as usualx_pose
,y_pose
as 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=true
androbot:=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.py
There 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.py
A 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
@misc{aditya2025robustlocalizationmappingnavigation,
title={Robust Localization, Mapping, and Navigation for Quadruped Robots},
author={Dyuman Aditya and Junning Huang and Nico Bohlinger and Piotr Kicki and Krzysztof Walas and Jan Peters and Matteo Luperto and Davide Tateo},
year={2025},
eprint={2505.02272},
archivePrefix={arXiv},
primaryClass={cs.RO},
url={https://arxiv.org/abs/2505.02272},
}