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