This repository provides code for training perceptive policies for legged robots using the manager-based workflow in IsaacLab. Network architectures, distillation methods, and other configurations can be easily customized through parameters. The learned policies can be tested with MoCap or deployed on an onboard Mac Mini computer.
Please note that the official implementation of LocoTouch is built on IsaacSim 4.5 and IsaacLab 1.40. To reproduce LocoTouch with Ubuntu 20.04, please refer to the ubuntu-20 branch.
-
LocoTouch Implementations
-
Flexible Network Architectures for RL/IL
-
Teacher-Student Pipelines
- "RMA" (Latent Supervision)
- "Monolithic" (Action Supervision)
- "ROA" (Regularized Online Latent Supervision)
-
- Signal Reading and Processing for Distributed Tactile Sensors
- MoCap-Robot Communication via NaNet and ROS
- IsaacLab-compatible depoyment code for Locomotion, State-Based Transport, and Tactile-Aware Transport polcies
- Mac Mini Setup with Custom-Designed Shell (MacMini-for-Onboard-Robotics)

-
Evaluated Perception Modalities
- Proprioception (Motor / IMU)
- Tactile Sensing
- Visual Sensing (Depth / RGB)
- Other Modalities (e.g., LiDAR)
Please note that the unimplemented features are not part of LocoTouch, and there is no estimated timeline for their release.
- Ubuntu 22.04 (x64)
- GelForce RTX 4090 GPU (recommended)
- NVIDIA GPU Driver 570.169
- NVIDIA CUDA 12.8
- Follow the guide to install IsaacSim 5.0.
- Follow the guide to install IsaacLab 2.2.1 inside a Conda environment.
Using a python interpreter where IsaacLab is installed, install LocoTouch and Loco_RL:
cd LocoTouch
pip install -e .
cd loco_rl
pip install -e .
cd ..Verify the installation by playing the teacher and student policies:
- Teacher Policy:
python locotouch/scripts/play.py --task Isaac-RandCylinderTransportTeacher-LocoTouch-Play-v1 --num_envs=20 --load_run=2025-09-01_21-03-58
- Student Policy:
python locotouch/scripts/distill.py --task Isaac-RandCylinderTransportStudent_SingleBinaryTac_CNNRNN_Mon-LocoTouch-Play-v1 --num_envs=20 --log_dir_distill=2025-09-02_23-27-14 --checkpoint_distill=model_7.pt
- RL Training:
python locotouch/scripts/train.py --task Isaac-Locomotion-LocoTouch-v1 --num_envs=4096 --headless
- Play:
python locotouch/scripts/play.py --task Isaac-Locomotion-LocoTouch-Play-v1 --num_envs=20
- Deployment:
Follow the guide in Go1-Policy-Deployment for installation, and run:
python teleoperation/joystick.py
python deploy/locomotion.py
- RL Training (recommend 15k+ iterations):
python locotouch/scripts/train.py --task Isaac-RandCylinderTransportTeacher-LocoTouch-v1 --num_envs=4096 --headless
- Play:
python locotouch/scripts/play.py --task Isaac-RandCylinderTransportTeacher-LocoTouch-Play-v1 --num_envs=20
- Deployment:
Follow the guide in Go1-Policy-Deployment for installation, and run:
python teleoperation/joystick.py
python mocap/run_optitrack.py
python deploy/transport_teacher.py
-
Distillation:
python locotouch/scripts/distill.py --task Isaac-RandCylinderTransportStudent_SingleBinaryTac_CNNRNN_Mon-LocoTouch-v1 --training --num_envs=405 --headless --load_run=2025-09-01_21-03-58
Additional options are supported, e.g.:
python locotouch/scripts/distill.py --task Isaac-RandCylinderTransportStudent_SingleBinaryTac_CNNRNN_Mon-LocoTouch-v1 --training --num_envs=405 --headless --load_run=2025-09-01_21-03-58 --checkpoint=model_15000.pt --headless --distill_lr=0.0005
-
Play (replace with your own log_dir_distill folder):
python locotouch/scripts/distill.py --task Isaac-RandCylinderTransportStudent_SingleBinaryTac_CNNRNN_Mon-LocoTouch-Play-v1 --num_envs=20 --log_dir_distill=2025-09-02_23-27-14 --checkpoint_distill=model_7.pt
-
Deployment: Follow the guide in Go1-Policy-Deployment for installation, and run:
python teleoperation/joystick.py
python tactile_sensing/run_tactile_sensing.py
python deploy/transport_student.py
- Python is not installed:
conda install python=3.11
- Error occurs after running "./isaaclab.sh --install":
pip install --upgrade pip
- Visualization error occurs after running "python source/standalone/tutorials/00_sim/create_empty.py":
conda remove --force xorg-libxcb xorg-libx11 xorg-libxext libxcb libxkbcommon mesa-glu libglvnd
- Mitigating from IsaacLab 1.40 to 2.0:
omni.isaac.lab. -> isaaclab.
omni.isaac.lab_assets -> isaaclab_assets
omni.isaac.lab_tasks -> isaaclab_tasks
omni.isaac.lab_tasks.utils.wrappers.rsl_rl -> isaaclab_rl.rsl_rl
obs, extras = env.get_observations() ->
obs, rwd, dones, extras = self.env.step(action) ->
env_obs = env.get_observations() obs = env_obs["policy"] extras = {"observations": {k: v for k, v in env_obs.items()}}
quat_rotate_inverse -> quat_apply_inverse quat_rotate -> quat_applynext_obs, _, dones, extras = self.env.step(action) extras = {"observations": {k: v for k, v in next_obs.items()}}
Press ctrl + shift + p; choose Open Workspace Settings; modify and paste the following settings:
{
"python.analysis.extraPaths": [
"${workspaceFolder}/_isaac_sim",
"${workspaceFolder}/../IsaacLab/source/isaaclab_assets",
"${workspaceFolder}/../IsaacLab/source/isaaclab_rl",
"${workspaceFolder}/../IsaacLab/source/isaaclab",
"${workspaceFolder}/../IsaacLab/source/isaaclab_tasks",
"${workspaceFolder}/../IsaacLab/source/isaaclab_mimic",
"${workspaceFolder}/loco_rl"
]
}@article{lin2025locotouch,
title={LocoTouch: Learning Dynamic Quadrupedal Transport with Tactile Sensing},
author={Lin, Changyi and Song, Yuxin Ray and Huo, Boda and Yu, Mingyang and Wang, Yikai and Liu, Shiqi and Yang, Yuxiang and Yu, Wenhao and Zhang, Tingnan and Tan, Jie and others},
journal={arXiv preprint arXiv:2505.23175},
year={2025}
}

