Revo 2 适配宇树 G1(测试与常见问题)
示例1:简单动作
1. 机器人配置
修改通用配置 brainco_ws/src/control_py/config/smach_config.yaml
mode:
current_mode: simple # 选择预定义的模式修改模式配置 brainco_ws/src/control_py/control_py/state_manager/<mode>/<mode>_states_config.yaml
behavior_trees:
active: # 动作序列
active_expected_duration: # 每个动作的执行时间,在此期间不会被其他动作打断2. Unitree 终端1: 启动主控制节点和灵巧手节点
# 进入工作空间
cd ~/unitree-g1-brainco-hand/brainco_ws
# 激活环境
conda activate g1brainco
# (可选)启动上肢运控
./launch/launch_robot.sh
# (可选)单独启动手臂运控
./launch/launch_robot.sh arm
# (可选)启动全身运控
# 需使用遥控手柄让机器人进入"常规运控模式(R1 + X)"
./launch/launch_robot.sh body检查输出信息:
| node | info | |
|---|---|---|
| stark_node | slave[126] get_device_info... DeviceInfo: ... slave[127] get_device_info... DeviceInfo: ... | 双手通信正常 |
| high_cmd_node | G1 HighCmd service ready | 下肢运控 bridge 已准备 |
| smach_main_node | Importing ultralytics YOLO. Please wait... | 等待 YOLO 模型加载完成(如果启用) |
| smach_main_node | Mode: eeg 检查正确 | 选择的控制模式 |
| smach_main_node | IK initialization done. | 加载 IK |
| smach_main_node | Request 'configure' to start | 等待 agent 控制命令 |
3. Unitree 终端2: 启动 Agent 网络服务
# 进入工作空间
cd ~/unitree-g1-brainco-hand/brainco_ws
# 激活conda环境
conda activate g1brainco
# 启动 Agent 服务
./launch/launch_trans.sh agent检查输出信息:
| node | info | |
|---|---|---|
| smach_trans_node | All ROS2 services ready | 检测 ROS2 服务已启动 |
| server | UDP discovery listening on ('0.0.0.0', 37020) | 等局域网广播发现 |
| agent | TCP listening on ('0.0.0.0', 43210) | 状态机命令端口 |
| agent | TCP listening on ('0.0.0.0', 46000) | 动作/切换命令端口 |
| smach_trans_node | Agents started | 网络代理服务已经启动成功 |
4. 控制端 PC: 打开控制 GUI
# 进入 client 目录
cd ui_client
# 激活conda环境
conda activate braincogui
# 启动 GUI
python ui_client/ui_client.py执行动作
Init -> Ready -> Active -> (e.g.)a1_Hello -> 手臂放下3s后可执行下个动作结束动作
(e.g.)a1_Hello -> Ready/Ready(Table Safe) 会打断正在执行的动作| UI config | description | default |
|---|---|---|
| 左上角IP | 同网络下的机器人IP | 192.168.123.164 |
| Port1 | 内部状态机命令,不可被发现 | 43210 |
| Port2 | Action切换命令,可以通过广播自动发现 | 46000 |
| State | ||
|---|---|---|
| Init | 初始状态 | |
| Ready | 机器人准备/回零 | 手臂从当前位置径直恢复原位 |
| Ready (Table Safe) | 机器人准备/回零 | 手臂绕过桌子恢复原位 |
| Shutdown | 机器人急停 | 重启需在机器人端重启两个终端命令 |
注意:
- 激活命令显示黄色,可达命令显示白色
- 左侧状态机不影响下肢 HighCmd
Active期间,正在执行的动作在一定时间(可配置)内不会被其他Action打断,但可通过Ready回零,或通过Shutdown急停
示例2:手眼标定
1. 机器人配置
修改通用配置 brainco_ws/src/control_py/config/smach_config.yaml
mode:
current_mode: calibr # 选择手眼标定模式检查标定配置 brainco_ws/src/control_py/control_py/state_manager/calibrate/calibrate_config.yaml
paths:
cam_calibr_dir: /home/unitree/unitree-g1-brainco-hand/cam_calibr
collection:
move_range: [0.015, 0.015, 0.015, 0.15, 0.15, 0.15]cam_calibr_dir: 标定数据保存目录move_range: 采集标定数据时机械臂末端随机运动范围
2. Unitree 终端1: 启动主控制节点和灵巧手节点
# 进入工作空间
cd ~/unitree-g1-brainco-hand/brainco_ws
# 激活环境
conda activate g1brainco
# (推荐)单独启动手臂运控
./launch/launch_robot.sh arm检查输出信息:
- IK初始化结束
"IK initialization done." - 当显示
"Request 'configure' to start"则可以发送状态转换请求
3. Unitree 终端2: 启动 Agent 网络服务
# 进入工作空间
cd ~/unitree-g1-brainco-hand/brainco_ws
# 激活 conda 环境
conda activate g1brainco
# 启动 Agent 服务
./launch/launch_trans.sh agent4. 客户端 PC: 打开控制 GUI
# 进入 client 目录
cd ui_client
# 激活 conda 环境
conda activate braincogui
# 启动 GUI
python ui_client/ui_client.py5. 采集手眼标定数据
先准备好棋盘格标定板。我们提供与 Revo2 手腕同构的棋盘格标定板3D打印文件标定板(待更新)和标定板支架,自行打印后,可直接替换 Revo2 双手完成标定。

分别执行左右手标定
Init -> Ready -> Active -> Calibr-Left-Start -> Calibr-Right-Start -> Ready采集过程中,程序会自动控制机械臂随机运动并保存数据。默认每侧采集 20 组数据。
生成的数据文件:
- 图像:
cam_calibr/imgs/left/,cam_calibr/imgs/right/ - 机械臂位姿:
cam_calibr/arm_pose/left.json,cam_calibr/arm_pose/right.json
6. 离线计算标定结果
左右手均采集完成后,检查左右手图像
cd ~/unitree-g1-brainco-hand/cam_calibr
chmod +x ./imgs/check_img_grid.sh
./imgs/check_img_grid.sh left
./imgs/check_img_grid.sh right离线计算标定参数
cd ~/unitree-g1-brainco-hand/cam_calibr
python compute_calibration.py运行完成后会生成:
cam_calibr/settings.yaml
该文件包含左右手对应的相机外参,后续 calibrate 模式会读取该文件用于坐标转换。
示例3:脑控机器人任务
1. 机器人配置
通用配置
修改通用配置 config/smach_config.yaml
mode:
current_mode: eeg # 选择当前模式
trigger_test: False # 转换异常是否触发程序中断(机器人调试时可设置为 True,脑控时推荐 False)
robot:
robot_dof: 29 # 机器人型号
safe_height_threshold: 0.07 # 单位:米,相对于机器人腰部零位高度,用于判定是否启用 SafeArmDown脑控动作域配置
可以修改 eeg 动作配置 state_manager/eeg/eeg_states_config.yaml
behavior_trees: # 动作序列
active_expected_duration: # 为每个动作设置期望持续时间,单位为秒视觉配置
部分动作 Grasp-Apple, Pour-Water 需要视觉信息,先擦完成 07 Test Run 示例2 手眼标定
修改视觉偏移 state_manager/eeg/vision_config.yaml
Replay 动作配置
部分动作 Biubiubiu 为 LeRobot 3.0 上肢遥操数据集回放
配置回放数据 state_manager/eeg/datasets_config.yaml
2. Unitree 终端1: 启动主控制节点和灵巧手节点
# 进入工作空间
cd ~/unitree-g1-brainco-hand/brainco_ws
# 激活环境
conda activate g1brainco
# 启动全身运控 (推荐先测试上肢动作,再启动全身运控)
./launch/launch_robot.sh body检查输出信息:
- IK初始化结束
"IK initialization done." - 当显示
"Request 'configure' to start"则可以发送状态转换请求
3. Unitree 终端2: 启动 Agent 网络服务
# 进入工作空间
cd ~/unitree-g1-brainco-hand/brainco_ws
# 激活 conda 环境
conda activate g1brainco
# 启动 Agent 服务
./launch/launch_trans.sh agent4. 客户端 PC: 打开控制 GUI
# 进入 client 目录
cd ui_client
# 激活 conda 环境
conda activate braincogui
# 启动 GUI
python ui_client/ui_client.py通过软件 GUI 管理机器人状态
Init -> Ready -> Active点击GUI 右侧动作按钮,或者通过脑控机器人训练平台发出动作指令
(e.g.)a1_Hello -> 手臂放下3s后可执行下个动作通过软件管理结束动作
Ready/Ready(Table Safe) 会打断正在执行的动作FAQ
System
Q1. 配置自定义网络后,可能无法连接网络
# 移除默认路由
sudo ip route del default via 192.168.123.1 dev eth0Q2. colcon build 显示系统时钟警告
make[2]: warning: Clock skew detected. Your build may be incomplete.# 查看系统时间
date显示1970年,可能是无法连接网络导致系统时钟无法自动更新
# 移除默认路由
sudo ip route del default via 192.168.123.1 dev eth0关闭并重新打开终端
# 查看系统时间同步情况
timedatectl status时间更新成功
删除 build install log 文件,重新编译
# 注意在正确的 ws 中运行以下命令
rm -rf build install log
colcon build不再报错
Q3. not found
ros2: command not found
Package 'XXX' not found以上问题出现可能是没有 source 正确的配置文件
Q4. 遇到任何 ROS 问题,可以尝试:
- 关闭所有 Terminal,重新打开新的 Terminal
- 删除 build install log 重新编译
Q5. 网络配置
unitree@ubuntu:~$ sudo ifconfig wlan0 up
# 报错 SIOCSIFFLAGS: Operation not possible due to RF-kill解决:
# 查看
unitree@ubuntu:~$ rfkill list
# 0: phy0: Wireless LAN
# Soft blocked: yes
# Hard blocked: no
unitree@ubuntu:~$ sudo rfkill unblock wifi
# 再查看
unitree@ubuntu:~$ rfkill list
# 0: phy0: Wireless LAN
# Soft blocked: no
# Hard blocked: no
# 重新运行不再报错
unitree@ubuntu:~$ sudo ifconfig wlan0 upQ6. SSH 成功 但 VScode 连接远程失败
首先,Download Server 需联网,确认本地网络连接正常
如果多次要求重新输入密码,且显示
Failed to connect to the remote extension host server (Error: ExtensionInstallFailed(ExtensionInstallFailed("Error while installing extensions: getaddrinfo EAI_AGAIN marketplace.visualstudio.com\ngetaddrinfo EAI_AGAIN marketplace.visualstudio.com\n")是 VS Code 远程 SSH 到 Linux 服务器时无法下载 VSCode 插件 的典型网络问题。DNS 解析失败或超时,即 Linux 服务器无法访问 marketplace.visualstudio.com
解决:
- 通过 Windows Powershell 或 Linux 命令行 ssh 连接远程
ssh unitree@192.168.xx.xx- 在 Linux 服务器上运行:
unitree@ubuntu:~$ ping marketplace.visualstudio.com如失败,则是 Linux 服务器的外网访问问题
- 运行:
unitree@ubuntu:~$ cat /etc/resolv.conf显示
nameserver 127.0.0.53
search Huawei.Local这意味着 Ubuntu 正在使用 systemd-resolved 的本地 DNS 缓存代理(127.0.0.53),但它无法解析外部域名。
- 运行:
unitree@ubuntu:~$ sudo vim /etc/systemd/resolved.conf找到或添加如下几行(去掉 #):
[Resolve] DNS=8.8.8.8 1.1.1.1
FallbackDNS=114.114.114.114
DNSStubListener=yes保存
- 重启 DNS 服务
unitree@ubuntu:~$ sudo systemctl restart systemd-resolved- 检查 DNS 是否生效
unitree@ubuntu:~$ systemd-resolve --status如显示
DNS Servers: 8.8.8.8 1.1.1.1
Fallback DNS Servers: 114.114.114.114 8.8.8.8则已生效
按 q 退出查看
- 再次测试网络
unitree@ubuntu:~$ ping 8.8.8.8
unitree@ubuntu:~$ ping marketplace.visualstudio.com如果能 ping 通, 则重启 VScode 远程 SSH 不会再出现问题
Control
Q1 Client 扫描不到机器人设备
优先检查:
./launch_robot.sh以及./launch_trans.sh agent是否已启动,且输出正常- 机器人与控制端是否在同一网络
46000和37020是否被占用
Q2 平台看不到新增动作
优先检查:
- 是否重新编译
- 当前模式是否正确
src/control_py/config/smach_config.yaml - 新动作是否加入
active.children - 该编号是否被加入
hidden_action_reg - 是否重启了 Agent 并重新扫描设备
Q3 动作能触发,但不能切换下一步
优先检查:
active_expected_duration是否过长allowed_sub_trans是否定义了不允许切换的状态- 使用
auto的动作是否正确调用了mark_active_action_done()
Q4 抓取为什么总是右手执行
当前代码中,部分抓取流程入口和中间步骤都存在固定 right 的逻辑。 如果要支持左手或双手,需要同步修改 on_xx_handler 中的处理逻辑。
Q5 识别物体后动作为什么不开始
常见原因:
- 物体没稳定识别(当前有稳定检测逻辑,如手的晃动可能导致手中的物体无法通过稳定检测判定)
- 物体检测边框离相机边缘过近
联系方式
如有问题或购买需求,请联系 BrainCo 灵巧手团队,或通过页面帮助入口提交工单。