请教关于加速度传感器和陀螺仪传感器的配合问题
自己做了一个四轴,完全重新制作的,包括平衡算法。现在只用陀螺仪已经可以飞稳了,就是需要手工操作来抵消陀螺仪自身的漂移。利用移动平均已经可以消除马达、螺旋桨震动引起的加速度计数据混乱,现在可以准确根据X和Y轴的正负得出四轴是否倾斜。但如果是刚倾斜,四轴会往一个方向飘过去,这时加速度计的对应轴会因为加速度的关系出现数据不准。这也给我的修正带来麻烦。看德国人的四轴,非常稳,可见他利用加速度计和陀螺仪的配合做的相当不错。曾经仔细研究过UAVP的代码,但它的最新版3.15里居然弱化了加速度计的修正作用,把关键的部分注释掉了,而以前的3.14里就保留了。实在让人不理解,是不是效果不好?
德国人的代码,看起来实在够吃力。于是先用自己想的来看看能否解决。
尝试过卡尔曼滤波算法,利用俯仰和翻滚角来得到四轴的状态,从而进行纠正。但效果并不好,经常出现姿态和实际不吻合的情况。而且卡尔曼算法很复杂,出问题都不知道怎么查。
也尝试过简单的方法,针对加速度计的X和Y轴做PID,然后将这个修正值加到整体的修正里面。但效果有限,很多时候四轴都快撞树了还没修正过来。如果加大参数,那么四轴就好像挖地那样自己开始低头,再抬头,无法稳定到平衡位置。
目前咬牙看德国人的代码,还是一头雾水。
希望有解决这个问题的高手能来点播一下。 感觉卡尔曼滤波不错啊,可能我没上实际平台测试的缘故,有兴趣可以加我QQ:146945一起探讨下。 UAVP是不是用的AD的GYRO芯片比较好,能在比较长的时间内不做纠正就能满足控制需要。
不过我发现用ENC-03积分后获得的角度还好,就是可能偏移的快一些。 卡尔曼滤波静态测试是效果没得说,但在实际飞行时就比较让人郁闷了。
特别我用的还是10寸桨,由于重量问题没法用9寸的,这就造成相应速度不是很高。 http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_424975.JPG
测试 (原文件名:测试.JPG)
这个就是用卡尔曼滤波的,感觉还可以啊 如果固定加速度或者加速度变化不大的情况下,还是可以接受的。但我用到四轴上,经常前后倾斜,到处漂移,我感觉这时候卡尔曼的结果就不大可靠了。
另外还有一个问题,德国人也没用那么复杂的卡尔曼滤波就可以达到那么好的效果。我想应该也有更加简单,直接的实现算法吧。 用什么电调?PPM的电调响应速度太慢,控制响应严重滞后,效果很差,所以德国人是自制I2C控制的电调。 我用10寸的桨,用PPM的电调和I2C的效果上没差别。
现在在用的就是I2C电调。德国人的那个版本。 I2C的电调有没有报错的功能啊?我想做一个CAN通信的电调,不知道I2C的是不是能很好的抗干扰.
还有,我的桨是12的,会不会情况更糟啊? I2C我目前除非是传简单数据,比如马达转速这些需要频繁更新的,没有加CRC16交验。别的比如接受遥控器后的输出数据等都加了CRC。
在I2C总线里,只要有一个设备出错一直拉低SDA,就会把整个总线弄乱套。所有收到的数据都是0xFF,所有地址都有设备。
总的来说不是非常可靠,加校验还是有必要的。
12的桨也许会更麻烦吧,至少更贵了。./emotion/em003.gif kalman 滤波不工作的原因,主要是你的参数选择问题。 另外由于陀螺drift不稳定,或者bias出现跳动,都会给kalman filter带来问题。不怕有drift,和bias,这些都可以modelling,就怕不稳定。
早期的卫星定姿不用kalman filter,因为那个时候陀螺不是那么稳定,所以用alpha-beta滤波,运算量还小。 不过现在都开始用kalman filter了。 能说说,到底怎么应用Kalman 吗 ? 仔细研究了一下UAVP 3.15的代码,然后把它的算法放到了我的四轴里,刚才试飞效果不错,整个飞行过程一直很平稳。不过抗风性能还不行,还会被吹跑。
UAVP的混合算法完全针对PID里的I进行。在Accel.c文件里,CheckLISL函数。通过获得加速度计的数据后,和陀螺仪的积分结果进行比较,看一下当前的陀螺仪积分后的偏转角和加速度计因为倾斜得出的角度的差异,根据比较结果设置变量LRIntKorr和FBIntKorr的数值。这2个变量在它处理I积分(pid2.c,LimitRollSum和LimitNickSum函数里可以看到),避免超过上限时用到了。每次PID后都进行这种“微调”修正。
也就是说,将加速度计得出的偏差数值慢慢地融合进I里(每次+1或者-1),这样就可以非常“温柔地”调整四轴的姿态。3.15以前的版本还有将这个数值直接加到P里,但在3.15中被去掉了,可能是因为直接加P太过“粗鲁”,容易造成大幅度震荡吧。
德国人MK的代码里也有类似的逻辑,只是MK的代码首先针对加速度计的数据做了一个类似移动平均的计算。出于内存小的原因,这段代码看起来实在有难度。但基本原理类似,也是将修正值放到I里,然后慢慢纠正。
这是我目前得出的结论,希望对大家能有所启发。 你好 我也在做这方面的事 能告诉我UAVP代码在哪找么 以上经验对新四轴系统的经验:
(1)F控和B控之间最好不用I2C,I2C不可靠,可以考虑以太网这种带校验的高速控制链路.
(2)高速控制链路一但建立起来,所有原始数据,各种姿态传感器数据都可以汇总到地面站进行数据记录.
(3)数据记录一但投入运行,飞一次的数据可以在家里不断分析仿真,改正算法进行验证.
(4)可以一次准备N种算法的程序,飞时地面站可以随时往F控DOWN程序.
(5)整个系统的控制算法非常重要,数据记录可以单独请偏理论的算法老师分析.
以上对每片ARM的成本增加大约40元,加入WIFI链路,地面站能和5个节点通信,功耗增加30%~40%,更适合更大体积的四轴系统
到底集中式控制好,还是分布式控制好,目前还看不出来?
但从老外看分布式控制主要是处理器太玩具化性能太底,因为在那个条件下,成本是第一位的. UAVP的代码下载页面:http://uavp.ch/moin/Download
在下面的GPL Source Code里。 【12楼】 cnmusic
我也下载了UAVP的3.14、3.15源代码,没用过PIC,很多语句看得吃力,还有就是很多变量的初始化(如PID的三个系数值)都找不到在哪里。
另请教下楼主:1.trig.c 和matrix.c 这两个文件里函数,是否只是用来调试用的?从程序的流程和调用关系来看,这两个文件里的函数都没有参与姿状平衡的计算,只在serial.c里有调用到。
2.是否还需要有Bootloader程序,才能把hex文件正确写入单片机?UAVP程序中用到的所有变量,是否在Bootloader里进行的初始化?
期待回复,谢谢! 我也没用过PIC,我只是研究它的算法,所以那些涉及到具体寄存器设置的东西我都忽略没看。
trig.c和matrix.c我也没去研究,里面的代码看起来都没有用到呢。
至于BootLoader,PIC是可以支持BootLoader的,但我用的是ARM,所以这部分我也没去管它。
他的很多用户配置的变量都保存到了EEPROM里,通过文件c-ufo.h里的那些extern就直接拿来当变量用了,倒是很方便。 目前我实现的融合代码,效果不能说很好。
目前的问题主要是振荡和纠正不彻底之间的平衡问题。如果I参数设置比较大,那么会引起四轴振荡,飞起来左右摇晃。如果设置比较小,那么振荡倒是没有,可经常是还差一点就能完全平衡的时候就不去纠正了。记录的数据可以看出有纠正数值,但因为I小所以纠正动作基本没效果。
尝试了设置积分上限后增加I的大小,但除了引起振荡外没有什么新的变化。
还挺麻烦呢,不知道是不是因为10寸桨太大,响应速度太慢的关系。 不要怀疑10寸桨的性能,UAVP和MK的也是10寸桨,飞得很稳不是吗?
我的飞控只做到了角速度的PID控制,动平衡还可以。因没融入加速计数据,静态平衡不好,一放手就会漂走。看UAVP的角速度、加速度融合PID算法,没看懂处理流程,净被那些变量给转晕了。试着加入加速计的X、Y轴的PID值到陀螺的I,进行融合控制,反应实在太迟钝,象你说的那样,四轴都快撞墙了,姿态还没调整完。MK的飞控代码可读性太差了,硬着头皮看了几天,最后还是回到了UAVP.看到你在【12楼】 的解说,才算有点眉目,谢谢! 我也是看不懂MK的代码,最后只好研究UAVP的了。MK的代码实在是够乱的,注释少,还是德文...看了3天也没搞定。
UAVP是直接用加速度计的X,Y轴来进行运算的。不过我感觉加上移动平均后就可以准确知道四轴到底有没有倾斜。以前我没加这部分,结果加速度计的数据乱到根本没法用。
UAVP的处理流程还是比较容易理解的。这里关于IntegralCount变量的作用,我目前的理解是它用这个来设置陀螺仪的中立点,也就是当IntegralCount != 0的时候,都是属于测量中立点的过程,IntegralCount = 1的时候开始根据积分数据计算中立点。而且UAVP和我想的一样,在每次起飞前重新标定一下陀螺仪的中立点,有助于消除温飘的影响。 http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_428665.gif
(原文件名:Image1.gif)
这是一次较长时间的飞行,看起来自动回中还是有些效果的,就是应该把移动平均设置的高一些来滤掉更多的震动。 我也要问这样的问题啊,不过我是菜鸟,没楼主问得那么高深。我要做传感器的ad转换,准备用avr单片机的,具体传感器有3个单轴EWTS82,一个3轴的飞思卡尔的A7260,如何把他们搞在一起进行ad转换??请各位高手支招,搞不出电路,烦恼中,
要不要加SP232,还是传感器直接与单片机连接?没用过SP232,不知道怎么接 http://you.video.sina.com.cn/b/19587452-1407327420.html
我的四轴的飞行录像,用的10寸桨,响应速度比较慢,所以运动幅度比较大。 姿态数据多长时间更新一次呀,控制反应是有点不及时。陀螺用的是ENC-03吗,温漂影响有这么严重? 目前更新速度是100Hz,但是用了10寸桨,所以效果和50Hz没多大差别。
ENC-03目前看起来定一次中立点只能管1分钟,然后又要重新再定了。视频里到1分钟的时候已经开始失控了。 你用的是什么电调?10寸桨对飞行的影响很大?好象未必呀。
同样是用ARM做主控,这个帖子里做的就很好呀。http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=2225879&bbs_page_no=2&bbs_id=1025 目前是I2C电调,就是德国人MK的那一套。
另外飞的是否稳和是否是ARM芯片没关系,你看人家用的可是9寸桨呢。8、9寸桨响应速度都没问题,就是到了10寸桨就开始不行了。
另外MK和UAVP用的10寸桨好像都是双叶桨吧?我用的是GWS 3叶桨,桨比他们的重,自然会影响响应速度。 原来是用的GWS 3叶桨,看来主要问题出在电调加速响应上了。 应该是配合更低KV的马达,但目前只有1000KV的最好买也最便宜。
我是准备再做一个小的,然后用小桨了。 我现在怀疑不是陀螺仪的不稳定,而是我自己焊的I2C电调不稳定了。
仔细看过录像,发现总是第一个马达出现间歇性的转速降低,造成四轴快速前飞。在这之前的姿态纠正数据都是正确的。
而且出现的时间也没有太多规律,第17秒钟就出现了。
准备换成PPM的电调再试试看。 请问楼主:您在20楼分析的“
这里关于IntegralCount变量的作用,我目前的理解是它用这个来设置陀螺仪的中立点,也就是当IntegralCount != 0的时候,都是属于测量中立点的过程,IntegralCount = 1的时候开始根据积分数据计算中立点。而且UAVP和我想的一样,在每次起飞前重新标定一下陀螺仪的中立点,有助于消除温飘的影响 ”
陀螺的中立点是怎么确定的呢?我们做的四轴中立点不准导致我们的飞行不稳定
想请教一下这个问题 谢谢 UAVP是个反华网站! mark. mark mark 为什么MK用什么器件大家就用什么器件呢?它的零点漂是因为器件的缘故,在动态情况下,kalman滤波反应不好,就可以试试自适应KF mark 我也准备做一个,可学长说,主要是要控制好平衡。看来,还得努力学学啊。 学习一下
页:
[1]