This error is not a standard ROS output. Instead, it typically surfaces when a custom rqt plugin or a node named "Odin" (a common internal codename for autonomy stacks, custom executors, or specific robotic platforms) fails to close its ROS GUI components gracefully. The rqtclose signal indicates that the GUI was either forcibly terminated, lost a connection to the ROS master, or encountered a deadlock during shutdown.
def shutdown_plugin(self): rospy.loginfo("odin rqtclose: Starting shutdown sequence") # Disconnect callbacks self.pub.unregister() rospy.loginfo("odin rqtclose: Publishers unregistered") # Call parent super().shutdown_plugin() rospy.loginfo("odin rqtclose: Complete") If you see the first log but not the last, you’ve found a hang. Attach strace to the stuck rqt process (find PID via ps aux | grep rqt ): odin rqtclose
#!/bin/bash # odin – correct wrapper for rqt rqt_pid="" function cleanup if [[ -n "$rqt_pid" ]]; then kill -TERM "$rqt_pid" wait "$rqt_pid" echo "odin rqtclose: clean exit" fi This error is not a standard ROS output
import rospy from python_qt_binding.QtCore import QTimer class OdinRqtPlugin: def (self, context): self._node = rospy.init_node('odin_rqt', anonymous=True) self._timer = QTimer() self._timer.timeout.connect(self._spin_ros) self._timer.start(10) # Process ROS events every 10ms def shutdown_plugin(self): rospy
import signal signal.signal(signal.SIGTERM, my_shutdown_handler) If that handler calls sys.exit() without cleaning up rqt , you’ll see rqtclose errors. Modify your rqt plugin’s shutdown_plugin() method: