器人運(yùn)動(dòng)學(xué)滑模變結(jié)構(gòu)控制:Simulink仿真設(shè)計(jì)與抖振抑制實(shí)踐)
滑模變結(jié)構(gòu)控制這名字聽(tīng)著唬人但在機(jī)器人運(yùn)動(dòng)學(xué)仿真里它其實(shí)是個(gè)特別“直接”的控制思路——說(shuō)白了就是設(shè)計(jì)一條誤差收斂的“滑模面”然后用不連續(xù)的切換控制把系統(tǒng)狀態(tài)“按”到這條面上再沿著面滑到零點(diǎn)。我當(dāng)年第一次在Simulink里把二連桿機(jī)械臂的運(yùn)動(dòng)學(xué)模型和滑??刂破鹘悠饋?lái)時(shí)看到示波器里那條誤差曲線穩(wěn)穩(wěn)收斂才真正理解課本上那句“對(duì)參數(shù)攝動(dòng)和外部擾動(dòng)具有魯棒性”是什么意思。這篇就圍繞“機(jī)器人運(yùn)動(dòng)學(xué)控制 Simulink仿真模型 滑模變結(jié)構(gòu)控制”三件事展開把建模、控制器設(shè)計(jì)、仿真實(shí)操和踩坑經(jīng)驗(yàn)一次講透。適合剛接觸滑??刂频难芯可?、做畢業(yè)設(shè)計(jì)的本科生以及想快速驗(yàn)證控制算法的工程師。1. 先搞清楚機(jī)器人運(yùn)動(dòng)學(xué)模型1.1 為什么從運(yùn)動(dòng)學(xué)入手很多人一上來(lái)就懟動(dòng)力學(xué)方程結(jié)果被慣性矩陣、科氏力、重力項(xiàng)搞得焦頭爛額。滑??刂齐m然是魯棒控制里的??偷珜W(xué)習(xí)路徑上完全可以先從運(yùn)動(dòng)學(xué)層面切入。運(yùn)動(dòng)學(xué)只研究關(guān)節(jié)角度與末端位置之間的映射關(guān)系不涉及力/力矩與加速度的因果模型形式簡(jiǎn)單控制目標(biāo)也直觀——就是讓末端或關(guān)節(jié)角度精確跟蹤期望軌跡。在這個(gè)層面上把滑模設(shè)計(jì)的邏輯跑通再去碰動(dòng)力學(xué)會(huì)輕松得多。從工程角度看機(jī)器人運(yùn)動(dòng)學(xué)控制場(chǎng)景也很常見(jiàn)視覺(jué)引導(dǎo)的末端定位、關(guān)節(jié)空間軌跡跟蹤、冗余機(jī)械臂的運(yùn)動(dòng)規(guī)劃等本質(zhì)上都需要先解決“讓關(guān)節(jié)角度按期望曲線走”的問(wèn)題。所以用二連桿機(jī)械臂作為仿真對(duì)象既保留了多軸耦合的特征又不會(huì)像六軸機(jī)械臂那樣把雅可比矩陣推導(dǎo)變成災(zāi)難。等你把二連桿的運(yùn)動(dòng)學(xué)滑??刂瞥酝笓Q成其他構(gòu)型只是換一套正解公式而已。1.2 二連桿機(jī)械臂的運(yùn)動(dòng)學(xué)方程我采用最常見(jiàn)的平面二連桿模型兩個(gè)連桿長(zhǎng)度分別為 (L_1)、(L_2)關(guān)節(jié)角度為 (\theta_1)、(\theta_2)。末端位置 ((x, y)) 由正運(yùn)動(dòng)學(xué)給出[ x L_1 \cos(\theta_1) L_2 \cos(\theta_1 \theta_2) ] [ y L_1 \sin(\theta_1) L_2 \sin(\theta_1 \theta_2) ]對(duì)時(shí)間求導(dǎo)得到末端速度與關(guān)節(jié)角速度的關(guān)系[ \dot{x} -L_1 \sin(\theta_1)\dot{\theta}_1 - L_2 \sin(\theta_1 \theta_2)(\dot{\theta}_1 \dot{\theta}_2) ] [ \dot{y} L_1 \cos(\theta_1)\dot{\theta}_1 L_2 \cos(\theta_1 \theta_2)(\dot{\theta}_1 \dot{\theta}_2) ]寫成矩陣形式就是 (\dot{\mathbf{p}} \mathbf{J}(\boldsymbol{\theta}) \dot{\boldsymbol{\theta}})其中 (\mathbf{J}) 是雅可比矩陣。運(yùn)動(dòng)學(xué)控制的目標(biāo)通常是給定期望末端軌跡 (\mathbf{p}_d(t))求關(guān)節(jié)角速度指令 (\dot{\boldsymbol{\theta}})。如果只用逆雅可比 (\dot{\boldsymbol{\theta}} \mathbf{J}^{-1}(\dot{\mathbf{p}}_d \mathbf{K}\mathbf{e}))那是經(jīng)典的“運(yùn)動(dòng)學(xué)PID”但面對(duì)模型誤差和擾動(dòng)時(shí)跟蹤性能會(huì)打折?;?刂圃谶@里的用法就是針對(duì)跟蹤誤差設(shè)計(jì)魯棒控制器不依賴精確的逆雅可比。在Simulink里搭模型時(shí)不少教程喜歡直接用積分模塊把 (\dot{\boldsymbol{\theta}}) 變成 (\boldsymbol{\theta})再用角度計(jì)算末端位置。我建議把這些運(yùn)算封裝進(jìn)一個(gè)“正運(yùn)動(dòng)學(xué)子系統(tǒng)”輸入關(guān)節(jié)角度輸出末端位置和雅可比矩陣這樣后期換三連桿、換球坐標(biāo)都很方便。模塊層面用Fcn模塊或MATLAB Function都可以但MATLAB Function寫雅可比更清晰還能順便輸出條件數(shù)以觀察奇異性。2. 滑模變結(jié)構(gòu)控制的核心思路2.1 滑模面的設(shè)計(jì)滑??刂频脑O(shè)計(jì)分兩步選滑模面定控制律。先說(shuō)滑模面。對(duì)于關(guān)節(jié)角度跟蹤問(wèn)題定義誤差 (e \theta_d - \theta)常見(jiàn)的線性滑模面為[ s \dot{e} \lambda e ]其中 (\lambda 0)。這個(gè)面的物理意義很直觀如果系統(tǒng)狀態(tài)能保持在 (s 0) 上那么 (\dot{e} -\lambda e)誤差指數(shù)收斂到零收斂速度由 (\lambda) 決定。你可以把 (s) 理解成“誤差空間的綜合指標(biāo)”它同時(shí)包含位置誤差和速度誤差。當(dāng) (s) 不為零時(shí)控制器要驅(qū)動(dòng)系統(tǒng)讓 (s) 趨向零這個(gè)過(guò)程叫“到達(dá)階段”一旦 (s 0)就進(jìn)入“滑模階段”。之所以說(shuō)滑??刂啤皩?duì)匹配擾動(dòng)不敏感”是因?yàn)樵诨C嫔舷到y(tǒng)運(yùn)動(dòng)由滑模面方程決定原有的動(dòng)力學(xué)參數(shù)被“替換”了。當(dāng)然前提是控制增益能克服擾動(dòng)上界否則系統(tǒng)會(huì)被擾動(dòng)推出滑模面。這個(gè)“上界”的概念在設(shè)計(jì)符號(hào)函數(shù)增益時(shí)特別關(guān)鍵后面細(xì)說(shuō)。2.2 趨近律與抖振抑制光讓 (s 0) 還不夠得規(guī)定 (s) 怎么走向零。最粗暴的做法是用符號(hào)函數(shù)[ \dot{s} -\eta ,\text{sgn}(s) ]對(duì)應(yīng)控制律里會(huì)出現(xiàn) (\eta ,\text{sgn}(s)) 這樣的切換項(xiàng)。這種“指數(shù)趨近律”簡(jiǎn)單但會(huì)導(dǎo)致一個(gè)經(jīng)典問(wèn)題——抖振。因?yàn)榉?hào)函數(shù)在零附近高速切換理想狀態(tài)下是無(wú)限頻率實(shí)際離散仿真里就會(huì)表現(xiàn)為高頻振蕩反映在關(guān)節(jié)角度曲線上就是毛刺或極限環(huán)。很多初學(xué)者第一次跑仿真看見(jiàn)角度曲線抖得像心電圖第一反應(yīng)是模型錯(cuò)了其實(shí)只是符號(hào)函數(shù)增益太大。抑制抖振的常規(guī)方法有幾種用飽和函數(shù) (\text{sat}(s/\phi)) 代替 (\text{sgn}(s))在邊界層內(nèi)做線性過(guò)渡代價(jià)是犧牲一點(diǎn)收斂精度。用超螺旋算法等高階滑模本質(zhì)是讓切換項(xiàng)作用在 (s) 的高階導(dǎo)數(shù)上抖振大幅減弱但參數(shù)調(diào)節(jié)復(fù)雜些。適當(dāng)調(diào)小切換增益 (\eta)只要能覆蓋模型誤差和擾動(dòng)的上界就行沒(méi)必要給得過(guò)大。我個(gè)人在做運(yùn)動(dòng)學(xué)仿真時(shí)先用飽和函數(shù)把邏輯跑通再換成符號(hào)函數(shù)對(duì)比抖振差異這個(gè)對(duì)比過(guò)程本身就是學(xué)習(xí)滑??刂谱詈玫慕滩?。你可以把飽和函數(shù)邊界層厚度 (\phi) 設(shè)成 0.01~0.05增益 (\eta) 先設(shè)個(gè)保守值比如 0.5然后在仿真里一點(diǎn)點(diǎn)加。2.3 為什么要用“趨近律”而不是直接設(shè)計(jì)控制輸入運(yùn)動(dòng)學(xué)模型的輸入是關(guān)節(jié)角速度 (\dot{\boldsymbol{\theta}})不是力矩。所以控制律的形式不能照搬動(dòng)力學(xué)里的 (u \tau)。這里需要用“運(yùn)動(dòng)學(xué)級(jí)”的虛擬控制量 (v \dot{\boldsymbol{\theta}}_c)把它當(dāng)作關(guān)節(jié)角速度指令。我們?cè)O(shè)計(jì)[ \dot{\boldsymbol{\theta}}_c \mathbf{J}^{-1}\left(\dot{\mathbf{p}}_d \lambda \mathbf{e} \eta ,\text{sgn}(s)\right) ]其中 (\mathbf{e} \mathbf{p}_d - \mathbf{p}) 是末端位置誤差(s \dot{\mathbf{e}} \lambda \mathbf{e})。這塊設(shè)計(jì)邏輯是如果用 (\dot{\boldsymbol{\theta}}_c) 驅(qū)動(dòng)真實(shí)機(jī)械臂那么末端速度會(huì)趨近期望速度誤差沿滑模面收斂。在Simulink里這個(gè) (\dot{\boldsymbol{\theta}}_c) 通常不能直接作為物理關(guān)節(jié)速度輸入需要再串一個(gè)底層速度環(huán)或者直接把 (\dot{\boldsymbol{\theta}}_c) 當(dāng)作指令給理想速度源。做運(yùn)動(dòng)學(xué)級(jí)仿真時(shí)我用的是“積分器理想速度驅(qū)動(dòng)”把 (\dot{\boldsymbol{\theta}}_c) 積分得到實(shí)際角度再反饋給正運(yùn)動(dòng)學(xué)模塊這樣簡(jiǎn)單且能看清控制器核心性能不摻動(dòng)力學(xué)干擾。當(dāng)然這種理想化模型忽略了很多執(zhí)行器特性但它作為學(xué)習(xí)載體非常合適——你可以單獨(dú)評(píng)估滑??刂频聂敯粜员热缃o雅可比矩陣加5%的參數(shù)偏差看誤差是否還能收斂這就比純粹的PID更能體現(xiàn)滑模優(yōu)勢(shì)。3. Simulink仿真模型搭建全流程3.1 模型架構(gòu)與模塊選型整個(gè)Simulink模型分四塊軌跡生成、滑??刂破?、被控對(duì)象正運(yùn)動(dòng)學(xué)雅可比、信號(hào)觀測(cè)。我從一個(gè)大框架說(shuō)起你按這個(gè)結(jié)構(gòu)搭不容易亂。軌跡生成模塊我用MATLAB Function生成圓形軌跡圓心 ((0.6, 0.4))半徑 0.1角頻率 0.5 rad/s仿真時(shí)長(zhǎng) 10 秒。輸出期望末端位置 (\mathbf{p}_d) 和期望速度 (\dot{\mathbf{p}}_d)。也可以在Constant模塊里用Clock和表達(dá)式實(shí)現(xiàn)但MATLAB Function最好改參數(shù)?;?刂破髂K輸入期望位置、期望速度、實(shí)際位置、實(shí)際角度輸出 (\dot{\boldsymbol{\theta}}_c)。這個(gè)模塊內(nèi)部用MATLAB Function實(shí)現(xiàn)雅可比計(jì)算、誤差計(jì)算、趨近律和控制律。注意雅可比矩陣可能奇異二連桿在某些位形下 (\det(\mathbf{J}) 0)需要在函數(shù)里加個(gè)判斷如果行列式絕對(duì)值小于閾值就用偽逆或阻尼最小二乘。常見(jiàn)做法是加個(gè)參數(shù) (\epsilon)[ \mathbf{J}^ \mathbf{J}^T(\mathbf{J}\mathbf{J}^T \epsilon \mathbf{I})^{-1} ]這個(gè) (\epsilon) 設(shè)成 0.01 左右能避免仿真中途因奇異而報(bào)NAN。被控對(duì)象模塊理想速度源就是兩個(gè)積分器輸入 (\dot{\boldsymbol{\theta}}_c)輸出實(shí)際關(guān)節(jié)角度 (\boldsymbol{\theta})反饋給控制器和正運(yùn)動(dòng)學(xué)。如果想更貼近真實(shí)可以在這個(gè)積分器前加一階慣性環(huán)節(jié)模擬執(zhí)行器延遲但學(xué)習(xí)階段別加先看純運(yùn)動(dòng)學(xué)下的控制效果。信號(hào)觀測(cè)模塊用Scope觀察末端位置跟蹤、關(guān)節(jié)角度曲線、誤差和滑模面 (s)。建議把誤差和 (s) 單獨(dú)放一個(gè)Scope方便看收斂速度。3.2 機(jī)器人運(yùn)動(dòng)學(xué)子系統(tǒng)實(shí)現(xiàn)我習(xí)慣把正運(yùn)動(dòng)學(xué)封裝成一個(gè)子系統(tǒng)內(nèi)部用MATLAB Function寫function [pos, J] fk_2link(theta, L1, L2) % 正運(yùn)動(dòng)學(xué) q1 theta(1); q2 theta(2); x L1*cos(q1) L2*cos(q1q2); y L1*sin(q1) L2*sin(q1q2); pos [x; y]; % 雅可比矩陣 J [-L1*sin(q1)-L2*sin(q1q2), -L2*sin(q1q2); L1*cos(q1)L2*cos(q1q2), L2*cos(q1q2)]; end輸入是 (\theta_1)、(\theta_2) 合成的一個(gè)向量信號(hào)用Vector Concatenate模塊或直接兩路輸入到MATLAB Function都行。輸出pos和J。注意MATLAB Function里不要用全局變量參數(shù)通過(guò)對(duì)話框傳遞。運(yùn)行時(shí)長(zhǎng)度參數(shù) (L_1 0.5)(L_2 0.4)單位米。這里有個(gè)容易踩的坑MATLAB Function默認(rèn)輸出類型會(huì)被推斷如果初始化時(shí)沒(méi)有給輸出變量賦值Simulink可能報(bào)“輸出未定義”。所以在函數(shù)開頭最好先寫一行 (\text{pos} zeros(2,1); J zeros(2,2);)或者用coder.extrinsic調(diào)用不了就直接在代碼里給默認(rèn)值。3.3 滑??刂破髯酉到y(tǒng)實(shí)現(xiàn)控制器的MATLAB Function寫法大概是這樣function [theta_dot_cmd] smc_controller(pd, pd_dot, p_current, theta, L1, L2, lambda, eta, phi) % pd: 期望位置2x1, pd_dot: 期望速度2x1, p_current: 實(shí)際位置2x1 % theta: 關(guān)節(jié)角2x1 [~, J] fk_2link(theta, L1, L2); e pd - p_current; edot pd_dot - J * theta_dot_current; % 注意這里需要當(dāng)前關(guān)節(jié)角速度 s edot lambda * e; % 滑模面 % 飽和函數(shù)替代符號(hào)函數(shù) sat_s min(1, max(-1, s / phi)); % 阻尼最小二乘逆 Jt J; JtJ J * Jt 0.01 * eye(2); Jinv Jt * (JtJ \ eye(2)); % 控制律 theta_dot_cmd Jinv * (pd_dot lambda * e eta * sat_s); end這里隱含一個(gè)依賴需要當(dāng)前關(guān)節(jié)角速度 (\dot{\boldsymbol{\theta}})。我們的被控對(duì)象是理想積分器所以 (\dot{\boldsymbol{\theta}}) 正好等于 (\dot{\boldsymbol{\theta}}_c)也就是控制器的輸出。這就形成一個(gè)代數(shù)環(huán)控制器輸出決定實(shí)際速度實(shí)際速度又反饋到控制器計(jì)算。Simulink會(huì)報(bào)警告“代數(shù)環(huán)”雖然在小步長(zhǎng)下能跑但最好顯式消除。消除代數(shù)環(huán)的辦法是把積分器輸出的狀態(tài) (\boldsymbol{\theta}) 反饋給控制器但在控制器里用差分近似關(guān)節(jié)速度比如 (\dot{\theta}[k] (\theta[k] - \theta[k-1]) / h)通過(guò)Memory模塊或Unit Delay實(shí)現(xiàn)。這樣可以打破代數(shù)環(huán)代價(jià)是速度估計(jì)有一點(diǎn)延遲和噪聲。運(yùn)動(dòng)學(xué)仿真中這個(gè)噪聲可接受。更優(yōu)雅的方案是在被控對(duì)象里加一個(gè)一階慣性濾波但學(xué)習(xí)階段我建議用Unit Delay近似簡(jiǎn)單實(shí)用。另一個(gè)更直接的辦法既然被控對(duì)象是積分器控制器輸出就是速度那就別把“當(dāng)前速度”當(dāng)反饋直接用期望速度的誤差做滑模面。末端位置誤差 (e) 是位置量其導(dǎo)數(shù)可以從期望速度減去“當(dāng)前速度”但我們可以把滑模面定義為[ s \dot{\mathbf{p}}_d - \dot{\mathbf{p}} \lambda e ]其中 (\dot{\mathbf{p}} \mathbf{J} \dot{\boldsymbol{\theta}})。如果控制器輸出 (\dot{\boldsymbol{\theta}}_c) 直接等于被控對(duì)象速度那么 (\dot{\mathbf{p}} \mathbf{J}\dot{\boldsymbol{\theta}}_c)。代入控制律會(huì)得到關(guān)于 (\dot{\boldsymbol{\theta}}_c) 的隱式方程。所以還是得打破代數(shù)環(huán)。我在實(shí)踐中用如上Unit Delay估計(jì)速度方案效果穩(wěn)定。3.4 參數(shù)設(shè)置與仿真配置仿真步長(zhǎng)選擇很關(guān)鍵?;?刂茙Х?hào)函數(shù)切換時(shí)如果步長(zhǎng)太大控制器輸出在幾個(gè)步長(zhǎng)之間反復(fù)跳變誤差曲線會(huì)呈現(xiàn)鋸齒狀。我推薦用變步長(zhǎng)ode45最大步長(zhǎng)設(shè) (0.001) 秒相對(duì)誤差 (1e-4)。如果用的是飽和函數(shù)可以放寬到 (0.005) 秒??刂破鲄?shù)我試用過(guò)一組不錯(cuò)的初始值(\lambda 3)(\eta 0.8)(\phi 0.05)。仿真10秒期望軌跡是半徑0.1米的圓。初始關(guān)節(jié)角度可以從末端位置反解也可以直接設(shè) (\theta_1 0.5)(\theta_2 0.8) 開始讓控制器自己收。注意期望軌跡的起始點(diǎn)最好和機(jī)械臂實(shí)際末端位置一致否則初始誤差很大符號(hào)函數(shù)增益可能讓速度指令瞬間飽和出現(xiàn)超調(diào)。我一般用MATLAB腳本先算初始關(guān)節(jié)角對(duì)應(yīng)末端位置把期望軌跡的起點(diǎn)移到那里比如自定義軌跡函數(shù)[ x_d 0.6 0.1\cos(0.5t - \phi_0) ] [ y_d 0.4 0.1\sin(0.5t - \phi_0) ]其中 (\phi_0) 由初始末端位置的極角決定這樣初始誤差接近零。仿真配置里還要注意解法器是否支持信號(hào)代數(shù)環(huán)。用Unit Delay后應(yīng)該沒(méi)有代數(shù)環(huán)警告如果有可以再插入一個(gè)Memory模塊在反饋路徑上。模型里還建議把所有Scope數(shù)據(jù)記錄到工作區(qū)用logsout方便后續(xù)分析。4. 仿真結(jié)果分析與調(diào)試4.1 跟蹤效果怎么看仿真跑完先看末端位置跟蹤曲線。把期望圓和實(shí)際軌跡畫在一張圖里如果軌跡重疊得比較好說(shuō)明跟蹤精度高。然后看關(guān)節(jié)角度曲線理想情況下是平滑曲線不應(yīng)有高頻分量。最后看誤差曲線 (e_x)、(e_y)穩(wěn)態(tài)誤差應(yīng)該在 (10^{-3}) 量級(jí)。還有一個(gè)關(guān)鍵指標(biāo)是滑模面 (s) 的收斂過(guò)程。如果設(shè)計(jì)正確且增益合適(s) 會(huì)在很短時(shí)間比如0.1秒內(nèi)從初始值衰減到零隨后一直在零附近小幅波動(dòng)。這個(gè)波動(dòng)幅度取決于飽和函數(shù)邊界層 (\phi) 和擾動(dòng)如果波動(dòng)太大說(shuō)明增益設(shè)置不合理或者速度估計(jì)噪聲大。4.2 抖振問(wèn)題與參數(shù)調(diào)節(jié)經(jīng)驗(yàn)最典型的問(wèn)題是用符號(hào)函數(shù)時(shí)關(guān)節(jié)速度指令呈高頻切換角度曲線有毛刺。這時(shí)候不要急著加大 (\lambda)先檢查 (\eta) 是否過(guò)大。(\eta) 的物理意義是“對(duì)抗擾動(dòng)的強(qiáng)度”如果模型精確、無(wú)擾動(dòng)(\eta) 只需要大于系統(tǒng)名義部分的誤差上界。在運(yùn)動(dòng)學(xué)級(jí)仿真里唯一的擾動(dòng)是數(shù)值誤差和速度估計(jì)誤差(\eta) 設(shè)成 0.2~0.5 通常足夠。把 (\eta) 調(diào)到 2 以上抖振會(huì)非常明顯除非你故意要觀察抖振。第二個(gè)常見(jiàn)問(wèn)題是初始誤差大導(dǎo)致速度指令飽和。我在控制器中加過(guò)飽和模塊限制 (\dot{\theta}_c) 幅值在 3 rad/s 以內(nèi)否則仿真早期速度會(huì)飆到幾十?dāng)?shù)值發(fā)散。這個(gè)限幅不影響穩(wěn)態(tài)性能但能顯著提高仿真穩(wěn)定性。第三個(gè)問(wèn)題是速度估計(jì)用Unit Delay引入的相位滯后。滯后會(huì)導(dǎo)致滑模面計(jì)算不準(zhǔn)確誤差穩(wěn)態(tài)值可能達(dá)不到理論精度。解決方法是在控制器里對(duì)估計(jì)的角速度做一階低通濾波或者用Kalman濾波的簡(jiǎn)化版。不過(guò)對(duì)于學(xué)習(xí)項(xiàng)目Unit Delay足夠讓你理解問(wèn)題所在。5. 常見(jiàn)問(wèn)題速查與避坑清單5.1 高頻報(bào)錯(cuò)與解決代數(shù)環(huán)警告反饋路徑插入U(xiǎn)nit Delay或Memory模塊注意采樣時(shí)間要與信號(hào)一致。MATL AB Function輸出未定義函數(shù)開頭給輸出賦零值。仿真速度極慢積分步長(zhǎng)太小或控制器里有高頻切換可改用飽和函數(shù)并適當(dāng)增大最大步長(zhǎng)。末端軌跡發(fā)散多半是雅可比逆接近奇異或初始誤差太大改用阻尼最小二乘逆并做速度限幅。Scope顯示沒(méi)有信號(hào)檢查信號(hào)線是否連錯(cuò)以及MATLAB Function是否設(shè)置成了“每步更新”而不是“每幀更新”如果是變步長(zhǎng)仿真最好把Scope采樣時(shí)間設(shè)為“繼承”。5.2 獨(dú)家實(shí)戰(zhàn)心得我做完這個(gè)項(xiàng)目后最大的體會(huì)是學(xué)習(xí)滑??刂撇荒苤槐弛吔晒揭欢ㄒH手在Simulink里改變 (\lambda)、(\eta)、(\phi)觀察誤差和滑模面的變化。建議你做一個(gè)對(duì)比實(shí)驗(yàn)其他參數(shù)不變把 (\eta) 從 0.1 調(diào)到 2看誤差收斂速度變快但抖振變強(qiáng)然后把符號(hào)函數(shù)換成飽和函數(shù)再看抖振被抑制但穩(wěn)態(tài)誤差略增大。這個(gè)過(guò)程10分鐘就能完成但比讀十遍論文都有用。另一個(gè)心得是運(yùn)動(dòng)學(xué)級(jí)滑??刂浦皇侨腴T真正的工業(yè)應(yīng)用中滑模控制更多用在動(dòng)力學(xué)層或電機(jī)電流環(huán)。但是你把運(yùn)動(dòng)學(xué)模型下的滑模設(shè)計(jì)邏輯理清后再去看“滑模變結(jié)構(gòu)控制”的經(jīng)典文獻(xiàn)很多符號(hào)就不會(huì)那么嚇人了。比如文獻(xiàn)里的 (u u_{eq} u_{sw})等效控制項(xiàng)在運(yùn)動(dòng)學(xué)級(jí)就對(duì)應(yīng)把 (s) 的導(dǎo)數(shù)置零求出的控制量切換項(xiàng)對(duì)應(yīng) (\eta \text{sgn}(s))。這套對(duì)應(yīng)關(guān)系搞明白滑??刂凭退阏嬲腴T了。最后再分享一個(gè)小技巧仿真結(jié)束后用MATLAB命令窗口運(yùn)行plot(logsout)可以快速查看所有記錄信號(hào)。如果你準(zhǔn)備寫報(bào)告或論文建議把誤差均方根值也計(jì)算一下用rms(e_x)就能得到這個(gè)指標(biāo)比肉眼觀察更有說(shuō)服力。按照上面的步驟搭好模型參數(shù)可以先按我給的初始值跑一遍然后再改動(dòng)各項(xiàng)參數(shù)觀察效果。相信我親手調(diào)過(guò) (s) 曲線之后“滑?!边@兩個(gè)字就再也不會(huì)讓你犯怵了。