跳到主要内容

第一期:全身遥操作

在电脑上运行 Sonic 仿真

系统最低需求
  • CPU:x86_64 架构
  • 显卡:Nvidia RTX 3070 / 4060,8 GB 显存
  • 内存:16 GB
  • 硬盘容量:200 GB

依赖安装

提示

需要将用户添加到 docker

sudo usermod -aG docker $USER # 运行完需重启

下载 ioenv

git clone https://github.com/ioai-tech/ioenv_cli.git
  • 加载环境变量
echo 'source <path_to_ioenv_cli>/ioenv_cli/ioenv.sh' >> ~/.bashrc # 把 <path_to_ioenv_cli> 换成 ioenv_cli 在本机的目录
source ~/.bashrc
  • 使用 ioenv list 查看可用镜像
ioenv list

ENVIRONMENT IMAGE CONTAINER STATUS
----------- ----- --------- ------
isaaclab yes -- --
mujocosim -- -- --
onboard -- -- --
sonic_onboard -- -- --
sonic_sim -- -- --
sonic_train yes yes running
  • 使用 ioenv pull <ENVIRONMENT> 拉取镜像
ioenv pull sonic_sim

# 国内用户使用华为云下载
ioenv pull sonic_sim --from-mirror

运行

# 第一个终端
ioenv run sonic_sim

cd /opt/GR00T-WholeBodyControl
source .venv_teleop/bin/activate
python gear_sonic/scripts/run_sim_loop.py
# 第二个终端
ioenv run sonic_sim

cd /opt/GR00T-WholeBodyControl/gear_sonic_deploy
./deploy.sh sim --input-type zmq_manager

## 如果使用键盘输入
./deploy.sh sim
# 第三个终端
ioenv run sonic_sim

cd /opt/GR00T-WholeBodyControl
source .venv_teleop/bin/activate
python gear_sonic/scripts/pico_manager_thread_server.py --manager

在 Pico 上运行 XRoboToolkit

安装

  • APK 下载地址:XRoboToolkit-PICO-1.1.1.apk

  • 把 APK 下载到笔记本上,用 USB 线把 Pico 连接到笔记本

  • 把 APK 拖入 Pico 的 Download 文件夹

  • 断开 USB 连接,在 Pico 主界面完成安装

校准

  1. 打开体感追踪器

  2. 佩戴模式选择「3 个追踪器」

  3. 点击「开始配对」,按住 Pico Motion Tracker 上的按键 6 秒进入配对模式

  4. 点击按键进行校准

设置

  • 在 PC Service 中把目标 IP 改成部署 SONIC 设备的 IP

在宇树 G1 上部署 Sonic

前置准备

首次部署前需要完成以下三项准备工作,详细步骤见文末附录:

下载 ioenv

git clone https://github.com/ioai-tech/ioenv_cli.git
  • 加载环境变量
echo 'source <path_to_ioenv_cli>/ioenv_cli/ioenv.sh' >> ~/.bashrc # 把 <path_to_ioenv_cli> 换成 ioenv_cli 在本机的目录
source ~/.bashrc
  • 使用 ioenv list 查看可用镜像
ioenv list

ENVIRONMENT IMAGE CONTAINER STATUS
----------- ----- --------- ------
isaaclab yes -- --
mujocosim -- -- --
onboard -- -- --
sonic_onboard -- -- --
sonic_sim -- -- --
sonic_train yes yes running
  • 使用 ioenv pull <ENVIRONMENT> 拉取镜像
ioenv pull sonic_onboard

# 国内用户使用华为云下载
ioenv pull sonic_onboard --from-mirror

运行

# 第一个终端
ioenv run sonic_onboard

cd gear_sonic_deploy
source scripts/setup_env.sh
./deploy.sh real --input-type zmq_manager
# 第二个终端
ioenv run sonic_onboard

source .venv_teleop/bin/activate
python gear_sonic/scripts/pico_manager_thread_server.py --manager

在电脑上训练 Sonic

备注
  • 示例命令使用 RTX 3090 训练
  • 我们真实训练使用 8 卡 RTX PRO 6000

依赖安装

提示

需要将用户添加到 docker

sudo usermod -aG docker $USER # 运行完需重启

下载 ioenv

git clone https://github.com/ioai-tech/ioenv_cli.git
  • 加载环境变量
echo 'source <path_to_ioenv_cli>/ioenv_cli/ioenv.sh' >> ~/.bashrc # 把 <path_to_ioenv_cli> 换成 ioenv_cli 在本机的目录
source ~/.bashrc
  • 使用 ioenv list 查看可用镜像
ioenv list

ENVIRONMENT IMAGE CONTAINER STATUS
----------- ----- --------- ------
isaaclab yes -- --
mujocosim -- -- --
onboard -- -- --
sonic_onboard -- -- --
sonic_sim -- -- --
sonic_train yes yes running
  • 使用 ioenv pull <ENVIRONMENT> 拉取镜像
ioenv pull sonic_train

# 国内用户使用华为云下载
ioenv pull sonic_train --from-mirror

数据准备

系统要求
  • GPU:NVIDIA GPU(推荐 L40)
  • CUDA:CUDA 12.x
  • 进入 sonic_train 环境
ioenv run sonic_train
  • 可选:在挂载目录下创建软链接到项目目录,防止 container 重启时数据丢失
mkdir -p /root/workspace/data
ln -s /root/workspace/data /opt/GR00T-WholeBodyControl/data

mkdir -p /root/workspace/sonic_release
ln -s /root/workspace/sonic_release /opt/GR00T-WholeBodyControl/sonic_release
  • 从 Hugging Face 下载模型 checkpointsSMPL motion data
cd /opt/GR00T-WholeBodyControl/

## 此处需要开代理
export https_proxy=http://127.0.0.1:7897/
export http_proxy=http://127.0.0.1:7897/

python download_from_hf.py --training
  • 下载 BONES-SEED 数据集

  • 在 Hugging Face 上登录,点击右上角头像 → access tokens,生成一个 tokentoken 的权限选择 Read access to contents of all public gated repos you can access

  • bones-seed 的 Hugging Face 页面上填写表单获取下载权限:https://huggingface.co/datasets/bones-studio/seed

## 需要代理
export https_proxy=http://127.0.0.1:7897/
export http_proxy=http://127.0.0.1:7897/

# 需要先登录
huggingface-cli login

## 下载 bones-seed 中全部的文件
huggingface-cli download bones-studio/seed --repo-type dataset --local-dir ./data/bones-seed

## 我们只下载其中的 g1.tar.gz
export HF_HUB_ENABLE_HF_TRANSFER=1
huggingface-cli download bones-studio/seed g1.tar.gz --repo-type dataset --local-dir ./data/bones-seed

## 解压
tar -xzf data/bones-seed/g1.tar.gz -C data/bones-seed/g1
  • 转换运动数据

SONIC 需要 motion_lib PKL 格式的运动数据,这一步把 Bones-SEED 的 CSV 转换为 PKL

cd /opt/GR00T-WholeBodyControl/

python gear_sonic/data_process/convert_soma_csv_to_motion_lib.py \
--input data/bones-seed/g1/csv/ \
--output data/motion_lib_bones_seed/robot \
--fps 30 \
--fps_source 120 \
--individual \
--num_workers 16
  • 过滤数据

删掉 G1 机器人无法执行的动作(与家具的交互、车辆、特技动作、高处平台 / 抬高表面)。

cd /opt/GR00T-WholeBodyControl/

python gear_sonic/data_process/filter_and_copy_bones_data.py \
--source data/motion_lib_bones_seed/robot \
--dest data/motion_lib_bones_seed/robot_filtered \
--workers 16

文件结构

/opt/GR00T-WholeBodyControl/
├── data/motion_lib_bones_seed/
│ ├── robot/ # Full motion library (142K PKLs)
│ └── robot_filtered/ # Filtered subset (~130K PKLs)
└── gear_sonic/

训练

  • 训练开始前,可以用 sample_data 跑通 pipeline
# 下载 sample data
python download_from_hf.py --sample

python gear_sonic/train_agent_trl.py \
+exp=manager/universal_token/all_modes/sonic_release \
num_envs=16 headless=True \
++manager_env.commands.motion.motion_lib_cfg.motion_file=sample_data/robot_filtered \
++manager_env.commands.motion.motion_lib_cfg.smpl_motion_file=sample_data/smpl_filtered
  • 之后可以用转换好的 BONES-SEED 数据集训练
python gear_sonic/train_agent_trl.py \
+exp=manager/universal_token/all_modes/sonic_release \
num_envs=4096 headless=True \
++manager_env.commands.motion.motion_lib_cfg.motion_file=data/motion_lib_bones_seed/robot_filtered \
++manager_env.commands.motion.motion_lib_cfg.smpl_motion_file=data/smpl_filtered
  • 也可以用下载好的 checkpoint 做微调
python gear_sonic/train_agent_trl.py \
+exp=manager/universal_token/all_modes/sonic_release \
+checkpoint=sonic_release/last.pt \
num_envs=4096 headless=True \
++manager_env.commands.motion.motion_lib_cfg.motion_file=data/motion_lib_bones_seed/robot_filtered \
++manager_env.commands.motion.motion_lib_cfg.smpl_motion_file=data/smpl_filtered

训练的 checkpoint 保存在 /opt/GR00T-WholeBodyControl/logs_rl/TRL_G1_Track/manager/universal_token/all_modes/sonic_release_test-<timestamp>/ 里。

评估 checkpoint

可以使用 metrics 或者 videos 来评估。

# --- Metrics ---
python gear_sonic/eval_agent_trl.py \
+checkpoint=<path_to_checkpoint.pt> \
+headless=True \
++eval_callbacks=im_eval \
++run_eval_loop=False \
++num_envs=128 \
"+manager_env/terminations=tracking/eval" \
"++manager_env.commands.motion.motion_lib_cfg.max_unique_motions=512"
# --- Render videos ---
python gear_sonic/eval_agent_trl.py \
+checkpoint=<path_to_checkpoint.pt> \
+headless=True \
++eval_callbacks=im_eval \
++run_eval_loop=False \
++num_envs=8 \
++manager_env.config.render_results=True \
"++manager_env.config.save_rendering_dir=/tmp/renders" \
++manager_env.config.env_spacing=10.0 \
"~manager_env/recorders=empty" "+manager_env/recorders=render"
  • 如果无法登录 wandb,可以用本地模式查看训练曲线
WANDB_MODE=offline python gear_sonic/train_agent_trl.py ...   # offline mode
wandb.wandb_project=my_project wandb.wandb_entity=my_team # custom project
use_wandb=false # disable entirely

导出 ONNX 模型

python gear_sonic/eval_agent_trl.py \
+checkpoint=<path_to_checkpoint.pt> \
+headless=True ++num_envs=1 \
+export_onnx_only=true

导出的 ONNX 模型在 /opt/GR00T-WholeBodyControl/logs_rl/TRL_G1_Track/manager/universal_token/all_modes/sonic_release_test-<timestamp>/exported/ 里,我们需要里面的 model_step_<num_step>_encoder.onnxmodel_step_<num_step>_decoder.onnx

部署自己训练的模型

注意

截止 2026 年 5 月 21 日,如果想部署自己训练好的 .onnx 文件,需要下载 g1_wrist_joints_10_clean.yaml,作者在这个 GitHub Issue 中有所提及。

在仿真里部署自己的模型

  • 确保已经安装 ioenv,并且拉取好 sonic_onboard 镜像

  • .onnx 文件和 .yaml 文件拷贝到共享文件夹

mkdir -p ~/ioenv_ws/sonic_sim_ws/sonic_patch
cp g1_wrist_joints_10_clean.yaml ~/ioenv_ws/sonic_sim_ws/sonic_patch
cp model_step_<num_step>_encoder.onnx ~/ioenv_ws/sonic_sim_ws/sonic_patch
cp model_step_<num_step>_decoder.onnx ~/ioenv_ws/sonic_sim_ws/sonic_patch
  • 运行
# 第一个终端
ioenv run sonic_sim

cd /opt/GR00T-WholeBodyControl
source .venv_teleop/bin/activate
python gear_sonic/scripts/run_sim_loop.py
# 第二个终端
ioenv run sonic_sim

## 运行自己训练的模型
just run g1_deploy_onnx_ref lo model_step_<num_step>_decoder.onnx reference/example/ \ --obs-config /root/workspace/sonic_patch/g1_wrist_joints_10_clean.yaml \ --encoder-file /root/workspace/sonic_patch/model_step_<num_step>_encoder.onnx \ --planner-file planner/target_vel/V2/planner_sonic.onnx \ --input-type manager \ --enable-motion-recording \ --enable-csv-logs \ --disable-crc-check
# 第三个终端
ioenv run sonic_sim

cd /opt/GR00T-WholeBodyControl
source .venv_teleop/bin/activate
python gear_sonic/scripts/pico_manager_thread_server.py --manager

在宇树 G1 上部署自己的模型

  • 确保已经安装 ioenv,并且拉取好 sonic_onboard 镜像

  • .onnx 文件和 .yaml 文件拷贝到共享文件夹

mkdir -p ~/ioenv_ws/sonic_onboard_ws/sonic_patch
cp g1_wrist_joints_10_clean.yaml ~/ioenv_ws/sonic_sim_ws/sonic_patch
cp model_step_<num_step>_encoder.onnx ~/ioenv_ws/sonic_sim_ws/sonic_patch
cp model_step_<num_step>_decoder.onnx ~/ioenv_ws/sonic_sim_ws/sonic_patch
  • 运行
# 第一个终端
ioenv run sonic_onboard

# 使用自己训练的模型运行
just run g1_deploy_onnx_ref enP8p1s0 /root/workspace/sonic_patch/model_step_<num_step>_decoder.onnx reference/example/ \ --obs-config /root/workspace/sonic_patch/g1_wrist_joints_10_clean.yaml \ --encoder-file /root/workspace/sonic_patch/model_step_<num_step>_encoder.onnx \ --planner-file planner/target_vel/V2/planner_sonic.onnx \ --input-type zmq_manager \ --enable-motion-recording \ --enable-csv-logs
# 第二个终端
ioenv run sonic_onboard

source .venv_teleop/bin/activate
python gear_sonic/scripts/pico_manager_thread_server.py --manager

附录

工具

  • Ubuntu 22.04 笔记本

  • 硬盘盒、硬盘(256 GB 及以上)、数据线

  • 宇树 G1

  • 工具(从上到下):六角扳手、六角星螺丝刀、十字螺丝刀

刷 SSD 和机器人固件

SSD 硬盘刷入 Jetson 镜像

  1. 把 SSD 硬盘插入硬盘盒,连接到笔记本电脑

  2. 卸载 SSD 硬盘

    sudo umount /dev/sda*
  3. 把 SSD 格式化为 ext4 文件系统

    sudo mkfs -t ext4 /dev/sda
  4. 这个链接下载宇树 G1 的 Jetson 6.2 镜像 g1-nx-j6.2.img.bz2,刷入 SSD(约写入 250 GB 数据)

    bzip2 -dc g1-nx-j6.2.img.bz2 | sudo dd of=/dev/sda bs=4M status=progress conv=fsync
  5. 刷完后弹出 SSD

    sudo sync
    sudo udisksctl power-off -b /dev/sda

拆解宇树 G1 的 SSD

  1. 使用六角扳手移除背后把手处的螺丝
  1. 敲开后背的银色后盖
  1. 使用六角星螺丝刀移除红圈内的螺丝
  1. 撕开内部的黑色塑料后盖
  1. 使用十字螺丝刀拧开固定 SSD 的螺丝
注意

第一次拆解 SSD 螺丝会有密封胶。用较小号的螺丝刀对准螺丝,再用物品在螺丝刀上方敲击,破坏密封胶后再拧。

宇树 G1 刷入 JetPack 6.2 固件

  1. 先短按,再长按电源键开机 G1,等待三个电源指示灯稳定亮起。

  2. 使用 USB-C 线将机器人连接到笔记本电脑。

  3. 同时按住绿灯右侧的两个白色按钮两秒钟。

  4. 继续按住它们的同时,松开顶部的白色按钮(PWR),继续按住底部(REC)两秒钟,直到三个绿色灯变成两个绿色灯。

  1. 当只有两盏灯亮起时,机器人进入刷写模式。在电脑上打开一个新终端并输入 lsusb,应该会看到包含 NVIDIA Corp. APX 的文本。

    lsusb
  2. 这个链接下载 Jetpack_6.2_nx.tar.bz2,运行以下命令刷写 Jetson Orin NX 的 JetPack 6.2 固件,过程约 8 分钟。

    sudo tar -xjvf Jetpack_6.2_nx.tar.bz2
    cd Jetpack_6.2_nx/Linux_for_Tegra
    sudo ./flash_nx_module.sh
  3. 刷写完成后,装回 SSD、装好后盖。

系统配置

通过 Wi-Fi 连接宇树 G1

  1. 用网线连接宇树 G1 和笔记本电脑

  2. ssh 进入宇树 Orin NX 开发板,有线网口地址:192.168.123.164,用户名 unitree,密码 123

    ssh unitree@192.168.123.164 # password 123
  3. 开启宇树 G1 的 Wi-Fi

    sudo nmtui
    # 在图形界面连接 Wi-Fi
  4. 查看宇树 G1 无线网卡的 IP 地址

    ifconfig
  5. 拿到无线网卡 IP 后可以断开网线,改用 Wi-Fi 连接宇树

    ssh unitree@<WiFi-IP> # password 123

Orin NX 打开高性能模式

刚装完系统时,Orin 默认不开启性能模式。用 jtop 查看时,5-8 核 cpu 未打开,Jetson Clocks 为未激活,功率也只有 15W

  • 开启高性能模式
sudo nvpmodel -m 0
sudo jetson_clocks
sudo jetson_clocks --show

然后输入 jtop 查看,高性能模式已开启。

安装 JetPack 相关库

使用 jtop 切换到 INFO 页面,发现 CUDA 相关库缺失,需要手动安装。

  • apt 安装 jetpack

    sudo apt update
    sudo apt install nvidia-jetpack

安装完成后可以在 jtop 里查看这些库的版本。

SSD 扩容

安装完成后,使用 df -h 查看磁盘空间只有 256 GB,而我们安装时用的是 2 TB 的硬盘,接下来要对磁盘扩容。

  1. 查看硬盘有多少未使用空间

    sudo parted /dev/nvme0n1 print free

    可以看到有 254 GB 已使用(蓝色框),1744 GB 未使用(红色框)。

  2. 把未使用分区接到 ext4 分区之后

    sudo parted /dev/nvme0n1
    # parted 软件中
    resizepart 1 100%
    # 在线扩容
    sudo resize2fs /dev/nvme0n1p1
  3. 验证,可以看到 ext4 分区扩容到 2 TB

    sudo parted /dev/nvme0n1 print free