Odin Rqtclose May 2026
ros2 launch odin_bringup minimal.launch.py # In a new terminal rqt --no-plugins If rqt stays open, add plugins one by one. The crash will reveal the problematic plugin. ros2 topic echo /rosout --once | grep -i "odin.*close" Also inspect ~/.ros/log/latest/ for fatal errors. Step 3: Use gdb on rqt gdb python run /usr/bin/rqt When it crashes, type bt (backtrace) to see the call stack. Step 4: Monitor Node State Transitions ros2 lifecycle get /odin/driver_node If it returns finalized , some process called LifecycleNode::shutdown() . Step 5: Network & DDS Configuration ODIN and rqt must share the same DDS domain and discovery protocol. Mismatched ROS_DOMAIN_ID or CycloneDDS/ FastDDS settings can cause rqt to lose contact and close the GUI due to "no liveliness." Fix with:
export ROS_DOMAIN_ID=42 To eliminate unwanted rqtclose behavior with ODIN, apply these configuration patterns: For Launch Files (Python/XML) # odin_bringup/launch/stable_rqt.launch.py from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='rqt_gui', executable='rqt_gui', name='rqt_gui', arguments=['--force-discover'], # Prevent incomplete shutdown prefix='xterm -e gdb --args', # Debug if needed ), Node( package='odin_driver', executable='node_driver', name='odin_driver', parameters=['enable_sigint_handler': False], # Critical! ) ]) For ODIN C++ Nodes Disable default shutdown behavior on service calls: odin rqtclose
# odin_rqt_plugin/odin_controller.py import rclpy from rclpy.node import Node from python_qt_binding.QtWidgets import QPushButton from rqt_gui_py.plugin import Plugin class OdinController(Plugin): def (self, context): super(). init (context) self._node = Node('odin_rqt_controller') self._button = QPushButton('Gracefully Shutdown ODIN') self._button.clicked.connect(self.shutdown_odin) self.setWidget(self._button) ros2 launch odin_bringup minimal
rqt --perspective-file ~/odin_rqt.perspective This saves which topics and plugins are active. After a crash, reloading does not replay the faulty action. If you genuinely want to close ODIN from rqt (safe shutdown), do not rely on raw rqtclose . Instead, create a custom plugin: Step 3: Use gdb on rqt gdb python
// Inside OdinNode::on_cleanup() rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &) RCLCPP_INFO(get_logger(), "Shutdown requested but ignoring to prevent rqtclose"); return CallbackReturn::SUCCESS; // Do not actually exit
This prevents the "sudden close" syndrome while ensuring data integrity. A user reported: "Every time I open rqt_console, the ODIN sonar node closes."