最近在学飞控ardupilot,按照官网的教程开始学习。Learning the ArduPilot Codebase为教程官网。想要跑一下Library Example Sketches,就是想看看程序执行的效果。哪知折腾了几个星期,都没有从pixhawk的串口看到输出信息。于是向博士师兄请教,说可能是代码版本的问题,硬件抽象层肯有区别。于是查看了代码结构。
从Github下克隆下来的master分支是最新的版本。ardupilot源码。
查看硬件抽象层,在Libraries库下,查看与HAL相关的,如图:
发现,HAL只支持CHibiOS,Empty,Linux,SITL.这个版本的代码将Nuttx支持移除了。我们可以对比一下,查看以往的版本,比如Copter 3.6.
AP_HAL-Copter3.6
我们发现,它的HAL文件要多很多,比如PX4就是很重要的。
最新版本的APM取消了Nuttx支持,改为了ChibiOS.故单板例程测试失败。 需将版本回退至3.6版。
于是,进入ardupilot目录,切换至Copter3.6版本。
命令如下:
git status //查看git状态
git fetch origin Copter-3.6 //从远程库中抓取Copter-3.6
git checkout -b Copter-3.6 origin/Copter-3.6 //在本地库中创建Copter-3.6分支
git submodule update --init --recursive //更新子模块
进入modules目录,更新子模块内容。
cd modules
git submodule update --init --recursive
在原master分支下,modules的内容如下:
modules-master
modules
至此,我们将代码切换至Copter3.6分支。可以开始我们的单板例程测试了。
cd ardupilot
./waf distclean //清除编译信息,包括初始化配置的板
./waf configure --board px4-v3 //设置板为px4-v3
./waf --targets examples/UART_test
UART_test.cpp部分程序
我们查看UART_test.cpp程序,可以看到,它将从串口和debug console输出数据。将UART_test.px4
下载到飞控板上,连接串口,通过串口监视器查看输出。
下面是硬件连接图,连接了Debug串口,即串口4,通过USB线连接了UARTA。
实物连接
如图所示,我们观察到了两个串口输出的情况。
cd ardupilot
./waf distclean //清除编译信息,包括初始化配置的板
./waf configure --board fmuv3 //设置板为fmuv3
./waf --targets examples/UART_test
编译结果
我们发现,另外一个串口监视器根本没有输出,这是怎么回事呢?
还是得去看代码,查看源码UART_test.cpp,我们看这里,这里有个if判断,只有当HAL_OS_POSIX_IO
为真时,才会有debug console输出。
loop函数
我们跳转到它的定义发现它的值在fmuv3板下被定义为0,在px4-v3板下定义为1。所以它没有输出。那我们可以将该判断条件注释掉,那就应该会有输出了,还可以对代码进行一点点改动。
OS_POSIX_IO
我们发现,另一个监视器还是没有输出。但是应该要打印的数据都从USB连接的那个串口输出来了,无论是UARTA还是debug console。这个应该是初始化板的时候,所选择的板类型不同,相关定义也不同。所以,当我们选择fmuv3时,可以不用接另一根线。接线图如下:
USB连接
至此,我们实现了UART输出信息,完成了UART_test示例程序的学习。