# 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

最後設定完的畫面如下,主要變動的東西有
1. Model 換成 Simulink
2. Procedure 裡面用來換賽道和把 carsim 內建的控制移除
3. 啟用 Live video 與設定模擬採樣率

### 設定 Models: Simulink 頁面
把 Run Control 的 Models 改成 `Models: Simulink`

選擇 `[Link to New Dataset]`


設定 Import/Export Channels:Import 是要從 simulink 給 carsim 的資料,通常是方向盤、油門等控制。Export 是要從 carsim 給 simulink 的資料,如果不需要可以不甜。

設定 Import/Export Channels 時,上面會需要選擇要跑哪個測試,這邊選擇在最一開始複製出來的那一份

這邊設定 Import Channek,選擇要輸入油門、煞車和方向盤角度。Mode 設定成 replace 表示用 simulink 取代 carsim 原有的數值

設定 Simulink 檔案位置,如果沒有 simulink 檔案的話,可以開 Matlab 的 simulink,建立一個空檔案存檔,然後把檔案路徑放在這裡。阿最好是找個安全的地方存起來,不要和我一樣放在 Download

### 設定 Procedure
創一個新的 procedure, 把 (1) 的地方清空,(2) 選擇 run forever

## Simulink 環節
### 配置
點 `Send to Simulink` 應該會開啟 Simulink 的畫面

Simulink 畫面如下

點上面的 `Library Browser` 會跑出左邊的側欄,這邊可以看到 CarSim 的東西

把 `Carsim S-Functino` 拖出來,點兩下,在 Simfile name 輸入 simfile.sim 後點 ok。


先隨便拉一些東西測試,一樣從 Library Browser 拉出來。方塊是 constant,黑色左邊三個輸入右邊一個輸出的是 Mux,順序記得看當初在 Import Channels 的設定。


要跑模擬,直接在 carsim 裡面點 Run Now,應該就會跳出 Live video 的畫面 + 開始跑。

### Logitech 方向盤
使用 [Simulation 3D Joystick](https://www.mathworks.com/help/sl3d/simulation3djoystick.html) 這個東東,需要下載 Simulink 3D simulation 的套件
雙擊可以設定裡面的 port,這個可以從 0 開始往上試,直到轉方向盤會有數值變化。這邊可以使用 `Display` 這個 Block 看數值。


然後就開心寫外部方向盤、油門與煞車到 carsim 輸入的對應關係

## Simulation Pace
設定這個讓模擬的時間速度和現實一樣,不然模擬的時間會跑得比現實還要快超過五倍以上


## 設置 live video


要跑的話點上面的 Sent to Simulink 會跳出 Live Video + Simulink 的視窗,點 Run Now 開始模擬


# 遇到的問題
:::spoiler Q1: 點 `Send to Simulink` 時,跑出 Matlab not found 的錯誤,但電腦上有 Matlab

A1: 解決方式:在上方 Tools -> Select MATLAB Version 選擇電腦有的 Matlab 版本。車隊電腦 2023B 的 Library 比較齊全,建議用他。參考 [Carsim无法与Simulink联合仿真的解决办法](https://blog.csdn.net/weixin_44884651/article/details/108202511)

:::
:::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.

把 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` 和轉向有關

其實可以,在 Run Control with Simulink 的 Import Channels 子裡面要選擇和 steering 設定一樣的變數,並且選擇 Replace。

更:是畫 preview points 的這個東西在搞,把他拿掉就好了,不需要設定 Procedure 裡面的 steering control

:::
:::spoiler Q3: The run stopped at T=XXX because S and L values...

當初在用的是時候,因為有 Q2 的問題,所以有加入 Steering: Path follower,這個東西會計算要往賽道上的哪的點前進,但如果是在很直的直角彎或是奇怪的地方,算這個的東西就會出錯。Procedure: Steering 裡面不要放東西就好了
:::