【飞控】如何学习无人机-入门篇

学什么

我把无人机分成3个大模块

操作

目的:组装无人机,享受驾驶无人机的乐趣。

抱歉我给不了太多建议,因为我从没有以此为目进行过学习,但是我知道这一部分的知识关键词是【航模】,有非常多的【航模】发烧友可以给你更专业的意见。

知识

目的:了解无人机的本质

知识解决的是「why?」 如果你遇到的问题通常是,为什么要用欧拉角?为什么要用滤波?那说明你现在需要的问题都是知识型问题。关键词是【导航】【控制】等理论知识。

开发

目的:实现一个具体功能,比如:室内悬停,避障,全自动A点飞到B点等等

通过【知识】,使用【工具】完成自己的目标,【编程语言】【操作系统】等等在飞控开发里能够使用就行

开发需要解决具体的问题,前提是你知道一定的无人机知识

开发解决的是 「how?」,怎么装编译环境?怎么调试?这个算法怎么写?这一部分的关键词是【编程】【嵌入式】等专业技能。

怎么学

其实如果你单独学一样,还是挺容易的,飞手专心学操作,学生专心学知识。无非就是多动手,和多看书嘛。

就是这个开发,很气人,飞控本来就是个交叉学科,本来就涉及很多不同学科的专业知识,但是因为你还需要把知识应用起来,又涉及一些计算机知识,编程知识等等。让整个学习过程变的非常庞大无从下手。

但是,偏偏我们大部分人学无人机的目的都是学开发对吧,那我就抛砖引玉,结合我多年走弯路的基础上,介绍一下我认为比较合适顺序。

先给出建议:学习开发 专业知识>编程能力

飞控开发不需要特别强大的编程能力和花哨的编程技巧,相反通常是你通过你的专业知识,先想到解决方案,然后再稍作修改,或者简单的实现一下算法,所以:

不要通过开源代码去学飞控!!!!

不要通过开源代码去学飞控!!!!

不要通过开源代码去学飞控!!!!

为什么不要,因为「飞控知识」到「飞控代码」飞控代码 的过程中,除了算法需要一些离散化,和一些迭代过程,还伴随着作者自己对算法的理解,选择,和编程习惯。

如果你试图从 飞控代码 ,反推 飞控算法 ,除非你本身对这个算法已经非常熟悉,否者即使你编程能力强,操作系统,嵌入式,编程语言,这些知识都非常强,你看代码依然会很迷茫,你看到懂每一行代码,但却不知道为什么要这样写。

举个栗子:我之前分析过一行滤波代码,背后涉及的知识点远远超出你的想象,如果你期望通过代码学习飞控知识简直是给自己开了个【地狱模式】。

最快速的路线是你对算法已经有一定的了解,你知道这个算法应该应用在飞控系统中的哪个环节,你知道这个算法有什么用,然后你很好奇这个算法怎么通过编程实现的?你找来了开源代码作为参考,相互对应下,你更加理解了算法,同时也知道了算法如何通过编程实现。

当然这个过程往往也不会这么顺利,可能你找的开源代码过于复杂,即使你比较熟悉算法,依然看不懂被程序加工后的算法函数,起码你已经可以明确,目前你看不懂是因为一些编程技巧导致的,你就可专心去攻克这个问题,而不是苦思冥想为啥我天天看就是看不懂?

所以首先明确到底是哪个步骤导致你的学习很难进行下去!

1.专业知识的阻碍

大部分人应该都会被困在这里一段时间吧,毕竟飞控涉及的专业知识太多了,但是通常你只需要深入理解其中一个部分,所以我的建议是先构建专业知识的框架

如果你还不知道你到底想学哪个部分我先给你一个图感受一下。

这是一个简单的模块划分:

1.无人机上的传感器获取数据

2.导航系统通过传感器数据得到当前飞机导航数据包括位置,速度,姿态等等

3.决策层提供目标,决策可以是遥控,也可以是自动导航

4.根据当前的导航信息,和决策层给出的目标,进行控制,是飞机以达到目标为目的进行动作

5.控制器给出输出,通过控制分配,给每个电机PWM,使电机以一定的速度转动。

6.电机转动,飞机当前的导航信息发生变化。

7.回到第一步,获取传感器数据,以得到最新的飞机导航信息。

这个简单的划分可以看到,无人机系统其实是有非常多的模块组成的,初学者并不需要每个部分都升入了解,但是你需要有这么个框架概念,你就可以定位你需要的知识属于哪个部分,你才能去针对性的学习。

这个阶段主要以搭建知识架构为主,可以忽略一些细节,不要被一些具体问题卡主,坚持看下去,有了知识框架后,再回头专研某个具体问题。

比如姿态控制,第一步肯定是从导航读取当前姿态,从某个地方获取期望姿态,然后求姿态误差,然后进行控制,最开始你可以不知道每个细节如何实现,等你有了这个架构。

在去定位具体问题,导航如何获取姿态,首先肯定是从传感器读取原始数据,进行一些滤波,然后融合,最后得到可用的姿态,把每个大问题也拆分成框架,最后你就有了整个知识。

一旦你构建好了你的知识框架,遇到问题你可以快速定位在你的框架体系中,就可以通过相关专业名称搜索来快速查找资料,同时平时如果看见一些讨论,一些好的文章,论文,都可以迅速添加到你的知识框架里。

你看,我确实不懂导航,之前也没接触过,主要是工作上暂时用不到,但是我的知识框架还是在的,只要有需要,我随时都可以开始查阅资料进行学习。

如何构建你自己的知识框架呢?你要是之前问我,我也没有答案,因为我的学习过程,都是通过关键词的搜索。

但是现在我有更好的答案:《多旋翼飞行器设计与控制》全权 ,全权老师这本书是我看过最全面的书籍,非常适合旋翼的学习,是我手边现在最常翻阅的书籍。

2.编程技巧的阻碍

如果你已经有一定的基础,了解一些专业知识,肯定会迫不及待,想要知道书上的知识如何变成代码,这时候一份优秀的开源代码,是最适合你的学习资料。

但是,我从来都不建议,没有编程经验,没有接触过嵌入式系统的朋友,一开始就直接看 APM ,PX4 的代码。

他们的系统过于庞大,很容易打击学习的积极性,一会就放弃了,我甚至一度怀疑这玩意只有计算机专业的人才能看的懂吧,我是不是该先去学计算机?

可以找一些自己能看懂的比较简单的飞控代码看,关键词【小四轴】,代码会简单一些,但是麻雀虽小五脏俱全,该有的都有,依然是很好的入门资料。学习的时候千万不要贪心,就选择自己能看懂的资料就行,能看懂的才能坚持下去,慢慢递增难度,学习贵在坚持,只要能坚持学下去,以后都能看懂。

其实看懂代码并不需要特别强的编程能力,因为只是阅读而已,

给出一些关键字:【构造函数】【重载】【启动脚本】【uorb】【创建线程】,如果熟悉这几个概念,看懂 PX4 ,apm 的代码也仅仅是需要点耐心。

阅读工具:understand (强列推荐)

具体读代码的小技巧可以看我之前的文章【打造自己的工作流】

至于实现算法,简单的 if else , switch ,for 基本也够用了,大部分情况不需要特别花哨的技巧。

3.PX4,APM的阻碍

如果你有一定的专业知识,同时编程能力也比较优秀,恭喜你,成为一名优秀的飞控工程师就只需要一点点耐心。

这时候你可以充分利用开源界两大教科书(APM ,PX4),不论什么时候他们依然是最好的参考资料,但是同时也会给学习的人带来而外的迷茫。

因为这两个参考资料太过耀眼,你可能会把他们作为金科玉律,以至于你可能会非常困惑,为什么他要这么做,跟书上的不太一样?

但我想说的是,他们是很好的代码,但是依然有很多作者的偏好,所以很多地方不过就是作者做了一些取舍,做了一些选择,不要迷失在深究为什么作者为什么这样写,反倒是你可以提出质疑,如果是我,我会怎么处理这个问题。不要被代码支配,代码只是帮助你学习的一个工具而已。

盯住你的目标

如果你看到这里,依然摩拳擦掌,跃跃欲试,那就放心大胆的干。

不要担心我是不是先把数学学好再开始?我是不是先学会C++再开始?我是不是先学好嵌入式系统再开始?

都不需要,你的目标只有一个,就是学会飞控,

如果在你建立知识框架的时候,刚体力学阻碍了你,那就去查资料,把这部分解决,然后继续回到你飞控的学习主线,什么问题阻碍了你,你就去解决它,然后再回归你的主线任务。

你要时刻明白,你做的所有编程学习,数学学习,嵌入式学习,都是为了学习飞控的辅助技能,不要被辅助技能吓倒,或者迷惑。

飞控是个交叉学科,你永远不可能把所有知识都准备充分再开始,你需要的是在遇到障碍的时候都保持耐心,坚持一下,仅此而已。