目录
1.rosbag命令行使用
需求
ROS 内置的乌龟案例并操作,操作过程中使用 rosbag 录制,录制结束后,实现重放
实现
1.准备
创建目录保存录制的文件
mkdir ./xxx
cd xxx
2.开始录制
rosbag record -a -o 目标文件
操作小乌龟一段时间,结束录制使用 ctrl + c,在创建的目录中会生成bag文件。
3.查看文件
rosbag info 文件名
4.回放文件
rosbag play 文件名
重启乌龟节点,会发现,乌龟按照录制时的轨迹运动。
效果图演示
2.rosbag编码使用
1.写 bag
1)创建功能包,功能宝依赖包为:roscpp rospy std_msgs rosbag
2)功能包src文件下创建cpp文件
代码如下:
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "std_msgs/String.h"
int main(int argc, char *argv[])
{
ros::init(argc,argv,"bag_write");
ros::NodeHandle nh;
//创建bag对象
rosbag::Bag bag;
//打开
bag.open("/home/rosdemo/demo/test.bag",rosbag::BagMode::Write);
//写(注意更改自己的文件路径)
std_msgs::String msg;
msg.data = "hello world";
bag.write("/chatter",ros::Time::now(),msg);
bag.write("/chatter",ros::Time::now(),msg);
bag.write("/chatter",ros::Time::now(),msg);
bag.write("/chatter",ros::Time::now(),msg);
//关闭
bag.close();
return 0;
}
3)配置文件CMake.list.txt
配置效果:
4)运行
1.配置环境source ./devel/setup.bash
2.运行rosrun 功能包名 文件名
出现的错误: 注意文件名后面不能有格式
运行后的效果:
列表生成写入的文件
2.读 bag
在创建的功能包src下创建新的C++文件(我运行的时候失败了,所以我重新建立了另一个新的功能包,再另一个新的功能包下再建立C++文件操作成功了)
代码如下:
/*
读取 bag 文件:
*/
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "rosbag/view.h"
#include "std_msgs/String.h"
#include "std_msgs/Int32.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"bag_read");
ros::NodeHandle nh;
//创建 bag 对象
rosbag::Bag bag;
//打开 bag 文件
bag.open("/home/rosdemo/demo/test.bag",rosbag::BagMode::Read);
//读数据(注意文件的路径)
for (rosbag::MessageInstance const m : rosbag::View(bag))
{
std_msgs::String::ConstPtr p = m.instantiate<std_msgs::String>();
if(p != nullptr){
ROS_INFO("读取的数据:%s",p->data.c_str());
}
}
//关闭文件流
bag.close();
return 0;
}
配置CmakeList.txt文件,运行步骤跟上面一样
运行效果(读文件)展示