<node name="odin_gui" pkg="odin_viz" type="odin_rqt.py" /> Check odin_rqt.py for any custom signal handling. Specifically, search for:
#!/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 odin rqtclose
rosnode list After rqtclose fails, run again. If the rqt node still appears, it’s still alive. Force-kill it: <node name="odin_gui" pkg="odin_viz" type="odin_rqt
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: node name="odin_gui" pkg="odin_viz" type="odin_rqt.py" />
def _spin_ros(self): rospy.rostime.wallsleep(0) # Allow ROS callbacks