四轴飞行器距离PID控制器

3
我正在尝试使用PID控制器,在水平移动时使四轴飞行器停在特定位置,但是目前它会根据最大速度超调或欠调。我已经尝试手动调整P、I和D增益,但只有有限的成功。实质上,速度需要在飞行路径的最后从最大速度降至0。
我运行一个循环,每0.1秒执行一次。四轴飞行器的俯仰输入以m/s为单位,我会在每次迭代中重新计算到目标的距离。
一些伪代码
kP = 0.25
kI = 0.50
kD = 90
timeStep = 0.1
maxSpeed = 10

currentError = initialDistanceToLocation - currentDistanceToLocation
derivativeError = (currentError - previousError) / timeStep
previousError = currentError
output = kP * currentError + kI * integralError + kD * derivativeError
integralError = integralError + currentError * timeStep

if >= maxSpeed {
    output = maxSpeed
} else if output <= 0 {
    output = 0
}
return output

有可靠的方法可以调整这个PID控制器以适应不同的最大速度并能够正常工作吗?还是我需要考虑其他因素?
2个回答

0
一些想法:
  • 在你计算输出之后,检查你的代码是否计算了integralError。这可能会导致未定义的行为,因为在输出计算中,integralError 可能是任何值,具体取决于编程语言。
  • 根据我的经验,你应该完全摆脱 D 部分,因为在数字环境和由于测量噪声,它可能会产生破坏性影响。
  • 我强烈建议看看 this 教程,它指导你通过重要方面(即使它集中在定点 PI 控制器上)。

你应该只在速度控制器中去除D,因为一旦你移除了驱动力,dv/dt=加速度(D所控制的)就会变成零!但是,在位置控制器中,去除驱动力(例如汽车上的油门)并不会使dposition/dt=速度(D所控制的)变为零,因为汽车具有速度和惯性。因此,在速度控制器上,D是无用的,但在位置控制器上,D非常重要,并且作为阻尼项来减少速度并防止位置超调。我在我的答案中解释了这一点。 - Gabriel Staples
1
换句话说,为了停在一个点上,需要从速度控制器切换到位置控制器,并增加 D 值(减小速度)以防止超过目标点的位置偏差。有关详细信息,请参见我的回答 - Gabriel Staples

0

摘要

要停在一个点上,一种简单的方法是在想要停在一个点上时,从速度PID控制器切换到位置PID控制器,并将D(阻尼位置控制器中的速度)调高以防止目标点位置超调。详情见下文。

提醒:速度控制器中的D = 无用。位置控制器中的D = 必要。请参见我的评论和下面的注释。

详细信息

我以前做过这个。我没有花太多时间进行优化,但我发现从速度控制器切换到位置控制器效果很好,因为速度控制器会试图飞越航点,而位置控制器则试图在接近所需停止点时停下来。

请注意,您的位置控制器也可以通过缩放增益以产生所需速度,甚至通过缩放位置误差以任意产生所需速度,并不断移动所需位置点以使车辆沿着路径行驶而被强制转换为速度控制器。下面的视频也演示了最后一部分。

位置控制器是一个PID控制器,用于控制位置:车辆的俯仰角与目标在Y轴上的距离成正比,车辆的滚转角与目标在X轴上的距离成正比。积分项消除了稳态误差,最终使其能够完美地停留在所需的位置上,尽管有扰动、风、缺陷等。导数项是一种减振项,随着速度的增加减小俯仰和翻滚角,以避免超过目标。换句话说:P和D相互对抗,这是好的意图!增大P会努力让车辆倾斜,当车辆没有速度时,而增大D会使车辆倾斜程度减小,从而在具有更多速度(位置的导数)时不会过度振荡!P快速启动(增加加速度),D阻止它以过高的速度移动(减少速度)。

对于任何控制器,在中和驱动力(在这种情况下是俯仰和横滚)立即停止误差导数的变化时,不需要D。例如:对于速度控制器,一旦你从汽车上移除油门,速度就停止变化,假设存在小阻力。所以,不需要D。但是,对于位置控制器,一旦你从汽车上移除油门(或者四轴飞行器上的倾斜),由于惯性和现有速度,位置会快速变化!所以,非常需要D。这就是规则!对于基于位置的控制器,非常需要D,因为它减弱了速度并作为减震项来防止目标超调。

观看这个视频,在0:49到1:10之间,看看车辆如何在PID位置控制模式下自主起飞,并自动将自己定位在房间中心。这正是我所说的。
enter image description here

在视频中的大约3:00,我说:“[目标航点]正在沿着航点路径将车辆向前引导两米半。”你应该知道这2.5米是我在位置PID控制器中强制执行的距离误差(位置误差),以便保持车辆在视频中显示的固定速度移动。因此……基本上我正在使用我的位置控制器作为一种粗略的速度控制器,并且由于我的“纯追踪”或“向量流场”航点跟随算法对所命令的路径形状具有自然滤波器。
无论如何,我在这里更详细的答案中解释了很多以上概念,还有更多内容,请参考:基于物理的控制和控制系统:多层控制

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接