代码之家  ›  专栏  ›  技术社区  ›  manhon

如何在目标跟踪中使用PID控制来控制线速度和角速度

  •  0
  • manhon  · 技术社区  · 4 年前

    假设我正在追踪一个移动的目标。

    我可以通过线速度和角速度来控制我的机器人,即。

    http://docs.ros.org/melodic/api/geometry_msgs/html/msg/Twist.html

    但如果我使用两个PID,一个用于线速度,另一个用于角速度,则很难调整参数,因为线速度和角速度都会影响机器人的“下一秒”位置。

    在这种情况下,使用PID控制器的正确方法是什么?

    0 回复  |  直到 4 年前
        1
  •  1
  •   JWCS    4 年前

    我假设这更像是一个低级控制问题:您已经收到cmd_vel(Twist)命令,并且希望您的机器人遵守它。 在这种情况下,你要么分别做两个动作(转弯前停止),要么同时做。在第一种情况下,你可以分别调整旋转和驾驶,因为你正在跟踪这种状态。

    更有可能的是,你有一个与差速驱动器非常相似的机器人,你向每一侧发送一个信号(例如pwm)来引导它。让我们尝试一个简单的/PID无基座;为了参考背景运动学,我将指出 first section of this paper 在这种情况下,您可以将这两个值融合为每侧的单独值。让 d_L, d_R 是每边距中心的距离,以及 d = d_L + d_R 让前进速度: vel_fwd = (vel_L + vel_R) / 2 ,以及 yaw_rate [rad/sec] = ω = (vel_R - vel_L) / d ,如果 d_L == d_R .解决未知问题 vel_L, vel_R 与已知 vel_fwd, yaw_rate : vel_L = vel_fwd - d/2 * yaw_rate , vel_R = vel_fwd + d/2 * yaw_rate .

    现在,应用PID。让 vel_L0, vel_R0 为当前测量值;因此,国家 vel_fwd0, yaw_rate0 众所周知。您有目标状态(来自消息) vel_fwd_T, yaw_rate_T .您有错误 _err 减去它们。此时,如果你愿意,你可以进行多元/线性化系统控制;但坚持使用PID,你给每个应用一个PID,你就会得到 vel_fwd_pid, yaw_rate_pid 。你可以把它们代入你的原始方程中 vel_L、vel_R . 就我个人而言,我通常会发现到处都是添加比例条款 vel_L = vel_fwd_T * k0 - d/2 * yaw_rate_T * k1 , vel_R = vel_fwd_T * k2 + d/2 * yaw_rate_T * k3 ,加速度/速度/yaw_rate限制足够。这是因为一侧的曲线可能与另一侧不同,但通过增加比例/线性增压,它们足够接近,并且可以调整旋转项的调谐,以应对您所期望的地板/车轮/地面条件。老实说,如果你尝试应用仿射或斜坡函数而不是完整的PID曲线来获得所需的平滑度,你就不太可能浪费时间。

        2
  •  0
  •   OrbitingPolarBear    3 年前

    很棒且非常有用的总结@JWCS

    为了更清楚起见,只想添加vel_L和vel_R的计算:

    vel_L=vel_fwd-(d/2*yaw_rate)

    ,

    vel_R=vel_fwd+(d/2*yaw_rate)