ROS C++ : 控制 rosbag 包的录制与停止

8 篇文章 0 订阅

我们经常会用rosbag来录一些ROS的消息进行离线调试什么的。如果是在终端运行,输入命令,然后Ctrl + C就可以运行和关闭了,但如果我想在C++程序里面去控制什么时候录包,什么时候停止录包呢?本文针对此情况进行简单分享。

1. 终端操作

终端录包的指令可以参考ROS官网rosbag的介绍。这里以最简单的情形为例。

1.1. 录制指定话题

录制 /top2record 话题的数据,将其放到当前文件夹的bag_name.bag:

rosbag record -O ./bag_name.bag /top2record

录完只要Ctrl + C就可以了。

1.2. 录制所有话题

rosbag record -a

记录下的bag包会以录制结束时间进行命名。

1.3. 其它录制参数


rosbag record --duration=30 /chatter #持续30s录制,还可以指定m,h,和--split类似
rosbag record --split --size=1024 /chatter #空间达到1024M后分文件存储
rosbag record --split --duration=30 /chatter #持续时间到30s后分文件存储
rosbag record --split --duration=5m /chatter #持续时间到5m后分文件存储
rosbag record --split --duration=2h /chatter#持续时间到2h后分文件存储
rosbag record -l 1000 /chatter  # 录制该主题1000个消息限制

1.4. 自动打开新的终端并执行录制


gnome-terminal --tab -x rosbag record -O ./bag_name.bag /top2record

2. C++代码

rosbag提供了官方的C++ API,但是看着很难用,没有用熟了的命令行那么好用,所以这里是通过C++启动终端运行命令行,而不是真的rosbag的官方API。

请注意代码中的空格。

2.1. 录包

std::string path = "./bag_name.bag";
std::string topics = " /top2record";
std::string node_name = " __name:=my_record_node";
std::string cmd_str = "gnome-terminal -x bash -c 'rosbag record -O " + path + topics + node_name + "'";
int ret = system(cmd_str.c_str()); // #include <stdlib.h>

这样就会弹出一个终端进行录包。这里之所以要通过__name:=加节点名称,是为了方便后面关闭,否则就只能用killall来杀掉所有record,如果没有这个进程会报错不说,还会因为没有正确关闭节点得到不正确的bag文件(killall没有发送终止命令给节点,即没有Ctrl + C)。

2.2. 停止录包


#include <ros/ros.h>

ros::V_string v_nodes;
ros::master::getNodes(v_nodes);

std::string node_name = std::string("/my_record_node");
auto it = std::find(v_nodes.begin(), v_nodes.end(), node_name.c_str());
if (it != v_nodes.end())
{
    std::string cmd_str = "rosnode kill " + node_name;
    int ret = system(cmd_str.c_str());
    std::cout << "## stop rosbag record cmd: " << cmd_str << std::endl;
}

这样刚才那个弹框就会消失,录包成功。这里先利用ROS master来判断是否存在这个录包节点,如果存在,调用rosnode kill来终止这个node。

如果存在namespace请在名字中加上相应前缀std::string ns = nh_->getNamespace() + std::string(“/”);,如果没有ns,请记得在节点名字前加上斜杠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛魔王的小怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值