前言

  任何复杂工程系统,一定都是从一个简单的系统,经过提出需求——解决方案——发现问题——解决问题的不断循环——达到预期需求后,最终演变成一个复杂系统。而且其需求不同或是问题演变的方向不同,这就导致了同一个行业或领域,会有多个商业产品。
  回到飞行控制,当我开始学习时,直接APM开源代码入手,直接给我干懵了。经过跌跌撞撞地学习,最终仅了解了飞控的最基本原理。
  为了巩固自己所学知识,使零碎的知识建立联系。下面以刚毕业的工程师小明的视角模拟上述(提出需求——解决方案——发现问题——解决问题的不断循环——达到预期需求)的过程,来讲解飞行控制过程。

需求:要做一个四旋翼飞机,能够实现三个自由度上的稳定飞行

  MD,上来就是一个这么复杂的问题。刚毕业的工程师小明都吓坏了,心想我本就是一个划水大学生,再说大学学的也不是这玩意啊。不过,拿人钱财替人消灾,只能硬着头皮做了。于是小明开始了他的飞控之旅。
  小明心想,“先不管它是不是三个自由度了,我能让它(四旋翼飞机)芜湖的一下起飞就不错了。”

  好在小明的力学还不错,便想到,这四旋翼有四个桨,只要四个桨叶旋转产生的升力相等,之和等于重力不就可以让飞机起飞了吗?噢,对。还要平衡扭矩,只要让电机13逆时针,电机24顺时针就行了,这个简单。理论存在,实践开始。
  于是小明查阅了相关资料,找到了螺旋桨参数及转速与升力和扭矩的关系(公式见:https://blog.csdn.net/qq_38041309/article/details/121329749),现在只需要根据让每个螺旋桨产生的升力等于1/4个G(重力)就行了。很快小明根据公式便得到了螺旋桨的转速w,接下来只要控制电机的电流和电压,就可以让电机保持这个转速了。
  那怎么保持电机的电流电业呢?找一个匹配的电池?这样未免不够灵活。后来小明发现,原来还有电调这种东西,可以放在电池和电机中间,这样就可以控制输入到电机的电流电压了((公式见:https://blog.csdn.net/qq_38041309/article/details/121329749)),而且小明还发现电调的另一个用处,那就是——电调提供了一个可控的油门量,控制这个油门量还可以随心改变输入到电机的电流和电压,这不是再完美不过了吗?这样一来小明就可以用遥控器和这个电调的油门相连接,油门开度越大,螺旋桨转速越大,这样一来就可以用遥控器让飞行器起飞和降落了。
  于是小明兴高采烈地把螺旋桨、电机、电调、电池组装起来,并连接遥控器。躲到远远的,然后慢慢地抬高控制器的油门。激动人心的时候来了,螺旋桨转起来了,越转越快,离地了!起飞了!

发现问题A——定高控制

  小明激动地拨动油门杆,在喜悦之时发现了很多问题。
  其一(A1),仅用油门杆调整到固定高度(定高)实在是太难了,起飞后油门给高了飞机起飞,给低了就开始降落,找到那个临界值太难了!
  其二(A2),四个桨叶转速相同,一旦有风或起飞时地面不平整等原因,飞机飞行时不水平,四个桨叶产生的合力将不再是竖直向上,水平分量将导致飞机发生偏移,甚至机身翻转导致坠机。

解决方案A

问题A2——消除飞机倾斜

  首先来看问题2,这个牵扯到飞行安全问题。但这个问题难不倒了解力学的小明,因为只要保证了四个螺旋桨产生的拉力相同,就不会在任何机体xy轴(机体坐标系定义如下图)方向有力矩,这就保证了飞行要想“翻身“也没有想的那么容易。那么有没有什么办法能让机身倾斜的飞机能够自动回到水平呢?于是小明联想到了不倒翁。只要让飞机的重心低于机体坐标系的xy平面。于是只要飞机倾斜产生水平速度时,拉力在重心处产生的力矩就会让机身回到水平,这不就能让飞机自行平稳了吗?好的,问题2解决方案有了!

问题A1——飞机自主定高

  再来看这个问题1。有什么办法可以让飞机更快的达到平衡点从而定高呢?最好是我遥控器的油门处于中立位置的时候,就表示我想让飞机定高根据公式计算,虽然理论上能够使得螺旋桨拉力等于重力,但且不说重力的测量误差,还有电调电池等等的误差累加,仅靠理论显然是不行了,看来不得不加入自动控制系统了。
  经过网上冲浪后小明知道了用得最多的就是PID控制,于是小明也打算用这玩意来控制定高飞行。得知PID是基于误差的控制,那就必须要知道油门杆处于中立位时刻的飞机高度,然后让PID去控制电机,如果低于这个高度就加大点油门,高于这个高度就减小点油门,就不用一直人为调控了。
  这就意味着必须要用到传感器了。了解过后,发现测量高度的有气压计、声波测距仪、激光测距仪等一系列测距仪。小明想,反正就要个定高,气压计就够了,别人飞机上也用这个,那我也用这个吧。
  实践开始,控制器的设计思路就设为——当油门杆处于中立位置(设定一定死区,在中立位的死区内,均算作指令为定高)时,记录该时刻的气压计的值,并作为期望值(更详尽的设计这里不再说明,比如可以设定中立位置的停留时间等),随着飞机高度的波动,气压计的值也发生改变并作为当前值,有了当前值和期望值,就可以计算误差,于是PID开始发挥作用,PID结算后可以输出需要的拉力值f,而通过螺旋桨产生拉力的计算公式,就可以计算得到螺旋桨的转速,从而就计算得到电调的油门值,就能实现自动调节了。

  自动控制结果如下

  至此,定高飞行的需求就完成了
  注:上述仿真模型只是粗略模拟,追求好效果还需加上速度环加速度环等。

发现问题B——飞行器飞行安全

  随着反复的测试,小明再次发现问题,问题B1——需求本身的另外五个自由度的控制没有解决问题B2——当起风时,导致的飞机倾斜,这个时候因为重心靠下的原因,拉力产生的力矩将使得飞机翻转,这就意味着飞机的定高的稳定性并没有根本性的解决。
  这个时候小明发现,这两个问题其实有点互通性。因为,如果能够很好地解决问题1,就能控制住飞机在水平位置不动,这样一来飞机肯定就不能倾斜(因为四旋翼有六个自由度,但只有4个动力输入,因此肯定有两个运动发生了耦合,其中一个是x轴旋转与y轴平动的耦合,及y轴的旋转与x轴平动的耦合)。目前小明只能控制z轴方向的平动,也就还有三个自由度的控制没有解决,也即z轴的旋转,x轴平动与y轴旋转的耦合,y轴平动与x轴旋转的耦合。
  但一下子要解决这么多东西,还是太过于复杂了,小明想。所以干脆不考虑耦合平动等乱七八糟的,先保证飞机飞起来能够平平稳稳的,不产生倾斜,保证飞行安全就行。也即先解决问题B2,问题B1之后再考虑。

解决方案B

问题B2——飞行器自主保持水平

  根据定高的解决经验,小明想,解决这个问题的思路其实和解决定高问题是一样的。因为,要保持飞机水平,无非是要保证机体xy轴不能做任何旋转运动,那就是要控制xy轴的旋转角度为0。那这就简单了,只要用传感器实时测出飞机的xy轴的姿态角作为当前值,然后与期望值0相减得到误差角,就可以通过PID输出期望的(角速度、再加一环PID还以得到角加速度,知道角加速度就可以算出力矩,通过改变四个电调油门值,得到升力差得到期望的力矩)电调油门值(理想情况是三个环,这里类似定高做简化,直接用角度误差输出油门控制量)。
  那么现在就需要找能测出角度的传感器,小明网上冲浪后发现,陀螺仪可以测量角速度(积分后得到角度),加速度计可以测量三个方向(机体xyz)的加速度(可通过加速度大小计算出xy方向的角度),磁力计测量磁场强度(解算后可以得到z轴方向的角度)。可以看到,每个姿态角均有两个测量值,如何融合这些数据,最终输出一个较为准确的一组姿态角为数据融合问题,可以采用卡尔曼滤波等,这里不再阐述,详见www.haimeigeng.com(之后更新)。下面直接假定夏明已经会数据融合了。
  得到姿态角后,就可以和之前做定高一样,采用PID进行自动控制了,同样也可以采用多个环,通过角度误差得到角速度,角速度误差得到力矩进而输出电机转速。原理图如下:

  这样一来,飞机的自主水平也搞定了。既然飞机的平稳运行搞定了,现在就可开始考虑实现前后左右飞行和偏航运动了。

问题B1——实现xy轴的移动和转动及z轴转动

  有了之前的经验,小明大感要解决这个问题只要如法炮制就行了。小明想只要把遥控器的拨动角度当做xy轴的期望旋转角就行了,然后又是用PID对飞行器经行控制就可以了。只不过需要限制飞机最大的倾斜角,也即飞机整体平面与水平面的夹角不应该过大,小明考虑到飞行安全,把这个角保守设置在了30度,那么滚转和俯仰的最大角应该只有30度(但不能同时达到30度,这样整体倾斜会超过30度)。
  与解决问题一的方法相同,得到遥控器指令后,将其线性映射为期望的姿态角,根据传感器获取到的下当前时刻的姿态角,便可做差得到期望的角速度,角速度误差得到力矩进而输出电机转速。原理如下图:

  至此,飞机便成功实现了稳定响应遥控器的指令,并拥有一定的飞行稳定性,不会因为飞机倾斜角太大而导致坠机。
  小明的任务阶段性地完成了,然而还有相当多的细节设计还需要小明慢慢更新(之后的博客将介绍开源飞控中如何设计控制器及姿态估计和位置估计模型)。

抛开理论公式,用符合直觉的方式理解四旋翼无人机控制相关推荐

  1. 二项分布_贝塔分布(multivariate Beta distribution)_多项分布_狄利克雷分布(Dirichlet distribution)_贝叶斯理论公式浅述

    二项分布_贝塔分布(multivariate Beta distribution)_多项分布_狄利克雷分布(Dirichlet distribution)_贝叶斯理论公式浅述 参考书籍<统计学习 ...

  2. 四旋翼姿态解算——梯度下降法理论推导

    转载请注明出处:http://blog.csdn.net/hongbin_xu 或 http://hongbin96.com/ 文章链接:http://blog.csdn.net/hongbin_xu ...

  3. 如何用最简单的方式理解傅立叶变换?

    你还在因为傅立叶挂科而头疼不已吗? 傅立叶变换经常被称为大学的杀手课程,傅立叶变换不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式. 但不幸的是,傅立叶变换的公式看起来太复杂了,所 ...

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

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

  5. 反省读经教育理论的误区 ——关于十三岁之前理解的问题

    反省读经教育理论的误区 --关于十三岁之前理解的问题 海印 读经二十年,成效可观,可观的是理论,客观的实际却是理论上许多的误解.因一些观念的误解,致使一线教学产生很大的畸形,首当其冲的就是十三岁之前儿 ...

  6. Map集合遍历的四种方式理解和简单使用

    Map集合遍历的四种方式理解和简单使用 ~Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值 1:无非就是通过map.keySet()获取到值,然后根据 ...

  7. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示...

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  8. Android启动Activity的两种方式与四种启动模式

    1.在一个Activity中调用startActivity()方法 2.在一个Activity中调用startActivityRequest()方法. 重写onActivityResult方法,用来接 ...

  9. react生命周期(自己的方式理解)

    react生命周期(自己的方式理解) react的生命周期函数有:挂载,渲染/更新,卸载 首先要知道react生命周期最初始的要有哪些?最后生命中出现的又有哪些?我本人喜欢把react比作是一个人的一 ...

  10. 02-CPU基础知识:通俗易懂方式理解主频、核心、线程、缓存、架构

    我们通常会将CPU比喻为人类的大脑,是计算机的核心硬件,决定了一台电脑的运算性能好坏.我们在选购CPU的时候,通常都会在网上查询处理器型号参数,主要是看主频.核心.线程.缓存.架构等参数,那么对于小白 ...

最新文章

  1. 基于小波变换实现图像增强
  2. JAVA——一次性读取或者写入文本文件所有内容
  3. tomcat中实现特定路径下的图片的url访问Tomcat配置图片保存路径,图片不保存在项目路径下...
  4. Spring(十九):Spring AOP(三):切面的优先级、重复使用切入点表达式
  5. H5添加禁止缩放功能
  6. linux睡眠进程,linux一个进程如何睡眠
  7. 漫话:是时候说说到底什么是 IPv4 和 IPv6 了!
  8. eclipse下SVN subclipse插件
  9. .net reactor 学习系列(四)---.net reactor应用场景
  10. IDEA代码格式化快捷键
  11. 基于深度学习的身份证号码识别方法
  12. 带宽、特征频率、截止频率、-3dB什么意思
  13. python连接高斯数据库_高斯数据库 (gaussDB) - 连接数据库(6)
  14. 对话仟峰资本Steven:DeFi大赢家是怎样炼成的 |链捕手
  15. 管家婆辉煌Ⅱ TOP 突破系统每年只能做11次12次月结存限制
  16. 【社会相关】:大神写的考研政治复习攻略
  17. U盘装机大师安装GHOST WIN10系统
  18. vue实现按钮倒计时功能
  19. 【原型制作】无素材-纯原生制作-登录注册页面原型图
  20. 金蝶eas系统服务器连接,金蝶eas服务器连接设置

热门文章

  1. ESS 控制台之访问控制篇
  2. 深港澳金融科技师(SHMFTTP)一级考试
  3. R数据分析:用lme4包拟合线性和非线性混合效应模型
  4. 【OpenCV】 码书(CodeBook)基本原理介绍
  5. 2019/10/8今日头条笔试
  6. 在html5网页中录音解决方案
  7. 使用js实现网页录音并上传服务器
  8. C语言自定义中文字符数组,C语言数组——字符数组
  9. HTML中使用IconFont图标
  10. springboot 打卡功能_SpringBoot、SSM、ajax实现考勤打卡功能(详细实现),供新手参考!...