commander一點理解

Commmander應用主要負責控制飛行器的模式控制。 
下圖解釋了commander應用的整體架構: 

Command和subsystem_info是一個緩存值。 
這個commander應用有幾個循序組成,並且每個循環作爲一個獨立的線程執行。 
1. command_handling_loop:在這個循環裏,主要完成將mavlink應用中的mavlink命令轉發給commander應用中。飛行器的狀態是根據這個命令改變的。 
2. subsystem info loop:監聽來自子系統的信息(比如傳感器)。但是並不管信號的質量,這個跟新可能是現在,也可能不是,可能是正確的也可能是不正確的,使能非使能。 
3. monitoring loop(主循環)定期做以下的檢查: 
  3.1傳感器的質量(誤差) 
  3.2解鎖和鎖的ppm輸入信號(遙控輸入) 
  3.3電池電量 
State machine handling 
所有的飛行模式的切換具體在commander/state_machine_helper.c文件裏面實現。 
爲了大家更好的理解代碼,給出典型的狀態轉化圖: 

具體代碼介紹

主要的上層控制代碼在src/modules/commander文件下的commander.cpp和state_machine_helper.cpp兩個文件夾內。下面是具體流程:我們先進入到commander.cpp裏。

這個函數主要是後臺應用程序,根據傳入的相應參數,進行相應的判斷和操作,比如說校準傳感器,具體校準程序在commander文件夾下的其他文件夾裏。還有一些錯誤提示信息,開闢新線程。

主循環

下面是int commander_thread_main(int argc, char *argv[])函數,控制應用部分的主循環commander主應用代碼都在這裏面。下面開始介紹主循環,這個主循環有點類似於c代碼裏的main函數,在裏面調用commander.cpp和state_machine_helper.cpp文件裏的其他函數,完成從接收——>完成模式切換。首先設置參數:

然後進行初始化首先是led,buzzer,battery的初始化,這三個函數在commander_helper.cpp裏

然後是一系列的初始化,由於太多就不一一列舉了。 
緊接開始monitoring loop主要對應上面框圖裏monitoring loop完成一系列主題的訂閱

接着初始化完成,標誌位爲true

起飛前檢查

檢查相應的變化,清除標誌位

創建低優先級線程

完成一系列的主題更新。

更新子系統信息。對應框圖中的subsystem info loop循環。

RC輸入檢查,從下圖開始。

根據遙控輸入設置主狀態

對於set_main_state_rc函數我們可以跟進去看,在這裏。

模式切換的一些代碼。

在主循環中還頻繁調用了state_machine_helper中的arming_state_transition,解鎖狀態改變函數。

還有main_state_transition,對應上面框圖中的State machine handling部分。這是模式切換的具體實現代碼。

還有一個函數是handle_command()這個函數主要對應上面框圖中的command_handling_loop。這個函數出現主循環的處理命令處 

總 結

最後借鑑來自此博客的一張圖,說明整個流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章