多控制器 H12 部署和操作说明
状态转换图
Mermaid 图表
在支持 Mermaid 的 Markdown 查看器中可以看到交互式图表:
flowchart TB
Start(["初始状态<br>Initial"]) -- E左 F右 + C --> Ready["准备站立<br>Ready Stance"]
Start -- E左 F右 + D --> Cali["校准模式<br>Calibrate"]
Cali -- E左 F右 + C --> Ready
Cali -- C长按 + D长按 --> Start
Ready -- E左 F右 + C --> Stance["站立<br>Stance"]
Ready -- C长按 + D长按 --> Start
Stance -- E中 F中 + A --> Walk["行走<br>Walk"]
Stance -- E中 F中 + B --> Trot["踏步<br>Trot"]
Stance <-- E中 F中 + C --> 切换控制器["切换控制器<br>switch_controller"]
Stance -- E右 F左 + A长按 --> VMP["VMP控制<br>VMP Controller"]
Stance -- E中 F中 + A长按 --> VR["VR控制<br>VR Remote Control"]
Stance <--> TACT动作["TACT动作<br>customize_action_LL_A/B/C/D<br>或 customize_action_RR_A/B/C/D"]
Walk -- E中 F中 + D --> Stance
Walk -- E中 F中 + B --> Trot
Walk -- C长按 + D长按 --> Start
Trot -- E中 F中 + D --> Stance
Trot -- E中 F中 + A --> Walk
Trot -- C长按 + D长按 --> Start
VMP -- E右 F左 + B长按 --> Stance
VMP -- C长按 + D长按 --> Start
VR -- E中 F中 + B长按 --> Stance
VR -- C长按 + D长按 --> Start
VMP <--> VMP动作["VMP动作<br>vmp_action_RL_A/B/C/D"]
Start:::initialState
Ready:::readyState
Cali:::caliState
Stance:::normalState
Walk:::motionState
Trot:::motionState
VMP:::specialState
VR:::vrState
classDef initialState fill:#ffcccc,stroke:#cc0000,stroke-width:3px
classDef normalState fill:#ccffcc,stroke:#00cc00,stroke-width:2px
classDef motionState fill:#ccccff,stroke:#0000cc,stroke-width:2px
classDef specialState fill:#ffcccc,stroke:#cc6600,stroke-width:2px
classDef vrState fill:#ffccff,stroke:#cc00cc,stroke-width:2px
classDef readyState fill:#ffffcc,stroke:#cccc00,stroke-width:2px
classDef caliState fill:#ffccff,stroke:#cc00cc,stroke-width:2px
style 切换控制器 stroke:#FF6D00,fill:#FFE0B2
style TACT动作 stroke:#00C853,fill:#C8E6C9
style VMP动作 stroke:#2962FF,fill:#BBDEFB
生成状态转换图
将上述代码传入 https://www.mermaidchart.com/ 中生成

快速参考表
急停(所有状态)
按键: C长按 + D长按 → 初始状态
主要状态切换
| 操作 | 按键 | 开关位置 | 从状态 → 到状态 |
|---|---|---|---|
| 启动机器人 | C | E左 + F右 | Initial → Ready |
| 校准模式 | D | E左 + F右 | Initial → Calibrate |
| 站立 | C | E左 + F右 | Ready Stance→ Stance |
| 行走 | A | E中 + F中 | Stance → Walk |
| 踏步 | B | E中 + F中 | Stance → Trot |
| 切换控制器 | C | E中 + F中 | Stance → Stance |
| 进入VMP | A长按 | E右 + F左 | Stance → VMP |
| 退出VMP | B长按 | E右 + F左 | VMP → Stance |
| 进入VR | A长按 | E中 + F中 | Stance → VR |
| 退出VR | B长按 | E中 + F中 | VR → Stance |
运动状态切换
| 操作 | 按键 | 开关位置 | 从状态 → 到状态 |
|---|---|---|---|
| 停止行走 | D | E中 + F中 | Walk → Stance |
| 行走到踏步 | B | E中 + F中 | Walk → Trot |
| 停止踏步 | D | E中 + F中 | Trot → Stance |
| 踏步到行走 | A | E中 + F中 | Trot → Walk |
部署自启动服务
执行部署脚本
cd <kuavo-ros-control>/src/humanoid-control/h12pro_controller_node/scripts
sudo su
./deploy_autostart.sh
选择控制方案
脚本会提示选择控制方案,输入 3 选择 multi 模式:
请选择控制方案 (1: ocs2, 2: rl, 3: multi):
3
已选择: multi
VR 启动配置
部署脚本在选择相机型号后,会提示选择 VR 启动方式:
- 输入
1: H12 进入 VR 时启动launch_quest3_ik.launch - 输入
2: H12 进入 VR 时启动launch_quest3_ik_videostream_orbbec.launch
选择 2 时可继续输入 Quest3 IP。输入后会拼接 ip_address 参数,例如:
roslaunch noitom_hi5_hand_udp_python launch_quest3_ik_videostream_orbbec.launch ip_address:=192.168.50.103
如果不输入 Quest3 IP,则使用不带 ip_address 的启动命令,通过广播发现 Quest3。
VR 遥操参数配置(h12_vr_launch.yaml)
H12/G12 进入 VR 时,会读取配置文件把 IP、遥操形式、控腰、急停开关等参数追加到上述启动命令,无需改代码即可在现场调整。
仅作用于方式1(
launch_quest3_ik.launch)。方式2(视频回传)的 launch 未声明这些参数,不注入、保持原行为。
- 包内默认:
config/h12_vr_launch.yaml - 用户覆盖:
~/.config/lejuconfig/h12_vr_launch.yaml(存在则覆盖同名字段,缺省字段沿用包内默认)
字段说明:
| 字段 | 含义 |
|---|---|
ip_address | VR 设备 IP,留空则不注入、走 launch 默认(广播发现) |
use_cpp_incremental_ik | 位置是否使用增量模式 |
use_incremental_hand_orientation | 姿态是否使用增量模式 |
control_torso | 是否启用控腰,false 可避免 VR 重连时腰部猛转 |
enable_vr_stop_robot | VR 手柄 X+Y 是否允许触发 stop_robot(关闭全身使能) |
约束:use_cpp_incremental_ik=false 且 use_incremental_hand_orientation=true 为无效组合,启动时会校验失败并终止(终端打印异常日志),需修正配置后重试。
⚠️
enable_vr_stop_robot: false后,VR 手柄不再能关闭机器人,只能用 H12/G12 遥控器C长按 + D长按急停。展会/验收等防误触场景可置false,但需周知现场(含训练场)同事。
交互式编辑脚本
无需手动 vim,可用交互脚本读改用户配置:
rosrun h12pro_controller_node h12_vr_launch_config_editor.py
脚本以「包内默认 + 现有用户配置」为起始值,逐字段提示修改(回车保留当前值),保存前做同样的校验,最终写入 ~/.config/lejuconfig/h12_vr_launch.yaml。
⚠️ 配置在进入 VR 时读取,非热加载。改完 yaml(脚本或手改)后,需先退出 VR(
B长按)再重新进入 VR(A长按) 才会生效;正处于 VR 遥操中的修改不会即时生效。
典型配置(展会防误触 + 指定 IP + 关控腰):
ip_address: "192.168.50.103"
use_cpp_incremental_ik: false
use_incremental_hand_orientation: false
control_torso: false
enable_vr_stop_robot: false
站立状态下的操作
自定义动作
- 操作方式
- E右 + F右 + A/B/C/D → customize_action_RR_A/B/C/D
- E左 + F左 + A/B/C/D → customize_action_LL_A/B/C/D
- 配置方式
- 修改 customize_config.json 中
customize_action_LL_X的arm_pose_name
- 修改 customize_config.json 中
轮臂按键映射执行动作
轮臂机器人在 multi 模式进入 Stance 后,可通过 H12 的 E/F 拨杆组合加 A/B/C/D 按键触发自定义动作。轮臂版本通过 ROBOT_VERSION 以 6 开头识别,状态机会禁止 walk/trot 步态切换,动作触发仍使用下面的 customize_action_* 映射。
| 开关位置 | 按键 | 触发名 | 默认执行内容 |
|---|---|---|---|
| E右 + F右 | A | customize_action_RR_A | 抱拳,播放 2_抱拳.wav |
| E右 + F右 | B | customize_action_RR_B | 打招呼,播放 1_挥手.wav |
| E右 + F右 | C | customize_action_RR_C | 点赞,播放 3_点赞.wav |
配置文件为 customize_config.json。每个按键映射项支持:
arm_pose_name: 要执行的动作名称列表,节点会依次调用/execute_arm_action执行动作;空字符串表示该位置不执行动作。music_name: 要播放的音乐文件名列表;同时配置动作和音乐时,音乐会在检测到动作开始执行后播放。
VMP 动作(VMP 模式下)
- 操作方式
- E右 + F左 + A/B/C/D → vmp_action_RL_A/B/C/D
- 配置方式
- 修改 customize_config.json 中
vmp_action_RL_X的action_name - 可支持的
action_name为,全套:yc_126_spec、正踢:yc_01_front_kick、侧踢:yc_02_side_kick、直拳:yc_06_straight_punch
- 修改 customize_config.json 中
摇杆控制
左摇杆: 平移(左右)、前后(上下)
右摇杆: 转向(左右)、高度(上下)
- AMP 控制器暂不支持高度控制
重要提示
- 控制器切换: 在站立状态下按
E中 F中 + C可循环切换控制器(MPC <--> AMP),切换之后会自动回到站立状态,两控制器共用一套状态机 - VMP 控制器限制: 只能从 AMP 控制器进入,不能从 MPC 控制器进入。且仅有动作展示。
- 急停: 在任何状态下都可以使用
C长按 + D长按紧急停止,MPC 控制器会缓慢下蹲再结束程序,AMP 和 VMP 控制器则立马结束程序,可切换到 MPC 再停止。 - 遥控器初始化: 当通过
roslaunch humanoid_controllers load_kuavo_real.launch joystick_type:=h12启动机器人前需要export KUAVO_CONTROL_SCHEME=multi设置环境变量后再执行命令,否则启动后程序会默认启动ocs2的遥控服务,会有问题。启动程序后在终端键盘 o 站立机器人时,遥控器仍需要 E 的拨杆到最左边,F 的拨杆到最右边,然后按 C 切换遥控器的状态后,后续遥控器按键才能正常使用。