Matlab仿真源碼解析與調(diào)試指南)
簡(jiǎn)介本資源是一套完整的四旋翼飛行器飛行控制系統(tǒng)MATLAB仿真方案面向控制理論初學(xué)者、無人機(jī)方向課程設(shè)計(jì)學(xué)生及科研入門者聚焦姿態(tài)解算、PID分層控制內(nèi)環(huán)角速度/外環(huán)位置、動(dòng)力學(xué)建模與三維可視化等核心問題。壓縮包共54個(gè)文件含21個(gè)核心M函數(shù)如quad_dynamics.m、quad_PID.m、attitude_PID.m、QuadrotorSimulink.mdl等支撐從非線性動(dòng)力學(xué)建模、傳感器測(cè)量模擬、多級(jí)PID控制器設(shè)計(jì)到3D動(dòng)畫演示的全流程另有9張運(yùn)行效果圖JPG直觀展示姿態(tài)響應(yīng)、軌跡跟蹤與系統(tǒng)穩(wěn)定性以及MAT文件和ASV備份文件便于調(diào)試溯源。資源包僅407KB結(jié)構(gòu)清晰、模塊解耦所有代碼經(jīng)Matlab 2019b實(shí)測(cè)可直接運(yùn)行替換數(shù)據(jù)即可復(fù)現(xiàn)實(shí)驗(yàn)結(jié)果。目前已有1365人學(xué)習(xí)下載適合零基礎(chǔ)快速上手飛行控制原理驗(yàn)證與算法調(diào)參實(shí)踐。 我年前幫一個(gè)學(xué)生調(diào)試飛行器相關(guān)的課設(shè)用的就是這套“四旋翼飛行器飛行控制系統(tǒng)”的Matlab源碼。當(dāng)時(shí)最直觀的感受是源碼本身能跑但如果你不清楚四旋翼控制系統(tǒng)的整體鏈路跑起來也只是一堆跳動(dòng)的曲線不知道哪里對(duì)、哪里錯(cuò)。這篇文章就順著四旋翼飛行器飛行控制系統(tǒng)的設(shè)計(jì)與仿真主線把模型建立、控制器設(shè)計(jì)、Simulink環(huán)境搭建、源碼閱讀順序全部串一遍同時(shí)把常規(guī)文檔里很少寫清楚的坑也點(diǎn)出來。無論你是剛接觸飛行控制理論的在校生還是在做畢設(shè)、課設(shè)、競(jìng)賽或者單純想把手里的Matlab源碼跑通并改成自己的版本這篇文章都能給你一條相對(duì)完整的路線。我不會(huì)堆公式嚇人而是盡量用工程語言講清楚每一個(gè)模塊在干什么、為什么這么干。1. 四旋翼控制系統(tǒng)的整體框架先建模還是先寫控制器很多剛接觸飛行器控制的人拿到源碼第一件事就是找控制器文件然后一頭扎進(jìn)PID參數(shù)里。這是一個(gè)很常見的誤區(qū)。四旋翼飛行器是一個(gè)典型的欠驅(qū)動(dòng)系統(tǒng)——它只有四個(gè)電機(jī)輸入?yún)s要控制六個(gè)自由度位置3個(gè)、姿態(tài)3個(gè)。這意味著你不可能直接對(duì)每一個(gè)自由度獨(dú)立施加控制力必須先搞清楚“四個(gè)電機(jī)轉(zhuǎn)速”和“飛行器姿態(tài)變化”之間的映射關(guān)系然后才能談控制。1.1 機(jī)體坐標(biāo)系與地面坐標(biāo)系的約定在Matlab源碼里幾乎所有坐標(biāo)變換和控制算法都依賴于坐標(biāo)系約定。最常見的設(shè)置是地面坐標(biāo)系慣性系通常取東北天ENU或北東地NED。機(jī)體坐標(biāo)系固定在飛行器質(zhì)心x軸指向機(jī)頭方向y軸指向右翼z軸向下NED習(xí)慣或向上ENU習(xí)慣。這個(gè)約定直接決定了姿態(tài)角橫滾roll、俯仰pitch、偏航y(tǒng)aw的旋轉(zhuǎn)順序和正負(fù)號(hào)。我在實(shí)際調(diào)試中就遇到過一次控制器的姿態(tài)反饋符號(hào)寫反導(dǎo)致飛行器在仿真里瘋狂翻滾。檢查了大半天最終發(fā)現(xiàn)就是坐標(biāo)系的y軸方向定義和姿態(tài)解算模塊不一致。所以拿到源碼的第一步不是看控制算法而是先找到注釋里對(duì)坐標(biāo)系的定義或者從初始姿態(tài)矩陣、重力分量方向反推它是ENU還是NED。這一步錯(cuò)了后面全錯(cuò)。1.2 剛體運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)方程的分工四旋翼的控制仿真通常分成兩部分運(yùn)動(dòng)學(xué)方程只描述位置、速度、姿態(tài)角、角速度之間的幾何關(guān)系不涉及力。它回答的問題是“飛行器以這個(gè)速度運(yùn)動(dòng)位置會(huì)怎么變、姿態(tài)角會(huì)怎么轉(zhuǎn)”。動(dòng)力學(xué)方程描述力、力矩與加速度、角加速度之間的關(guān)系。它回答的問題是“四個(gè)螺旋槳產(chǎn)生了多少升力和力矩飛行器會(huì)獲得多大的線加速度和角加速度”。在四旋翼的簡(jiǎn)化模型中作用于機(jī)體的外力主要包括重力、四個(gè)旋翼產(chǎn)生的總升力以及空氣阻力外力矩則主要包括旋翼反扭矩、陀螺力矩以及空氣阻力矩。Matlab源碼里通常會(huì)把這些力與力矩在機(jī)體坐標(biāo)系下表達(dá)然后換算到地面坐標(biāo)系去更新位置。這里有一個(gè)容易忽略的細(xì)節(jié)陀螺力矩來源于旋翼高速旋轉(zhuǎn)當(dāng)飛行器姿態(tài)變化時(shí)旋轉(zhuǎn)體的角動(dòng)量方向被迫改變會(huì)產(chǎn)生一個(gè)阻礙姿態(tài)變化的反作用力矩。如果不建這個(gè)力矩項(xiàng)仿真在高速偏航或快速翻轉(zhuǎn)時(shí)會(huì)有偏差。大部分教學(xué)版源碼會(huì)忽略它但如果你做的是高精度仿真或者帶較大旋翼的飛行器建議在建模時(shí)把這部分補(bǔ)上。2. 控制算法選型為什么教學(xué)版偏愛串級(jí)PID而不是LQR或MPCMatlab源碼1266期里的控制器核心是PID但它的結(jié)構(gòu)并不是簡(jiǎn)單的四個(gè)獨(dú)立PID通道而是串級(jí)PID。這個(gè)選型背后有非常實(shí)際的原因。2.1 串級(jí)PID的結(jié)構(gòu)與物理含義四旋翼串級(jí)PID的結(jié)構(gòu)可以拆成三個(gè)環(huán)節(jié)外環(huán)位置環(huán)輸入是期望位置坐標(biāo)輸出是期望姿態(tài)角橫滾/俯仰指令以及期望油門。它其實(shí)是在用“水平位置偏差”反推“該往哪個(gè)方向傾斜”。中環(huán)姿態(tài)環(huán)輸入是期望姿態(tài)角和當(dāng)前姿態(tài)角輸出是期望角速度。內(nèi)環(huán)角速度環(huán)輸入是期望角速度和當(dāng)前角速度輸出是期望力矩最終換算成四個(gè)電機(jī)的轉(zhuǎn)速指令。為什么要串聯(lián)這么多層因?yàn)榻撬俣拳h(huán)響應(yīng)最快它直接作用于執(zhí)行機(jī)構(gòu)姿態(tài)環(huán)次之位置環(huán)最慢。三層環(huán)路的帶寬依次遞減才能保證系統(tǒng)穩(wěn)定不會(huì)出現(xiàn)內(nèi)環(huán)還沒跟上、外環(huán)又給了新指令的情況。在實(shí)際調(diào)試中一個(gè)重要的原則是先調(diào)內(nèi)環(huán)再調(diào)外環(huán)。如果角速度環(huán)沒調(diào)穩(wěn)姿態(tài)環(huán)和位置環(huán)調(diào)得再好看也沒用——因?yàn)閮?nèi)環(huán)的震蕩會(huì)被外環(huán)放大。2.2 PID參數(shù)整定的大致思路Matlab源碼里通常會(huì)給一套初始的PID參數(shù)但不同飛行器模型質(zhì)量、轉(zhuǎn)動(dòng)慣量、臂長(zhǎng)不同參數(shù)差異很大。我一般按這樣的步驟來調(diào)整先把外環(huán)位置環(huán)的P和I設(shè)為0只保留內(nèi)環(huán)角速度環(huán)的P逐步增大直到角速度響應(yīng)出現(xiàn)等幅震蕩記錄臨界增益再取0.6倍左右作為初始P值。加上角速度環(huán)的D用來抑制超調(diào)但注意D太大會(huì)放大噪聲。調(diào)完角速度環(huán)再恢復(fù)姿態(tài)環(huán)的P此時(shí)姿態(tài)環(huán)的作用就是跟蹤外環(huán)給出的期望角度同樣觀察階躍響應(yīng)來調(diào)。最后調(diào)位置環(huán)位置環(huán)一般只在需要航跡控制的時(shí)候才重點(diǎn)調(diào)如果是懸停仿真給一組經(jīng)過測(cè)試的參數(shù)即可。這套方法源于齊格勒-尼科爾斯整定法雖然原始方法是針對(duì)單回路模擬系統(tǒng)的但拆開分層使用在四旋翼上很有效。需要注意的一點(diǎn)是PID參數(shù)不是越大越好。很多新手看到響應(yīng)慢了就瘋狂加P結(jié)果振蕩加劇甚至發(fā)散。四旋翼有執(zhí)行器飽和約束電機(jī)轉(zhuǎn)速有上限增益過高會(huì)導(dǎo)致抖動(dòng)和電機(jī)飽和仿真里看起來還能飛實(shí)機(jī)上早就炸機(jī)了。3. Simulink環(huán)境里的仿真鏈路從期望指令到電機(jī)轉(zhuǎn)速M(fèi)atlab源碼1266期通常包含兩種執(zhí)行方式純腳本.m文件和Simulink模型.slx。Simulink方案由于可視化程度高適合觀察每個(gè)環(huán)節(jié)的信號(hào)變化是多數(shù)人首選。但Simulink最大的坑不是搭建而是“看起來搭對(duì)了實(shí)際連錯(cuò)了”。3.1 典型Simulink模塊鏈路一個(gè)標(biāo)準(zhǔn)的四旋翼飛行控制系統(tǒng)Simulink模型信號(hào)流大致是期望軌跡生成器輸出懸停點(diǎn)坐標(biāo)或預(yù)設(shè)航跡點(diǎn)坐標(biāo)。位置控制器計(jì)算位置誤差輸出期望滾轉(zhuǎn)角、期望俯仰角、期望油門。姿態(tài)控制器接收期望姿態(tài)角和IMU反饋的當(dāng)前姿態(tài)角計(jì)算期望角速度。角速度控制器計(jì)算期望力矩??刂品峙淠K把期望力矩和總升力映射到四個(gè)電機(jī)的轉(zhuǎn)速或者油門百分比。四旋翼動(dòng)力學(xué)模型根據(jù)電機(jī)轉(zhuǎn)速計(jì)算升力、力矩更新線加速度、角加速度再積分得到速度、位置和姿態(tài)。傳感器模型IMU角速度、加速度、GPS/視覺定位位置一般會(huì)疊加白噪聲。控制分配這一塊通常被初學(xué)者忽略但它是整個(gè)鏈路的樞紐。以“X型”四旋翼為例四個(gè)電機(jī)的位置和旋轉(zhuǎn)方向決定了它們?cè)跐L轉(zhuǎn)、俯仰、偏航三個(gè)通道上的作用符號(hào)。如果電機(jī)序號(hào)映射錯(cuò)誤飛行器就會(huì)“給油門反而翻轉(zhuǎn)”。3.2 控制分配的數(shù)學(xué)表達(dá)在源碼里控制分配通常是一個(gè)4x4矩陣乘以期望控制量向量[F_total] [ 1 1 1 1 ] [T1] [Tx ] [ 0 -l 0 l ] [T2] [Ty ] [ l 0 -l 0 ] [T3] [Tz ] [ c -c c -c ] [T4]其中T1到T4是四個(gè)旋翼產(chǎn)生的升力l是電機(jī)到機(jī)體中心距離c是反扭矩系數(shù)。這個(gè)矩陣的具體形式取決于旋翼的排列方式。拿到源碼后建議先核對(duì)這個(gè)矩陣和模型里電機(jī)位置是否一致這是最常見的錯(cuò)誤來源之一。4. 源碼結(jié)構(gòu)解析拿到壓縮包后從哪里開始看這套源碼壓縮包通常包含這樣幾類文件“main/run腳本”、“plant模型”、“控制器代碼”、“繪圖腳本”、“參數(shù)文件”。很多讀者下載后第一反應(yīng)是直接運(yùn)行主腳本然后對(duì)著曲線不知所措。這里給出一個(gè)更有效的閱讀順序。4.1 先讀參數(shù)文件確認(rèn)飛行器物理參數(shù)四旋翼模型里最關(guān)鍵的物理參數(shù)包括質(zhì)量mkg重力加速度g通常9.81或9.8某些老源碼用9.8注意這差異機(jī)體轉(zhuǎn)動(dòng)慣量Ixx, Iyy, Izz電機(jī)到質(zhì)心的距離l升力系數(shù)、反扭矩系數(shù)電機(jī)時(shí)間常數(shù)或轉(zhuǎn)速-油門關(guān)系這些參數(shù)直接決定控制器的輸出范圍。比如質(zhì)量是1kg但四旋翼總升力只有8N那么即使控制器給出滿油門也無法懸停。在源碼里如果發(fā)現(xiàn)懸停油門異常第一步就是檢查這些參數(shù)是否與實(shí)際模型匹配。4.2 對(duì)照關(guān)鍵函數(shù)理解坐標(biāo)變換源碼里的姿態(tài)更新通常用歐拉角微分方程或者四元數(shù)。如果你看到四元數(shù)不要慌它的核心作用是避免“萬向節(jié)鎖”同時(shí)更高效地進(jìn)行旋轉(zhuǎn)矩陣運(yùn)算。閱讀時(shí)可以重點(diǎn)關(guān)注機(jī)體角速度p, q, r如何通過旋轉(zhuǎn)矩陣變成姿態(tài)角變化率重力在地面坐標(biāo)系的分量如何投影到機(jī)體坐標(biāo)系有一類經(jīng)典bug就是姿態(tài)角的微分方程里漏了偏航角速率對(duì)滾轉(zhuǎn)、俯仰角變化率的耦合項(xiàng)導(dǎo)致大偏航角時(shí)姿態(tài)響應(yīng)失真。如果對(duì)照源碼時(shí)發(fā)現(xiàn)它用了簡(jiǎn)化的小角度假設(shè)那么在大姿態(tài)角超過30度下仿真結(jié)果會(huì)偏差明顯。4.3 確認(rèn)仿真步長(zhǎng)與離散化方式Matlab源碼里既有連續(xù)模型用ode45也有離散模型固定步長(zhǎng)。工程上推薦離散模型因?yàn)閷?shí)際飛控代碼就是離散運(yùn)行的仿真越接近離散化結(jié)果越有參考價(jià)值。需要特別留意的是仿真步長(zhǎng)和控制器執(zhí)行頻率。如果控制器執(zhí)行頻率是100Hz而仿真步長(zhǎng)設(shè)成了0.001s1kHz意味著控制器每隔10個(gè)仿真周期才更新一次指令這要在源碼里用“采樣保持”模塊實(shí)現(xiàn)。很多初版源碼在這個(gè)環(huán)節(jié)處理不當(dāng)導(dǎo)致仿真結(jié)果看起來與控制頻率無關(guān)這在實(shí)機(jī)上是不可能的。4.4 從可視化結(jié)果反推代碼運(yùn)行邏輯Matlab源碼1266期通常會(huì)在運(yùn)行結(jié)束后繪制一些曲線包括三維軌跡圖、姿態(tài)角響應(yīng)圖、電機(jī)油門曲線。建議按照這個(gè)順序讀圖看三維軌跡飛行器能否到達(dá)目標(biāo)點(diǎn)有沒有震蕩有沒有漂移看姿態(tài)角響應(yīng)是否存在高頻振蕩姿態(tài)角是不是在合理范圍滾轉(zhuǎn)俯仰不超過45度看電機(jī)油門是否出現(xiàn)持續(xù)性飽和油門長(zhǎng)時(shí)間頂在上下極限如果是說明控制器輸出需求超出了物理極限。這些曲線不只是“結(jié)果展示”更是定位問題的重要工具。如果軌跡發(fā)散先看姿態(tài)角是否發(fā)散如果姿態(tài)角發(fā)散再看角速度環(huán)是否振蕩如果角速度環(huán)振蕩回到PID參數(shù)。5. 常見問題排查仿真發(fā)散、控制失效與模型不穩(wěn)定跑四旋翼仿真的人十個(gè)有九個(gè)遇到過“莫名其妙的發(fā)散”。以下是幾個(gè)高頻問題及排查思路希望能幫你縮短Debug時(shí)間。5.1 剛起步就炸飛檢查初始條件和電機(jī)轉(zhuǎn)向如果仿真一開始位置或姿態(tài)就飛出去首先檢查初始條件初始姿態(tài)角是否為0水平放置初始速度、角速度是否為0四個(gè)電機(jī)的初始轉(zhuǎn)速是否為懸停附近的合理值而不是0如果電機(jī)初始轉(zhuǎn)速為0而控制器期望它立刻產(chǎn)生足夠的升力來抵抗重力那么飛控必須瞬間輸出一個(gè)大指令。初始階段控制器輸出可能直接飽和然后進(jìn)入震蕩。其次檢查電機(jī)轉(zhuǎn)向X型四旋翼相鄰兩個(gè)旋翼對(duì)轉(zhuǎn)如果所有旋翼同向旋轉(zhuǎn)偏航通道會(huì)完全失效飛行器會(huì)自旋。判定方法很簡(jiǎn)單把偏航指令設(shè)置為0看仿真里偏航角是否持續(xù)增加如果是那大概率是電機(jī)轉(zhuǎn)向映射寫錯(cuò)了。5.2 姿態(tài)緩慢漂移檢查角速度反饋方向姿態(tài)漂移很多情況下是角速度符號(hào)問題。比如滾轉(zhuǎn)角速度p的反饋符號(hào)寫反控制器會(huì)朝著錯(cuò)誤方向輸出力矩系統(tǒng)看似穩(wěn)定實(shí)則緩慢漂移直到超過臨界角。排查方法在仿真里給一個(gè)純滾轉(zhuǎn)指令然后觀察滾轉(zhuǎn)通道的力矩輸出和角速度反饋方向是否相反。如果同相符號(hào)一定錯(cuò)了。5.3 高頻抖動(dòng)檢查PID微分項(xiàng)的濾波PID控制器里的D項(xiàng)對(duì)高頻噪聲非常敏感。仿真里的IMU模塊如果疊加了白噪聲D項(xiàng)會(huì)把噪聲放大成高頻力矩指令表現(xiàn)為姿態(tài)角高頻抖動(dòng)電機(jī)油門曲線看起來很“毛躁”。解決方案一般有三種在D項(xiàng)前面加低通濾波器一階慣性環(huán)節(jié)截止頻率通常取控制器頻率的1/5到1/10。用測(cè)量微分替代誤差微分也就是只對(duì)角速度反饋?zhàn)鑫⒎侄皇菍?duì)位置誤差做微分。增加仿真中IMU的噪聲強(qiáng)度看看系統(tǒng)能否承受更大的測(cè)量不確定性。實(shí)際上這里的高頻抖動(dòng)在純數(shù)值仿真里可能不明顯但一旦把參數(shù)移植到實(shí)機(jī)上電機(jī)和螺旋槳會(huì)被抖出噪聲來。所以從一開始就給D項(xiàng)加濾波是一個(gè)好習(xí)慣。5.4 懸停位置偏移檢查傳感器模型是否公平在很多源碼里位置反饋用的是理想值直接從動(dòng)力學(xué)模型取位置姿態(tài)反饋用的是加了噪聲的IMU值。這種不對(duì)稱會(huì)讓位置控制器“看起來”很完美而實(shí)際上如果換到真實(shí)硬件上完全不是一回事。一個(gè)更嚴(yán)謹(jǐn)?shù)姆抡媸俏恢煤妥藨B(tài)都從傳感器模型輸出獲取也就是加入測(cè)量延遲和噪聲。這樣控制器面對(duì)的不再是精確的模型狀態(tài)而是帶誤差的觀測(cè)值。把這一步做好仿真結(jié)論才有說服力。6. 幾個(gè)容易忽視的工程細(xì)節(jié)執(zhí)行器飽和、延遲與采樣如果說建模和控制算法是飛行控制系統(tǒng)的靈魂那么執(zhí)行器飽和、控制延遲和采樣頻率就是軀體邊界。很多Matlab源碼把這三個(gè)因素全部理想化導(dǎo)致仿真結(jié)果偏樂觀這里展開說說。6.1 執(zhí)行器飽和與積分飽和每個(gè)電機(jī)有最大、最小轉(zhuǎn)速或油門百分比0~100%。當(dāng)控制器計(jì)算出的期望轉(zhuǎn)速超過上限時(shí)實(shí)際轉(zhuǎn)速被鉗位在極限值此時(shí)誤差無法被控制器完全消除。如果PID控制器帶有積分項(xiàng)積分項(xiàng)會(huì)持續(xù)累積導(dǎo)致“積分飽和”——一旦誤差反向控制器需要很長(zhǎng)時(shí)間才能退出飽和狀態(tài)表現(xiàn)為超調(diào)嚴(yán)重、響應(yīng)遲緩。解決思路對(duì)積分項(xiàng)做限幅限制積分輸出不超過執(zhí)行器極限的合理比例。使用“條件積分”法即當(dāng)執(zhí)行器飽和且誤差朝向繼續(xù)飽和方向時(shí)暫停積分累加。在控制器輸出側(cè)加限幅模塊。Matlab/Simulink里處理積分飽和最方便的方式是采用帶復(fù)位邏輯的PID控制器模塊或在積分器上加外部復(fù)位信號(hào)。6.2 控制延遲與零階保持器真實(shí)飛控系統(tǒng)中傳感器數(shù)據(jù)采集、控制解算、PWM輸出三者之間存在時(shí)延。仿真中如果忽略這一時(shí)延控制器相當(dāng)于“提前”知道了系統(tǒng)的真實(shí)狀態(tài)相當(dāng)于開掛。在Simulink里可以用“Memory”模塊或“Transport Delay”模塊來模擬控制周期延遲。不過要注意過大的控制延遲會(huì)明顯降低系統(tǒng)相位裕度導(dǎo)致原本穩(wěn)定的參數(shù)變得不穩(wěn)定。如果你發(fā)現(xiàn)源碼里的PID參數(shù)在純連續(xù)模型里很穩(wěn)但加入一個(gè)10ms延遲后就開始振蕩別懷疑是代碼錯(cuò)這就是相位裕度削減之后的必然結(jié)果。6.3 采樣頻率選擇的經(jīng)驗(yàn)值控制器采樣頻率一般建議是系統(tǒng)帶寬的10~20倍。四旋翼姿態(tài)環(huán)帶寬一般在5~15Hz所以姿態(tài)環(huán)控制頻率做到100~250Hz是合理的位置環(huán)帶寬更低可以放到20~50Hz。源碼里如果只給了一個(gè)統(tǒng)一的控制頻率建議至少確認(rèn)它不低于100Hz否則姿態(tài)環(huán)響應(yīng)會(huì)有明顯滯后。7. 在線觀測(cè)與數(shù)據(jù)記錄的實(shí)用技巧仿真跑完了不能只看最后一張圖。調(diào)試四旋翼控制系統(tǒng)最有效的方式是“錄制中間信號(hào)”而不是看最終結(jié)果。我習(xí)慣把下列信號(hào)全部放到Scope或者輸出到工作區(qū)期望位置、實(shí)際位置、位置環(huán)輸出的期望角度、姿態(tài)環(huán)輸出的期望角速度、角速度環(huán)輸出的期望力矩、四個(gè)電機(jī)的實(shí)際轉(zhuǎn)速、控制器飽和標(biāo)志位。有了這些信號(hào)定位問題會(huì)快很多。比如位置偏差大先看期望角度是否被推到了極限如果期望角度已經(jīng)很大但姿態(tài)響應(yīng)沒跟上說明姿態(tài)環(huán)帶寬不夠需要提高姿態(tài)環(huán)增益如果姿態(tài)響應(yīng)跟上但位置還是回不來說明位置環(huán)增益太低或油門輸出飽和了。這個(gè)“逐級(jí)確認(rèn)”的思路是我調(diào)試飛行器控制系統(tǒng)的核心方法論和排查通信系統(tǒng)故障時(shí)的分層定位邏輯完全一樣先確認(rèn)執(zhí)行層再確認(rèn)協(xié)調(diào)層最后確認(rèn)決策層。7.1 在源碼中添加信號(hào)記錄點(diǎn)如果源碼里某些中間信號(hào)沒有被暴露到輸出你可以加一點(diǎn)簡(jiǎn)單的代碼來記錄。比如在控制器函數(shù)里把期望姿態(tài)角塞進(jìn)一個(gè)out結(jié)構(gòu)體然后用assignin(base, ctrlLog, ctrlLog)導(dǎo)出到Matlab工作區(qū)最后在腳本里用figure; plot(t, ctrlLog.phi_des, t, state.phi)這樣的方式繪圖對(duì)比。但注意不要在主循環(huán)里頻繁用assignin會(huì)拖慢仿真。更高效的做法是提前預(yù)分配一個(gè)大型矩陣每次迭代寫入一行仿真結(jié)束后一次性讀取。7.2 用蒙特卡洛方式驗(yàn)證魯棒性固定一組參數(shù)只跑一次仿真無法說明控制系統(tǒng)真的穩(wěn)定。更合理的做法是微調(diào)模型中的不確定參數(shù)質(zhì)量增減10%、轉(zhuǎn)動(dòng)慣量增減20%、加入不同強(qiáng)度的風(fēng)干擾跑多組實(shí)驗(yàn)觀察控制性能指標(biāo)超調(diào)、調(diào)節(jié)時(shí)間、穩(wěn)態(tài)誤差的變化范圍。在Matlab里寫一個(gè)批量仿真腳本用parfor并行跑不同參數(shù)組合最后匯總畫出一個(gè)性能分布圖。這一步做完你對(duì)這套控制算法的魯棒性會(huì)有非常直觀的認(rèn)知。8. 從仿真到實(shí)機(jī)模型能飛不代表代碼能飛這個(gè)話題雖然和源碼調(diào)試無關(guān)但我覺得有必要提一嘴。很多人調(diào)完Matlab仿真后覺得“穩(wěn)了”直接往飛控板上移植結(jié)果首飛就炸。根本原因在于仿真模型里沒有包含實(shí)機(jī)的眾多未建模動(dòng)態(tài)機(jī)架彈性形變、螺旋槳?dú)鈩?dòng)干擾、電機(jī)響應(yīng)非線性和溫度漂移、電池電壓下降帶來的升力變化、GPS/視覺定位的跳變等。如果你的目標(biāo)是把這套源碼改造成可以直接上機(jī)的飛控建議分步走先用軟件在環(huán)SIL仿真把控制算法代碼嵌入到PX4或ArduPilot的仿真實(shí)體里。再用硬件在環(huán)HIL把代碼跑在真實(shí)飛控板上接收仿真環(huán)境反饋的傳感器數(shù)據(jù)。最后才裝到真機(jī)上小油門低速試飛。這樣做的好處是每一步都能獨(dú)立驗(yàn)證出了問題能明確知道是算法問題、代碼移植問題還是整機(jī)結(jié)構(gòu)問題而不是一鍋粥地亂調(diào)。至于Matlab源碼本身它最大的價(jià)值是教學(xué)演示和算法驗(yàn)證把控制鏈路徹底跑通把每個(gè)環(huán)節(jié)的信號(hào)變化看明白為后續(xù)移植到嵌入式平臺(tái)打下理論基礎(chǔ)。從這個(gè)角度說這套源碼已經(jīng)完成了一多半的使命。如果你拿著這套源碼但連基本的運(yùn)行結(jié)果都出不來先不要改控制參數(shù)從模型參數(shù)、坐標(biāo)約定、初始條件三個(gè)方向查。這三個(gè)地方是最容易在源碼打包、分享過程中被改動(dòng)的角落。我本人就遇到過幾次下載的源碼跑起來全是NaN檢查后發(fā)現(xiàn)是重力加速度被填成了0。這種問題不是水平不夠而是太相信“下載即正確”。源碼調(diào)試最大的敵人永遠(yuǎn)是默認(rèn)它是對(duì)的。本文還有配套的精品資源點(diǎn)擊獲取