目录

OpenER-G1:面向开放环境的具身机器人韧性运行框架

Open Environment Resilience Runtime for Humanoid Robots

OpenER-G1 面向开放、动态和非结构化环境中的人形机器人持续可靠运行,集成 CAT-VLA、Click-and-Traverse、NVIDIA GR00T-N1.7、SONIC Whole-Body Control、MuJoCo、DDS 与 ZMQ,构建从环境理解、策略选择、障碍穿越、到达确认、控制权交接到 VLA 技能执行的完整机器人闭环。

项目采用分层设计:复杂空间穿越由专用强化学习策略负责,视觉-语言-动作任务由 GR00T-N1.7 与 SONIC 完成,并通过运行时 Handover 机制协调不同控制器之间的安全切换。


1. 核心功能

1.1 多模态环境理解与策略选择

Click-and-Traverse/cat_vla 提供四种环境理解与策略路由方式:

模式 输入 功能
keyword 自然语言 基于关键词快速选择策略
llm 自然语言 基于本地 LLM 理解复杂任务描述
vla-lite 图像 + 指令 基于 VLM 分析场景并选择策略
scan RGB-D / 几何 多视角扫描、点云与几何分析

当前 CAT 策略覆盖地面障碍、顶部障碍、狭窄通道及组合约束,例如:

hurdle
crouch
side
side_hurdle
side_crouch
all_easy
all_hard

1.2 CAT 强化学习障碍穿越

Click-and-Traverse 提供 CAT 强化学习策略的训练、ONNX 转换、MuJoCo 评估与 DDS 部署流程:

PPO / DAgger
    ↓
Policy Checkpoint
    ↓
ONNX
    ↓
MuJoCo Evaluation
    ↓
DDS Deployment

部署后形成闭环:

rt/lowstate
    ↓
CAT Policy
    ↓
rt/lowcmd
    ↓
G1 Robot

1.3 GR00T + SONIC VLA 技能执行

GR00T-N1.7 根据:

Camera + Robot State + Prompt

生成 Action Chunk,并交由 SONIC Whole-Body Control 转换为 G1 全身控制指令。

当前可用于验证:

squat
lunge
dance
macarena
walk
jump
kick

1.4 CAT → SONIC 控制权交接

CAT 与 SONIC 都可能向 rt/lowcmd 发布控制命令,因此不能长期同时控制机器人。

项目实现运行时 Handover:

CAT Traversal
    ↓
Goal Reached
    ↓
Stable Hold
    ↓
SONIC Starts
    ↓
Runtime Monitoring
    ↓
CAT Releases Control
    ↓
SONIC Exclusive Control
    ↓
VLA Skill

CAT 到达目标后继续保持机器人平衡,并监测控制总线活动。当检测到 SONIC 已稳定上线后,CAT 自动退出,完成控制权切换。


2. 系统架构

                Language / Scene
                       │
                       ▼
                  CAT-VLA
                       │
                Policy Routing
                       │
                       ▼
            Click-and-Traverse
                       │
                RL Traversal
                       │
                       ▼
                  rt/lowcmd
                       │
                       ▼
                   MuJoCo G1
                       │
                 Goal Reached
                       │
                       ▼
                  Stable Hold
                       │
                       ▼
               Handover Manager
                       │
                       ▼
        Camera + State + Prompt
                       │
                       ▼
                 GR00T-N1.7
                       │
                 Action Chunk
                       │
                       ▼
                   SONIC WBC
                       │
                       ▼
                     G1

3. 项目结构

.
├── Click-and-Traverse/
│   ├── cat_vla/                 # 环境理解与策略路由
│   ├── cat_ppo/                 # CAT 训练与评估
│   └── deploy/                  # DDS 部署与 Handover
│
├── GR00T-WholeBodyControl/
│   ├── gear_sonic/              # MuJoCo、Camera、VLA Client
│   └── gear_sonic_deploy/       # SONIC WBC
│
├── Isaac-GR00T/                 # GR00T PolicyServer
├── unitree_lerobot/
└── weights/

4. 环境配置

推荐环境:

  • openKylin / Linux
  • Python 3.10+
  • NVIDIA GPU + CUDA
  • Docker
  • MuJoCo
  • TensorRT
  • ZeroMQ
  • CycloneDDS / Unitree SDK2
  • ROS 2

进入项目根目录后设置:

export PROJECT_ROOT="$(pwd)"

export GPU_ID=0
export DISPLAY_ID=:0

export POLICY_PORT=5550
export CAMERA_PORT=5555
export ACTION_PORT=5556
export STATE_PORT=5557
export CONTROL_PORT=5580

export GROOT_CKPT="$PROJECT_ROOT/weights/GR00T-N1.7-G1-SONIC-BonesSeed-V2"
export TENSORRT_ROOT=/path/to/TensorRT

每次系统重启后,建议先确保本机 DDS 回环接口支持 multicast:

sudo ip link set lo multicast on
ip link show lo

有界面运行:

export DISPLAY="$DISPLAY_ID"
export __GLX_VENDOR_LIBRARY_NAME=nvidia
unset PYOPENGL_PLATFORM
export MUJOCO_GL=glfw

无界面服务器:

unset DISPLAY
export MUJOCO_GL=egl

5. CAT-VLA 运行

进入:

cd "$PROJECT_ROOT/Click-and-Traverse"

Keyword

python cat_vla.py "跨过去"
python cat_vla.py "低头蹲下钻过去"
python cat_vla.py "侧身通过"

LLM

先启动本地 LLM 服务,例如:

ollama serve

执行:

python cat_vla.py \
  --mode llm \
  "前面有一个较低的障碍,请选择合适的通过方式"

VLA-Lite

配置兼容 OpenAI API 的本地视觉模型服务:

export OPENAI_BASE_URL=http://127.0.0.1:8080/v1
export OPENAI_API_KEY=not-needed

执行:

python cat_vla.py \
  --mode vla-lite \
  --scene data/assets/TypiObs/side-hurdle-crouch3 \
  "帮我安全穿过当前区域"

Scan

python cat_vla.py \
  --mode scan \
  --scene data/assets/TypiObs/side-hurdle-crouch3 \
  "分析障碍"

交互模式

python cat_vla.py --interactive

策略评估

python cat_vla.py \
  --eval \
  --episodes 50 \
  --mode scan \
  --scene data/assets/TypiObs/hurdle0 \
  "分析障碍"

如果当前版本入口不是仓库根目录下的 cat_vla.py,请根据 Click-and-Traverse/cat_vla/README.md 中的实际入口运行。


6. Mode A:GR00T + SONIC VLA 闭环

Terminal 1:GR00T PolicyServer

export CUDA_VISIBLE_DEVICES="$GPU_ID"

cd "$PROJECT_ROOT/GR00T-WholeBodyControl"
source .venv_inference/bin/activate

HF_HUB_OFFLINE=1 \
TRANSFORMERS_OFFLINE=1 \
python "$PROJECT_ROOT/Isaac-GR00T/gr00t/eval/run_gr00t_server.py" \
  --model-path "$GROOT_CKPT" \
  --embodiment-tag UNITREE_G1_SONIC \
  --device cuda:0 \
  --port "$POLICY_PORT"

Terminal 2:MuJoCo

cd "$PROJECT_ROOT/GR00T-WholeBodyControl"
source .venv_sim/bin/activate

export DISPLAY="$DISPLAY_ID"
export __GLX_VENDOR_LIBRARY_NAME=nvidia
unset PYOPENGL_PLATFORM
export MUJOCO_GL=glfw

python gear_sonic/scripts/run_sim_loop.py \
  --interface sim \
  --enable-onscreen \
  --enable-offscreen \
  --enable-image-publish \
  --camera-port "$CAMERA_PORT"

Terminal 3:SONIC Deploy

宿主机:

cd "$PROJECT_ROOT/GR00T-WholeBodyControl/gear_sonic_deploy"

export TensorRT_ROOT="$TENSORRT_ROOT"

./docker/run-ros2-dev.sh

容器内:

export CUDA_VISIBLE_DEVICES="$GPU_ID"

cd /workspace/g1_deploy
source scripts/setup_env.sh

bash deploy.sh \
  --input-type zmq_manager \
  --output-type all \
  sim

Terminal 4:运行时控制

cd "$PROJECT_ROOT/GR00T-WholeBodyControl"
source .venv_sim/bin/activate

python - <<'PY'
import os
import time
import zmq

port = os.getenv("CONTROL_PORT", "5580")

ctx = zmq.Context()
pub = ctx.socket(zmq.PUB)
pub.bind(f"tcp://127.0.0.1:{port}")

time.sleep(0.5)

print("k=start/stop")
print("i=init pose")
print("p=pause/unpause")
print("t <prompt>=change prompt")

while True:
    msg = input("> ").strip()
    if not msg:
        continue

    if msg.startswith("t "):
        pub.send_string("prompt:" + msg[2:].strip())
    else:
        pub.send_string(msg)
PY

Terminal 5:VLA Client

cd "$PROJECT_ROOT/GR00T-WholeBodyControl"
source .venv_inference/bin/activate

python gear_sonic/scripts/run_vla_inference.py \
  --host 127.0.0.1 \
  --port "$POLICY_PORT" \
  --camera-host 127.0.0.1 \
  --camera-port "$CAMERA_PORT" \
  --state-zmq-host 127.0.0.1 \
  --state-zmq-port "$STATE_PORT" \
  --action-zmq-host 127.0.0.1 \
  --action-zmq-port "$ACTION_PORT" \
  --prompt "squat" \
  --action-horizon 40

正常情况下可以看到:

PolicyServer is reachable.
New action chunk ...
ZMQ: Sent latent action ...

机器人落地并稳定后,在控制终端依次输入:

k
i
p

切换技能:

t squat
t lunge
t dance
t macarena
t walk
t jump
t kick

7. Mode B:CAT 障碍穿越

Mode B 下不要启动 SONIC Deploy。CAT 与 SONIC 都会写 rt/lowcmd

Terminal 1:CAT 场景

cd "$PROJECT_ROOT/GR00T-WholeBodyControl"
source .venv_sim/bin/activate

export DISPLAY="$DISPLAY_ID"
export __GLX_VENDOR_LIBRARY_NAME=nvidia
unset PYOPENGL_PLATFORM
export MUJOCO_GL=glfw

python gear_sonic/scripts/run_sim_loop.py \
  --wbc-version sonic_model12_catbend \
  --interface sim \
  --enable-onscreen \
  --enable-offscreen \
  --enable-image-publish \
  --camera-port "$CAMERA_PORT"

Terminal 2:CAT DDS Controller

cd "$PROJECT_ROOT/Click-and-Traverse"

PYTHONPATH=deploy \
"$PROJECT_ROOT/GR00T-WholeBodyControl/.venv_sim/bin/python" \
deploy/scripts/deploy_cat_dds.py \
  --obs-name bend \
  --exp-name G1Cat_bend

推荐流程:

Controller Start
      ↓
Default Pose
      ↓
Robot Landing
      ↓
Stable Balance
      ↓
Start Navigation
      ↓
Obstacle Traversal
      ↓
Goal Reached

8. Mode C:CAT → SONIC/VLA 完整任务

Mode C 用于验证:

CAT Traversal
      ↓
Goal Verification
      ↓
Stable Hold
      ↓
Runtime Handover
      ↓
SONIC Exclusive Control
      ↓
GR00T VLA Skill

提前启动:

  1. GR00T PolicyServer;
  2. CAT 场景 MuJoCo;
  3. Runtime Control;
  4. VLA Client。

此时暂不启动 SONIC Deploy。

启动 CAT Handover:

cd "$PROJECT_ROOT/Click-and-Traverse"

PYTHONPATH=deploy \
"$PROJECT_ROOT/GR00T-WholeBodyControl/.venv_sim/bin/python" \
deploy/scripts/deploy_cat_dds.py \
  --obs-name bend \
  --exp-name G1Cat_bend \
  --handover

机器人落地并稳定后启动导航。

到达目标后,CAT 会继续保持机器人平衡并进入 Handover Ready。

随后启动 SONIC Deploy。等待 SONIC 初始化完成后,在 Runtime Control 中输入:

k

当 CAT 检测到第二控制器持续发布 rt/lowcmd 后,将自动让位退出。

确认 CAT 已退出后,再输入:

i
p

切换后续技能:

t squat
t dance
t macarena

交接阶段不要提前执行高动态动作或手臂初始化。


9. 运行日志

CAT 仿真与 DDS 部署轨迹位于:

Click-and-Traverse/action_log/

典型日志包括:

sim-G1Cat_*/
dds-G1Cat_*/
obs_act_record.pkl

可用于复现实验轨迹、分析 observation/action 变化以及定位运行问题。


10. 注意事项

  • CAT 与 SONIC 不应长期同时向 rt/lowcmd 发送控制命令;
  • Mode C 仅允许 Handover 阶段短暂重叠;
  • CAT 场景配置、Observation 配置与对应策略需要匹配;
  • 建议先完成机器人落地和平衡,再启动 CAT Navigation;
  • 高动态技能如 jumpkick 建议在基础闭环稳定后再测试;
  • 公开仓库中不要提交服务器绝对路径、Token、私有账号或失效符号链接;
  • 大模型权重是否随仓库发布,请遵循对应模型许可证;
  • 真实机器人部署前应额外配置急停、关节限位、速度/力矩限制等硬件安全机制。

11. Acknowledgements

本项目基于或集成:

  • Click-and-Traverse
  • NVIDIA Isaac-GR00T
  • GR00T Whole-Body Control / GEAR-SONIC
  • MuJoCo
  • ROS 2
  • Unitree SDK2
  • LeRobot

各第三方组件版权与许可证以其原始仓库中的 LICENSECITATION.cffATTRIBUTIONS.md 和相关说明为准。

关于
721.4 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号