5

语境

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

四轴飞行器的控制输入是滚动/俯仰/偏航角和高度的推力百分比。

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

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

问题

  • 我了解基本的 PID 控制器原理,但我仍然不清楚它如何通过仅对误差求和并乘以常数将速度(米/秒)转换为滚动/俯仰/偏航(弧度)?是的,速度和横滚/俯仰成正比,这是否意味着乘以正确的常数会产生正确的结果?

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

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

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

4

3 回答 3

1

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

基本原理很容易理解。调整要困难得多。我花了最多的时间才真正弄清楚要向 pid 控制器输入什么以及变量上的 + 和 - 号等小东西。但最终我解决了这些问题。

测试 PID 控制器的最佳方法是有一些方法来动态设置您的值,这样您就不必每次都重新编译您的固件。我在我工作的四轴飞行器固件中使用了 mavlink。使用mavlink,可以使用任何支持mavlink协议的地面控制软件轻松配置直升机。

从小处着手,使用现成的控制器构建一个可以工作的直升机,然后编写自己的。然后对其进行测试、调整和实验。除非您尝试自己制造直升机,否则您永远不会真正了解 PID 控制器。我的裸机软件开发库可以帮助您更轻松地编写软件,而无需担心硬件驱动程序的实现。链接:https ://github.com/mkschreder/martink

于 2015-01-12T08:53:31.497 回答
1
  • 这是基本的想法。理论上,您可以在系统中使用几个常数来从一个单位转换为另一种单位。在您的情况下,您的 P、I、D 常量将隐含包含正确的转换因子。例如,如果在一个理想化的系统中,您希望通过反馈来控制角度,P=0.5(以度为单位),但您只能获得速度,并且您知道 5 度的倾斜会产生 1 m/s,那么您会对 P 控制器进行编程,将测得的速度乘以 0.1,结果将是角度的控制输入。
  • 我认为最好的方法是实现一个 SISO PID 控制器,而不是高度(h),而是垂直速度(dh/dt),以推力百分比作为输出,但我不确定。
  • 不幸的是,如果您对参数一无所知,那将是唯一的方法。我建议在四轴飞行器坠毁时不会造成太大损害的环境......
  • 这听起来是个好方法
于 2014-03-30T08:24:58.993 回答
0

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

于 2020-02-13T11:41:33.920 回答