DEVLOG – 如何在直线上直行?

发布: (2025年12月14日 GMT+8 08:36)
4 min read
原文: Dev.to

Source: Dev.to

问题陈述

要应对任何问题,首先需要把它转化为明确且易于理解的问题陈述,所以我们的表述如下:

“我该如何让 SPIKE Prime 机器人在拉动外部负载的情况下,沿直线移动 X 距离?”

重心

这看起来似乎很显而易见:“只要让它以 0 度移动!”你可能会这么说。然而,重心(物体总质量集中的点)并不总是位于几何中心。只有规则体的重心才与几何中心重合;对所有其他物体而言,这两点并不一致。

因此,让机器人以 0° 角度前进会导致它随时间倾斜。

提案 #1:MOVE(0 – YAW)

我的最初想法是让机器人以 (0 – yaw) 度移动,即每当机器人通过内部陀螺仪检测到倾斜时,就进行相应的校正。

由于机器人编程环境不支持在循环内部使用 “MOVE UNTIL X DISTANCE”,我只能依赖时间。思路如下:

  1. 启动计时器 (T)。
  2. 让机器人以 0° 前进 X cm。
  3. 计算 speed = X ÷ T

该任务分为两个子任务:

  1. 任务 1: 从点 A 直线移动到点 B(距离短且无外部负载)。
  2. 任务 2: 从点 B 带负载移动到点 C。
  • 对于任务 1,机器人可以因距离短且无负载而保持直线前进,从而可以计算出其速度。
  • 对于任务 2,使用 MOVE(0 – YAW) 方法循环执行。要获得行驶距离 X 所需的时间,使用 time = d / v,其中已知距离 d 和速度 v

提案 #2:基于位移的运动

第一个提案依赖时间,但由于机器人在移动过程中会倾斜,实际行驶的总距离会增加,时间因而不可靠。

我们改为跟踪机器人相对于起点的实际直线位移——即“鸟瞰距离”,而不是总路径长度。

工作原理

  1. 将位置向量 (Rx, Ry) 初始化为 (0, 0)

  2. 在每个小时间间隔(tick)内:

    • 测量机器人自上一次 tick 以来移动的距离(通过轮编码器)。
    • 从陀螺仪读取当前的偏航角 yaw。
    • 按运动方向更新向量位置:
    Rx = Rx + A × cos(yaw)
    Ry = Ry + A × sin(yaw)

    其中 A 为本次 tick 移动的距离(由轮子转动计算,或 A = v × t)。

  3. 计算直线位移:

    R = sqrt(Rx² + Ry²)
  4. R ≥ X 时停止机器人,其中 X 为期望的直线距离。

虽然理论上是正确的,但由于机器人本身的限制,这个方法并未奏效。只能回到 PID! 😊

Back to Blog

相关文章

阅读更多 »