建立APM飞控固件编译环境

本文为《无人机飞控固件开发教程》系列视频的辅助资料,已经在“网易云课堂”上线, 链接如下https://study.163.com/course/introduction/1209568864.htm?share=1&shareId=1448054983

无人机调试,飞控硬件定制、固件修改,日志分析,课程售前咨询,请QQ联系:3500985284

在“网易云课堂”上购买过本课程的学员请加我的QQ(3500985284),添加时请注明在网易云课堂上的订单编号,我们有个学员微信群,验证通过后我会将你拉进去,学习中遇到问题请在群里提问,我们会帮你解决大部分的问题。

特别注意:

1、已发布的视频教程如果需要修改,我要重新编辑视频、上传、平台审核,非常麻烦;而此网页版的配套资料是我的自建网站,修改起来非常快捷,因此最新的更新永远首先出现在此配套网页资料里,大家如果遇到视频与网页资料不匹配的地方,请以此网页资料为准

一、下载自动化配置文件

 官方下载链接:下载链接(2021年3月更新:不要使用这个官网的脚本文件,这里面有些步骤与当前最新的cygwin64不兼容,使用这个已经无法建立可以成功编译飞控固件的编译环境)

 2021年3月3日更新:我将APM官方的这个脚本文件修改了一下,将其中的一些步骤换为了国内的源,从而有些步骤的下载速度快了很多倍,同时修改了其中某些步骤的bug,我修改后的脚本文件和配套安装包放在了百度网盘上,请按照此压缩包中的“使用说明.pdf”进行安装。

 下载链接:https://pan.baidu.com/s/1EVELSOJ7CP-hYAhyd1ImXQ(注意,使用这个脚本建立的编译环境只可以编译Copter-4.0.7以前(含)版本的固件,无法编译之后版本的固件)

 提取码:nfcy

2021年04月15日更新:运行此脚本前请关闭360安全卫士、360杀毒之类的软件,可能会导致某些步骤卡死。另外, 推荐使用火绒安全。

 2023年3月1日更新:由于从Copter-4.1.0版本之后,APM官网更新了编译工具链,因此上述自动化脚本建立的编译环境无法编译“Copter-4.1.0”及其之后版本的固件,我们更新出了另一个版本的自动化脚本,可以建立针对新固件的编译环境,有编译新版本固件的同学可以使用它来建立编译环境。新版脚本链接如下:

 链接:https://pan.baidu.com/s/10TjrmpeKMglUFtcB16awDg注意,使用这个脚本建立的编译环境只可以编译Copter-4.1.0以上(含)版本的固件,无法编译之前版本的固件)
 提取码:nfcy

注意,如果遇到脚本(上面的.ps1文件)双击运行后闪退的情况(Win10或者Win11操作系统),请参考如下链接解决http://www.manongjc.com/detail/40-epgvkbhnilhgetq.html

二、使用powershell运行自动化配置文件

 右键单击,使用powershell运行。

 如果弹出如下提示,输入“A”,回车。

三、安装future库、python3

 运行“setup-x86_64.exe”注意,如果你是2021年3月3日之后使用第一步中我修改后的脚本安装的编译环境,这一步可以直接跳过,该脚本已经完美解决这一步的问题。

到这一步,我们需要明白我们都干了什么。事实上,我们主要是:

  1. 安装了cygwin64。严格来讲,“Cygwin是一个可原生运行于Windows系统上的POSIX兼容环境”;通俗来讲,cygwin64可以被认为是一款轻量化的linux虚拟机,可以帮助我们在windows下运行linux命令,同时不同于传统的虚拟机,它的性能损失较小,系统开销也小得多;
  2. 在cygwin64内部安装了很多软件包。也就是说你在“linux虚拟机”里安装了很多软件包(如python3、pip、pymavlink、intelhex等等),这跟你是否在windows环境下安装过这些包没有任何关系
  3. 安装了MavProxy。这是后面进行软件仿真用的。

四、下载并安装GCC编译器

 2022年4月8日更新:我把这个安装包放到了第一步的那个压缩包里了,大家可以直接使用,不用再额外下载了。

注意,最后一步勾选“Add path to environment variable” 。

 注意,一定要安装这个版本的编译器,其他版本(即使是更加新的版本的)不一定与飞控源代码兼容,请不要给自己制造麻烦,开发飞控固件的核心在于编程与测试,而不在于你有多擅长建立编译环境,请不要在本节课上浪费太多时间,赶紧建立好编译环境并把代码改起来才是正事。

五、clone飞控源代码

 接下来的操作需要用到Git命令,请大家自学一下相关知识。

  • 推荐一本书:《GitHub入门与实践》,大塚弘记;

再次强调,如果你以前没有用过git,或者对git的使用一直是似是而非的,那么在进行下面的学习之前,强烈要求(注意,是要求,不是建议)你把上述两个网址里的内容过一遍,相信我,你会受益无穷的。如果你不搞明白git的用法,后面的学习中会创造出很多奇葩的bug,而这些bug对于明白git用法的人来看就是笑话。目前绝大多数开源工程都是放到gitee或者github上管理的,其背后都是用了git工具,如果你以后要走编程的路,git永远都是绕不开的。

再次强调一下,请立即停下来,不要急着下载飞控源代码!花一下午的时间系统地学习一下git知识,也就一下午的时间就够了!学习知识最怕似是而非!

   1、注册github账号;

   2、在APM官方代码页面fork一下;

   3、安装Github Desktop软件,官方链接:官方下载链接

    注意,如果出现无法安装的情况,重新电脑后再试一下。

   4、在Github Desktop中登陆并下载代码;

特别注意:1、请不要将飞控源代码ardupilot文件夹放置到C盘中,win10操作系统对C盘的访问权限管理非常严格,会导致后面编译时报错; 2、飞控源代码不能放在中文路径下面,否则编译时同样会报错。因此,请尽量将“ardupilot文件夹”直接放到D盘或者E盘的根目录下。

 再次强调,飞控源代码存放位置是有讲究的:

  • 源代码目录中不能包含“空格”,比如“d/git rep/ardupilot”,其中“git rep”文件夹名称中包含空格,导致后面编译报错;
  • 源代码不能放到C盘的任何目录下面,win10对于C盘文件的权限管理越来越严格,编译飞控固件时编译器可能没有权限访问C盘中的源代码导致编译报错;
  • 源代码的最佳存放位置是D盘根目录下,省时省力又省心(不要想当然,不要故意给自己制造麻烦,快速建立起编译环境把飞控代码改起来才是王道)。

  注意,这一步对网络环境要求较高,如果出现下图所示错误,就将已经下载的“ardupilot”文件夹删除掉,重新走一下此步骤。当初我为了录制这个视频教程,反复下载了将近6遍才成功,大家加油☺。

2022年4月29日更新:推荐一个不错的解决github打不开、下载速度慢的方法:https://www.bilibili.com/video/BV1Aq4y1q7hr

   5、下载git,官方链接:官方下载链接

   6、配置一下git,取消自动替换换行符。

git config --global core.autocrlf false

六、切换到最新的稳定版飞控固件

// 查看源代码中包含的所有tag,按回车显示下一行,按“q”+回车,退出
git tag  

// 从多旋翼3.6.11稳定版固件创建分支,分支名为:MyCopter3.6.11
git checkout -b MyCopter3.6.11 Copter-3.6.11

// 如果你想编译固定翼固件,按照下面的命令切换到固定翼特定版本
// 从固定翼3.9.9稳定版固件创建分支,分支名为:MyCopter3.9.9
// 2024年3月23日更新:从4.1.2版本(含)开始,固定翼源代码tag的前缀从ArduPlane改为了Plane,二者只是tag名的前缀发生了变化,源代码本身里承接关系
// 也就是说,ArduPlane-4.1.1的下一个稳定版本是Plane-4.1.2(多旋翼代码的tag也发生过前缀变化,不过本视频录制时已经是变化后的了,因此不再特别说明)
git checkout -b MyPlane3.9.9 ArduPlane-3.9.9

特别注意:
1、对于APM固件,直升机固件和多旋翼使用的是同一套源代码,因此如果你要编译直升机固件,实际上只需要切换到一个多旋翼的稳定版即可,然后编译时按照第三节课的方法指定为编译直升机固件即可(同一套代码,编译时指定为直升机,则编译出来的是直升机固件;编译时指定的是多旋翼,则编译出来的是多旋翼固件);

2、对于APM固件,垂直起降固定翼的固件和传统固定翼使用的是同一套源代码,因此如果要编译垂起的固件,切换到一个固定翼的稳定版即可,并且编译的时候直接指定编译为固定翼即可(同一套源代码,编译时指定为固定翼,编译出来的固件既可以用于传统固定翼,又可以用于垂直起降固定翼。这一点跟直升机与多旋翼的关系不同);

3、对于APM固件,无人船固件和无人车固件使用的是同一套源代码,因此如果要编译无人船的固件,切换到一个无人车的稳定版即可,并且编译时直接指定为无人车即可(同一套源代码,编译时指定为无人车,编译出来的固件既可以用于无人车,又可以用于无人船。这一点跟直升机与多旋翼的关系不同)。

注意,不要切换到“master”分支,这里面是不稳定版本,包含了大量未测试的新的代码,在此基础上编译自己的飞控固件是一件极其不靠谱的事情,并且大部分情况下,master分支的代码是无法编译通过的,即使编译通过,一般人也不会拿自己当小白鼠去使用它。(2021年11月21日更新,我把这段话的字体调到了一个大到离谱的地步,我希望你能看到它,我希望你能认真地看完这段话,我希望你能理解这段话)

七、更新子模块

注意,这一步千万不能省略,否则编译大概率要报错。

git submodule update --init --recursive

 这一步运行后,你会发现“ardupilot”文件夹下面出现了“modules”文件夹,里面就是“ardupilot”所依赖的其他开源工程的源代码,编译飞控固件时需要用到它们。

 但是,这一步经常会出错,或者在不报错的情况下里面缺失部分文件,因此出现如下两种情况时,请直接删除这个“modules”文件夹,然后重新运行这个更新子模块的命令。

 判断是否完全更新成功的方法如下:如下图所示,在更新子模块后再更新一次,如果几秒内命令便运行完成并且没有任何提示输出,说明上次更新是完全成功的,没有任何遗漏。

 注意,如果按照上述方法反复更新子模块都一直报错,那么请换个网络环境试试(比如用手机共享热点给电脑),并尝试使用这个视频中的方法加速github访问速度(注意,更新子模块的本质还是从Github上下载源代码,并且下载的代码量甚至超过ardupilot本身的代码量):https://www.bilibili.com/video/BV1Aq4y1q7hr如果换了网络环境后还不行,请看看下面这段话:

如果你反复尝试均无法正常更新子模块,请果断放弃,不要将时间浪费在这种事情上,请在第二节课的配套网页资料中获取我更新好子模块的源代码。

 更新子模块背后的逻辑如下:

在以后的学习中,只要切换过分支,就记得一定要更新子模块,不要想当然地以为不用更新,的确有些情况下不需要更新,但是养成一个好的习惯并坚守它,能让你避开很多bug。你有没有发现:有些人写程序就是bug比别人少,而有些人,就是不长记性,写出来的程序坑人坑己。

八、使用Github Desktop管理代码

 推荐一本书:《GitHub入门与实践》,大塚弘记。

 推荐一个网站: https://gitee.com/progit/ (强烈建议大家把这个网页上的内容过一遍,系统地学习一下git,对你以后的工作和学习帮助会非常大,甚至超过本课程本身给你带来的好处)。

九、备份——创建压缩包

 能成功走到这一步其实是很不容易的,赶紧将固件文件夹创建一个压缩包备份一下。

   压缩包备份法的基本原则:

   1、取得阶段性成果后立即将整个工程创建压缩包进行备份,刻不容缓;

   2、压缩包以如下格式命名“Vx_YYMMDD_阶段成果描述”,实例:V1_190722_更新完成子模块.rar;

   3、任何时候,禁止直接操作压缩包内的内容!如果要查看其内部内容,只允许解压缩到一个文件夹,然后操作解压缩后的文件,严格避免双击打开压缩包(有时候电脑一卡、手一滑,把压缩包里的文件拖动到其内部的其他文件夹中了,到时候哭都没地方哭啊);

 4、优先信任压缩包的内容。

无人机调试,飞控硬件定制,固件修改,log日志分析,飞控驱动添加
请QQ联系:3500985284

微信公众号:“怒飞垂云”,扫描下图添加

京ICP备19049723号   |   京公网安备 11010502039327号