我想通过终端优雅地杀死一个 rosbag
实例。
优雅地意味着在这种情况下,rosbag
文件在 kill 之后没有后缀 .active。
所以我从终端执行以下操作以将推荐的 SIGINT
发送到 rosbag:
$ rosbag record /some/topic &
$ RPID=$!
$ # do some stuff
$ kill -2 $RPID
不幸的是,包仍然处于事件状态,并且可能发生并非所有内容都存储到磁盘的情况。
但是,如果我将 rosbag 放入启动文件中,它似乎可以工作:
$ roslaunch rosbag_record.launch &
$ LPID=$!
$ # do some stuff
$ kill -2 $LPID
现在 rosbag 保持完整,并且在没有事件后缀的情况下存储。
现在有趣的问题是,在第一种情况下我做错了什么。
我虽然杀死启动文件 并在这种情况下杀死 roscore ,但会引发
ros::shutdown()
,这会在所有进程中导致 SIGINT
。但是使用
kill
的手动方式似乎有不同的行为。 最佳答案
原生信号处理没有得到很好的支持,最好使用 ROS 的预期方式来启动和关闭完成的节点,以便 API 可以跟踪。
为了优雅地结束一个节点,我们假设一个名为 my_bag
的 rosbag 节点已经启动:
rosbag record -o /file/name /topic __name:=my_bag
然后,使用
rosnode kill
命令和节点名称优雅地杀死节点:rosnode kill /my_bag
Link for reference
关于terminal - 通过 kill 优雅地杀死 rosbag,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50652887/