第 21 课 · 遥控与手柄:让鸭子听你的
这一课解决什么问题:鸭子能站能走了,给它接上遥控——用手柄(或键盘)发速度指令,让它朝你想去的方向走,并建立"先悬空、后落地"的调试顺序。
1. 摇杆给的不是角度,是速度
先回扣整门课最重要的直觉。你推手柄摇杆时,没有在控制任何一条腿:
手柄摇杆 策略网络 关节
速度指令 ──▶ (61 → 14) ──▶ 14 个角度 @ 50Hz
摇杆给的是三个数:vx(前后)、vy(左右)、vtheta(转向角速度)——和你在浏览器 Sandbox 里按方向键时给的是同一种东西。
本课的映射细节取自平价路线的官方使用文档(Microduck-build-tutorial/microduck/docs/gamepad.md 与 usage.md),概念在两条路线上是通的,具体按键以你所用运行时的官方文档为准。要点:每个输入源发出的是 [-1, 1] 的归一化指令,由调度器统一换算成物理限速,所以键盘、手柄、仿真行为完全一致。默认限速:前进 vx +0.7、后退 -0.5,侧移 vy ±0.3,原地转向 ±3.0、行进中转向 ±1.5。
所以呢?你永远不需要(也不应该)手写关节角度:想更快,改限速常量;想换走法,换策略文件。
2. 手柄怎么映射
用蓝牙 Xbox 兼容手柄,先在板子上配对:bluetoothctl 里 scan on → pair → trust(下次开机自动重连)→ connect。
带终端(SSH)运行时的默认映射(来自 gamepad.md):
| 输入 | 作用 |
|---|---|
| 左摇杆 上下 / 左右 | vx(前后)/ vy(左右) |
| 右摇杆 左右 | vtheta(转向) |
| A | 开/关 walk(行走策略) |
| B | 停止调度器 |
| View/Back | 开关 IMU/陀螺仪显示 |
无头模式(不接任何电脑,演示神器):make gamepad-headless-enable 装一个开机自启的服务,之后按住 START 启动控制循环,A 开行走,B 停,同时按住左右扳机 2 秒安全关机(等 10–15 秒再断总电源)。
两个坑:
- 手柄一连上,Wi-Fi 就会被关掉——给 2.4GHz 蓝牙让路。要 SSH 就先关手柄,Wi-Fi 自动恢复,这不是故障;
- 映射因手柄而异:蓝牙下的轴号、按键号经常与默认值不同。用
jstest /dev/input/js0逐个摇杆、按键记录真实编号,再改输入模块顶部的常量(方向反了改正负号)。仓库默认值只在 Xbox 蓝牙手柄上验证过,你的手柄以 jstest 实测为准。
3. 没有手柄:键盘就行
make run 之后直接按(usage.md):
| 键 | 作用 |
|---|---|
v / h / s |
开关 walk / head / squat 三个动作 |
| 方向键 | vx(上下)、vtheta(左右) |
x |
速度清零 |
i |
IMU 显示 |
q |
停止控制循环 |
注意这个设计:walk、head、squat 是三个独立开关的动作(moves),叠在中立姿态上运行;手柄的 A 键就是 walk 的开关。其中 walk 是策略,squat 是逆运动学算出来的——两种动作并存,正好复习第 01 课的"运行 ≠ 训练"。
4. 调试顺序:先悬空,后落地
和第 20 课的测试金字塔一脉相承:
- 悬空试指令响应:鸭子吊着或抱在手里,轻推摇杆,看每条腿摆动方向对不对。方向反了不用慌,改符号常量;手柄断连时速度会自动清零(力矩保持姿态),这是安全设计;
- 落地低速:软垫地面,给一点 vx,直行几秒、停止、再直行。别一上来就满杆;
- **一启动就倒?**按平价路线文档的排查顺序:左右腿舵机 ID 装反没、膝盖偏置和实际装配一致没、IMU 安装方向对没、
walk.onnx和当前硬件匹配没。
5. 动手练习(15 分钟)
- 画出你自己的手柄(或键盘)按键地图,贴在工位上;
- 悬空推杆,记录三行观察:推杆 → 哪条腿 → 什么方向;
- 落地以最低速直行 1 米再停止,视频存进实验记录。
自查清单
- [ ] 我能说清摇杆给的是什么信号、由谁换算成关节角度
- [ ] 我能解释手柄连上后 Wi-Fi 断开的原因和处理办法
- [ ] 我能按"悬空 → 落地低速"的顺序说出调试步骤
- [ ] 我实测过自己手柄的轴号和按键号
下一课预告
主线走完了。第 22 课看另一条路线:有人用树莓派 Zero 2 W 和 Python 也复刻了这只鸭子,还提供现成镜像——预算更省,先看到动。
延伸资源
- 手柄配对与重映射:
Microduck-build-tutorial/microduck/docs/gamepad.md - 使用文档(键盘/手柄/动作/限速):
Microduck-build-tutorial/microduck/docs/usage.md - 主线运行时日常操作速查:
docs/robot/cheatsheet.md