通过杀死优雅地杀死rosbag

时间:2018-06-02 02:02:27

标签: terminal kill ros

我想通过终端优雅地杀死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的手动方式似乎有不同的行为。

2 个答案:

答案 0 :(得分:4)

原生信号处理并未得到很好的支持,使用ROS的启动和关闭完成节点的预期方法总是更好,这样API就可以跟踪。 为了优雅地结束节点,我们假设已启动名为my_bag的rosbag节点:

rosbag record -o /file/name /topic __name:=my_bag

然后,使用rosnode kill命令和节点名称正常杀死节点kann:

rosnode kill /my_bag

<强> Link for reference

答案 1 :(得分:0)

如@ Tik0答案中的参考中所述,您可以在bash中添加陷阱以捕获SIGINT(Ctrl + C)并从那里调用rosnode kill,例如:

#!/bin/bash
trap "rosnode kill /bagger" SIGINT
rosbag record /my_topic __name:=bagger &
roslaunch mypackage launch.launch