基于waf编译APM飞控固件

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

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

 特别注意,切换固件版本用的是“Git Bash”这个软件,而编译固件用的是“Cygwin64”这个软件,二者外观差不多,但是请不要搞混。

 再说一遍:Git Bash这个软件,打开后界面中会有“MINGW64”字样,这个软件是用来切换版本用的,不是用来基于waf编译飞控固件的。编译飞控固件用是Cygwin64。

我已经将上面两段文字的字号调到最大了,希望大家能看见。

一、配置飞控类型

// 再次强调,从这一步开始,使用的软件是“Cygwin64”,而不是“git bash”
// 查看所有支持的飞控类型
./waf list_boards

// 将编译目标设置为fmuv3版飞控,对应Pixhawk2.4.x硬件
./waf configure --board fmuv3

// 对于Pixhawk2.4.x版本飞控,由于出厂刷的BootLoader版本不同,可能编译目标为fmuv2,也可能是fmuv3,如果你不确定是哪个,就编译出两个版本的固件,哪个能烧写进去哪个就是对的(错误的固件是烧不进去的,也不会损坏飞控,请放心尝试)
// 如果你的飞控是Pixhawk4,就将这里的fmuv3改为Pixhawk4,但是注意,Pixhawk4这类硬件请用多旋翼4.0.0、无人车4.0.0和固定翼4.0.0以上版本的源代码进行编译,低于这些版本编译时会报错
// 以此类推

 这一步会在“ardupilot”文件夹下生成“build”文件夹,里面放着与你指定的飞控硬件相匹配的库文件和一些其他文件,如果你编译了一种飞控硬件的固件之后,打算编译另一个型号的飞控硬件的固件,这时最稳妥的办法是手动删除“ardupilot/build”文件夹,然后再指定编译目标为新的飞控硬件,从而可以避免两种飞控硬件都出现在build文件夹中,造成编译时出错,注意,这种出错概率很大,请尽量不要在此处偷懒

 注意,这一步只需要执行一次,如果后面只是修改了飞控的代码,并没有修改硬件定义文件(课时16中的概念,你如果现在看到这段话,大概率你还没有涉及这一块),也没有更换飞控型号,则不需要重新执行此步骤。

这一步常见问题:

1、如下图所示,提示“Could not find the program [‘arm-none-eabi-ar’] :”  

解决办法:

(1)、这一步如果出现下图所示错误提示,重启一下电脑试试,90%情况下能解决这个问题☺

(2)、如果重启电脑后还不行,按照第一节课中的第四步,重新安装GCC编译器,并且 注意,最后一步勾选“Add path to environment variable” 。

2、如下图所示,提示“invalid lock file in /cygdrive/d/ardupilot”

 这是由于之前编译飞控固件时会产生一些“锁文件”来保存编译的临时配置选项,如果异常退出或者其他未知原因,这些“锁文件”在编译完成后没有被正常清除,就会有这种提示。这种情况不影响正常编译,如果你觉得它们碍眼的话,可以手动将其删除,锁文件都是以“.lock”开头的,如下图所示(你的电脑里可能只有其中一个文件或者一个都没有,都是正常情况):

3、配置成功后卡在最后一步没有反应

 这是2023年3月左右开始出现的新的问题,应该是编译环境的某些依赖包的更新导致的,实际上配置板子类型已经完成。

二、编译飞控固件

 这一步大家如果遇到问题,请先看看本文第四部分“疑难解答”环节是否有同样问题(经过长时间的完善,大家遇到的各种情况的问题的都更新到那里了),如果没有,请在微信群里提问。

// 如果是编译多旋翼固件,运行下面的命令
./waf copter

// 如果是编译常规固定翼固件或者垂直起降固定翼固件(二者使用的是同一个固件),运行下面的命令
./waf plane

// 如果是编译直升机固件,运行下面的命令
./waf heli

// 如果是编译无人车固件,运行下面的命令
./waf rover

// 如果是编译潜水艇固件,运行下面的命令
./waf sub

// 如果是编译外设固件(如CAN总线版本的GPS),运行下面的命令
./waf AP_Periph

// 如果你上次编译好好的,突然就编译报错了,尝试如下命令,删除之前的编译缓存,这样下次编译时会从头编译
// 这个命令等效于手动删除“ardupilot/build”文件夹
./waf distclean

// 列出waf的所有命令及其使用方法
./waf -h

 2023年3月16日更新,此处同样会出现编译完成后卡在最后一步的问题,处理方法跟上面一样:

三、烧写飞控固件

 1、安装最新版地面站MissionPlanner:官方下载链接

 2、使用MissionPlanner烧写飞控固件,自行编译的固件位置: bulid/fmuv3/bin/arducopter.apj

 注意,如果找不到“加载自定义固件”的按钮,是MissionPlanner设置的问题,请按照下述文章第四条进行处理:链接地址

四、疑难解答

 1、编译报错“Missing configuration file ‘/cygdrive/d/ardupilot/build/sitl/ap_config/h’, reconfigure the project!”

 “ reconfigure the project! ”这句话的意思是:请重新配置工程。一般情况下,在工程的编译目标出现混乱后会发生这种问题,只需要重新指定编译目标即可解决:

 第一步、手动删除ardupilot/bulid文件夹;

 第二步、重新设置编译目标(如FMUv3);

// 将编译目标设置为fmuV3版飞控
./waf configure --board fmuv3

 第三步、开始编译

// 如果是编译多旋翼固件,运行下面的命令
./waf copter

 2、编译或者列出支持板子类型时报错“No such file or directory”

 大家注意,我们使用git命令切换分支的时候,使用的是“Git bash”这个软件,这个软件打开后,命令行窗口的标题栏显示的是“MINGW64”,而我们使用waf命令编译固件、查看支持的板子类型时,打开的是“Cygwin64 Terminal”这款软件,大家请不要搞混。

 出现 “No such file or directory” 错误时,请检查一下,你是否在MINGW64中执行了waf命令。

 3、提示“-bash: ./waf : /usr/bin/python: 解释器错误:No such file or directory”或者设置板子类型时卡在“Checking for ‘g++'(C++ compiler)”处不动

 从2019年12月之后,我发现由于cygwin64的更新,导致运行“./waf”命令时,会发出这个提示,其背后的原因是编译器无法正确调用python,我试了很多种方法都没有解决这个问题,最后找的了一个简单粗暴的解决方法:我把可以正常编译的虚拟机系统(2019年6月份建立的编译环境)中C盘下的“cygwin64”文件夹覆盖新建立的编译环境的电脑下的同名文件夹,问题就解决了。

 百度网盘链接

链接:https://pan.baidu.com/s/1Tal_42aQ17EBLSLbQHiVnw 提取码:nfcy

 使用方法:

 1、彻底“C:\cygwin64”文件夹,如果弹出是系统文件,是否继续,就点“继续”(注意按照之前的方法安装cygwin64的步骤不能省略,尽管此处我们要删除它,但是它的安装过程中还是在其他文件夹安装了不少编译必须的文件);

 2、删除桌面上的“Cygwin64 Terminal”快件方式;

 3、将刚下载的压缩包解压缩到桌面或者某个“C盘根目录”的盘中(由于系统权限,你不可能直接解压到C盘根目录下);

 4、将解压缩完成的文件夹移动到C盘根目录下(注意,有的学员解压缩方式不同,解压缩后,cygwin64文件夹下面还套了一个cygwin64文件夹,那么移动时请移动那个里层的cygwin64文件夹);

 5、将C:\cygwin64文件夹下的“Cygwin64 Terminal”快捷方式移动到桌面上,以后运行程序时,就双击这个快捷方式。

 4、提示“Failed to process hwdef.dat ret=1”

 报错输出如下图所示,经研究发下,是由于将飞控源代码“ardupilot”文件夹放到了C盘根目录下了,而win10操作系统对C盘的访问权限非常严格,导致cygwin在运行时有些操作被禁止(Permission denied),解决方法很简单:将ardupilot放到D盘根目录下。

 5、提示“No module named future”、“mavgen returned 1 error code”

 如上图所示,提示“No module named future”、“mavgen returned 1 error code”,这个提示说明缺少了“python2.7的future库”, 在cygwin64命令行中输入如下命令安装future库:

pip install future

 6、提示“./waf:行3:from: 未找到命令”

 如下图所示,编译时提示“xxx 未找到命令”,这个问题很不常见,是由于大家根据第二节课的方法建立编译环境时,解压缩cygwin64压缩包时使用了有问题的解压软件,解压缩后部分文件缺失导致的。

 解决方法:彻底删掉cygwin64文件夹,使用winrar软件重新解压cygwin64文件夹并按照第二节课的方法重新建立编译环境。

7、提示“bad interpreter: No such file or directory”

 如下图所示,调用waf命令时提示“bash: ./waf: /usr/bin/python: bad interpreter: No such file or directory”,这是由于你使用了“Git Bash”这个软件来进行编译,而实际上我们用的是cygwin64进行编译,软件打开错了。

8、自行修改部分代码后编译报错(必看!)

 只要修改代码,就有可能出现“语法错误”,进而导致编译报错。编译报错后,由于编译过程中的输出比较多,我们第一眼看到的往往是下图所示的“报错总结”,但是大家一定要注意,这个只是“总结”,或者说叫“编译结论”,而不是问题根源的真正位置。

 这时我们要做的是:

 (1)放宽心态;

 (2)将编译输出慢慢往上翻;

 (3)最终找到编译过程中第一次报错的地方,那里往往是问题的根源,并且编译器会给出很明确的问题提示(如下图所示);

 (4)照着提示修改对应源代码即可。

9、提示“-bash: waf: command not found”

 如下图所示,执行指定编译目标为fmuv3的命令时,命令行提示“ -bash: waf: command not found ”。细心的学员应该能发现,这是由于“waf”前面缺少“./”导致的,正确的命令开头应该是“./waf”,而不是“waf”。

10、提示“you need to install pexpect with ‘python -m pip install pexpect’”

 编译报错,这时候不要怕,也不要急着去问别人,尝试翻译一下最下面的那个报错的意思是什么意思,实在不行就用谷歌翻译帮忙翻译一下,然后你就发现这个报错提示已经够贴心了:

你需要使用“python -m pip install pexpect”命令来安装“pexpect”包。

 也就是说你的编译环境建立的不太完整,缺少一个叫“pexpect”的python包,导致无法编译,你使用这个命令就可以安装这个包(如果缺少其他包,也是类似的提示)。

 解决方法很简单,在当前的cygwin64命令行中输入如下命令并回车即可(安装python包跟命令行中当前所处的目录无关)

pip install pexpect -i https://pypi.tuna.tsinghua.edu.cn/simple

 注意,上面的命令中,我省去了不必要的“python -m”,同时在结尾加上了“-i https://pypi.tuna.tsinghua.edu.cn/simple”,这样自动联网下载这个包的时候连接的是清华大学的镜像服务器,而不是国外的服务器,从而速度可以提升上千倍。(实时上大部分情况下不加这个根本就无法成功下载python包)

 如果还不行,则可能是由于你用的源代码版本使用的是Python3辅助编译的,而使用pip安装的是python2.x版本的包,通过尝试将上面命令行头部的“pip”改为“pip3”来安装python3对应的包,修改后的命令如下:

pip3 install pexpect -i https://pypi.tuna.tsinghua.edu.cn/simple

11、报错提示“Command [‘/usr/bin/git’, ‘rev-parse’, ‘–short=8’, ‘HEAD’] returned 128”

 这可能是源代码中的git文件损坏导致的,也可能是由于文件所有权发生改变后导致的(我是格式化C盘并重装系统后,编译D盘中之前的源代码时遇到的这个问题)。解决方法:

  • 方法一:从之前备份的压缩包中重新解压缩出源代码即可。(有一次我删掉这个源代码,重新解压出之前备份的源代码后问题消失。)
  • 方法二:有一次,方法一无效,我不得已重新从github上clone源代码,更新子模块,之后问题消失。

2022年11月20日更新:暂时没有更便捷的方法。

12、报错提示“could not configure a C++ compiler!”

 这个提示的意思是没有找到C++编译器,出现这种报错有如下几种可能:

 1、你忘记安装GCC编译器了,请按照第一节课中的第四步下载并安装GCC编译器(其余编译环境相关的软件不需要重新安装);

 2、你安装GCC编译器时,最后一步没有勾选“Add path to environment variable”,也就是说没有将GCC编译器的路径放到环境变量中,从而编译环境找不到GCC编译器。解决方法:只需要按照第一节课中第四步的方法重新安装GCC编译器,并在结尾勾选上“Add path to environment variable”即可(其余编译环境相关的软件不需要重新安装);

 3、建立编译环境后建议重启电脑后再开始编译固件,从而让一些设置生效(重启解决大部分问题)。


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

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

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