diff --git a/src/GUI/gui.py b/src/GUI/gui.py index 3ec9c3c..5966f64 100644 --- a/src/GUI/gui.py +++ b/src/GUI/gui.py @@ -1733,30 +1733,38 @@ def main(): 這樣可以確保所有 ROS2 相關操作都共享同一個初始化狀態 """ - # 第一步:在最外層只初始化一次 ROS2 - print("🚀 [GUI] 初始化 ROS2...", flush=True) - rclpy.init() - print("✓ [GUI] ROS2 初始化完成", flush=True) + # 第一步:在最外層只初始化一次 ROS2(終極防護) + # 添加 rclpy.ok() 檢查,防止重複初始化導致 "Context.init() must only be called once" 錯誤 + print("🚀 [GUI 主程式] 檢查 ROS2 初始化狀態...", flush=True) + if not rclpy.ok(): + print("🚀 [GUI 主程式] ROS2 未初始化,開始初始化...", flush=True) + rclpy.init() + print("✅ [GUI 主程式] ROS2 已全局初始化(由 GUI 主程式霸佔)", flush=True) + else: + print("ℹ️ [GUI 主程式] ROS2 已初始化,跳過重複初始化", flush=True) try: # 第二步:啟動 Qt 應用程式 - print("🚀 [GUI] 啟動 Qt 應用程式...", flush=True) + print("🚀 [GUI 主程式] 啟動 Qt 應用程式...", flush=True) app = QApplication(sys.argv) station = ControlStationUI() station.show() - print("✓ [GUI] 應用程式已啟動", flush=True) + print("✓ [GUI 主程式] 應用程式已啟動", flush=True) # 第三步:進入 Qt 事件循環(阻塞直到用戶關閉應用) - print("🎯 [GUI] 進入主事件循環,等待用戶操作...", flush=True) + print("🎯 [GUI 主程式] 進入主事件循環,等待用戶操作...", flush=True) sys.exit(app.exec()) finally: - # 第四步:只有當 GUI 視窗被關閉時,才做 ROS2 cleanup - print("\n🛑 [GUI] 應用程式關閉,正在清理 ROS2 資源...", flush=True) + # 第四步:只有當 GUI 視窗被關閉時,才做 ROS2 cleanup(終極防護) + # 這裡確保 ROS2 被正確且安全地關閉 + print("\n🛑 [GUI 主程式] 應用程式關閉,正在清理 ROS2 資源...", flush=True) if rclpy.ok(): rclpy.shutdown() - print("✓ [GUI] ROS2 已關閉", flush=True) - print("✓ [GUI] 應用程式完全退出", flush=True) + print("✓ [GUI 主程式] ROS2 已安全關閉", flush=True) + else: + print("ℹ️ [GUI 主程式] ROS2 已關閉或不可用,無需重複 shutdown", flush=True) + print("✓ [GUI 主程式] 應用程式完全退出", flush=True) if __name__ == '__main__':