Pixhawk原生PX4固件中的坑

时间:2023-01-27 16:06:25

作为一名飞控开发的小学生:),最近入坑Pixhawk+PX4了。

基于Pixhawk硬件平台进行二次开发,有两套固件可以选择:Ardupilot系列也就是常说的APM固件,包含了ArduCopter以及ArduPlane等;另一个就是Pixhawk原生固件PX4了。前者最开始是为APM硬件(Ardupilot Mega)开发的,升级到3.0版本后已经兼容Pixhawk硬件,从个人学习的角度来看,APM固件的代码架构比较容易理解,基本上花个一天时间就能大概摸清整体结构了,而且由于出现的时间早,玩的人以及相关资料都比较丰富,所以属于首选。后者则采用了Nuttx实时操作系统,一开始接触的时候简直头大,整体结构、信息传递机制都不了解,资料相对少点,所以属于备选。

但是在做HIL仿真时,不论是我自己编译APM固件还是下载的官方固件,前后折腾了快一周还是不能正常工作;而用PX4固件则比较顺利地实现了需求。所以从时间成本以及沉没成本考虑,还是决定入坑Pixhawk+PX4了。

一、编译

Windows下编译坑多而且速度还慢,选择在Ubuntu里面编译。按照dev.px4.io/Linux/Advanced Linux以及Building the Code里面的说明,还是能比较方便的搭建好PX4的开发环境。但还是有几点要注意:

1. 在clone完项目后,不要着急添加子模块,先把分支切换到stable上。

2. 添加子模块时不能忘了 --recursive 参数,要不然会缺少几个模块,导致编译不过。

1 git submodule update --init --recursive

二、代码

1. 无论是目前的master版本还是stable版本,用minicom查看nsh控制台时,都会出现乱码。拔掉SD卡依然乱码。解决办法(stable版本),参考自 这篇博客

将 /Firmware/ROMFS/px4fmu_common/init.d/rcS 文件中

# Start MAVLink mavlink start -r 800000 -d /dev/ttyACM0 -m config -x

替换成

1     # Start USB shell if no microSD present, MAVLink else
2     if [ $LOG_FILE == /dev/null ] 3  then 4         # Try to get an USB console 5         nshterm /dev/ttyACM0 &
6     else
7         mavlink start -r 800000 -d /dev/ttyACM0 -m config -x 8     fi

 

三、硬件在环在仿真(HIL)

按照官方教程,如果编译master版本的固件,而机架选择固定翼时能够正常仿真,但是机架选择四旋翼就没有输出了。如果编译stable版本的固件, 那么两种机架都可以正常仿真. 这也就是在第一点里提到要切换到stable分支上的一个原因, 另一个原因则是master版本与stable版本之间的子模块有不少差别, 同步之后从master切换到stable是一个坑. 

先记这么多,后续有了继续补充。