Skip to content

dyumanaditya/quad-stack

Repository files navigation

QuadStack Logo

QuadStack

Software stack for MAB and Unitree quadrupeds, powering robust localization, mapping and navigation:

Neural Locomotion Visual Inertial Kinematic Aided Odometry SLAM Navigation, Planning & Exploration


Features

  • Neural locomotion
  • Visual Inertial Kinematic aided odometry
  • Velocity Constrained SLAM
  • Navigation, Planning & Exploration

Install & Setup

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

Robots

This repository supports the

  • MAB Silver Badger (silver_badger)
  • MAB Honey Badger (honey_badger)
  • Unitree A1 (a1)
  • Unitree Go1 (go1)
  • Unitree Go2 (go2)
Image 1 Image 2 Image 3 Image 4 Image 5

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.

Worlds

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

Export the model Path

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

Add the world argument on bringup

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.

Neural Teleoperation

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

Visual Odometry

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:

  1. robot as usual
  2. world as usual
  3. x_pose, y_pose as usual for the initial robot position
  4. use_kinematics_odom (bool, default=true): this allows you to use leg odometry to reset the VO if it gets lost.
  5. rosbag (bool, default=false): this specifies whether a rosbag is going to be played after launching instead of real time simulation
  6. real_robot (bool, default=false, only works when rosbag=true and robot:=silver_badger/go2): this specifies if the rosbag is from a real robot or from simulation

SLAM

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:

  1. robot as usual
  2. world as usual
  3. x_pose, y_pose as usual for the initial robot position
  4. use_kinematics_odom (bool, default=true): this allows you to use leg odometry to reset the VO if it gets lost.
  5. rosbag (bool, default=false): this specifies whether a rosbag is going to be played after launching instead of real time simulation
  6. real_robot (bool, default=false, only works when rosbag=true and robot:=silver_badger/go2): this specifies if the rosbag is from a real robot or from simulation
  7. use_laser_stabilization (bool, default=true): whether to stabilize laser scan from depth images based on IMU values
  8. use_vel_map_constraints (bool, default=true): whether to add leg odometry computed velocity constraints to the SLAM factor graph.

Navigation

To launch navigation, the main launch line is as follows

ros2 launch quadstack_bringup navigation.launch.py

There are two ways to perform navigation:

  1. Navigation and SLAM
  2. 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.

Autonomous Exploration

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.

Bibtex

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}, 
}