化學(xué)習(xí)的QUBE-Servo 2旋轉(zhuǎn)倒立擺控制)
簡介面向Quanser QUBE-Servo 2硬件平臺(tái)與MATLAB使用者的旋轉(zhuǎn)倒立擺強(qiáng)化學(xué)習(xí)方案包聚焦DDPG與SAC兩類算法解決真實(shí)實(shí)驗(yàn)臺(tái)上的平衡控制建模、訓(xùn)練和部署問題可廣泛應(yīng)用于控制類課程設(shè)計(jì)、研究生科研和機(jī)器人競賽準(zhǔn)備等場景。壓縮包共16個(gè)文件整體大小1.74MB包含三套Simulink模型slx分別對(duì)應(yīng)仿真、硬件在環(huán)和QLabs虛擬平臺(tái)場景還包括策略參數(shù)文件mat、MATLAB腳本m、MLX交互式配置向?qū)б约癙ython輔助腳本、結(jié)果圖和授權(quán)說明等便于按模塊查閱和復(fù)用。已有32人學(xué)習(xí)。包內(nèi)提供從仿真環(huán)境到硬件在環(huán)再到QLabs虛擬平臺(tái)的三套完整模型用戶可按需切換預(yù)訓(xùn)練策略文件可直接加載運(yùn)行省去從頭訓(xùn)練的時(shí)間SAC策略裁剪腳本用于精簡網(wǎng)絡(luò)層以適配嵌入式部署參數(shù)配置腳本和評(píng)估工具則支持快速調(diào)參與效果驗(yàn)證。整套方案注重工程實(shí)用性從環(huán)境搭建到策略部署均有清晰路徑適合具備一定控制或強(qiáng)化學(xué)習(xí)基礎(chǔ)的高校學(xué)生、科研人員及競賽團(tuán)隊(duì)快速上手。1. 項(xiàng)目整體思路與方案選型1.1 硬件平臺(tái)與問題定義Quanser QUBE-Servo 2 是很多高??刂茖?shí)驗(yàn)室里常見的旋轉(zhuǎn)倒立擺平臺(tái)。相比傳統(tǒng)的一維直線倒立擺它的結(jié)構(gòu)更緊湊由直流電機(jī)驅(qū)動(dòng)一個(gè)水平旋轉(zhuǎn)臂臂末端鉸接一根擺桿電機(jī)轉(zhuǎn)動(dòng)時(shí)帶動(dòng)擺桿在豎直平面內(nèi)運(yùn)動(dòng)。控制目標(biāo)非常直接讓擺桿從自然下垂位置被甩起來并在豎直向上的倒立位置穩(wěn)定住同時(shí)讓旋轉(zhuǎn)臂保持在某個(gè)參考角度附近。這個(gè)系統(tǒng)最大的特點(diǎn)是“看著簡單控制起來不簡單”。電機(jī)軸角度、擺桿角度、對(duì)應(yīng)的角速度這四個(gè)狀態(tài)變量構(gòu)成了一個(gè)典型的欠驅(qū)動(dòng)非線性系統(tǒng)——你只有電機(jī)一個(gè)輸入?yún)s要同時(shí)管住兩個(gè)旋轉(zhuǎn)自由度。而且系統(tǒng)還帶有電機(jī)摩擦、擺桿阻尼、信號(hào)量化誤差等一大堆“不干凈”的因素。用經(jīng)典控制方法做倒立擺LQR、極點(diǎn)配置、PID這些方法都能跑但都有一個(gè)共性前提你必須先建立一個(gè)相對(duì)精確的數(shù)學(xué)模型然后再基于模型去設(shè)計(jì)控制器。這次實(shí)現(xiàn)包換了一條路直接用強(qiáng)化學(xué)習(xí)來做。核心思路是不給控制器顯式的數(shù)學(xué)模型而是把“維持平衡”這件事變成一個(gè)試錯(cuò)學(xué)習(xí)任務(wù)讓智能體在仿真環(huán)境中不斷嘗試控制策略通過獎(jiǎng)勵(lì)信號(hào)學(xué)會(huì)“什么樣的電壓輸出能讓擺桿穩(wěn)在豎直位置”。這個(gè)思路本身不新但在MATLAB的強(qiáng)化學(xué)習(xí)工具箱環(huán)境下能不能順利跑通、能不能從仿真遷移到實(shí)物才是真正值得寫一講的經(jīng)驗(yàn)。1.2 為什么選擇強(qiáng)化學(xué)習(xí)線路做控制的人第一個(gè)反應(yīng)通常是倒立擺這種教科書級(jí)系統(tǒng)LQR就夠用了為什么還要上強(qiáng)化學(xué)習(xí)我的看法是兩者解決的不是同一個(gè)問題。LQR要求系統(tǒng)模型已知或者能被線性化QUBE-Servo 2在教學(xué)場景下沒問題但如果你把擺桿換成柔性結(jié)構(gòu)、給系統(tǒng)加上未知負(fù)載、或者讓擺桿參數(shù)發(fā)生漂移LQR的重整定成本會(huì)非常高。強(qiáng)化學(xué)習(xí)的思路是把控制器變成一個(gè)“策略網(wǎng)絡(luò)”它的輸入是傳感器觀測輸出是控制指令中間這一大坨非線性映射完全靠數(shù)據(jù)去逼近——不需要精確模型只要仿真環(huán)境足夠接近實(shí)物策略就能學(xué)到。當(dāng)然強(qiáng)化學(xué)習(xí)也有自己的代價(jià)訓(xùn)練時(shí)間、超參數(shù)調(diào)優(yōu)、獎(jiǎng)勵(lì)函數(shù)設(shè)計(jì)每一個(gè)環(huán)節(jié)都能讓人反復(fù)折騰。這個(gè)項(xiàng)目選擇MATLAB而不是Python主要原因有三個(gè)。第一QUBE-Servo 2官方提供了完整的Simulink模型和QUARC實(shí)時(shí)控制接口MATLAB里可以直接用帶硬件支持的Simulink模型跑強(qiáng)化學(xué)習(xí)環(huán)境不需要像Python那樣自己寫底層通信。第二Reinforcement Learning Toolbox提供了現(xiàn)成的DDPG、TD3、SAC、PPO等算法實(shí)現(xiàn)不用自己從零寫Actor-Critic網(wǎng)絡(luò)。第三從仿真到實(shí)物部署時(shí)MATLAB生成的代碼可以直接部署到Speedgoat或兼容實(shí)時(shí)目標(biāo)機(jī)遷移鏈路很完整。1.3 算法選型的對(duì)比與取舍QUBE-Servo 2的控制動(dòng)作是電機(jī)電壓或者電流指令這是一個(gè)連續(xù)動(dòng)作空間問題??蛇x的主流算法有DDPG、TD3、SAC、PPO。我在這套實(shí)現(xiàn)包里主要用TD3和SAC做了對(duì)比簡單說一下結(jié)論。算法動(dòng)作噪聲處理樣本效率調(diào)參難度實(shí)物部署友好度DDPG簡單高斯噪聲中等較高容易發(fā)散較好TD3目標(biāo)策略平滑較高中等較好SAC熵正則化探索高中等中等PPO重要性采樣裁剪低較低好但樣本效率差最終選TD3作為默認(rèn)方案原因很實(shí)際QUBE-Servo 2的擺桿在仿真環(huán)境里可以被精確建模樣本效率高的算法能更快收斂而在實(shí)物遷移時(shí)TD3只有一個(gè)確定性策略網(wǎng)絡(luò)部署邏輯更簡單不會(huì)像SAC那樣因?yàn)殡S機(jī)策略在實(shí)物上產(chǎn)生不必要的抖動(dòng)。如果你只想快速看效果DDPG也能跑通但收斂穩(wěn)定性確實(shí)差一個(gè)檔次。2. 環(huán)境搭建與狀態(tài)動(dòng)作設(shè)計(jì)2.1 MATLAB/Simulink環(huán)境配置這個(gè)項(xiàng)目依賴的軟件環(huán)境有三塊MATLAB本體建議R2022b及以上舊版本在強(qiáng)化學(xué)習(xí)工具箱的接口上有差異、Simulink、Reinforcement Learning Toolbox以及QUARCQuanser的實(shí)時(shí)控制工具包實(shí)物實(shí)驗(yàn)需要。如果只做仿真不碰實(shí)物QUARC可以不裝但需要用QUBE-Servo 2官方提供的Simscape模型替代。第一件要做的事是獲取QUBE-Servo 2的Simulink模型文件。Quanser官網(wǎng)的學(xué)習(xí)資源庫里提供了“QUBE-Servo 2 Modeling and Control”系列文件里面有完整的非線性模型和線性化模型。拿到模型后先跑一遍開環(huán)仿真確認(rèn)擺桿從垂直下垂位置開始的響應(yīng)曲線正常。這一步很多人跳過直接進(jìn)強(qiáng)化學(xué)習(xí)結(jié)果訓(xùn)練半天發(fā)現(xiàn)環(huán)境里角度信號(hào)本身就有問題白費(fèi)時(shí)間。用強(qiáng)化學(xué)習(xí)工具箱的rlSimulinkEnv函數(shù)把Simulink模型包裝成強(qiáng)化學(xué)習(xí)環(huán)境時(shí)需要明確三個(gè)接口觀測信號(hào)從哪取、動(dòng)作信號(hào)從哪進(jìn)、終止條件怎么判定。我習(xí)慣的做法是把觀測信號(hào)通過一個(gè)Bus Selector匯總到一個(gè)向量端口動(dòng)作端口直接連到電機(jī)的電壓輸入。終止條件的設(shè)置比較關(guān)鍵不能把“擺桿掉落”直接作為終止否則智能體會(huì)學(xué)到“快速傾倒”這種規(guī)避行為而是要設(shè)計(jì)一個(gè)平衡區(qū)域出區(qū)域才算失敗。2.2 狀態(tài)空間與觀測變量設(shè)計(jì)QUBE-Servo 2 有四個(gè)核心狀態(tài)電機(jī)軸角度、電機(jī)軸角速度、擺桿角度、擺桿角速度。但直接把這四個(gè)原始量喂給強(qiáng)化學(xué)習(xí)智能體效果往往不太理想原因是角度單位弧度和角速度數(shù)值范圍差了一個(gè)數(shù)量級(jí)網(wǎng)絡(luò)訓(xùn)練時(shí)梯度容易不穩(wěn)定。我在實(shí)現(xiàn)包里做了一組觀測變換把觀測向量設(shè)計(jì)為obs [theta_motor * scale_angle, theta_pend * scale_angle, omega_motor * scale_angular_velocity, omega_pend * scale_angular_velocity, sin(theta_pend), cos(theta_pend)]加sin和cos分量是強(qiáng)化學(xué)習(xí)倒立擺任務(wù)里一個(gè)非常實(shí)用的技巧。擺桿角度在豎直向上附近時(shí)角度值本身在0附近擺動(dòng)但如果擺桿翻轉(zhuǎn)一圈角度會(huì)發(fā)生跳躍直接用原始角度會(huì)讓網(wǎng)絡(luò)很難理解“角度是循環(huán)的”這一事實(shí)。而正弦余弦永遠(yuǎn)連續(xù)相當(dāng)于給了網(wǎng)絡(luò)一個(gè)“角度位置在哪”的穩(wěn)定編碼。有一個(gè)容易踩的坑電機(jī)軸角度是否要加入觀測取決于控制目標(biāo)。如果只要求擺桿倒立穩(wěn)定電機(jī)軸角度可以不進(jìn)觀測但如果你希望旋轉(zhuǎn)臂同時(shí)鎖定在某個(gè)固定角度比如0度那這個(gè)狀態(tài)必須進(jìn)觀測否則智能體沒法學(xué)到“回中”行為。這個(gè)實(shí)現(xiàn)包的目標(biāo)是“擺動(dòng)起擺穩(wěn)定平衡電機(jī)軸回中”所以觀測里包含了電機(jī)角度。2.3 動(dòng)作空間與執(zhí)行器限制動(dòng)作空間的設(shè)置直接跟物理設(shè)備綁定。QUBE-Servo 2的電機(jī)標(biāo)稱電壓范圍是±6V峰值可能到±10V但長時(shí)間跑建議限制在±6V以內(nèi)電機(jī)線圈會(huì)過熱。在強(qiáng)化學(xué)習(xí)環(huán)境里動(dòng)作量需要?dú)w一化處理——網(wǎng)絡(luò)輸出一個(gè)范圍在[-1, 1]的信號(hào)然后通過一個(gè)Saturation模塊映射到實(shí)際電壓。這里有一個(gè)我做第一版時(shí)犯過的錯(cuò)直接用網(wǎng)絡(luò)輸出作為電壓指令沒有做平滑處理。強(qiáng)化學(xué)習(xí)策略網(wǎng)絡(luò)產(chǎn)生的動(dòng)作會(huì)有高頻抖動(dòng)前期探索階段尤其嚴(yán)重。這種抖動(dòng)的電壓信號(hào)直接作用在直流電機(jī)上會(huì)導(dǎo)致電流尖峰還可能讓電機(jī)的編碼器讀到被噪聲污染的角速度信號(hào)。后來我在動(dòng)作輸出路徑上加了一階低通濾波時(shí)間常數(shù)選在0.02秒左右抖動(dòng)問題明顯改善。另外要注意如果仿真模型里電機(jī)飽和特性沒有建模訓(xùn)練出來的策略很可能會(huì)學(xué)到“加大電壓到極限值”的暴力策略在實(shí)物上直接觸發(fā)電流保護(hù)。所以環(huán)境模型里必須包含飽和模塊最好還加上電流限制邏輯讓強(qiáng)化學(xué)習(xí)從一開始就知道“動(dòng)作是有代價(jià)的”。2.4 獎(jiǎng)勵(lì)函數(shù)設(shè)計(jì)從稀疏到密集獎(jiǎng)勵(lì)函數(shù)是強(qiáng)化學(xué)習(xí)項(xiàng)目里最考驗(yàn)“手工設(shè)計(jì)能力”的地方。網(wǎng)上一搜“強(qiáng)化學(xué)習(xí)遇到錯(cuò)誤獎(jiǎng)勵(lì)”能找到大量討論——獎(jiǎng)勵(lì)函數(shù)沒寫好智能體訓(xùn)練不收斂是小事更糟的是模型“自以為是”地學(xué)到了完成任務(wù)但行為完全錯(cuò)誤的對(duì)策。倒立擺任務(wù)最樸素的獎(jiǎng)勵(lì)函數(shù)是位置誤差加權(quán)R -(theta_pend^2 0.1 * omega_pend^2 0.05 * theta_motor^2 0.01 * omega_motor^2)這個(gè)設(shè)計(jì)思路直接來源于LQR的代價(jià)函數(shù)——把狀態(tài)量的二次型加權(quán)和作為負(fù)獎(jiǎng)勵(lì)。這樣做的好處是每個(gè)時(shí)刻都有反饋獎(jiǎng)勵(lì)是密集的智能體不會(huì)陷入真空探索期。但問題也隨之而來如果四個(gè)狀態(tài)量的權(quán)重分配不合理智能體會(huì)發(fā)現(xiàn)“犧牲擺桿角度來減小電機(jī)角度誤差”很劃算學(xué)成一個(gè)偏心也不平衡的控制器。我建議的做法是開始訓(xùn)練時(shí)先把電機(jī)回中的權(quán)重拉低讓智能體優(yōu)先學(xué)會(huì)“把擺桿立起來”等擺桿穩(wěn)定后再把回中權(quán)重逐步提高。這種課程式的獎(jiǎng)勵(lì)調(diào)度curriculum reward shaping實(shí)現(xiàn)起來并不復(fù)雜——在Simulink里加一個(gè)隨時(shí)間變化的權(quán)重模塊或者在MATLAB腳本里分段更新獎(jiǎng)勵(lì)函數(shù)參數(shù)都可以。3. 訓(xùn)練實(shí)現(xiàn)與核心環(huán)節(jié)3.1 Actor-Critic網(wǎng)絡(luò)結(jié)構(gòu)與初始化Reinforcement Learning Toolbox里創(chuàng)建TD3智能體時(shí)網(wǎng)絡(luò)結(jié)構(gòu)通過createTD3Agent或rlTD3Agent指定。我最終跑通的網(wǎng)絡(luò)結(jié)構(gòu)如下% 觀測維度64個(gè)狀態(tài) sin/cos obsDim 6; actDim 1; % Actor網(wǎng)絡(luò)兩層隱藏層每層256個(gè)神經(jīng)元 actorNetwork [ featureInputLayer(obsDim, Normalization, none, Name, obs) fullyConnectedLayer(256, Name, fc1) reluLayer(Name, relu1) fullyConnectedLayer(256, Name, fc2) reluLayer(Name, relu2) fullyConnectedLayer(actDim, Name, action) tanhLayer(Name, tanh) ]; % Critic網(wǎng)絡(luò)輸入包含觀測和動(dòng)作 criticNetwork [ featureInputLayer(obsDim, Normalization, none, Name, obs) fullyConnectedLayer(256, Name, fc1) reluLayer(Name, relu1) fullyConnectedLayer(256, Name, fc2) reluLayer(Name, relu2) fullyConnectedLayer(1, Name, qvalue) ];Actorn網(wǎng)絡(luò)最后一層接tanh輸出范圍自動(dòng)限制在[-1, 1]正好和前面說的歸一化動(dòng)作空間匹配省去了額外裁剪。兩層256個(gè)神經(jīng)元的規(guī)模對(duì)于這類低維控制問題來說已經(jīng)足夠再大反而容易過擬合仿真環(huán)境里的特殊噪聲。有個(gè)小細(xì)節(jié)Critic網(wǎng)絡(luò)的標(biāo)準(zhǔn)做法是把動(dòng)作和觀測拼接后一起輸入網(wǎng)絡(luò)但TensorFlow和MATLAB的實(shí)現(xiàn)細(xì)節(jié)略有不同。MATLAB的rlQValueFunction支持同時(shí)接收觀測和動(dòng)作輸入所以Critic網(wǎng)絡(luò)里觀測和動(dòng)作是分開兩個(gè)輸入分支的。我一開始按PyTorch的習(xí)慣把動(dòng)作拼到觀測里作為特征輸入結(jié)果訓(xùn)練速度明顯變慢且不穩(wěn)定——雖然理論上可行但工具箱對(duì)分叉輸入的處理做了優(yōu)化順著官方文檔來更穩(wěn)。3.2 訓(xùn)練超參數(shù)與收斂判斷TD3算法在MATLAB工具箱里的關(guān)鍵超參數(shù)如下這是我調(diào)了很多輪之后穩(wěn)定下來的配置參數(shù)數(shù)值說明采樣時(shí)間Ts0.005s200Hz控制頻率QUBE-Servo 2支持折扣因子0.99標(biāo)準(zhǔn)設(shè)置兼顧短期和長期獎(jiǎng)勵(lì)經(jīng)驗(yàn)池容量200000足夠容納多次完整訓(xùn)練回合最小批量256太大訓(xùn)練慢太小不穩(wěn)定Actor噪聲0.1訓(xùn)練時(shí)動(dòng)作探索噪聲標(biāo)準(zhǔn)差目標(biāo)噪聲0.2目標(biāo)策略平滑噪聲噪聲裁剪范圍[-0.5, 0.5]防止目標(biāo)動(dòng)作偏移過大學(xué)習(xí)率3e-4Actor/Critic統(tǒng)一軟更新系數(shù)τ0.005目標(biāo)網(wǎng)絡(luò)更新平滑程度訓(xùn)練循環(huán)我一般設(shè)2000個(gè)回合每個(gè)回合設(shè)2000步10秒仿真時(shí)長。QUBE-Servo 2的實(shí)物起擺過程一般不超過3秒所以10秒的回合長度足夠包含完整的“起擺-穩(wěn)定”過程。一個(gè)值得注意的細(xì)節(jié)是Simulink環(huán)境里的強(qiáng)化學(xué)習(xí)訓(xùn)練速度很受采樣時(shí)間和仿真步長的影響。如果把仿真步長設(shè)成固定步長0.005秒2000回合需要跑很長時(shí)間。我的做法是在訓(xùn)練階段用一個(gè)稍大的控制周期比如0.01秒快速驗(yàn)證算法邏輯等確認(rèn)策略能收斂了再把采樣時(shí)間改回0.005秒做精細(xì)訓(xùn)練。這樣前期迭代效率高后期精度也夠。如何判斷訓(xùn)練真正收斂而不是假收斂我總結(jié)了三個(gè)信號(hào)第一訓(xùn)練曲線里的平均獎(jiǎng)勵(lì)值連續(xù)100回合不再上升第二在固定初始狀態(tài)下策略能穩(wěn)定完成“起擺平衡”的完整流程第三把訓(xùn)練好的策略放到一個(gè)“沒訓(xùn)練過的初始擺角”下測試仍然能恢復(fù)平衡——這個(gè)泛化性測試比獎(jiǎng)勵(lì)曲線更可靠。3.3 仿真驗(yàn)證與評(píng)估指標(biāo)訓(xùn)練完成后先把Agent導(dǎo)出% 保存訓(xùn)練好的智能體 save(trainedAgent.mat, agent); % 在仿真環(huán)境中評(píng)估 evalOpts rlEvaluationOptions(NumEpisodes, 10, ... MaxSteps, 2000, ... UseParallel, false); results evaluate(agent, env, evalOpts);評(píng)估時(shí)的觀察重點(diǎn)不是獎(jiǎng)勵(lì)值本身而是時(shí)域響應(yīng)曲線。我會(huì)畫三張圖電機(jī)角度隨時(shí)間變化、擺桿角度隨時(shí)間變化、電壓輸出隨時(shí)間變化。如果擺桿角度能穩(wěn)定在±5度以內(nèi)電壓噪聲不明顯說明策略質(zhì)量可以接受。不過仿真能過線不意味著實(shí)物就沒問題。QUBE-Servo 2的Simulink模型忽略了很多高頻動(dòng)力學(xué)特性比如電刷換向的轉(zhuǎn)矩脈動(dòng)、編碼器量化誤差、電壓源的內(nèi)阻壓降。仿真里的策略拿到實(shí)物上一開始大概率會(huì)出現(xiàn)“小幅抖動(dòng)但能立住”的現(xiàn)象這只是運(yùn)氣好。真正的考驗(yàn)是模型不確定性比如擺桿重心不完全在模型標(biāo)稱位置、摩擦力矩方向隨機(jī)變化等。我強(qiáng)烈建議做一輪域隨機(jī)化domain randomization——在仿真模型的參數(shù)里加入±10%的隨機(jī)擾動(dòng)比如擺桿慣性矩、阻尼系數(shù)、電機(jī)力矩常數(shù)讓策略見到更多樣的環(huán)境。這樣再遷移到實(shí)物成功率會(huì)顯著提升。4. 常見問題與排查技巧實(shí)錄4.1 訓(xùn)練發(fā)散最常見的“獎(jiǎng)勵(lì)黑客”問題我在早期版本里遇到過一次特別典型的發(fā)散問題訓(xùn)練到200多回合時(shí)獎(jiǎng)勵(lì)突然從-50跳到-3000智能體開始“原地瘋狂翻轉(zhuǎn)擺桿”。排查后發(fā)現(xiàn)問題出在終止條件的設(shè)置上。我把終止條件設(shè)置成了“擺桿角度超過60度即終止”但在擺動(dòng)起擺階段擺桿角度在某個(gè)瞬間會(huì)超過60度這時(shí)回合被強(qiáng)制終止智能體獲得的獎(jiǎng)勵(lì)不僅低還會(huì)把這種“早死”與狀態(tài)關(guān)聯(lián)起來。最終學(xué)到的策略變成了快速晃動(dòng)機(jī)電臂讓擺桿獲得一個(gè)很大的初速度甩過去。解決方法是把終止條件改成“擺桿角度在平衡位置附近保持超過10秒才終止”其余情況都不終止只是給出負(fù)獎(jiǎng)勵(lì)。這就逼著智能體必須在完整回合內(nèi)學(xué)會(huì)“起擺-穩(wěn)定”的串聯(lián)動(dòng)作而不是投機(jī)取巧。這個(gè)改法看似簡單但直接決定了訓(xùn)練能不能收斂。4.2 獎(jiǎng)勵(lì)函數(shù)設(shè)計(jì)錯(cuò)誤局部最優(yōu)陷阱另一個(gè)常見的坑是獎(jiǎng)勵(lì)函數(shù)里的權(quán)重失衡。我試過一版把電機(jī)回中權(quán)重設(shè)得特別高的獎(jiǎng)勵(lì)函數(shù)結(jié)果智能體學(xué)成了“寧可讓擺桿倒下也要讓電機(jī)歸零”的詭異行為——它在電機(jī)回中后立刻放棄穩(wěn)定擺桿導(dǎo)致擺桿反復(fù)倒下又立起。根本原因是回中獎(jiǎng)勵(lì)在每一時(shí)刻都成了主導(dǎo)項(xiàng)智能體發(fā)現(xiàn)先回正電機(jī)“占便宜”更大。這個(gè)問題的排查思路是分別單獨(dú)評(píng)估獎(jiǎng)勵(lì)函數(shù)里每一項(xiàng)的數(shù)值量級(jí)。用MATLAB的step函數(shù)手動(dòng)跑幾個(gè)回合把每一步的各個(gè)獎(jiǎng)勵(lì)分量都記錄下來算平均值看看哪個(gè)分量占據(jù)了總獎(jiǎng)勵(lì)的90%以上。如果某個(gè)分量完全主導(dǎo)說明其他目標(biāo)的信號(hào)被淹沒了需要調(diào)整權(quán)重。我最后用的權(quán)重比例是擺桿角度:電機(jī)角度:角速度 10:1:1這樣既保障了擺桿平衡這個(gè)最核心的目標(biāo)又不會(huì)讓次要目標(biāo)喧賓奪主。4.3 仿真到實(shí)物的遷移失敗這是這個(gè)項(xiàng)目里最讓人頭疼的一環(huán)。即使仿真里跑得再漂亮實(shí)物上一旦出現(xiàn)以下現(xiàn)象基本可以斷定是遷移問題擺桿在高頻抖動(dòng)但電機(jī)軸溫度飆升策略在起擺階段過于激進(jìn)觸發(fā)電流保護(hù)擺桿穩(wěn)定后持續(xù)有低頻振蕩無法收斂最有效的手段是在仿真環(huán)境里加“不確定性注入”。具體操作很簡單用rng種子在每次回合開始時(shí)隨機(jī)初始化擺桿長度、慣量、電機(jī)力矩常數(shù)讓策略學(xué)到的是一個(gè)魯棒控制策略而不是某個(gè)精確模型的“記憶”。另一個(gè)實(shí)操技巧是在實(shí)物部署前給動(dòng)作輸出加一個(gè)限制變化率模塊。仿真里的電機(jī)模型允許電壓瞬變但實(shí)物的電源和電機(jī)驅(qū)動(dòng)有自己的爬坡率限制過快的電壓變化會(huì)引入噪聲和機(jī)械沖擊。把變化率限制在每步0.5V以內(nèi)可以顯著減少抖動(dòng)。4.4 MATLAB軟件版本的兼容性最后提一個(gè)容易被忽視的問題MATLAB版本。Reinforcement Learning Toolbox在R2021a、R2022b、R2023b之間有一些接口變化比如rlTD3Agent的參數(shù)傳遞方式、rlSimulinkEnv的終止條件函數(shù)格式等。如果你的Simulink模型是用舊版本建的新版本打開后可能會(huì)出現(xiàn)“int等類型不匹配”的錯(cuò)誤。我的建ed建議是項(xiàng)目開始前就確定一個(gè)MATLAB版本整個(gè)開發(fā)過程不隨意升級(jí)。如果確實(shí)需要在新版本里打開舊模型先用upgradeadvisor檢查模型兼容性。另外QUARC工具包和MATLAB版本的對(duì)應(yīng)關(guān)系非常嚴(yán)格裝錯(cuò)版本會(huì)導(dǎo)致Simulink實(shí)時(shí)模塊無法啟動(dòng)這類問題通常不是代碼問題純粹是環(huán)境匹配問題查兼容性矩陣比改代碼更快。5. 個(gè)人的實(shí)操體會(huì)這個(gè)項(xiàng)目做了幾輪迭代我最大的感受是強(qiáng)化學(xué)習(xí)控制倒立擺難點(diǎn)不在算法本身而在“環(huán)境建模的忠實(shí)度”和“獎(jiǎng)勵(lì)函數(shù)設(shè)計(jì)的意圖對(duì)齊”這兩件事上。算法參數(shù)調(diào)來調(diào)去最后發(fā)現(xiàn)影響最大的還是Simulink模型里電機(jī)飽和模塊的參數(shù)和獎(jiǎng)勵(lì)函數(shù)權(quán)重的比例。如果你正準(zhǔn)備在自己的設(shè)備上復(fù)現(xiàn)這個(gè)實(shí)現(xiàn)包我的建議是第一次訓(xùn)練一定要用保守的獎(jiǎng)勵(lì)函數(shù)先跑通完整鏈路再去優(yōu)化穩(wěn)態(tài)性能。不要一上來就追求“又快又穩(wěn)又省電”那會(huì)讓訓(xùn)練過程充滿挫敗感。還有一個(gè)小技巧是訓(xùn)練過程中保持Simulink的仿真加速模式用set_param把仿真模式設(shè)為accelerator能讓訓(xùn)練時(shí)間縮短到原來的三分之一左右這在反復(fù)調(diào)參階段能省下大量時(shí)間。最后再分享一個(gè)細(xì)節(jié)保存模型參數(shù)時(shí)除了保存Agent對(duì)象記得把訓(xùn)練曲線數(shù)據(jù)、超參數(shù)配置、獎(jiǎng)勵(lì)函數(shù)版本都一起存下來。訓(xùn)練配置分散在多個(gè)文件里幾天后你一定會(huì)忘記當(dāng)時(shí)跑的版本是“加了低通濾波”還是“改了終止條件”的。這個(gè)習(xí)慣讓我少走了很多彎路。本文還有配套的精品資源點(diǎn)擊獲取