# Carsim Driver-in-the-loop 計畫 本計畫使用羅技的 Pro 方向盤與踏板,讓 FSAE 的車手能夠在外部控制我們在 carsim 中建立的車輛模型與賽道,讓我在設計初期可以測試不同車輛參數的影響 ### 配置 - 方向盤與油門、煞車踏板:Logitech Pro Racing Wheel & Pedal - Carsim 2024.0 - Matlab R2023B ### 參考資料 - [Using Simulink with CarSim, TruckSim, and BikeSim](https://www.youtube.com/watch?v=YQVUmVMtP3U) - [基于MATLAB\simulink和carsim的联合仿真](https://blog.csdn.net/m0_73134033/article/details/129669206) - [Carsim-实时仿真的动画同步问题](https://blog.csdn.net/DSK_981029/article/details/122424885) - [https://zhuanlan.zhihu.com/p/18107563960](https://zhuanlan.zhihu.com/p/18107563960) - [Formula Student Driver-in-the-Loop Simulator Using Simulink and Unreal Engine](https://www.mathworks.com/videos/formula-student-driver-in-the-loop-simulator-using-simulink-and-unreal-engine-1736319381271.html) ## 設定畫面 先做一台可以跑的車出來,有了之後按上面的 Duplicate 複製一份。如果有畫 preview points 的記得拿掉,不然會報奇怪的錯誤,詳情看最後面的 Q2 ![image](https://hackmd.io/_uploads/SJiHclH3lg.png) 最後設定完的畫面如下,主要變動的東西有 1. Model 換成 Simulink 2. Procedure 裡面用來換賽道和把 carsim 內建的控制移除 3. 啟用 Live video 與設定模擬採樣率 ![image](https://hackmd.io/_uploads/SJAh5gH2xe.png) ### 設定 Models: Simulink 頁面 把 Run Control 的 Models 改成 `Models: Simulink` ![image](https://hackmd.io/_uploads/B1SS-_Xhel.png) 選擇 `[Link to New Dataset]` ![image](https://hackmd.io/_uploads/Skg2bOQ2ex.png) ![image](https://hackmd.io/_uploads/ByQMzOX2gg.png) 設定 Import/Export Channels:Import 是要從 simulink 給 carsim 的資料,通常是方向盤、油門等控制。Export 是要從 carsim 給 simulink 的資料,如果不需要可以不甜。 ![image](https://hackmd.io/_uploads/ry-mOeB2xg.png) 設定 Import/Export Channels 時,上面會需要選擇要跑哪個測試,這邊選擇在最一開始複製出來的那一份 ![image](https://hackmd.io/_uploads/BkbK4umnxe.png) 這邊設定 Import Channek,選擇要輸入油門、煞車和方向盤角度。Mode 設定成 replace 表示用 simulink 取代 carsim 原有的數值 ![image](https://hackmd.io/_uploads/ryPleJV2ge.png) 設定 Simulink 檔案位置,如果沒有 simulink 檔案的話,可以開 Matlab 的 simulink,建立一個空檔案存檔,然後把檔案路徑放在這裡。阿最好是找個安全的地方存起來,不要和我一樣放在 Download ![image](https://hackmd.io/_uploads/rJPSium2el.png) ### 設定 Procedure 創一個新的 procedure, 把 (1) 的地方清空,(2) 選擇 run forever ![image](https://hackmd.io/_uploads/HkCzteBnxe.png) ## Simulink 環節 ### 配置 點 `Send to Simulink` 應該會開啟 Simulink 的畫面 ![image](https://hackmd.io/_uploads/HkYfqO72el.png) Simulink 畫面如下 ![image](https://hackmd.io/_uploads/rk1pnumnll.png) 點上面的 `Library Browser` 會跑出左邊的側欄,這邊可以看到 CarSim 的東西 ![image](https://hackmd.io/_uploads/SJNPTum3xg.png) 把 `Carsim S-Functino` 拖出來,點兩下,在 Simfile name 輸入 simfile.sim 後點 ok。 ![image](https://hackmd.io/_uploads/HkeRhpOm3eg.png) ![image](https://hackmd.io/_uploads/rkOCaOX2lg.png) 先隨便拉一些東西測試,一樣從 Library Browser 拉出來。方塊是 constant,黑色左邊三個輸入右邊一個輸出的是 Mux,順序記得看當初在 Import Channels 的設定。 ![image](https://hackmd.io/_uploads/rkuds9Q3gx.png) ![image](https://hackmd.io/_uploads/BJgNeyVhgx.png) 要跑模擬,直接在 carsim 裡面點 Run Now,應該就會跳出 Live video 的畫面 + 開始跑。 ![image](https://hackmd.io/_uploads/Syz-3eShgg.png) ### Logitech 方向盤 使用 [Simulation 3D Joystick](https://www.mathworks.com/help/sl3d/simulation3djoystick.html) 這個東東,需要下載 Simulink 3D simulation 的套件 雙擊可以設定裡面的 port,這個可以從 0 開始往上試,直到轉方向盤會有數值變化。這邊可以使用 `Display` 這個 Block 看數值。 ![image](https://hackmd.io/_uploads/rkzuf0Q2xe.png) ![image](https://hackmd.io/_uploads/SJ-8z0Q3ex.png) 然後就開心寫外部方向盤、油門與煞車到 carsim 輸入的對應關係 ![image](https://hackmd.io/_uploads/HyUYRgH3ee.png) ## Simulation Pace 設定這個讓模擬的時間速度和現實一樣,不然模擬的時間會跑得比現實還要快超過五倍以上 ![image](https://hackmd.io/_uploads/HJY_S-Engx.png) ![image](https://hackmd.io/_uploads/rklcHWNhgl.png) ## 設置 live video ![image](https://hackmd.io/_uploads/HJ8eO0mnlg.png) ![image](https://hackmd.io/_uploads/B1FbOCQ2lg.png) 要跑的話點上面的 Sent to Simulink 會跳出 Live Video + Simulink 的視窗,點 Run Now 開始模擬 ![image](https://hackmd.io/_uploads/BJGpJbSnll.png) ![image](https://hackmd.io/_uploads/BJ_hekN2lx.png) # 遇到的問題 :::spoiler Q1: 點 `Send to Simulink` 時,跑出 Matlab not found 的錯誤,但電腦上有 Matlab ![image](https://hackmd.io/_uploads/S1_Twdmneg.png) A1: 解決方式:在上方 Tools -> Select MATLAB Version 選擇電腦有的 Matlab 版本。車隊電腦 2023B 的 Library 比較齊全,建議用他。參考 [Carsim无法与Simulink联合仿真的解决办法](https://blog.csdn.net/weixin_44884651/article/details/108202511) ![image](https://hackmd.io/_uploads/B11MZRQ2ge.png) ::: :::spoiler Q2: 在 Simulink 按 Run 的時候出現 "X_DM_1" 為定義的錯誤訊息 **Error reported by S-function 'vs_sf' in 'driver_in_the_loop/CarSim S-Function':** Failed to start Solver: a symbolic expression contains the symbol "X_DM_1" and it is not recognized. Either you have mis-spelled the name, or the parameter or variable has not been defined yet. If this is the name of a new parameter or variable, please check the order in which your VS commands were sent to the VS Math Model. ![image](https://hackmd.io/_uploads/Hyn5gt7hll.png) 把 Run Control 從 Simulink 換回 Run Math Model 還是有一樣的錯,看起來是 Carsim 設定的問題。 把 Procedure -> Steering 那邊加回去就不會有錯誤了,看[CarSim仿真快速入门(十一)—驾驶员模型(1)] 雖然這樣可以跑,但是 carsim 裡面的轉向就會使用 steering 的設定,而非 simulink 的輸入 (http://www.360doc.com/content/20/1209/13/72814757_950375321.shtml)說 `X_DM_1` 和轉向有關 ![image](https://hackmd.io/_uploads/Symv85mnxg.png) 其實可以,在 Run Control with Simulink 的 Import Channels 子裡面要選擇和 steering 設定一樣的變數,並且選擇 Replace。 ![image](https://hackmd.io/_uploads/H1hz55Qnge.png) 更:是畫 preview points 的這個東西在搞,把他拿掉就好了,不需要設定 Procedure 裡面的 steering control ![image](https://hackmd.io/_uploads/HJJntxSngl.png) ::: :::spoiler Q3: The run stopped at T=XXX because S and L values... ![image](https://hackmd.io/_uploads/BJO2h572xg.png) 當初在用的是時候,因為有 Q2 的問題,所以有加入 Steering: Path follower,這個東西會計算要往賽道上的哪的點前進,但如果是在很直的直角彎或是奇怪的地方,算這個的東西就會出錯。Procedure: Steering 裡面不要放東西就好了 :::