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 這個硬件的編輯腳本,如果要添加驅動,添加系統功能的模塊函數,要修改里面的編譯選項,保證添加的模塊文件,才能夠被編譯到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM