多旋翼無人機拋飛實現流程 APM韌體

2021-08-04 02:56:07 字數 2077 閱讀 7121

呼叫流程:

arducopter.cpp->fast_loop()->update_flight_mode()(fight_mode.cpp)->throw_run

當機架構型為***或多旋翼機已經arm時,取消初始化。禁止進入拋飛模式

拋飛過程有兩個重要內容:1、手持無人機拋飛時,使電機不轉(保證安全)

2、無人機處於空中時及時,控制姿態保證不墜機

狀態機共包含五種狀態:
狀態一:throw_disarmed - 電機未解鎖

進入條件:電機未arm,積分鎖開啟

狀態程序:

設定電機不轉動

呼叫函式:set_desired_spool_state(具體實現方法請檢視ap_motorsmulticopter.cpp)

設定油門資料為0,消除姿態控制的誤差並設定姿態控制的積分量為0

呼叫函式:set_throttle_out_unstabilized->relax_attitude_controllers(ac_attitudecontrol.cpp)

狀態二:throw_detecting - 電機解鎖(未需安裝)並等待拋飛(拋飛檢測)

進入條件:電機已解鎖,並當前條件為throw_disarmed

狀態程序

設定電機不轉動

呼叫函式:set_desired_spool_state(當throw_motor_start變數為0時,此時_spool_state的賦值為desired_shut_down)

同狀態一

設定waiting_for_throw為true,並提醒使用者

狀態三:throw_uprighting - 電機拋飛已經被檢測到,並姿態已經保持直立

進入條件:拋飛動作已被檢測到,並當前條件為throw_detecting

拋飛檢測:

該項為本次內容中最為重要的,拋飛檢測的呼叫在狀態機if判斷中被呼叫

實現流程:

拋飛狀態檢測共有四個變數:

(1)high_speed 速度向量模大於5m/s

(2)free_falling z軸加速度大於-0.25g時,判斷處於自由落體狀態。但該條件誤判率較高

(3)changing_height 判斷z軸速度,從而判斷是否處於空中狀態

(4)no_throw_action 加速度向量模小於g,判斷無人機不處於拋飛狀態

結合這四個變數,可判斷有較大概率處於丟擲的狀態

判斷條件為(high_speed|free_falling)&changing_height&no_throw_action

當判斷條件為真時,將留出500ms為進一步檢測拋飛狀態:

判斷條件為:500ms內z軸速度變化超過:-2.5m/s

至此,如果最終結果為真.那麼將進行throw_uprighting姿態控制
狀態程序

取消電機量限制

取消姿態誤差和積分限制

設定期望姿態角分別為(0,0,0)

設定油門量為0.5

狀態四:throw_hgtstabilise - 無人機已經達到預定高度,並保持穩定

進入條件:檢查程序:

與狀態(3)類似,設定高度控制器達到指定高度

狀態五:throwposhold - 無人機達到預定位置並保持穩定

進入條件:檢查無人機高度誤差是否小於0.

5m 且當前狀態為throw_hgtstabilise

狀態程序:

位置控制

六旋翼無人機(無人機應急基站)或巡檢無人機

諾基亞當時的無人機基站就是用的六旋翼嘛。無人機還可以去用來檢查基站。把六旋翼的原理弄懂。六旋翼和四旋翼的區別是不是還是在旋翼動力分配上?就像球上平衡車三輪和四輪的區別?其實球上平衡車不管三輪還是四倫,都是兩個角度環兩個速度環,可以投影成兩個一級倒立擺,只是最後轉化成的每個輪子的pwm的公式改變一下就...

四旋翼無人機crazepony燒寫流程

開源crazepony。自上而下,從產品到底層的學習方法是效率比較高的。事前準備 韌體燒寫過程 用keil 5開啟專案,更新 編譯得到hex格式檔案 開啟isp,選擇要燒寫的hex檔案,選定 程式設計前重灌檔案 和 rts的高電平復位,dtr高電平進bootloader rts復位,dtr用來給st...

玩轉四旋翼無人機(DJI SDK 使用)

onboard api matrice 100 被設計為可以使用遙控器 機載備和 移動 裝置進行控制。如果遙控器讓飛切換到 api控制模式,裝置通過 onboard api mobile api可以請求獲得控制權。啟用 api控制 之後 將遙控器模式開關置為中位 f檔 啟動示例 啟動示例 1.編譯 ...