对于 PX4 Firmware 的调试,有别于传统的单片机单步调试,没有办法仿真,因为是多线程程序,也没有好的集成编译环境。主要还是靠串口打印来调试数据。在 Pixhawk 飞控上有一个 USB 的接口,如果想要进入串口打印调试终端 nsh ,就必须拔掉 SD 卡,然后用 USB 口连接电脑,否则不能进入 nsh 终端。
注意: 对于 Firmware 1.5.4 版本,其更改了 rcS 启动文件,导致 nsh 始终乱码,修改方式如下:
新固件 (line649)
# Start MAVLink
mavlink start -r 800000 -d /dev/ttyACM0 -m config -x
end{lstlisting}
按老固件方法加一个判断
egin{lstlisting}
# Start USB shell if no microSD present, MAVLink else
if [ $LOG_FILE == /dev/null ]
then
# Try to get an USB console
nshterm /dev/ttyACM0 &
else
mavlink start -r 800000 -d /dev/ttyACM0 -m config -x
fi
进而 make 并 upload 即可。
新手玩家第一次进行 USB 或者串口连接系统命令行终端,请先按照要求进行系统控制台安装。
Windows
NuttShell(nsh) 和 Unix 终端命令类似。 NSH 通过串口或者 USB 转串口来与 PX4FMU 交互,因此可以使用类似超级终端的串口软件来与 FMU 交互,在 Pixhawk 开发中,建立好了开发环境后 (第 ef{compile}节) , PX4 Toolchain 已经附带了一个串口工具: TeraTerm 。当然,也可以选择使用任何一种串口调试工具。
Linux
在 Ubuntu 上通常使用 screen 工具进行调试,可按如下方法安装:
sudo apt-get install screen
使用 screen 工具连接串口
screen /dev/ttyXXX BAUDRATE 8N1
其中, ttyXXX 为串口名称,通过 ls /dev/tty* 命令查看设备名称。
通常为: /dev/ttyUSB0 或者 /dev/ttyACM0 。
调试方法
在 Windows 和 Linux 操作系统下的调试方法是相同的,这里以 Windows 为例进行说明。
( 1 ) 拔掉 SD 卡,
( 2 ) 把飞控用 USB 线和电脑连接,
( 3 ) 然后打开 Tera Term 串口调试助手,输入 Pixhawk 的飞控 COM 端口号码,和正确的波特率。要等待飞控蜂鸣器两声长响,飞控系统启动完全了。
quad $circ$ 57600 baud
quad $circ$ 8 data bits
quad $circ$ 1 stop bit
点击回车后即可进入 nsh :
microSD 注意事项:
因为 microSD 卡需要时间去写文件 ,所以在飞控板正记录日志的时候 断电有可能会损坏系统。日志记录在 上锁的时候会自动被停止,因此系统 断电前需要上锁。
( 4 ) 输入测试命令
$ullet$ ls
nsh> ls -l # 列出当前文件夹内容
/:
dr--r--r-- 0 dev/ # 飞控板上的设备、传感器等
dr--r--r-- 0 etc/ # 脚本、混控配置和 Bootloader
dr--r--r-- 0 fs/ # 参数、航点
dr--r--r-- 0 obj/ # 文件句柄
$ullet$ ls /etc
nsh> ls /etc
/etc:
.
extras/
mixers/
init.d/
$ullet$ free
nsh> free //查看 RAM 大小;
total used free largest
Mem: 235888 168624 67264 61888
$ullet$ test
固件中 有名为“ test ”的测试命令 ,它可以用来帮助列出所有测试项目 ,并且很有利于隔离问题。比如 sensor test 用来测试传感器。单独的测试传感器。单独的驱动也有测试,大多数情况下是一个状态指令 (status command) ,比如 : l3gd20 test
nsh> l3gd20 test
WARN [l3gd20] gyro x: 0.02675 rad/s
WARN [l3gd20] gyro y: -0.03811 rad/s
WARN [l3gd20] gyro z: -0.00076 rad/s
WARN [l3gd20] temp: 33 C
WARN [l3gd20] gyro x: 25 raw
WARN [l3gd20] gyro y: -47 raw
WARN [l3gd20] gyro z: -5 raw
WARN [l3gd20] temp: 7 raw
WARN [l3gd20] gyro range: 34.9066 rad/s (2000 deg/s)
ERROR [l3gd20] PASS
对于传感器的命令有 start
、 test
、 reset
、 info
、 testerror
或者 regdump
$ullet$ ? / help
在串口调试助手输入 ? 或者 help 指令,可以发现飞控系统支持的指令列表。 PX4 所有的内建应用程序 (Builtin Apps) 都在指令列表里面。详细的调试指令说明请待后续发布。
这些指令,比如 commander 指令(该指令是切换飞控状态的可以切换 takeoff,stab,land 模式状态)。我们在终端输入 commander stop 就是停止这个进程运行。如果我们想启动某个进程,比如我们要启动 commander start 就启动了这个进程。其他也是 XXX start 就启动这个进程,有些进程还要输入参数。$phi$
例如
nsh> commander stop
WARN [commander] .
WARN [commander] terminated.
nsh> commander start
...
nsh> ekf2 stop
nsh> ekf2 start
nsh> INFO [lib__ecl] EKF using pressure height - commencing alignment
INFO [lib__ecl] EKF alignment complete
如果我们要打印某个进程的某个变量,我们只要在这个变量处添加 warnx("XX",XX ) ;这个打印语句即可。具体用法可以在源码搜索到,复制修改即可。
例如
warnx("nav state: %d", status.nav_state);
我们想观察这个变量的话,进入调试终端,先把这个进程 stop 掉,然后再 start 一下,就可以看到打印输出。一定要先 stop 再 start ,否则看不到打印数据。这就是最有效的代码调试手段。
注意:输入 help 命令时,会出现很多系统指令列表,这些指令在 Firmware/msg 文件夹下都可以找到对应的话题,每一个指令都会订阅和发布一些数据,我们自己定义的 topic 也可以出现在这个命令列表中,前提是我们要在 cmake 里面添加。
Cmake 编辑脚本文件夹,其中 Cmake/Configs 是存放的不同硬件的编译脚本, nuttx_mindpx-v2_default 是 Pixhawk 这个硬件的编辑脚本,如果要添加驱动,添加系统功能的模块函数,要修改里面的编译选项,保证添加的模块文件,才能够被编译到。