...我想问几个有关为APM 2.6模块控制的四旋翼飞机实现基本PID的问题。 (我使用的是3DRobotics的框架)
我将整个控制系统简化为两个PID块,一个用于控制侧倾,另一个用于控制俯仰(偏航和其他所有功能...我稍后再考虑。)
我正在由自由旋转光束组成的钻机上测试该装置,其中我绑住了四旋翼的两个臂。另外两个可以自由移动。因此,我实际上是一次测试一个自由度(滚动或俯仰)。
检查下图:这里的A,B标记安装了装置的自由旋转的梁。 br />
通过仔细调整P和D参数,我成功实现了约30秒的持续飞行。
但是“持续”,我的意思是指无人机不会向一侧倾倒的测试。稳定的飞行仍然遥遥无期,而且飞行30秒以上也显得非常困难。它从一开始就摇摆不定。到达20到25秒时,它开始向一侧倾斜。在30秒内,它向一侧倾斜了不可接受的距离。很快,我发现它倒置了。
对于PID代码本身,我正在从陀螺仪+加速度计数据的“互补滤波器”中计算比例误差。积分项设置为零。 P项约为0.39,D项为0.0012。 (我不是故意使用Arduino PID库,只是想在这里实现我自己的PID之一。)
如果想了解视频的工作原理,请查看此视频。
http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be
[是的,设置非常古老!我同意。 :)]
请让我知道在此阶段可以做些什么来提高稳定性。
@Ian:在我的设置中进行的许多测试中,我使用来自串行监视器的读数绘制了一些测试的图形。以下是Roll相对于“ Motor1&Motor2-PWM input”(两个电机控制该Roll)的示例读数:
关于输入/输出:
输入:滚动和俯仰值(以度为单位),由加速计+陀螺仪的组合获得。输出:电动机的PWM值,使用Servo库的电动机提供。 write()函数
解决方案
我解决了这个问题。方法如下:
问题的症结在于我实现Arduino程序的方式。我正在使用write()函数更新伺服角度,该角度恰好接受参数中的整数步(或以某种方式仅响应整数输入,100和100.2会产生相同的结果)。我将其更改为writeMicroseconds(),这使直升机变得更加稳定。
我将一台电动机的RPM加起来,同时将另一台电动机保持在稳定值。我对此进行了更改,以增加一台电机的RPM,同时减少另一台电机。这样可以使总水平推力保持不变,这在我试图使该东西保持垂直高度时可能对我有帮助。
我将RPM推至最大极限,这就是为什么四轴飞行器一直失控的原因全力以赴。当感觉到倾斜时,RPM没有上升的空间。
我观察到其中一台电动机固有地弱于另一台电动机,我不知道为什么。我将偏移量硬编码到该电机的PWM输入中。
感谢所有支持。
源代码:
如果感兴趣的是,这是我的基本PID实现的源代码:PID源代码
请随时在您的硬件中对其进行测试。欢迎对该项目做出任何贡献。
#1 楼
您的比例增益似乎太高。
您似乎在不断增加一台电动机的RPM,同时锁定另一台电动机以使系统旋转。这不是一个好的控制策略,因为最终这些策略都会变得饱和,您将失去控制。而且随着时间的增加,您命令系统的能力也会降低。因此,您需要一个更好的系统模型。
如果处理#1和#2,您将拥有一个更稳定的系统,但您可能对控制带宽不满意。为了解决这个问题,您需要使系统更坚固,其中包括消除在传感器方面和在控制方面的任何滞后。
#2 楼
我将首先阅读以下问题:调节PID回路的最佳策略是什么?如果我不得不猜测,我会说您在构造互补滤波器方面遇到问题。在关闭四轴飞行器马达的情况下,您应该前后倾斜框架,以查看所报告的侧倾/俯仰值是否实际准确。
对我来说,加速度计的输入与滤波器的输出之间似乎存在延迟-振荡可能是由于对输入数据的较晚反应所致。最终的翻转看起来可能是随着时间的推移而累积的可能的积分错误-换句话说,当您的四轴飞行器在其一侧时,它实际上认为它在水平徘徊。
(更新)关于图形,事实上,您的电动机速度会继续提高(而不是保持平衡),这意味着您在某处出错。也许您的积分项正在无限增长,您应该为其指定一个合理的最大值。
评论
$ \ begingroup $
前后倾斜时,我使用了滚动值更新了我的问题。我通过降低最大PWM输入解决了最终的翻转。似乎校正值在很高的RPM下不起作用。在高转速下工作时,我可以轻松地用手转动钻机。在较低的RPM时,我会感觉到很大的阻力,四旋翼飞机似乎会摆动回原来的位置(我猜这很好)。因此,“翻身”问题可能是通过降低RPM来解决的(不知道无人机是否会起飞,希望它会起飞)。振荡问题仍然存在。
$ \ endgroup $
–梅茨堡
2014年1月15日10:51
$ \ begingroup $
如果我正确地阅读了该图,则您的侧倾传感器会认为它的起始位置为$ -3 ^ {\ circ} $,然后振荡并最终达到$ -5 ^ {\ circ} $。但是在视频中,四轴飞行器在$ \ pm90 ^ {\ circ} $侧。这种差异从何而来?
$ \ endgroup $
–伊恩
2014年1月15日14:31
$ \ begingroup $
嗯,该图形并不完全适合视频中显示的测试。如上所述,该图来自我对此设置进行的众多测试之一,并且我不记得确切的情况。该图只是为了让您了解输入与输出响应的行为方式,我还想确定输入与输出之间没有太大的滞后(假设环路以150+ Hz的频率运行)。将视频与图表匹配可能没有多大意义。视频中没有用于测试的确切数据集。
$ \ endgroup $
–梅茨堡
2014年1月15日17:04
$ \ begingroup $
我意识到图表有点误导,对此表示抱歉。我将尝试用更准确的图表更新图表。实际上,由于我正在从串行端口绘制数据,因此当我创建此图时,Arduino开发板已与笔记本电脑捆绑在一起。经过一定程度的振荡后,我不得不手动干预并减慢振荡。这就是为什么您看到它在-5度下沉,而实际上在90度左右下沉的原因。稍后,我将尝试更新更准确的图形。
$ \ endgroup $
–梅茨堡
2014年1月15日17:41
$ \ begingroup $
我从图中看到的另一件事是,您的推力总在增加。好像错了
$ \ endgroup $
–伊恩
2014年1月16日14:36
#3 楼
好吧,这里可能发生了很多事情...1)您报告的角度正确吗?嘈杂?您可以通过手动倾斜四边形并监视显示的值来轻松检查。
2)您自己的PID实现存在一个错误。您可以在此处使用受信任的实现来检查代码。
3)支柱和电机安装方向错误。
4)...
评论
$ \ begingroup $
1)我已经倾斜并检查了所报告的角度,几乎是正确的,但是绝对嘈杂。 2)非常有可能...实际上,我认为这是对它的完整总结:P 3)不太可能,两个顺时针,两个逆时针...我已经多次检查了道具,我猜这种类型的错误会导致了无法控制的严重错误。 4)....
$ \ endgroup $
–梅茨堡
2014年1月15日下午16:50
$ \ begingroup $
4)...错误的PID调节比没有PID的情况更糟!
$ \ endgroup $
– dm76
2014年1月15日17:01
$ \ begingroup $
是的,我现在知道了。明天我会努力的。我的第一个计划是使用受信任的PID库,第二个计划是将PID的输出从PWM信号更改为roll.pitch校正。
$ \ endgroup $
–梅茨堡
2014年1月15日17:10
评论
循环的输入是什么,输出是什么?@GuySirton:更新了我的问题
电动机命令中的平坦部分是什么?看起来有些饱和。您像连续功能一样滚动更改,但是命令看起来非常突然。另外,为什么在侧倾输入保持在相同范围内时,两个电机PWM命令都向上漂移?顺便说一下,大约是什么时标?
30秒后失去控制的原因可能与两个命令都向上漂移有关。我认为您正在尝试控制命令之间的差异,但是您不能允许这些命令继续漂移。
@GuySirton:他们没有漂移,我将其从零开始递增,以便在3/4秒内达到特定的稳态。但是,当您说“ 30秒后您失去控制的原因可能与您的两个命令都向上漂移有关”时,我认为您是对的。如果我不使用此渐进增量,则如果将PWM输入固定在某个水平(低于上面显示的最大输入),则30秒后失去控制的问题就消失了。