# OpenMCT 開發筆記 ###### tags: `飛控` `地面站` ## 開發環境 ### node.js (使用14.19.1版) ![](https://i.imgur.com/sPRkuuk.png) ### git bash ![](https://i.imgur.com/QYeOROm.png) ### 使用vs code編輯 ![](https://i.imgur.com/x18PX1T.png) ### 安裝虛擬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版 ![](https://i.imgur.com/rhgnq3M.png) 2. Run it, choose your desired installation location, let it install: ![](https://i.imgur.com/cNeRm6a.png) ### Python ![](https://i.imgur.com/QrHG3pp.png) 安裝時,記得要安裝環境 --- --- ## 架設OpenMCT - https://gitlab.lrz.de/lls/vis-frame.git - https://gitlab.lrz.de/lls/vis-frame/-/wikis/home 1. 打開cmd,輸入"cd 要存取的資料夾" 2. 輸入git clone 網址(網址複製如下圖) ![](https://i.imgur.com/p2eGXNc.png) 3. 下載完後,輸入cd vis-frame 4. 輸入cd openmct 5. 輸入npm install,開始下載 6. 在下載同時可以開另一個cmd,切換到OpenMCT_Telemetry_server(如下圖) ![](https://i.imgur.com/Qs5RurE.png) 7. 輸入npm install開始下載,下載完成後可以將cmd視窗關閉 8. 回到openmct的cmd視窗,下載完成後輸入npm start ![](https://i.imgur.com/XNfoWov.png) 9. 前往 http://localhost:8080 ![](https://i.imgur.com/yWioWoH.png) --- --- ## 建立自己的Aircraft ### 1.製作Telemetry_Object ![](https://i.imgur.com/dGLLaQy.png) 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 ![](https://i.imgur.com/UDHz4cS.png) 位置在vis-frame/python_scripts/Telemetry_Object_Generator 將會產生幾個不同的檔案 在openmct/example/飛行器的名字中會有兩個檔案 #### Plugin.js - Plugin的種類分為三種 ![](https://i.imgur.com/7vEdB7g.png) 更多資訊可以看 [Open MCT Integration Tutorials](https://hackmd.io/@isaPv93jQuix8iD4DT34kQ/Hy9jHYxru) 官方文件: [Github](https://github.com/nasa/openmct-tutorial) #### dictionary.json name是在openmct上所顯示的名稱 format是變數的型態 key是在傳輸腳本所用到的變數名稱,因此在選擇變數名稱後須將他寫入python腳本中 如下圖 ![](https://i.imgur.com/2tP8K6E.png) --- --- ## 定義plugin.js 編輯openmct/src/plugin/plugin.js 這個檔案定義了所有openmct要使用的plugin ### 1.檔案位置 在define後輸入plugin的檔案位置 ![](https://i.imgur.com/4FXQ6vn.png) ### 2.函式名稱 在function後輸入plugin名稱 ![](https://i.imgur.com/4By0ku4.png) ### 3.定義函式 ```#javasripts plugins.Aircraft_YEEPlugin = Aircraft_YEEPlugin; ``` 將Aircraft_YEE改成自己飛行器的名字 ![](https://i.imgur.com/HXXPIVz.png) ### 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/ 為即時資料 ![](https://i.imgur.com/qJ8wvxl.png) ### 5. 編輯OpenMCT_Telemetry_Server #### import由腳本所添加的檔案 到OpenMCT_Telemetry_Server/server.js 傳入檔案 ```#javasripts var Aircraft_YEE = require('./Aircraft_YEE'); ``` ![](https://i.imgur.com/cCOVyWP.png) #### 新增一個變數: ```#javasripts var aircraftYEE = new Aircraft_YEE; ``` #### 添加連接: ```#javascripts app.use('/AircraftYEERealtime', realtimeServerAircraftYEE); app.use('/AircraftYEEHistory', historyServerAircraftYEE); ``` ![](https://i.imgur.com/mZRLcHo.png) --- --- ## 開始測試 ### 開啟模擬器(JMavSim) 1. 到PX4的資料夾中開啟run-console ![](https://i.imgur.com/a9ehzIa.png) ``` cd Firmware make px4_sitl jmavsim ``` ![](https://i.imgur.com/Fixy6w5.png) - terminal畫面 ![](https://i.imgur.com/IAGvP7w.png) - 模擬器畫面 ![](https://i.imgur.com/2dw02iQ.jpg) ### 連接mavsdk - 模擬器terminal介面 ![](https://i.imgur.com/NIT7VUn.png) - MAVSDK程式執行 ![](https://i.imgur.com/OA0fGaW.png) ### 實際測試結果 ``` commander takeoff ``` ![](https://i.imgur.com/FjiW0tR.png) ``` commander land ``` ![](https://i.imgur.com/6v38lHu.png) --- --- ## 使用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 ``` ![](https://i.imgur.com/KIRWwTb.png) --- --- ## 數傳 ### 下載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對調後 ![](https://i.imgur.com/kGZdoyV.png) ### 根據自己的系統(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 ``` ##### 安裝問題一(已解決): ![](https://i.imgur.com/gN9djqY.png) ![](https://i.imgur.com/xJbDBQ6.png) 看起來像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後面的表情符號刪掉 ![](https://i.imgur.com/9o4aR7U.png) --- ##### 安裝問題三(已解決): ![](https://i.imgur.com/acXhrpc.png) - 解決方法: 在出現錯誤的檔案中增加header檔 ``` #include <atomic> ``` ##### 安裝問題四(已解決): ![](https://i.imgur.com/IjvxLiF.png) - 解決方法: 問題一中,下載的檔案需要切換版本 ``` cd c_library_v2 git checkout 49ce44c4e4 ``` ![](https://i.imgur.com/rl71xSg.png) ##### 安裝問題五(已解決): ![](https://i.imgur.com/ClFg4SZ.png) 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 ``` ![](https://i.imgur.com/yypBkSt.png) build砍了重裝 ![](https://i.imgur.com/QTVdepe.png) 不可行 [解決方法1](https://mavsdk.mavlink.io/main/en/cpp/guide/installation.html) ![](https://i.imgur.com/v7t5xLX.png) ![](https://i.imgur.com/42TQryI.png) 需要注意的地方: ``` cmake -Bbuild -DCMAKE_PREFIX_PATH="上面下載資料夾的位址"/mavsdk_extracted ``` 解決方法2: 更換版本(v1.2.0) ![](https://i.imgur.com/f76MaCg.png) - System-wide Install可以順利 --- #### 測試 [example](https://mavsdk.mavlink.io/main/en/cpp/examples/) ``` cd examples/takeoff_and_land/ cmake -Bbuild -H. cmake --build build -j4 ``` ![](https://i.imgur.com/QDnolDd.png) - 可以順利編譯 ![](https://i.imgur.com/75Yupu9.png) - 打開檔案Debug的位置(ex:takeoff_and_land\build\Debug) - 把mavsdk.dll檔丟入Debug中(預設位置:Program Files (x86)\mavsdk_superbuild\bin) - 用cmd打開Debug資料夾,執行exe檔(ex:takeoff_and_land.exe) ![](https://i.imgur.com/CCbchMM.png) --- #### 寫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: ![](https://i.imgur.com/XoCUqPG.png) ![](https://i.imgur.com/HQci5dG.png) - 74行中,[]中間要加& Problem 2: ![](https://i.imgur.com/liixwRu.png) - 確定每個to_string前面有 std:: ![](https://i.imgur.com/ExcEy9o.png) Problem 3: ![](https://i.imgur.com/R66gqvX.png) --- ##### 連接上jmavsim測試 ![](https://i.imgur.com/TiH9rvA.png) 用cmd打開Debug資料夾 ``` build\Debug>檔案名稱.exe udp://:模擬器port ``` ![](https://i.imgur.com/KGuy49E.png) - 可以成功連接上模擬器並傳送資料 ![](https://i.imgur.com/Sb6l0i5.png) --- ## 更新OpenMCT版本 [教學](https://gitlab.lrz.de/lls/vis-frame/-/wikis/Home/How%20to%20Install%20and%20Update%20OpenMCT) ![](https://i.imgur.com/CWTXgEK.png) ![](https://i.imgur.com/yPnIHky.png) - 卡在空白畫面,不知道是否正確。 --- ![](https://i.imgur.com/4D9owek.png) - 只執行openmct(new)可以跑出新的介面。 --- ![](https://i.imgur.com/noQVRbj.png) - 出現未知錯誤 --- ![](https://i.imgur.com/f6SRG4Q.jpg) --- [111學年上 地面站進度規劃](https://hackmd.io/spy_A3g0SuqrZhYo1RRw8A)