前言:

相比直升机来说,四旋翼乃至多旋翼飞行器的机械结构简单,操控灵活,飞行稳定,体积也能做的更小,当然也能更大,它将直升机复杂的机械结构设计难度转化到了电子电路和算法上面,因此四旋翼飞行器的设计更容易上手,更民众化。

四旋翼飞行器的软件核心包括两大部分:姿态融合算法和控制算法;硬件核心便是MCU和传感器。

先介绍下姿态融合算法,姿态融合说白了就是将3轴加速度、3轴角速度和3轴磁场强度融合成四元数,再将四元数转化为欧拉角,最后将欧拉角最为控制量输送到所有电机以达控制飞行器姿态的目的。欧拉角包括偏航角Yaw、俯仰角Pitch和滚动角Roll。我用的算法是Madgwick写的AHRSUpdate和IMUUpdate,简单有效,其中AHRSUpdate是融合了陀螺仪、加速度计和磁力计,而IMUUpdate只融合了陀螺仪和加速度计,就优缺点来说,IMUupdate算法只融合了加速度计和陀螺仪的数据,还需要使用互补滤波算法来融合磁力计以修正偏航角Yaw,不然飞行器会找不到北,但是这种互补滤波有个小问题,就是假如定义偏航角的范围是0-360度,那么当机头大概从北偏西1度转到北偏东364度时,机头会经过0度(360度)这个点,那么这时,yaw不会直接1-0-364这么变化,而是会被逆向积分从 1-20-180-270-364这么转一圈,这是个不好的现象,实验了半天也没有解决,而AHRSupdate很好的解决了这个问题,不过由于AHRSupdate把磁力计的数据融合进了所有欧拉角,因此当传感器受到外围强磁场干扰时,就会造成全方位失控,导致坠机,而使用IMUupdate算法,顶多飞行器会转圈而已。

传感器我用的是invensense公司的MPU9150,MPU9150芯片集成了加速度计、陀螺仪和磁力计,并且内置硬件DMP用于姿态融合,不过不好用;MCU则用是Gigadevice公司的GD32F103系列,由于我也是刚接触四旋翼飞行器,第一个目的当然是能够平稳的飞起来,暂不考虑加入其他外围设备。后续可能会考虑使用GD32F107或者GD32F2xx系列,可扩展摄像头小玩一把航拍,当然更好的是GD32F4xx系列(期盼中),自带浮点运算单元,由于我软件太菜,算法中出现大量的浮点运算导致姿态更新频率和控制频率达不到很高。

做四轴飞行器也是为了好玩,目前我只完成了第一步:姿态融合。接下来才是更重要的,选择合适的机架、电调、电机、螺旋桨,写PID控制代码,系统整合以后还要调试各种参数,抗干扰,抗震动,最后还要加各种应用器件。在此鼓励一下自己,坚持就是胜利,慢慢磨洋工。

我现在软件实现的功能:算法用AHRSupdate、陀螺仪零偏校准、加速度计平滑滤波、磁力计平面校准,以后看情况可能会慢慢更新加速度计精确校准、磁力计椭球拟合校准、陀螺仪温度补偿等。

第一部分:硬件

1.传感器:MPU9150(INVENSENSE公司的,单芯片内集成了加速度计、陀螺仪和磁力计,并且内置DMP用于姿态融合,不过只融合了加速度计和陀螺仪,没有融合磁力计进去,具有自校准功能,价格比MPU6050贵很多,但是省PCB面积,省事,轴向重合度高。实际上就是把MPU6050和磁力计AK8975放在同一个芯片里,程序还是使用MPU6050的驱动,缺点是会偶尔丢失数据,自带的姿态融合算法的更新频率不高);

2.MCU:GD32F103CB(Gigadevice公司的,ARMcortex-M3内核,32位MCU,主频最高108Mhz,48Pin,与ST同型号的32位MCU 直接兼容,性价比更高,外接8M晶振,也可使用内部8M晶振,晶振远离传感器,避免干扰磁力计,不过当时考虑不周,这个芯片的timer太少了,以后会先采用GD32F103VCT6或者GD32F107VCT6);

3.电源芯片:TLV70233DBVR(TI的LDO,输入2-6V,输出3.3V,只需要外接2个X7R无极性陶瓷电容,价格太高)

4.串口:MAX3232(方便调试)

5.USB供电,输出电压5V

6.目前机架、电调、电池、电机和螺旋桨已买好,来张图,比较大众化:

上图:

图1:PCB的3D效果图,测试版,先追求调通得出姿态角,后续改版会做大的调整:

第二部分:软件

1.使用keil,uvision4.1.0,工具链:RealViewMDK-ARM Version4.12;

2.驱动:官方的MPU6050驱动inv_mpu.c和inv_mpu_dmp_motion_driver.c;

先看几个图,然后再说坐标轴的设定和算法部分。

上图:

图1:系统初始化,顺序从上到下依次是:初始化MPU、设置需要使用哪些传感器、设置陀螺仪测量范围(我设的是正负500度/s)、设置加速度计测量范围(我设的是正负4g)、配置fifo、设置采样率、装载DMP、设置陀螺仪轴向(比较重要)、使能DMP的一些玩意儿、设置DMP的FIFO、自校准陀螺仪和加速度计、开启DMP、开始姿态融合,见下图:

图2:由四元数求出的最终姿态角,其中Yaw为航向角,表示机头偏离正北方多少度,范

围-180到+180;Pitch为俯仰角,表示机头正方向与水平线的夹角,范围-90到+90;Roll为翻滚角,表示机翼与水平线的夹角,范围:-180到+180。下图为机身水平,且机头正北偏西37度左右的数据:

图3:下图为机翼水平,机头指向正北,且机头向下25度的数据

图4:下图为机头指向正北,保持水平,且机翼的右翼向下倾斜23度的数据

图5:看下欧拉角的奇异点,在奇异点处一个转动状态对应无穷多组自由度值,当物体转到这些奇异点附近,便没法求解。图中当Pitch为+90度时,机体的姿态便没法控制,Roll的轴向发生了变化。如下图:


第三部分:如何确定自己的轴向

首先,轴向的定义跟初始化四元数和最后结算的欧拉角有关,跟四元数更新算法无关,换句话说,不管你的轴向如何定义,姿态融合算法随便用,但是初始化四元数的公式和最后结算欧拉角的公式要做适当的改变,这个后面算法中有说。加速度计也好,陀螺仪也好,磁力计也好,他们的轴向都要满足右手定理,如下图:

再附上一段注释用于解释如何定义合理的轴向,以及如何正确旋转传感器的轴向,解释这么多其实就是说定义好的轴向要满足右手定理,如下图:

下图,旋转前是[x y z],旋转后就是[-y x z]:

下图是如何确定旋转角度的正方向,用右手握住坐标轴,拇指指向轴向的正方向,四个指头弯曲的方向就是旋转角度的正方向,在初始化四元数时,计算出的欧拉角的正方向也要满足这个条件:

我的程序使用的轴向如下图所示,未作任何改变:


第四部分:算法

第一步是校准,加速度计和陀螺仪我用的是MPU9150内部自校准,磁力计的校准采用如下方法:见附件-磁力计校准

第二步是初始化四元数,常见的轴向定义是绕x轴旋转是Roll,绕y轴旋转是Pitch,绕z轴旋转是Yaw,我的程序中也有这样的定义,不过被我注释掉了,这里举个另外一种轴向定义来对初始化四元数进行说明,方便比较,也是我目前正在用的轴定义。

下面我们来定义绕x轴旋转是Pitch,绕y轴旋转是Roll,绕z轴旋转是Yaw,轴向的正方向如上图一样,不变。

先对加速度计和磁力计的数据进行处理,得到init_xx来供我们使用如下图:

然后通过公式计算出初始化的Roll、Pitch、Yaw,注意加负号保证旋转角度的正方向,如下图:

其中Yaw的正方向未必对,可以自己去验证下,具体参考公式见附件-ST电子罗盘计算Yaw

然后由上面的欧拉角求出初始化四元数,这时要注意旋转顺序的不同,公式也不同,大部分旋转顺序是Z-Y-X,我的程序里也用的这个顺序,在这里我们按Z-X-Y的顺序来旋转,并得出求四元数的公式以做比较,其旋转矩阵:

q=qyaw*qpitch*qroll=

(cos(0.5*Yaw)+ksin(0.5*Yaw)) *(cos(0.5*Pitch)+isin(0.5* Pitch)) * (cos(0.5*Roll)+jsin(0.5* Roll))

得出初始化四元数计算公式如下图所示:

其中i,j,k之间相乘的顺序不能随意变,在前的先计算,在后的后计算相乘的公式如下图:

至此初始化四元数完成。

第三步就是使用AHRSUpdate算法了,用完以后再根据公式计算出欧拉角,此公式跟旋转顺序和旋转使用的轴向有关,我们的旋转顺序是Z-X-Y,且绕Z是Yaw,绕X是Pitch,绕Y是Roll,推到过程如下图:

首先得出3个方向余旋矩阵:

下图绕Z轴Yaw:

下图绕X轴pitch:

下图绕Y轴Roll:

然后按照我们的Z-X-Y顺序求得C=Croll * Cpitch * Cyaw,如下图:

将上图的方向余旋矩阵C与下图的四元数姿态矩阵做对比,即可求出欧拉角,注意上图的方向余旋矩阵C是随着我们对坐标轴的定义变化而变化的,而下图的四元数姿态矩阵是固定的:

最后一步就是求出欧拉角,公式如下图:

以下是静止时,刚上电时的数据:

以下是上电半个小时以后的数据:

可以看出正常的静止状态下,数据的波动范围是不超过1度的,也不会有漂移。具体效果还需要上机架飞起来以后再做调整。

最后总结一下:

我的代码中,0°<yaw<360°, -90°<pitch<+90°,-180°<roll<180°,并且我定义:Yaw北偏西为正,pitch往上为正,roll“右翼”下沉为正。传感器坐标轴:绕y旋转是 roll,绕x旋转为pitch,绕z旋转为yaw。代码里只有姿态更新,72Mhz主频下更新频率在350-400Hz,108Mhz下可以达到400-500Hz,目前我采用定时器定时,代码跑108Mhz,使姿态更新频率控制在400Hz。

注意跑108Mhz时,需要修改延迟函数和串口函数,适当增加一下延迟函数的数值避免I2C通信失败,修改串口函数是为了避免108Mhz下串口乱码问题,具体修改方式参考论坛顶置帖子http://bbs.21ic.com/iclist-182-1.html。

GD32F103+MPU9150四旋翼飞行器第一步:姿态融合算法相关推荐

  1. 微型四旋翼飞行器设计经验之瞎扯淡

    在正式开始记录微型四旋翼飞行器设计的学习笔记之前,感觉自己很有必要先给自己一个总结,也希望能够帮到更多的朋友少走弯路(虽然不知道帮助大不大). 去年九月下旬开始了微型四旋翼飞行器的学习与设计,在12月 ...

  2. 用Unity模拟四旋翼飞行器姿态控制(PID控制)

    一.问题来源 至于为什么要做这个仿真,其实我是想通过Unity来测试一下PID算法是如何控制四旋翼飞行器的控制姿态的.在此之前,我也想过直接做实物,然后去实现PID算法,但是实现硬件平台要涉及很多方面 ...

  3. 四旋翼飞行器平衡传感器数据 处理方法探讨

    四旋翼飞行器平衡传感器数据 处理方法探讨 [摘要]四旋翼飞行器的制作与研究日渐火热,而且其应用价值日渐凸显,当今四旋翼飞行器大都使用飞控板控制,其优点是操作简单,稳定性比较好,但好多的复杂功能无法自定 ...

  4. 四旋翼飞行器9——APM地面站使用详解(校准结束)

    四旋翼飞行器9--APM地面站使用详解 如果你手上有一块apm飞控,那么APM飞控第一步--下载APM地面站,校准传感器.遥控器. 下面的文章,大部分参考这个: http://bbs.loveuav. ...

  5. 四旋翼飞行器基本知识(四旋翼飞行器结构和原理+四轴飞行diy全套入门教程)

    转载两篇日志: 第一篇<四旋翼飞行器结构和原理> 第二篇<四旋翼飞行diy全套入门教程> =========================================== ...

  6. 四旋翼飞行器5——各类方案设计及参考

    下面几篇文章及资料是这两天看到的比较好的资源,可以多看看,对于新手来说,是个不错的提升自己的一些资料.可以分析每一种方案的特点,主控啊,传感器啊,不过到最后肯定要自己实践,才能得到最好的控制效果. 文 ...

  7. 四旋翼飞行器10——华科尔DEVO-10遥控和RX1002接收机对码

    四旋翼飞行器10--华科尔DEVO-10遥控和RX1002接收机对码 一.华科尔DEVO-10遥控和RX1002接收机简介 下面这个链接是淘宝店家给我的资料: DEVO-10遥控器操作手册 链接: h ...

  8. 四旋翼飞行器的研究方向

    毕业设计选的四旋翼飞行器设计的题目,顺便了解了下四旋翼飞行器有哪些值得研究的点. 四旋翼飞行器在高空检测(如电线,桥梁),灾害搜救,娱乐以及军事上都会有应用.相关研究的点也有很多,主要有飞行器的姿态估 ...

  9. 【飞控理论】四旋翼飞行器控制原理

    该篇博客是对锡月科技无人机飞行控制原理教学内容的整理 1.四旋翼飞行器的两种结构: "×"字模式: Pitch和 Roll与1,3.2,4两组电机呈 45°夹角 . "十 ...

最新文章

  1. 刚刚,特斯拉宣布终止私有化,马斯克最终没能说服大股东
  2. Javascript实现动态菜单添加
  3. 偶然发现了获取有ID的dom的一种方法
  4. 第三次学JAVA再学不好就吃翔(part105)--流的标准处理异常
  5. leetcode 37. 解数独 思考分析
  6. 流行歌单片机c语言编程,单片机6首音乐播放的proteus仿真电路及C语言程序设计...
  7. 1.2.1 计算机网络的分层结构、协议、服务和接口(转载)
  8. 一个实用的JS自定义函数addLoadEvent()
  9. java继承涉及的动/静态绑定及隐藏
  10. 御剑php字典,Newyujian1.5 御剑源码 主要用于扫描网站目录 - 下载 - 搜珍网
  11. No.3PPT风格及搭配
  12. 入手华为云学生机体验
  13. 虚拟机centos7无法正常启动
  14. 自定义dns服务器是什么,dns服务器有什么用(电脑设置DNS的方法)
  15. 摄影_光圈、快门、曝光度(ISO)
  16. EasyExcel标题加批注和标题字体填充红色
  17. 【ELM回归预测】基于非洲秃鹫算法优化极限学习机预测附matlab代码
  18. 若依框架使用自带的方法进行图片上传
  19. RSI+ROC短期指标组合怎么使用?
  20. Java原子操作和CAS

热门文章

  1. 电商平台1688按关键词搜索商品接口调用展示
  2. 16 岁高中生开发「粤语编程」项目,在 GitHub 火了!
  3. 龙珠直播公布全新战略,会借力苏宁再上台阶吗?
  4. 管理远程桌面信息的三种好用的管理工具
  5. 制造业生产物料管理无从下手?掌握这5大方法就够了
  6. 日本游戏 推荐列表 不断更新中
  7. opencv-python透明图和纯白背景图互转
  8. 洛谷 P5149 会议座位
  9. CNN:low-level feature 和 high level feature 的理解
  10. python前端控制爬虫停止_Webmagic 爬虫的配置、启动和终止