ROS学习笔记13——rosbag功能包的简单使用

rosbag是用于录制和回放 ROS 主题的一个工具集,实现了数据的复用,方便调试和测试。rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。

1、通过命令行使用rosbag

1.1 录制

rosbag record -a -O 目标文件

-a 录制所有话题

-O 文件命名时不带时间戳

若不想录制所有的话题,可以不使用 -a ,而是将所需话题跟在后面。结束录制使用 ctrl + c,在创建的目录中会生成bag文件。

1.2 查看文件

rosbag info 文件名

1.3 回放文件

rosbag play 文件名

rosbag的 参数远不止这些,可以通过 -h 进行查看。

2、通过编码使用rosbag

通过编码可以更加灵活的使用rosbag,下面通过rosbag实现文本的简单读写。

2.1 写bag

#include "ros/ros.h"
#include "rosbag/bag.h"
#include "std_msgs/String.h"
/*
    需求:使用rosbag向磁盘文件写数据(话题+消息)
    流程:
        1、导包
        2、初始化
        3、创建rosbag对象
        4、打开文件流
        5、写数据
        6、关闭文件流
*/
int main(int argc, char *argv[])
{
    /* code */
    //2、初始化
    setlocale(LC_ALL, "");
    ros::init(argc, argv,"rosbag_write");
    ros::NodeHandle nh;
    //3、创建rosbag对象
    rosbag::Bag bag;
    //4、打开文件流
    bag.open("test.bag",rosbag::BagMode::Write);
    //5、写数据
    std_msgs::String msgs;
    msgs.data = "Come on! You are the best!";
    /*
        参数1:话题
        参数1:时间戳
        参数1:消息
    */
    bag.write("/chatter",ros::Time::now(),msgs);
    //6、关闭数据流
    bag.close();
    return 0;
}

2.2 读bag

#include "ros/ros.h"
#include "rosbag/bag.h"
#include "rosbag/view.h"
#include "std_msgs/String.h"
/*
    需求:使用rosbag读取磁盘上的bag文件
    流程:
        1、导包
        2、初始化
        3、创建bag对象
        4、打开文件流
        5、读数据
        6、关闭文件流
*/
int main(int argc, char *argv[])
{
    /* code */
    //2、初始化
    setlocale(LC_ALL, "");
    ros::init(argc, argv,"rosbag_read");
    ros::NodeHandle nh;
    //3、创建bag对象
    rosbag::Bag bag;
    //4、打开数据流
    bag.open("test.bag",rosbag::BagMode::Read);
    //5、读数据
    //取出话题、时间戳和消息
    //先获取消息的集合,再迭代取出消息的字段
    for (auto &&m : rosbag::View(bag))
    {
        //解析
        std::string topic = m.getTopic();
        ros::Time time = m.getTime();
        std_msgs::StringPtr p = m.instantiate<std_msgs::String>();
        ROS_INFO("话题:%s, 时间戳:%.2f, 消息:%s",
                    topic.c_str(),
                    time.toSec(),
                    p->data.c_str());
    }
    //6、关闭
    bag.close();
    return 0;
}

### 安装 Rosbag 的方法 RosbagROS(Robot Operating System)的一个工具,用于记录和回放 ROS 数据流。然而,在 Windows 系统上设置 ROS 和其依赖项可能较为复杂,因为 ROS 主要在 Linux 平台上开发和支持。以下是关于如何在 Windows 虚拟环境中安装 rosbag 的说明。 #### 使用 WSL (Windows Subsystem for Linux) 由于 ROS 更适合运行于类 Unix 环境下,推荐通过 **WSL** 来实现兼容性支持: 1. 配置 WSL: - 启用 WSL 功能并安装 Ubuntu 或其他发行版作为子系统。 - 更新软件源:`sudo apt update && sudo apt upgrade` 2. 安装 ROS Noetic(或其他版本): - 添加 ROS 存储库密钥: ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - ``` - 安装 ROS 基础组件: ```bash sudo apt install ros-noetic-ros-base ``` 3. 初始化 `rosdep` 工具以便管理依赖关系: ```bash sudo apt install python3-rosdep sudo rosdep init rosdep update ``` 4. 创建 catkin 工作空间并将 rosbag 引入其中: ```bash mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make source devel/setup.bash sudo apt-get install ros-noetic-rosbag ``` #### 如果坚持使用纯 Windows 方法 虽然不建议这样做,但如果确实需要直接在 Windows 上操作,则可以尝试以下方式: 1. 下载 Python 版本的 rosbag 替代方案——`rosbags` 库[^2]。这是一个跨平台的支持读写 `.bag` 文件的库。 - 执行命令来安装该库及其所需依赖项: ```powershell pip install rosbags ``` 2. 对应原生 ROS 中的功能调用替换为上述第三方模块接口。例如解析 bag 文件内容可参照官方文档示例代码片段[^3]。 ```python from rosbags.rosbag1 import Reader from rosbags.serde import deserialize_cdr, serialize_cdr with Reader('path_to_your_bag_file') as reader: for connection in reader.connections: msg = deserialize_cdr(connection.msgtype, bytes_data) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值