You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
實飛/SITL 對無人機下第一個控制指令(切 mode)時,python GUI 行程 CPU 衝到 112%、記憶體一路爬向 30GB 被 OOM killer 幹掉。 根因(切 mode 是執行期第一個走 get_or_create_client 的動作): - get_or_create_client / get_or_create_position_client 原本 per-drone 於執行期新建 ROS2 node 並 executor.add_node()。 - CPU:add_node 從 asyncio/Qt 執行緒呼叫,同時 _ros_spin_thread 在另一 執行緒 spin_once 同一個 SingleThreadedExecutor → wait set 損毀 → 空轉。 - 記憶體:執行期新建 node = 新 DDS participant,discovery 撞壞封包 → FastRTPS bad_alloc。解釋了「開機沒事、切 mode 才炸」。 兩個 client 都只打單一 service(send_command_long / pos_global_int), 靠 request 的 target_sysid 路由、無 per-drone 狀態 → 每台一個節點無意義。 修法:改成「共用節點 + 啟動預建 + 執行期只重用」。 - communication.py: 兩個 per-drone dict → 單一 command_long_client / position_target_client;新增 init_shared_command_clients(); get_or_create_*(drone_id=None) 回傳共用 client(僅留一次性 lazy fallback)。 - gui.py: executor 設好後、spin thread 啟動前於主執行緒預建;cleanup 改 銷毀兩個共用節點。 飛行中不再新建 participant + add_node 不再跨執行緒 → 兩症狀同時消。 SITL 切 mode 實測不再暴衝。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
1 month ago | |
|---|---|---|
| src | 1 month ago | |
| .gitignore | 3 months ago | |
| .gitmodules | 10 months ago | |
| README.md | 3 months ago | |
README.md
這是天雷系統的專案
===
功能簡介
- mavlink 多對多串流與交換
- 支援 xbee 與 telemetry
- 支援 udp 管理
- ROS2 介面監控載具
=== 使用限制
- 不允許進到 ros 系統有相同 sysid
- 假設一台載具上所有 component 共用同一 socket
===
運行環境
專案核心框架
- ROS2 Humble
- Python 3.8.10
必要相依套件及版本
-
Python [Package] fc_network_adapter
- pymavlink -> Version: 2.4.42
- conda-forge 中的 pyserial-asyncio
- importlib_metadata -> Version: 8.5.0
- setuptools -> Version: 58.2.0 (版本太新不行)
- pyserial-asyncio [Package] GUI
- testresources
- websockets
- PyQt6
- PyQt6-WebEngine
-
ROS2
- source ~/ros2_humble/install/setup.bash
- geographic_info (https://github.com/ros-geographic-info/geographic_info.git) 已經作為 submodule 放在 external
- angles (https://github.com/ros/angles.git) 已經作為 submodule 放在 external
- mavros_msgs (https://github.com/mavlink/mavros) 這個專案中的一個資料夾 這邊手動複製的
開發用輔助專案
- Gazebo Garden
- Ardupilot
===
使用說明
Clone 專案後 請先執行這些指令
# 1.同步 submodule
cd ~/AirTrapMine
git submodule init
git submodule update
# 2. build 需要的 package
colcon build --packages-select angles geographic_msgs
colcon build --packages-select mavros_msgs # 這個依賴前面的
colcon build --packages-select fc_interfaces # 自己定義的
主要專案 fc_network_adapter 請一律在 ~/AirTrapMine/src/ 路徑下 以模組化啟動程式
# 記得先開啟 依賴 Package 到 overlay
. ./install/local_setup.bash
# 範例
cd ~/AirTrapMine/src/ # 這是範例!!!
python -m fc_network_adapter.fc_network_adapter.mainOrchestrator
python -m fc_network_adapter.tests.demo_integration
python -m someotherpkg.src.example_wholeMoving
python fc_network_apps/vehicleDiagShow.py
GUI 介面 在 ~/AirTrapMine/src/GUI 路徑下 直接啟動
cd ~/AirTrapMine/src/GUI
python gui.py
===
資料夾說明
- fc_network_adapter (核心) 建立、維護與飛控韌體的連接 構築 mavlink 封包 處理無線模組的通訊格式 (XBee)
- fc_interfaces (必要) 自定義的 ROS2 介面檔 沒有這個核心會運作不了
- fc_network_module (重要) 非核心 但是支援載具的重要附屬功能 需要該功能時 作為一個 ros2 節點打開 例如 : ntrip rtk 訊號轉接
- fc_network_apps 是 fc_network_adapter 高階包裝API 利於開發GUI或其他應用 使用者的外層包裝 可以不使用 或者當作一個範例程式來看
- someotherpkg 如何使用 fc_network_apps 的範例檔案
- GUI 由 PyQt6 開發的互動式介面
- unitdev 為各自協作者做開發時的測試區 01 -> 晉凱(ken) 02 -> 其宇(chiyu) 03 -> 文鈞 04 -> 倫渝
- logs 是執行時期的記錄檔
===