呼叫流程: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.編譯 ...