我想通过终端优雅地杀死一个 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/

10-11 10:19