搜索
bottom↓
回复: 43

圆点博士小四轴算法快速入门,送给即将走进四轴的新手...

  [复制链接]

出0入0汤圆

发表于 2014-5-26 17:05:49 | 显示全部楼层 |阅读模式
楼主最近有段时间没来了,既然来了,就顺便谈谈飞控的代码写法吧。
楼主发的帖子比较少,关于小四轴的硬件设计,大家就参照楼主发的下面两个帖子吧。(由于时间久远,换了ID)

帖子一:圆点博士微型四轴飞行器开工拉...有钱出钱,没钱出力 http://www.amobbs.com/thread-5504090-1-1.html
帖子二:圆点博士小四轴2013版全部资料大放送 http://www.amobbs.com/thread-5571228-1-1.html

看完上面两个帖子,小四轴的硬件设计肯定没有问题啦。下面楼主谈下简单飞控算法的写法。
飞控的算法代码一般包括下面三个部分:滤波,姿态,PID

1,滤波可以用互补滤波来实现,互补滤波的资料很多,大家随便就能找到。基本公式是:


2,滤波完就是四元数拉。直接用老外Madgwick的IMU就可以。超级简单

3, PID的代码其实也很简单,主要是要了解其中的原理,才能更好地调整参数。为了方便新手们理解,楼主建立了一个数学模型来让大家了解。(只针对新手,老手就算了)

========圆点博士小四轴之PID控制模式分析=======
PID控制的P是Proportional的缩写, 是比例的意思,I是Integral的缩写,是积分的意思,D是Derivative的缩写,是微分的意思。所以,PID就是我们常说的比例,积分,微分控制。
我们首先来看一个PID控制模型曲线图:
该图包含了比例控制,比例+积分控制,比较+积分+微分控制的电机响应图的对比。


下面我们对曲线进行具体分析:
PID中的比例控制是最容易理解的,比例控制就是把角度的误差乘以一个常数作为输出驱动。假定我们有一个理想模型的电机,1V电压的变化会带来小四轴1度的角度改变。假定现在电机控制电压是5V,小四轴在某一轴上的偏角是5度,目标角度是100度。我们把当前的电压量定义为Vin,把输出控制量定义为Vout。假定P等于0.2,那么比例控制的结果就是:
第一次:Vout=Vin+(100-5)*P=5V+19V=24V,得到电机电压是24V,对应的小四轴角度是24度,距离目标角度的误差是100-24=76度。
第二次:Vout=Vin+(100-24)*P=24V+15V=39V, 从而引起的角度是39度。
我们看到,在这么的一个比例控制系统下,小四轴角度在慢慢地向目标角度靠近。

PID中的积分控制就是把把所有角度误差相加起来,然后乘上一个常数作为输出驱动。在上述例子中,假定I=0.2, 我们来看看比例和积分控制同时起作用下的系统反应。
第一次:Vout=Vin+(100-5)*P+(100-5)*I=5V+19V+19V=43V,这时候小四轴角度为43度。
由于第一次控制前的误差是100-5=95,第二次控制前的误差是100-43=57,所以积分结果是152。
第二次:Vout=Vin+(100-43)*P+((100-5)+(100-43))*I=43V+11V+30V=84V, 这时候小四轴角度变为84度。
第三次:Vout=Vin+(100-84)*P+((100-5)+(100-43)+(100-84))*I=84+3V+33V=120V。这时小四轴角度变为120度。
我们看到,在增加了积分控制后,小四轴角度在快速向目标角度靠近。

PID中的微分控制就是把角度的变化乘上一个常数来作为电机驱动输出。在上述例子中,假定D=0.2, 我们来看看比例,积分和微分共同控制下的系统反应。假定第一次前,电机转速保持5转,那么第一次前的角度变化为0。
第一次:Vout=Vin+(100-5)*P+(100-5)*I-(5-5)*D=5V+19V+19V-0V=43V,这时候小四轴角度为43度。
和上一次相比,角度从5度变化到了43度,所以小四周角度变化是43-5=38度。
第二次:Vout=Vin+(100-43)*P+((100-5)+(100-43))*I-(43-5)*D=43V+11V+30V-7V=77V, 这时候小四周角度77度。

把上述的计算结果列出来,我们看到:



从上面的数据,我们可以看到:
1,单独比例控制的时候,数据慢慢接近目标 (图表中的红色线)
2,加入积分控制之后,数据快速接近目标 (图表中的蓝色线)
3,微分控制起到抑制变化的作用。(图表中的绿色线)

有了这些理论基础,就可以写PID控制代码拉。

========圆点博士小四轴之PID控制代码分析=======
在圆点博士小四轴2014版代码里,我们只使用到PD参数。
首先我们来看PID中的比例控制。跟上一节模型提到的一样,比例是针对误差的控制。
首先我们获取小四轴当前角度。
bs004_angle_cur_pitch=bs004_imu_pitch;
bs004_angle_cur_roll =bs004_imu_roll;
把当前角度和目标角度相减,就可以得到角度偏差。
bs004_angle_err_pitch=bs004_angle_cur_pitch-bs004_angle_target_pitch;
bs004_angle_err_roll=bs004_angle_cur_roll-bs004_angle_target_roll;
然后进行比例控制:
bs004_fly_m1=bs004_fly_m1
+bs004_pitch_p*bs004_angle_err_pitch
-bs004_roll_p *bs004_angle_err_roll
-bs004_yaw_p*bs004_angle_err_yaw;
bs004_fly_m2=bs004_fly_m2
-bs004_pitch_p*bs004_angle_err_pitch
-bs004_roll_p *bs004_angle_err_roll
+bs004_yaw_p*bs004_angle_err_yaw;

bs004_fly_m3=bs004_fly_m3
-bs004_pitch_p*bs004_angle_err_pitch
+bs004_roll_p *bs004_angle_err_roll
-bs004_yaw_p*bs004_angle_err_yaw;
bs004_fly_m4=bs004_fly_m4
+bs004_pitch_p*bs004_angle_err_pitch
+bs004_roll_p *bs004_angle_err_roll
+bs004_yaw_p*bs004_angle_err_yaw;

在上一节模型中,我们提到PID中的微分控制针对的是角度变化而进行的控制。
所以我们首先要得到当前角度和上一次角度的差异。
bs004_angle_dif_pitch=bs004_angle_cur_pitch-bs004_angle_last_pitch;
bs004_angle_dif_roll =bs004_angle_cur_roll-bs004_angle_last_roll;
bs004_angle_dif_yaw  =bs004_angle_last_yaw-bs004_angle_cur_yaw;
然后进行微分控制:
bs004_fly_m1=bs004_fly_m1
+bs004_pitch_d*bs004_angle_dif_pitch
-bs004_roll_d *bs004_angle_dif_roll
-bs004_yaw_d*bs004_angle_dif_yaw;
bs004_fly_m2=bs004_fly_m2
-bs004_pitch_d*bs004_angle_dif_pitch
-bs004_roll_d *bs004_angle_dif_roll
+bs004_yaw_d*bs004_angle_dif_yaw;
bs004_fly_m3=bs004_fly_m3
-bs004_pitch_d*bs004_angle_dif_pitch
+bs004_roll_d *bs004_angle_dif_roll
-bs004_yaw_d*bs004_angle_dif_yaw;
bs004_fly_m4=bs004_fly_m4
+bs004_pitch_d*bs004_angle_dif_pitch
+bs004_roll_d *bs004_angle_dif_roll
+bs004_yaw_d*bs004_angle_dif_yaw;

从上面的描述我们可以看出,小四轴的PID控制还是比较简单的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2014-5-26 17:28:45 | 显示全部楼层
先顶了再说!

出0入0汤圆

发表于 2014-5-26 17:33:58 | 显示全部楼层
呀呀,真是我等菜鸟的福音啊!谢谢楼主!!

出0入0汤圆

发表于 2014-5-26 18:11:59 | 显示全部楼层
收藏,多谢 了……

出0入0汤圆

发表于 2014-5-26 18:48:19 | 显示全部楼层
顶一个!!!

出0入0汤圆

发表于 2014-5-26 20:56:05 | 显示全部楼层
收藏准备下次

出100入101汤圆

发表于 2014-5-26 20:57:48 | 显示全部楼层
扫盲贴,好!

出0入0汤圆

发表于 2014-5-27 00:12:11 来自手机 | 显示全部楼层
先mark一下,明天慢慢看

出0入0汤圆

发表于 2014-5-27 00:58:38 | 显示全部楼层
标记一下,有空看

出0入0汤圆

发表于 2014-5-27 10:50:55 | 显示全部楼层
讲的很是不错,楼主能否上传一份工程源码?

出0入0汤圆

发表于 2014-5-27 10:51:28 | 显示全部楼层
能否接着讲一下针对四轴的PID参数整定的方法。

出0入0汤圆

发表于 2014-5-27 11:20:36 | 显示全部楼层

顶一个!!!

出0入0汤圆

发表于 2014-5-27 12:01:29 | 显示全部楼层
顶。。。。

出0入0汤圆

发表于 2014-5-27 12:39:55 | 显示全部楼层
学习了 mark

出0入0汤圆

 楼主| 发表于 2014-5-27 13:54:37 | 显示全部楼层
sgzzour 发表于 2014-5-27 10:50
讲的很是不错,楼主能否上传一份工程源码?

工程代码已经更新到csdn的git代码库上:https://code.csdn.net/etootle_4x

出0入0汤圆

发表于 2014-5-27 14:11:48 | 显示全部楼层
简直碉堡了~!!!怒顶~!!!!

出0入0汤圆

发表于 2014-5-27 14:57:09 | 显示全部楼层
做了板子,一直还没好好的研究过

出0入0汤圆

发表于 2014-5-27 16:13:06 | 显示全部楼层
很好的四轴入门教程,适合新人。

出0入0汤圆

发表于 2014-5-28 09:50:53 | 显示全部楼层
不错,很不错的教程

出0入0汤圆

发表于 2014-5-28 10:52:40 | 显示全部楼层
这么长时间来的困惑一下解决了,

出0入0汤圆

 楼主| 发表于 2014-5-30 00:15:43 | 显示全部楼层
hhhhhchch1 发表于 2014-5-28 10:52
这么长时间来的困惑一下解决了,

很高兴能够对大家有所帮助。

出0入0汤圆

发表于 2014-5-30 08:14:49 | 显示全部楼层
果断收藏!

出0入0汤圆

发表于 2014-5-30 08:27:49 | 显示全部楼层
呀呀,真是我等菜鸟的福音啊!谢谢楼主!!

出0入0汤圆

发表于 2014-5-30 18:39:24 | 显示全部楼层
我等菜鸟果断收藏

出0入0汤圆

发表于 2014-5-30 22:54:39 来自手机 | 显示全部楼层
很好哦!最近遇到个关于MPU6050传感器的问题,16位应对应65536,加速度量程为+-8g,也就是说静止放平是z轴应为4096左右,即65536/16,可是读出来,z轴17210水平的时候,但是绘制曲线时,数据的变化是和板子的变化趋势是一致的,我想误差也不能这么大啊!暂时还不知道问题出在哪里呢!?倘若楼主指点一二,或许就知道问题的点了…

出0入0汤圆

发表于 2014-5-30 23:03:50 来自手机 | 显示全部楼层
四轴精华帖阿!

出0入0汤圆

发表于 2014-5-31 04:40:54 | 显示全部楼层
真心好人

出0入98汤圆

发表于 2014-5-31 07:50:10 | 显示全部楼层
收藏下,马上有用。

出0入0汤圆

发表于 2014-5-31 12:58:45 | 显示全部楼层
顶楼主,果断收藏

出0入0汤圆

发表于 2014-7-2 23:33:50 | 显示全部楼层
收藏先,很好

出0入0汤圆

发表于 2014-7-10 16:08:04 | 显示全部楼层
收藏先~

出0入0汤圆

发表于 2014-7-11 11:03:49 | 显示全部楼层
顶顶!!

出0入0汤圆

发表于 2014-7-17 16:18:08 | 显示全部楼层
谢谢楼主科普

出0入0汤圆

发表于 2015-2-24 22:36:59 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2015-2-24 23:29:50 | 显示全部楼层
通俗易懂,很好。

出0入0汤圆

发表于 2015-2-26 22:05:13 | 显示全部楼层
真是我等菜鸟的福音啊,虽然没完全看懂,但是可以不断学习

出0入0汤圆

发表于 2015-2-27 20:25:56 | 显示全部楼层
好难啊。。。数学不好怎么办

出0入0汤圆

发表于 2015-3-2 16:19:49 | 显示全部楼层
热心人不错,学习了

出0入0汤圆

发表于 2015-3-6 14:57:20 | 显示全部楼层
感谢楼主分享,请教下:bs004_fly_m1、m2、m3、m4分别是什么参数?为什么是等于pitch、roll、yaw相加?

出0入0汤圆

发表于 2015-3-13 15:51:15 | 显示全部楼层
zxjfun 发表于 2015-3-6 14:57
感谢楼主分享,请教下:bs004_fly_m1、m2、m3、m4分别是什么参数?为什么是等于pitch、roll、yaw相加? ...

应该是四个电机的输出数值;至于为什么是+ - 应该是我们平时的X、+模式中的一种;这里的+、-要结合m1、m3;m2、m4对比看

出0入0汤圆

发表于 2015-3-13 19:52:56 | 显示全部楼层
多谢分享 学习了

出0入0汤圆

发表于 2015-3-13 22:51:39 | 显示全部楼层
zxjfun 发表于 2015-3-6 14:57
感谢楼主分享,请教下:bs004_fly_m1、m2、m3、m4分别是什么参数?为什么是等于pitch、roll、yaw相加? ...

就是 四轴飞行器 4个电机的输出啊~  你去这可以找到源代码http://www.eeboard.com/bbs/forum-98-1.html  
不过我不理解的是
在上一节模型中,我们提到PID中的微分控制针对的是角度变化而进行的控制。
所以我们首先要得到当前角度和上一次角度的差异。
bs004_angle_dif_pitch=bs004_angle_cur_pitch-bs004_angle_last_pitch;
bs004_angle_dif_roll =bs004_angle_cur_roll-bs004_angle_last_roll;
bs004_angle_dif_yaw  =bs004_angle_last_yaw-bs004_angle_cur_yaw;   这一句不用last?
还有
微分控制:
bs004_fly_m1=bs004_fly_m1
+bs004_pitch_d*bs004_angle_dif_pitch
-bs004_roll_d *bs004_angle_dif_roll
-bs004_yaw_d*bs004_angle_dif_yaw;
后面两个 为什么不是+  呢?

出0入0汤圆

发表于 2015-7-7 22:06:10 | 显示全部楼层
收藏备用了!贴子很不错
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 07:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表