Pixhawk之调试方法

对于 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} 
按老固件方法加一个判断
\begin{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 开发中,建立好了开发环境后 (第\ref{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 端口号码,和正确的波特率。要等待飞控蜂鸣器两声长响,飞控系统启动完全了。

tera

\quad $\circ$ 57600 baud

\quad $\circ$ 8 data bits

\quad $\circ$ 1 stop bit

点击回车后即可进入 nsh :

teraterm

microSD 注意事项:

因为 microSD 卡需要时间去写文件 ,所以在飞控板正记录日志的时候 断电有可能会损坏系统。日志记录在 上锁的时候会自动被停止,因此系统 断电前需要上锁。

( 4 ) 输入测试命令

$\bullet$ 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/   # 文件句柄

$\bullet$ ls /etc

 nsh> ls /etc
 /etc:
  .
  extras/
  mixers/
  init.d/

$\bullet$ free

  nsh> free  //查看 RAM 大小;
               total       used       free    largest
  Mem:        235888     168624      67264      61888

$\bullet$ 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 testresetinfotesterror 或者 regdump

$\bullet$ ? / help

在串口调试助手输入 ? 或者 help 指令,可以发现飞控系统支持的指令列表。 PX4 所有的内建应用程序 (Builtin Apps) 都在指令列表里面。详细的调试指令说明请待后续发布。

nsh

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 这个硬件的编辑脚本,如果要添加驱动,添加系统功能的模块函数,要修改里面的编译选项,保证添加的模块文件,才能够被编译到。

posted @ 2017-02-14 11:16  小黏瓜  阅读(4579)  评论(0编辑  收藏  举报