给「抓起杯子 → 走一段 → 放下」用的那一段。你问过要不要把走路也学进模型里 —— 结论是不要,走脚本,理由在下面。
python base_translate.py --dx 0.30 # 干跑:只打印,不动
python base_translate.py --dx 0.30 --go # 真的走:向左 30 cm
python base_translate.py --dy 0.25 --go # 向前 25 cm
默认是干跑,不加 --go 不会动。
平移这一段没有接触、没有精度要求,是个开环里程计问题。塞进模仿学习是纯亏:
走脚本反而让两者天然隔离:安全层继续清零策略的底盘输出,脚本走另一条通道。
没有里程计反馈,走多远完全由「速度 × 时间」决定。 地毯、电量、载重都会让实际距离偏离指令距离。
所以:先在空载下标定一次实际走了多远,把比值填进 CAL_SCALE。
真正用的时候距离不要超过 0.5 m —— 误差随距离线性累积。
| 常量 | 值 | 为什么是这个数 |
|---|---|---|
MAX_DIST | 0.60 m | 单次平移最远。开环误差随距离累积,别贪多 |
MAX_SECS | 30 s | 硬超时:无论如何到点就停 |
RAMP | 0.6 s | 加减速时间。杯子在夹爪里,猛起步会甩出去 |
CAL_SCALE | 1.00 | 标定系数 = 实测距离 ÷ 指令距离。标过之后填这里 |
| 复用什么 | 为什么不重写 |
|---|---|
运动学全部来自 base_test.py |
那里的 WHEEL_MOUNT_DEG 是 2026-08-13 用 --identify
一个轮子一个轮子转出来的实测值。复制一份出来,改一处忘一处,
症状是「机器人朝着奇怪的方向斜着走」。上游是
lekiwi.py 的 _body_to_wheel_raw / _degps_to_raw |
串口占用检查 bus_guard.require_free() |
别的进程占着串口就直接拒绝跑,不去抢 |
finally:
# 无论如何都要把轮子归零并卸力矩
for _ in range(3): # 归零【重试三次】—— 一次写失败就还在走
for sid in WHEEL_MOUNT_DEG:
bus.write(sid, ADDR_GOAL_SPEED, 0)
...
异常路径下轮子还在转,机器人会一直走下去。 所以归零不是「顺手做一下」,是这个脚本存在的前提 —— 而且要重试三次, 因为一次写失败就等于没停。
① RIGHT_PICK(策略) 杯子拿起来,安全层照常把底盘清零
② base_translate.py 脚本走一段,策略不参与
③ RIGHT_PLACE(策略) 放下
三段各管各的。这也是为什么 Pick 和 Place 要拆成独立技能 —— 中间插一段脚本,两边的策略都不需要知道。
脚本位置:03-software/scripts/base_translate.py(145 行)。
先干跑确认方向和距离,再加 --go。