通过kill优雅地杀死rosbag

Tik*_*ik0 7 terminal kill ros

我想rosbag通过终端优雅地终止一个实例。在这种情况下,优雅地意味着该文件在终止后rosbag没有后缀.active 。

所以我从终端执行以下操作将推荐发送SIGINT到 rosbag:

$ rosbag record /some/topic &
$ RPID=$!
$ # do some stuff 
$ kill -2 $RPID
Run Code Online (Sandbox Code Playgroud)

不幸的是,包仍然处于活动状态,并且可能会发生并非所有内容都存储到磁盘中的情况。但是,如果我将 rosbag 放入启动文件中,它似乎可以工作:

$ roslaunch rosbag_record.launch &
$ LPID=$!
$ # do some stuff 
$ kill -2 $LPID
Run Code Online (Sandbox Code Playgroud)

现在 rosbag 保持完整,并且存储时没有活动后缀。

现在有趣的问题是,在第一种情况下我做错了什么。我认为杀死启动文件,并在本例中杀死 roscore,会引发 a ,这会导致所有进程中的ros::shutdown()a 。SIGINT但使用手动方式kill似乎有不同的行为。

Tik*_*ik0 10

原生信号处理没有得到很好的支持,最好使用 ROS 的预期方式来启动和关闭完成的节点,以便 API 可以跟踪。my_bag为了优雅地结束一个节点,我们假设启动了一个名为 rosbag 的节点:

rosbag record -o /file/name /topic __name:=my_bag
Run Code Online (Sandbox Code Playgroud)

然后,可以使用rosnode kill命令和节点名称优雅地杀死节点:

rosnode kill /my_bag
Run Code Online (Sandbox Code Playgroud)

链接供参考