DEVLOG – 如何在直线上直行?
Source: Dev.to
问题陈述
要应对任何问题,首先需要把它转化为明确且易于理解的问题陈述,所以我们的表述如下:
“我该如何让 SPIKE Prime 机器人在拉动外部负载的情况下,沿直线移动 X 距离?”
重心
这看起来似乎很显而易见:“只要让它以 0 度移动!”你可能会这么说。然而,重心(物体总质量集中的点)并不总是位于几何中心。只有规则体的重心才与几何中心重合;对所有其他物体而言,这两点并不一致。
因此,让机器人以 0° 角度前进会导致它随时间倾斜。
提案 #1:MOVE(0 – YAW)
我的最初想法是让机器人以 (0 – yaw) 度移动,即每当机器人通过内部陀螺仪检测到倾斜时,就进行相应的校正。
由于机器人编程环境不支持在循环内部使用 “MOVE UNTIL X DISTANCE”,我只能依赖时间。思路如下:
- 启动计时器 (T)。
- 让机器人以 0° 前进 X cm。
- 计算
speed = X ÷ T。
该任务分为两个子任务:
- 任务 1: 从点 A 直线移动到点 B(距离短且无外部负载)。
- 任务 2: 从点 B 带负载移动到点 C。
- 对于任务 1,机器人可以因距离短且无负载而保持直线前进,从而可以计算出其速度。
- 对于任务 2,使用 MOVE(0 – YAW) 方法循环执行。要获得行驶距离 X 所需的时间,使用
time = d / v,其中已知距离d和速度v。
提案 #2:基于位移的运动
第一个提案依赖时间,但由于机器人在移动过程中会倾斜,实际行驶的总距离会增加,时间因而不可靠。
我们改为跟踪机器人相对于起点的实际直线位移——即“鸟瞰距离”,而不是总路径长度。
工作原理
-
将位置向量
(Rx, Ry)初始化为(0, 0)。 -
在每个小时间间隔(tick)内:
- 测量机器人自上一次 tick 以来移动的距离(通过轮编码器)。
- 从陀螺仪读取当前的偏航角 yaw。
- 按运动方向更新向量位置:
Rx = Rx + A × cos(yaw) Ry = Ry + A × sin(yaw)其中
A为本次 tick 移动的距离(由轮子转动计算,或A = v × t)。 -
计算直线位移:
R = sqrt(Rx² + Ry²) -
当
R ≥ X时停止机器人,其中X为期望的直线距离。
虽然理论上是正确的,但由于机器人本身的限制,这个方法并未奏效。只能回到 PID! 😊