# OpenMCT 開發筆記
###### tags: `飛控` `地面站`
## 開發環境
### node.js (使用14.19.1版)

### git bash

### 使用vs code編輯

### 安裝虛擬PX4
- [安裝教學](https://docs.px4.io/master/en/dev_setup/dev_env_windows_cygwin.html) 依照網頁內的步驟安裝
1. Download the latest version of the ready-to-use MSI installer from [Github](https://github.com/PX4/PX4-windows-toolchain/releases)
- 最新版(v1.0)還沒有MSI檔,所以使用v0.9版

2. Run it, choose your desired installation location, let it install:

### Python

安裝時,記得要安裝環境
---
---
## 架設OpenMCT
- https://gitlab.lrz.de/lls/vis-frame.git
- https://gitlab.lrz.de/lls/vis-frame/-/wikis/home
1. 打開cmd,輸入"cd 要存取的資料夾"
2. 輸入git clone 網址(網址複製如下圖)

3. 下載完後,輸入cd vis-frame
4. 輸入cd openmct
5. 輸入npm install,開始下載
6. 在下載同時可以開另一個cmd,切換到OpenMCT_Telemetry_server(如下圖)

7. 輸入npm install開始下載,下載完成後可以將cmd視窗關閉
8. 回到openmct的cmd視窗,下載完成後輸入npm start

9. 前往 http://localhost:8080

---
---
## 建立自己的Aircraft
### 1.製作Telemetry_Object

1. 至vis-frame\python_scripts\Telemetry_Object_Generator
2. 編輯Telemetry_Object_Generater.py
3. 將telemetry_object_name改成飛行器的名字
4. 將UDP_PORT改成自己要傳給openmct的port
5. 除了generate_pythonScripts皆改為true
```#python
generate_Dictionary = True
generate_OpenMCT_object = True
generate_server_object = True
generate_pythonScripts = False
```
### 2.下載另一個傳輸腳本
預設產生的傳輸腳本需經過misson planner
[MavSDK ver2.0 連結](https://hackmd.io/q80yrkPCTuitar3Rv8Uf2w)
### 3.執行Telemetry_Object_Generater.py

位置在vis-frame/python_scripts/Telemetry_Object_Generator
將會產生幾個不同的檔案
在openmct/example/飛行器的名字中會有兩個檔案
#### Plugin.js
- Plugin的種類分為三種

更多資訊可以看 [Open MCT Integration Tutorials](https://hackmd.io/@isaPv93jQuix8iD4DT34kQ/Hy9jHYxru)
官方文件: [Github](https://github.com/nasa/openmct-tutorial)
#### dictionary.json
name是在openmct上所顯示的名稱
format是變數的型態
key是在傳輸腳本所用到的變數名稱,因此在選擇變數名稱後須將他寫入python腳本中
如下圖

---
---
## 定義plugin.js
編輯openmct/src/plugin/plugin.js
這個檔案定義了所有openmct要使用的plugin
### 1.檔案位置
在define後輸入plugin的檔案位置

### 2.函式名稱
在function後輸入plugin名稱

### 3.定義函式
```#javasripts
plugins.Aircraft_YEEPlugin = Aircraft_YEEPlugin;
```
將Aircraft_YEE改成自己飛行器的名字

### 4. 將plugin安裝至openmct
編輯openmct/index.html
在程式碼後面添加
```javascript
openmct.install(function install(openmctAPI) {'//......'});
```
eg:
```javascript
openmct.install(openmct.plugins.Aircraft_01Plugin());
openmct.install(openmct.plugins.HistoricalTelemetryPlugin('Aircraft_01.telemetry', '/Aircraft01History/', 'localhost'));
openmct.install(openmct.plugins.RealtimeTelemetryPlugin('Aircraft_01.telemetry', '/Aircraft01Realtime/', 'localhost'));
```
/Aircraft01History/ 為歷史資料
/Aircraft01Realtine/ 為即時資料

### 5. 編輯OpenMCT_Telemetry_Server
#### import由腳本所添加的檔案
到OpenMCT_Telemetry_Server/server.js 傳入檔案
```#javasripts
var Aircraft_YEE = require('./Aircraft_YEE');
```

#### 新增一個變數:
```#javasripts
var aircraftYEE = new Aircraft_YEE;
```
#### 添加連接:
```#javascripts
app.use('/AircraftYEERealtime', realtimeServerAircraftYEE);
app.use('/AircraftYEEHistory', historyServerAircraftYEE);
```

---
---
## 開始測試
### 開啟模擬器(JMavSim)
1. 到PX4的資料夾中開啟run-console

```
cd Firmware
make px4_sitl jmavsim
```

- terminal畫面

- 模擬器畫面

### 連接mavsdk
- 模擬器terminal介面

- MAVSDK程式執行

### 實際測試結果
```
commander takeoff
```

```
commander land
```

---
---
## 使用Mavproxy連接
- 到Mavproxy官網下載 https://ardupilot.org/mavproxy/
- 不要用mavproxy的GUI介面,用cmd輸入指令
```
mavproxy --master=udp:127.0.0.1:14550 --out=udp:127.0.0.1:15550 --out=udp:127.0.0.1:16550
```

---
---
## 數傳
### 下載MAVSDK source code
```
git clone https://github.com/mavlink/MAVSDK.git
cd MAVSDK
git checkout v1.0.7
git submodule update --init --recursive
```
- 將 checkout與submodule update對調後

### 根據自己的系統(linux or window)安裝Library
[官網連結](https://mavsdk.mavlink.io/main/en/cpp/guide/build.html)
#### Debug
```
cmake -DCMAKE_BUILD_TYPE=Debug -Bbuild/default -H.
cmake --build build/default -j8
```
##### 安裝問題一(已解決):


看起來像submodulus沒載到,試試看手動下載[這個](https://github.com/mavlink/c_library_v2/tree/49ce44c4e4dcda330141f714c9ad978c5e48974d)丟進去
p.s. 要把下載後c_library_v2資料夾內的東西丟回到v2.0資料夾中
---
##### 安裝問題二(已解決):
```
D:\MAVSDK\src\mavsdk\core\mavsdk_impl.cpp : warning C4819: 檔案含有無法在目前字碼頁 (950) 中表示的字元。請以 Unicode 格式儲存檔案以防止資料遺失 [D:\MAVSD
K\build\default\src\mavsdk\mavsdk.vcxproj]
```
- 解決方法:
至mavsdk_impl.cpp中,將102行At least for now後面的表情符號刪掉

---
##### 安裝問題三(已解決):

- 解決方法:
在出現錯誤的檔案中增加header檔
```
#include <atomic>
```
##### 安裝問題四(已解決):

- 解決方法:
問題一中,下載的檔案需要切換版本
```
cd c_library_v2
git checkout 49ce44c4e4
```

##### 安裝問題五(已解決):

https://github.com/mavlink/MAVSDK/issues/1679
解決方法: [照著裡面做](https://github.com/mavlink/MAVSDK/pull/1686/files#diff-9682ac5948df4bfb222920e2b1b94e629eb95f1f70c166ed1228bf8233265480)
#### Release
```
cmake -Bbuild/default -H. -DCMAKE_BUILD_TYPE=Release
cmake --build build/default -j8 --config Release
```
---
#### System-wide Install
```
cmake --build build/default --target install
```

build砍了重裝

不可行
[解決方法1](https://mavsdk.mavlink.io/main/en/cpp/guide/installation.html)


需要注意的地方:
```
cmake -Bbuild -DCMAKE_PREFIX_PATH="上面下載資料夾的位址"/mavsdk_extracted
```
解決方法2: 更換版本(v1.2.0)

- System-wide Install可以順利
---
#### 測試
[example](https://mavsdk.mavlink.io/main/en/cpp/examples/)
```
cd examples/takeoff_and_land/
cmake -Bbuild -H.
cmake --build build -j4
```

- 可以順利編譯

- 打開檔案Debug的位置(ex:takeoff_and_land\build\Debug)
- 把mavsdk.dll檔丟入Debug中(預設位置:Program Files (x86)\mavsdk_superbuild\bin)
- 用cmd打開Debug資料夾,執行exe檔(ex:takeoff_and_land.exe)

---
#### 寫code時間
[測試](https://github.com/ncku-uav/mavsdk-telemetry-cpp)
#### 編譯code
再寫完的.cpp檔資料夾中,加一個CMakeLists.txt,裡面的內容長
```
cmake_minimum_required(VERSION 3.10.2)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(telemetry)
add_executable(telemetry
telemetry.cpp
)
find_package(MAVSDK REQUIRED)
target_link_libraries(telemetry
MAVSDK::mavsdk
)
if(NOT MSVC)
add_compile_options(telemetry PRIVATE -Wall -Wextra)
else()
add_compile_options(telemetry PRIVATE -WX -W2)
endif()
```
##### 編譯要使用幾個指令
```
cd 檔案所在的位址
cmake -Bbuild -H.
cmake --build build -j4
```
Problem 1:


- 74行中,[]中間要加&
Problem 2:

- 確定每個to_string前面有 std::

Problem 3:

---
##### 連接上jmavsim測試

用cmd打開Debug資料夾
```
build\Debug>檔案名稱.exe udp://:模擬器port
```

- 可以成功連接上模擬器並傳送資料

---
## 更新OpenMCT版本
[教學](https://gitlab.lrz.de/lls/vis-frame/-/wikis/Home/How%20to%20Install%20and%20Update%20OpenMCT)


- 卡在空白畫面,不知道是否正確。
---

- 只執行openmct(new)可以跑出新的介面。
---

- 出現未知錯誤
---

---
[111學年上 地面站進度規劃](https://hackmd.io/spy_A3g0SuqrZhYo1RRw8A)