|
|
|
|
@ -22,6 +22,7 @@ from pymavlink import mavutil
|
|
|
|
|
from . import mavlinkObject as mo
|
|
|
|
|
from . import serialManager as sm
|
|
|
|
|
from . import mavlinkVehicleView as mvv
|
|
|
|
|
from . import mavlinkROS2Nodes as mros
|
|
|
|
|
|
|
|
|
|
from .utils import RingBuffer, setup_logger
|
|
|
|
|
from .utils import acquireSerial, acquirePort
|
|
|
|
|
@ -37,6 +38,7 @@ class PanelState:
|
|
|
|
|
self.mavlink_bridge_state = "Stopped"
|
|
|
|
|
self.object_manager_state = "Stopped"
|
|
|
|
|
self.serial_manager_state = "Stopped"
|
|
|
|
|
self.ros2_manager_state = "Stopped"
|
|
|
|
|
self.socket_object_list = [] # 已有的 mavlink object
|
|
|
|
|
self.linked_serial_dict = {} # 已連線的 serial 端口 serial id num : serial_port string
|
|
|
|
|
self.panel_info_msg_list = [] # 顯示在面板上的資訊訊息
|
|
|
|
|
@ -246,6 +248,7 @@ class ControlPanel:
|
|
|
|
|
stdscr.addstr(3, 2, f"Mavlink Bridge State : {state.mavlink_bridge_state}")
|
|
|
|
|
stdscr.addstr(4, 2, f"Socket Object number : {len(state.socket_object_list)}")
|
|
|
|
|
stdscr.addstr(2, 36, f"Serial Manager State : {state.serial_manager_state}")
|
|
|
|
|
stdscr.addstr(3, 36, f"ROS2 Manager State : {state.ros2_manager_state}")
|
|
|
|
|
|
|
|
|
|
# 顯示當前選單項目
|
|
|
|
|
start_line = 6
|
|
|
|
|
@ -1133,6 +1136,20 @@ class Orchestrator:
|
|
|
|
|
# === 3) serial_manager 部分的準備 ===
|
|
|
|
|
self.plumber = sm.serial_manager()
|
|
|
|
|
|
|
|
|
|
# === 4) ros 部分的準備 ===
|
|
|
|
|
self.fc_ros_manager = mros.ros2_manager
|
|
|
|
|
if not self.fc_ros_manager.initialized:
|
|
|
|
|
self.fc_ros_manager.initialize()
|
|
|
|
|
self.fc_ros_manager.status_publisher.rate_controller.topic_intervals = {
|
|
|
|
|
'position': 1.0,
|
|
|
|
|
'attitude': 0.0,
|
|
|
|
|
'velocity': 0.0,
|
|
|
|
|
'battery': 1.0,
|
|
|
|
|
'vfr_hud': 1.0,
|
|
|
|
|
'mode': 0.0,
|
|
|
|
|
'summary': 1.0,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def engageWholeSystem(self):
|
|
|
|
|
"""啟動整個系統"""
|
|
|
|
|
# === 1) 面板部分的啟動 ===
|
|
|
|
|
@ -1146,6 +1163,9 @@ class Orchestrator:
|
|
|
|
|
# === 3) serial_manager 部分的啟動 ===
|
|
|
|
|
self.plumber.start()
|
|
|
|
|
|
|
|
|
|
# === 4) ros 部分的啟動 ===
|
|
|
|
|
self.fc_ros_manager.start()
|
|
|
|
|
|
|
|
|
|
def mainLoop(self):
|
|
|
|
|
logger.info("Main orchestrator started <-")
|
|
|
|
|
try:
|
|
|
|
|
@ -1174,6 +1194,11 @@ class Orchestrator:
|
|
|
|
|
linked_serial_dict = self.plumber.get_serial_link()
|
|
|
|
|
self.panelState.linked_serial_dict = linked_serial_dict
|
|
|
|
|
|
|
|
|
|
if self.fc_ros_manager.running:
|
|
|
|
|
self.panelState.ros2_manager_state = 'Running'
|
|
|
|
|
else:
|
|
|
|
|
self.panelState.ros2_manager_state = 'Stopped'
|
|
|
|
|
|
|
|
|
|
# B. 更新載具列表(從 vehicle_registry 獲取)
|
|
|
|
|
self._update_vehicles_list()
|
|
|
|
|
|
|
|
|
|
@ -1284,10 +1309,17 @@ class Orchestrator:
|
|
|
|
|
self.plumber.shutdown()
|
|
|
|
|
self.plumber.thread.join(timeout=2)
|
|
|
|
|
|
|
|
|
|
if self.fc_ros_manager.spin_thread.is_alive():
|
|
|
|
|
if self.fc_ros_manager.running:
|
|
|
|
|
self.fc_ros_manager.stop()
|
|
|
|
|
self.fc_ros_manager.spin_thread.join(timeout=2)
|
|
|
|
|
|
|
|
|
|
# 關閉面板執行緒
|
|
|
|
|
if self.panel_thread.is_alive():
|
|
|
|
|
self.panel_thread.join(timeout=2)
|
|
|
|
|
|
|
|
|
|
time.sleep(0.5) # 等待各模組穩定關閉
|
|
|
|
|
|
|
|
|
|
logger.info("Main orchestrator END!")
|
|
|
|
|
|
|
|
|
|
# =============== 面板動作 - Mavlink Object ===============
|
|
|
|
|
@ -1560,6 +1592,6 @@ if __name__ == "__main__":
|
|
|
|
|
2. 修正 udp port 在移除後仍被記錄為佔用的問題
|
|
|
|
|
3. 因應 mvalinkObject.py 中 mavlinkObjects 修正變數存取方式
|
|
|
|
|
4. 註解掉無效代碼 action == "UPDATE_VEHICLES_LIST" 區塊
|
|
|
|
|
|
|
|
|
|
5. 系統納入 mavlink ROS2 Manager 模組
|
|
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
|