四旋翼PID控制器

5

背景

我的任务是为室内飞行的微型四旋翼设计和构建一个速度PID控制器。飞行的房间配备有基于摄像机的高精度室内跟踪系统,可以为四旋翼提供速度和位置数据。生成的系统应能够接受每个轴(x、y、z)的目标速度并以该速度驱动四旋翼。

四旋翼的控制输入是横滚/俯仰/偏航角和高度升力百分比。

我的想法是为每个轴实现一个PID控制器,其中SP是该方向上的期望速度,测量值是跟踪系统提供的速度,输出值分别是横滚/俯仰/偏航角和升力百分比。

不幸的是,由于这是我第一次接触控制理论,我不确定自己是否朝着正确的方向前进。

问题

  • 我了解基本的PID控制器原理,但还不清楚它如何通过僅將誤差相加並乘以一個常數就能将速度(m/s)轉換為横滚/俯仰/偏航(弧度)?是的,速度和横滚/俯仰成正比,这是否意味着只要乘以正确的常数就能得到正确的结果?

  • 对于垂直速度控制器的情况,如果将速度设置为0,则四旋翼实际上应保持其高度而不上升或下降。如何将其与PID控制器集成,以便当误差为0时,推力值不为0(应保持悬停,而不是掉落)?我应该在输出中添加一个常量项吗?

  • 一旦系统被实现,调整PID增益参数的好方法是什么?手动试错?

  • 系统发展的下一个步骤是另外一层位置PID控制器,它以期望位置(x、y、z)作为设定点,测量位置由室内跟踪系统提供,输出为x/y/z速度。这是一个好方法吗?之所以将这些PID控制层分开是因为该项目是更大框架的一部分,该框架促进重用性。是否最好只使用单层PID控制器,该控制器直接将位置坐标作为设定点,并输出横滚/俯仰/偏航/推力值?

3个回答

1

我有一篇博客可能会对您感兴趣:http://oskit.se/quadcopter-control-and-how-to-really-implement-it/

基本原理很容易理解,但微调要难得多。我花了最长的时间来弄清楚应该输入到PID控制器中的内容,以及变量上的正负号等小细节。但最终我解决了这些问题。

测试PID控制器的最佳方法是找到一种可以动态设置值的方式,这样就不用每次重新编译固件。我在我的四轴飞行器固件中使用mavlink。借助mavlink,可轻松配置飞行器,只需使用支持mavlink协议的任何地面控制软件即可。

从小做起,先使用现成的控制器建造一个工作的飞行器,然后再编写自己的控制器。然后进行测试、微调和实验。除非尝试亲手构建四轴飞行器,否则永远无法真正理解PID控制器。我的裸机软件开发库可以帮助您更轻松地编写软件,而无需担心硬件驱动程序的实现。链接:https://github.com/mkschreder/martink


1
  • 这是基本的想法。在系统中,你可能会理论上得到几个常量来将一个单位转换为另一个单位。在你的情况下,你的P、I、D常数将隐含包括正确的转换因子。例如,如果在一个理想化的系统中,你想要用P=0.5度来通过反馈控制角度,但你只能访问速度,并且你知道5度的倾斜会给出1 m/s 的速度,那么你将编程P控制器将测量到的速度乘以0.1,结果就是角度的控制输入。
  • 我认为最好的方法是不针对高度(h)实现SISO PID控制器,而是针对竖直速度(dh/dt)实现,推力百分比作为输出,但我不确定。
  • 不幸的是,如果你没有关于参数的先验知识,那么这将是唯一的方法。我建议选择一个即使四轴飞行器坠毁也不会造成太大损害的环境...
  • 听起来是个不错的方法。

3
经过一番尝试和错误,它终于成功了。演示视频链接 - xabre

0
如果您正在使用Python编程语言,可以使用ddcontrol框架。您可以通过SISO数据估算传递函数。为此,您可以使用tfest函数。然后,您可以使用pidopt函数优化PID控制器。

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