美好的一天,

我是一名学生,目前正在从事自动四轴飞行器项目,尤其是到目前为止的稳定部分。我正在使用经过调整的螺旋桨系统,并且我已经考虑过在零件放置期间四轴飞行器的平衡。现在,我已经在过去的3 1/2周内对四轴飞行器的PID进行了调整,而我获得的最好成绩是,四轴飞行器的恒定角度振荡为+ -10度,设定点/所需角度为0度。我还尝试了一个在俯仰轴上具有相同结果的保守7度设定值。

到目前为止,我的PID代码吸收了来自互补滤波器( FilteredAngle=(0.98)*(FilteredAngle + GyroAngleVel*dt) + (0.02)*(AccelAngle) )的角度测量值和所需角度的差异。<


我在某处读到,仅靠角度测量来稳定四轴飞行器是不可能的,而且还必须考虑角速度。但是我已经读了很多作品,它们仅使用一个具有角度差(俯仰和横摇)的pid循环作为输入。

与上述内容相反,我已阅读了这篇文章的评论(https://www.quora.com/What-is-rate-and-stabilize-PID-in-quadcopter -control)由爱德华·勒伦(Edouard Leurent)提出,只有一个角度误差的单个PID控制回路和一个同时利用角度误差和角速度误差的级联PID回路(角度和比率)在数学上是等效的。

继续仅使用Single PID Loop(Angle)方法,我只需要调整3个参数(Kp,Ki和Kd)。

但是如果我要更改代码以使用级联循环(



我是否必须调整3个参数中的两组(角度的Kp,Ki和Kd以及角速度的Kp,Ki和Kd)?
级联的PID控制回路是否比单个PID控制回路具有更好的性能?
在级联回路中,稳定飞行角速度的设定值是否也为0(度/秒)?如果四轴飞行器尚未达到所需角度怎么办?

谢谢:)

评论

我还在控制回路中使用100Hz采样率

关于级联的PID控制器,请您考虑一下思想实验。如果您将角位置指令为常数,又将角速度指令为常数,非零怎么办?系统将服从角位置并将速度设置为零,还是服从角速度并允许角位置移动到无穷大?您不能同时控制两者,只能控制一个,而另一个将控制信号的要求。 PID控制器使用位置,因为速度可以受PID增益(阻尼,稳定等)限制(不受控制)。

只是继续尝试那就是我解决问题的方式。

这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方留下评论-您始终可以对自己的帖子发表评论,一旦您拥有足够的声誉,就可以在任何帖子中发表评论。 -来自评论

这将随着控制器的“战斗”而结束。到达零位置误差的唯一方法是...到达那里。也就是说,必须有一些速度接近零才能达到零。如果您只是在达到零时就切换控制器,那么即使惯性将您拉过零角度误差,您也将始终保持零速度。

#1 楼

可以仅在单个回路pid中使用角度测量值来稳定四轴飞行器。但是,使用级联PID控制器更容易稳定四轴飞行器。是的,您正在调整更多参数。首先,您首先使用陀螺仪(快速传感器,但有漂移)的角速率读数调整内环速度PID控制器,然后使用角度设定值和传感器测量的角度测量值对外环稳定PID进行调整,将加速度计的角度读数融合以及从陀螺仪的角速度读数积分的角度。我发现这是实现稳定飞行的最简单方法,再加上目前的530Hz当前控制环路速率。

其他相关的有用问题解答:


PID输出不能精确地达到设定点
需要四轴PID的帮助

资源:


https://www.quora.com/ Quadopter控制中的PID速率和稳定度是多少


#2 楼

您如何设法从发布的代码filter = (0.98*gyro*dt + 0.02*accel)中获得任何角度?陀螺仪输出以$ \ mbox {deg} / s $为单位,其中加速度为$ \ mbox {deg} / s ^ 2 $。当您将陀螺仪时间乘以时间时,将获得一个角度单位$ \ mbox {deg} $(不是角度,请参见下文),但是随后将其添加到加速度中,而加速度没有正确的单位。 br />
另外,对于陀螺仪部分,您只是要使用正确的单位。角位置是角速度的积分,这意味着您必须对gyro*dt个段求和才能累加一个角度。否则,所有gyro*dt都会为您提供您在上一个时间间隔dt中移动的角度。

您可以检查代码是否与您在问题中编写的内容匹配,然后更新问题? br />:EDIT:

我的问题不是关于如何计算加速值,而是关于如何实现过滤器。在您的更新中,过滤器计算仍然不正确。

现在,您不再将陀螺仪输出设置为角位置单位,而是采用另一种方法,而是使用角加速度单位。更糟糕的是,您现在还在累积这种加速度,这没有任何意义。

在代码的初始化部分应该有以下内容:通过数值积分获得角速度:

gyro<AXIS>Position = 0;
accelerometer<AXIS>Position = 0;
accelerometer<AXIS>Velocity = 0;


接下来,将陀螺仪角速度和基于加速度计的角速度进行数值积分:

accelerometer<AXIS>Velocity = accelerometer<AXIS>Velocity + accel<AXIS>*dt;


最后,您可以将这两个读数与互补滤波器融合在一起:


评论


$ \ begingroup $
很抱歉,我已更正了所用Complemetary筛选器的代码,并更新了当前在此问题上写的内容。
$ \ endgroup $
–user123456098
16年1月15日在15:10

$ \ begingroup $
使用以下公式从加速度计获得的加速度计算加速度计角度:对于Roll:float accelRoll = atan2f(-accelRealX,accelRealZ)* 180.0F / PI;
$ \ endgroup $
–user123456098
16年1月15日在15:12

$ \ begingroup $
对于Pitch:float accelPitch = atanf((accelRealY)/ sqrt(pow(accelRealX,2)+ pow(accelRealZ,2)))* 180.0F / PI;
$ \ endgroup $
–user123456098
16年1月15日在15:12

$ \ begingroup $
对于偏航:float numeratorYaw = magRealZcos(accelRollPI / 180.0F)-magRealYsin(accelRollPI / 180.0F); float denominatorYaw = magRealXcos(accelPitchPI / 180.0F)+ magRealYsin(accelPitchPI / 180.0F)* sin(accelRollPI / 180.0F)+ magRealZsin(accelPitchPI / 180.0F)* cos(accelRollPI / 180.0F); float accelYaw = atan2f((numeratorYaw)/(denominatorYaw))* 180.0F / PI;
$ \ endgroup $
–user123456098
16年1月15日在15:13

$ \ begingroup $
@ user123456098-您可以在此SE网站上描绘代码,方法是将其放在自己的行上并在其前面加上四个空格,也可以使用文本两边的重音符号(`)在行内进行描绘。
$ \ endgroup $
–卡盘
16年1月15日在15:48