---
# System prepended metadata

title: Carsim Driver-in-the-loop 計畫
tags: [carsim, 技術筆記]

---

# 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 裡面不要放東西就好了
:::