我正在开发/调整四轴飞行器的软件PID。现在,我只想使用前后电动机来稳定俯仰角,而我只看Kp。电机具有控制分辨率:输入变化需要达到三个保持点才能完全起作用。

过程输出的确达到了设定值,但不足以满足我的要求。没有稳态误差(也称为下垂),搜索范围以设定点为中心,对于我的要求来说太宽了。同样,不稳定性不是振荡,而是更多的随机漂移,在PID尝试对其进行校正之前,该漂移需要足够大。


Kp较低时,输出需要与

我无法找到合理的折衷方法。

我无法找到合理的折衷方法。

我正在考虑将多维数据集函数(或类似函数)应用于错误,然后再将其提供给PID:这样,小错误应该足够显着,以便PID可以尝试纠正它们,而大错误则可以减少并且可能不会触发振荡。我想以前一定有人经历过:这是一个好的解决方案吗?有没有更好的选择?

据我所知,这不是稳态错误(下垂)或振荡问题:请不要建议使用Ki或Kd

EDIT:我已经弄清了问题的描述,并建议使用cuberoot而不是对数,这确实是个坏主意。

,谢谢,
Marc。

评论

预计在PID中,您将不会总是仅使用P达到设定值。这就是积分器的作用。不清楚您说“控制启动”是什么意思,但是显然,当您接近设定点时,错误信号会下降,P的影响会减小。如果将P设置得太大,系统将变得不稳定。这就是PID回路的行为。 ps。不要使用错误的对数。使用积分器。

感谢@GuySirton,但我不认为Ki是问题所在:我的糟糕,我应该在问题中解释得更好。据我了解的PID,当过程输出稳定在一个稍微高于或低于设定值的值时,Ki很有用。在这里,过程输出始终保持在以设定值为中心的范围内,但是上下的波动对于我的要求而言太大。

仅供参考,出于几个原因,使用错误日志是一个坏主意。首先,仅对正数定义对数;您将如何处理负错误?其次,对于非常小的正数,对数非常负。在理想情况下,错误= 0,对数变为负无穷大。正如达姆金(Damjen)在他的回答中指出的那样,减少振动会增加Kd。一般来说,Kp可以减小误差,Kd可以提高稳定性并减少振荡,而Ki可以减小稳态误差,同时又可以降低稳定性。

非常感谢您的评论@ ryan0270。我赞成您的评论,但我认为我在这里的代表太低了。显然,我应该回到学校学习,这是解决我的问题的完全不合适的功能。我的意思是更类似于cuberoot的函数,该函数针对正错误和负错误进行定义,并且可以减少较高的错误,同时保留较小的错误。

@ marcv81也不要使用多维数据集根。它必须是线性的。如果问题在于小P(即稳定)会导致信号太小而无法产生效果,那么答案仍然是增加一个积分器。如果您有一个物理系统,那么您也会遇到稳态错误(即使您认为没有),因此也需要一个积分器。也说积分器仅用于稳态误差是简单/错误的。

#1 楼

自从发布问题以来,我试图对3个PID参数进行很多调整,但从未达到任何可接受的结果。我没有尝试按照问题中的建议来修改误差曲线,但是我找到了一种替代方法,该方法效果很好。可能还有其他好的解决方法。

我按如下方式使用PID:


过程设定值:角度
过程输出:电动机速度之间的差(在电动机混合方程中使用)

尽管从理论上讲这可能很好,但我找不到Kp,Ki和Kd的合适值来获得令人满意的结果。我将程序更改为使用2个级联PID,如下所示:

外部PID:


过程设定值:角度
过程输出:角速度

内部PID:


过程设定值:角速度
过程输出:电动机速度之间的差(用于电动机混合方程式)

我首先对内部PID进行了调整,以便在目标角速度为零时不会产生振荡,而是对角度变化有轻微的抵抗力。然后,我对外部PID进行了调整,以使其不产生振荡,而以与杆输入相匹配的合理响应的姿态进行调整。即使进行了非常基本的调整,结果还是可以接受的。

再次感谢所有参与者,您的意见鼓励我学习有关PID的更多信息,并避免了一些错误。

评论


$ \ begingroup $
当您说“电动机速度”时,是指要发送给给定电动机的ESC的信号值吗?
$ \ endgroup $
–杰克逊克
16年8月8日在15:25

$ \ begingroup $
我的意思是我发送给某些ESC的PWM信号之间的差异。例如,在+配置上,横滚的PID取决于左和右ESC之间的PWM差。希望这接近匹配的电动机速度之间的差异。
$ \ endgroup $
– marcv81
16年8月11日,下午5:05

#2 楼

听起来问题出在电机上。电机很好,但是它们有一个阈值,可防止您将它们的速度精确设置为所需的值。这是一个问题,因为您试图将PID直接映射到其输出,该输出具有最小值。

您需要更改电动机控制代码,以便在所需推力低于电动机阈值的情况下,对电动机进行脉冲调节,以使其在一段时间内的平均值成为您所需的推力。有多种方法可以完成此操作,具体取决于控制循环的工作方式。

评论


$ \ begingroup $
鉴于我找到了不需要此方法的解决方案,因此这不是问题的根源。但是,这是一个非常有趣且相关的评论。当我有代表时我会投票:)
$ \ endgroup $
– marcv81
2014年4月23日在22:12

#3 楼

我不确定为什么您会说“请不要建议使用Ki或Kd”,并且无论如何都会建议它们。
从原始帖子的评论中,我了解到,您解决的问题并不在于设定点附近,而是

如果是这种情况,那么您需要添加Kd来抑制振荡。

如果您的问题实际上是您稳定在设定点附近那么您需要添加Ki来补偿该误差。

这就是为什么PID调节器中存在所有三个项而不仅仅是一个的原因。仅使用比例项会产生这种行为。引入非线性以致您通常不应该这样做。

注意事项

评论


$ \ begingroup $
感谢@DamjanDakic。 PID不会在设定值附近稳定,也不会在设定值附近振荡。它在设定值附近的范围内随机搜寻,该范围对于我的要求而言太大。即使我在技术上没有振荡问题,也请问是否可以使用Kd缩小寻迹范围?
$ \ endgroup $
– marcv81
14-4-22在16:27



$ \ begingroup $
是的,即使不是正弦波振荡,添加Kd也会抑制您的运动。如果该运动的中心是您的设定点,那么一切都会很好,如果它落在某个其他点,则添加Ki将使该点向设定点偏移。
$ \ endgroup $
–Damjan Dakic
2014年4月22日在19:14

#4 楼

无论如何我都会提出建议。添加一个积分器。

您所描述的是关于仅比例控制器将如何工作的教科书描述。如果输出稳定,则永远不会达到设定值。来自Wikipedia:


由于需要非零误差来驱动它,因此比例
控制器通常在稳态误差下工作,称为
下垂。下垂与过程增益成正比,而与比例增益成反比。可以通过在设定值或输出上添加一个补偿偏置项来缓解下垂,或者通过添加一个积分项来动态地修正下垂。


偏置通常是静态的根据某个已知数量将值添加到输出中。如果下垂是一个已知的稳定常数,则可以执行此操作。但是我个人的感觉是,通常这是需要不断调整的技巧。

您正在尝试使用错误的对数来实现动态偏差。不要搞乱控制器的输入。这只会使您头痛不已。如果使用积分器,您将获得更好的结果。

替代方法是使用超前滞后滤波器:


超前补偿器可以提高稳定性。或
系统的响应速度;滞后补偿器可以减少(但不能消除)稳态误差。


但是,如果您使用积分器。

评论


$ \ begingroup $
感谢您的回答。不好意思的解释,很抱歉,但是我显然没有任何稳态错误(又称下垂)。我所得到的是一个不稳定的输出(虽然没有振荡),但以设定点为中心的范围内。我不相信我能解决这个问题。
$ \ endgroup $
– marcv81
14年4月22日在16:24

$ \ begingroup $
@ marcv81从更新的描述中,现在听起来根本就无法控制。控制器不应“搜寻”。您能否包括一些代码/伪代码?如果输入和输出的图可用,那么这些也将有所帮助。
$ \ endgroup $
–embedded.kyle
14年4月22日在16:57