假设我正在跟踪一个移动的目标。
我可以通过直线速度和角速度来控制我的机器人,即。
http:/docs.ros.orgmelodicapigeometry_msgshtmlmsgTwist.html。
但如果我用两个PID,一个是线性速度,另一个是角速度,就很难调参数,因为线性速度和角速度都会影响机器人的 "下一秒 "位置。
在这种情况下,正确使用PID控制器的方法是什么?
我假设这更像是一个低级控制问题:你已经收到了cmd_vel(Twist)命令,你希望你的机器人服从它。在这种情况下,你要么分别做两个动作(在转弯前停止),要么同时做两个动作。在第一种情况下,你可以分别调整旋转与驾驶,因为你在跟踪这种状态。
更有可能的是,你有一个足够类似于差速器的机器人,你要给每一边发送一个信号(例如pwm)来引导它。让我们尝试一个简单的无PID的基础;为了参考背景运动学,我会指向 本文第一节. 在这种情况下,你将这两个值融合成两边的独立值。让 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
,加速度velocityyaw_rate限制即可。这是因为一侧的曲线可能与另一侧的曲线不一样,但在增加比例线性提升的情况下是足够接近的,而且旋转项上的调整可以调整到处理你所期望的地板轮地条件。老实说,如果你试着应用非线性或斜率函数而不是全PID曲线进行驾驶,以获得你所需要的合适的平稳性,你就不太会浪费时间。