XLeRobot · 底盘 · 2026-08-23

底盘平移脚本

给「抓起杯子 → 走一段 → 放下」用的那一段。你问过要不要把走路也学进模型里 —— 结论是不要,走脚本,理由在下面。

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_DIST0.60 m单次平移最远。开环误差随距离累积,别贪多
MAX_SECS30 s硬超时:无论如何到点就停
RAMP0.6 s加减速时间。杯子在夹爪里,猛起步会甩出去
CAL_SCALE1.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 ★

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。