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

devtools/2024/10/18 12:27:10/

文章目录

    • 1. 终端操作
      • 1.1. 录制指定话题
      • 1.2. 录制所有话题
      • 1.3. 其它录制参数
      • 1.4. 自动打开新的终端并执行录制
    • 2. C++代码
      • 2.1. 录包
      • 2.2. 停止录包

我们经常会用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,请记得在节点名字前加上斜杠。


http://www.ppmy.cn/devtools/122098.html

相关文章

基于keras的停车场车位识别

1. 项目简介 该项目旨在利用深度学习模型与计算机视觉技术&#xff0c;对停车场中的车位进行检测和状态分类&#xff0c;从而实现智能停车管理系统的功能。随着城市化的发展&#xff0c;停车场管理面临着车位检测效率低、停车资源分配不均等问题&#xff0c;而传统的人工检测方…

Hive数仓操作(八)

一、Hive中的分桶表 1. 分桶表的概念 分桶表是Hive中一种用于提升查询效率的表类型。分桶指的是根据指定列的哈希值将数据划分到不同的文件&#xff08;桶&#xff09;中。 2. 分桶表的原理 哈希分桶&#xff1a;根据分桶列计算哈希值&#xff0c;对哈希值取模&#xff0c;将…

中安未来 OCR—— 开启文字识别新时代

在数字化的浪潮中&#xff0c;高效准确的文字识别技术正发挥着越来越重要的作用。今天&#xff0c;我要向大家介绍一款令人惊艳的 OCR 解决方案 —— 中安未来 OCR。 一、初识中安未来 OCR 中安未来 OCR 以其强大的功能和卓越的性能&#xff0c;在众多文字识别工具中脱颖而出。…

RabbitMQ 优点和缺点

优势&#xff1a; 消息可靠性&#xff1a;RabbitMQ 提供了持久化功能和消息确认机制&#xff0c;确保消息在各种情况下都能可靠地存储和处理。 灵活的路由&#xff1a;通过多种交换机类型和绑定规则&#xff0c;RabbitMQ 能够灵活地路由消息到指定的队列。 支持多种消息协议&am…

OpenCV视频I/O(9)视频采集类VideoCapture之释放与视频捕获相关的所有资源函数release()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 关闭视频文件或捕获设备。 该方法由随后的 VideoCapture::open 和 VideoCapture 析构函数自动调用。 C 函数还释放内存并清除 *capture 指针。 …

Netty系列-7 Netty编解码器

背景 netty框架中&#xff0c;自定义解码器的起点是ByteBuf类型的消息, 自定义编码器的终点是ByteBuf类型。 1.解码器 业务解码器的起点是ByteBuf类型 netty中可以通过继承MessageToMessageEncoder类自定义解码器类。MessageToMessageEncoder继承自ChannelInboundHandlerAdap…

普渡PUDU MT1:AI赋能,破解大面积场景清洁新挑战

普渡AI智能扫地机器人PUDU MT1:破解大面积场景清洁难题的新利器 在仓储物流、工业车间、交通枢纽、大型商场等大面积场景中,清洁难题一直是管理者们头疼的问题。这些区域面积广阔,清洁任务繁重,传统清洁方式难以胜任。然而,普渡机器人最新推出的AI智能扫地机器人PUDU MT1…

设置参数说明

目录 设备连接基本设置电机设置控制设置保护设置保存并重启读取参数擦除参数并重启设备重启 设备连接 驱动板接入电脑后会虚拟为串口&#xff0c;点击“刷新”&#xff0c;选择对应的com&#xff0c;点击“连接设备”&#xff0c;软件左下角会提示“连接成功”。驱动板出厂默认…