1. 程式人生 > >無人機基於Matlab/Simulink的模型開發(連載一)

無人機基於Matlab/Simulink的模型開發(連載一)

“一切可以被控制的物件,都需要被數學量化”

這是筆者從事多年研發工作得出的道理,無論是車輛控制,機器人控制,飛機控制,還是無人機控制,所有和機械運動相關的控制,如果不能被很好的數學量化,那麼將不會被很好的控制。

因為工作需要,筆者曾拜訪過很多無人機研發公司,高校和研究所。發現大多數無人機研發公司的研發手段,相較於國外,還很初級。基本都是嵌入式開發居多,側重於驅動的修改,飛行邏輯的修改。我認為這算不上是嚴格的無人機開發。因為大多數公司,都沒有給被控物件(無人機),建立完整的數學模型。只是利用開源的框架,調整控制引數,沒有完整的測試流程和測試指標。這樣研發出來的飛機一致性很差,每一架飛機的飛行狀態都不統一,完全不能滿足於工業應用的場景。2018/2019年倒閉的無人機公司,大多數都是存在這種情況。

不乏有些原本從事網際網路軟體開發的公司,轉行從事無人機開發。在運動控制領域,和網際網路軟體開發的不同。有的時候網際網路軟體開發,不需要建立被控物件的數學模型。秉承設計模式,軟體架構設計,協作程式設計,大規模軟體集中測試,上線。在無人系統開發中,軟體構架設計也是必不可少的,但是在測試的環節,如果沒有建立數學模型,測試無從談起,因為一般的真機測試,代價,效率和測試密集程度遠遠達不到要求。因為一個BUG會導致飛機墜毀,而任何一個新系統,往往存在大量的BUG。

而在已經成熟工業界,比如汽車,飛機制造,電力電子,航天等領域大量採用了基於Matlab基於Simulink的模型開發手段。

我們阿木實驗室提供如下的課程體系和打包工具:

課程將全面,細緻地講解如何基於模型(Simulink)的方法設計一套功能強大的飛控系統。本課程由多位一線資深飛控工程師設計,結合多年的基於模型的飛控開發經驗,給大家提供最先進,最前沿的飛控開發體驗。

概述

基於模型的開發將省去繁瑣的程式碼編寫步驟,只需要拖動幾個模組,就像搭積木一般,輕鬆搭建您自己的飛控演算法。飛控開發人員可以將更多的精力放在演算法本身,而不需要過多關注程式碼實現的細節,這樣將大大加快開發的效率,減少在程式碼編寫過程中產生的錯誤。同時,基於模型的開發具有優秀的程式碼複用性。也就是說,已經設計好的功能模組,只需要簡單的複製貼上,就能輕鬆地應用到其它任何地方,免去了程式碼移植過程的繁瑣。

基於模型的開發另外一個強大的優勢即在於“一次試驗,多次模擬”的目的。結合Simulink強大的開環和閉環模擬系統,只需採集一次資料,便可通過模擬再現在真實世界中的實際表現。通過修改模型演算法或引數,可以進行線上的資料模擬和除錯,大大簡化除錯的難度。

系統介面與匯流排設計

在我們設計控制系統之前,首先要做的就是定義系統的輸入/輸出介面。在Simulink中,介面一般都是以匯流排的方式進行定義。可以將匯流排理解為C語言中的結構體,當把Simulink模型自動生成C程式碼後,也可以看到匯流排最終是用結構體來進行實現的。

對於內環的姿態環控制器來說,輸入匯流排設計如下:

Command_Bus

ElementTypeUnitMeaning
resetuint8[0,1]為1復位控制器
modeuint8[0,1]0:角度控制,1:角速度控制
base_thint160~1000姿態環基礎油門

Reference_Bus

ElementTypeUnitMeaning
phi_ref_radsinglerad目標roll
theta_ref_radsinglerad目標pitch
psi_ref_radsinglerad目標yaw
p_ref_radDssinglerad/s目標roll角速度
q_ref_radDssinglerad/s目標pitch角速度
r_ref_radDssinglerad/s目標yaw角速度

States_Bus

ElementTypeUnitMeaning
phi_radsingleradroll當前值
theta_radsingleradpitch當前值
psi_radsingleradyaw當前值
p_radDssinglerad/sroll角速度當前值
q_radDssinglerad/spitch角速度當前值
r_radDssinglerad/syaw角速度當前值

輸入介面總共有三個匯流排,分別是Command_Bus,Reference_Bus和States_Bus。其中Command_Bus是控制匯流排,用來對控制系統進行一些設定,如模式設定,復位等。Reference_Bus和States_Bus是目標訊號匯流排和狀態訊號匯流排,可以理解為控制器的目標值和當前值。控制器的目的就是通過控制來使得當前值儘可能收斂到目標值。

輸入介面設計完了,接下來是輸出介面。輸出介面相比輸入要簡單很多,無非就是多路pwm指令輸出。這裡我們預留6個pwm輸出介面,即最多可以支援6軸的控制,當面,也可以根據自己的需要,來進行修改。

Control_Out_Bus

ElementTypeUnitMeaning
pwm1uin161000~2000電機1 pwm訊號
pwm2uin161000~2000電機2 pwm訊號
pwm3uin161000~2000電機3 pwm訊號
pwm4uin161000~2000電機4 pwm訊號
pwm5uin161000~2000電機5 pwm訊號
pwm6uin161000~2000電機6 pwm訊號

好了,現在介面都定義好了,那麼下一步的問題就是如何在Simulink裡面來實現這些介面定義了。

其實,在Simulink中實現這些介面定義很簡單。Simulink提供了一個Bus Editor的工具,只需要進行簡單配置就可以定義任何你需要的介面或者匯流排了。

下面一步一步地講解一下匯流排的定義方法:

  • 首先開啟控制模型,點選Edit->Bus Editor

  • 這裡我之前已經配置過了,所以能看到我已經定義過的匯流排。但是如果是自己第一次進行設計的話,這裡應該是空的。可以點選如紅色圈圈所示的add bus來新增Bus訊號,這裡我們總共需要新增4個Bus。三個輸入匯流排和一個輸出匯流排。Bus新增好後,在最右邊的Property,修改Bus的名稱。新增好Bus之後,我們下面就需要往Bus裡面新增Element,即匯流排的元素。首先選定一個Bus,然後點選藍色圈圈圈出的add element選項,即可新增元素。

  • 
    
  • 然後需要對Element進行配置。如圖所示,我們一般只需要對Name,Data Type和Dimension三個選項進行配置即可。Dimension為變數的維度,如果我們的element需要配置為向量或者矩陣,那麼就需要對Dimension進行配置。

  • 配置完成後,需要點選File->Export to File來將Bus的配置儲存成.m還活著.mat檔案。因為Bus的定義都是儲存在工作空間的。當你下次開啟matlab的時候,工作空間都是會被清除的,所以我們需要將我們的Bus定義儲存成檔案,這樣,當下次開啟matlab的時候,只需要load一下我們的.mat/.m檔案,就能將我們定義的Bus再load進工作空間。

微信公眾號關注《阿木實驗室》獲取更多無人機開發測評資訊,關注《阿木社群》獲取更多學習課程資訊。
社群論壇地址:bbs.amovauto.com 參與討論。