對於 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 端口號碼,和正確的波特率。要等待飛控蜂鳴器兩聲長響,飛控系統啟動完全了。
\quad $\circ$ 57600 baud
\quad $\circ$ 8 data bits
\quad $\circ$ 1 stop bit
點擊回車后即可進入 nsh :
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
、 test
、 reset
、 info
、 testerror
或者 regdump
$\bullet$ ? / 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 這個硬件的編輯腳本,如果要添加驅動,添加系統功能的模塊函數,要修改里面的編譯選項,保證添加的模塊文件,才能夠被編譯到。