对于传感器获取到的信息,有两种处理方式,一种是实时处理,另一种是先存储起来,后期在进行处理。显然,第二种处理方式更加灵活,在ROS中,提供了rosbag功能包来进行数据的存储和读取。
rosbag record -a -o xxx.bag
ctrl+c 结束录制
rosbag info xxx.bag
rosbag play xxx.bag
注:
rosbag本质上也是一个节点,在录制信息时,是一个订阅者,在回放信息时是一个发布者,因此也可以用以下命令进行数据的录制回放
rosrun rosbag play ./bags/xxx.bag
rosrun rosbag record ./bags/xxx.bag
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "std_msgs/String.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc, argv, "record");
ros::NodeHandle nh;
// 创建bag对象
rosbag::Bag bag;
// 打开文件流
bag.open("../bags/test.bag", rosbag::BagMode::Write);
// 写入数据
std_msgs::String msg;
msg.data = "hello C++";
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.write("/chatter", ros::Time::now(), msg);
// 关闭文件
bag.close();
return 0;
}
rosrun rosbag_demo demo01_record
#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, "play");
ros::NodeHandle nh;
// 创建bag对象
rosbag::Bag bag;
// 打开bag文件
bag.open("../bags/test.bag", rosbag::BagMode::Read);
// 读数据,遍历bag
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;
}
rosrun rosbag_demo demo02_play
[ INFO] [1664592519.825306555]: 读取的数据:hello C++
[ INFO] [1664592519.830824939]: 读取的数据:hello C++
[ INFO] [1664592519.831062195]: 读取的数据:hello C++
[ INFO] [1664592519.831401755]: 读取的数据:hello C++
[ INFO] [1664592519.831540311]: 读取的数据:hello C++
#! /usr/bin/env python
import string
import rospy
import rosbag
from std_msgs.msg import String
if __name__ == "__main__":
rospy.init_node("record_p")
# 创建bag对象
bag = rosbag.Bag("../bags/test.bag",'w')
# 写数据
s = String()
s.data = "hello python!"
# 注意,话题名称要与读取名称一致
bag.write("chatter1",s)
bag.write("chatter1",s)
bag.write("chatter1",s)
# 关闭文件
bag.close()
#! /usr/bin/env python
from multiprocessing.managers import BaseManager
import rospy
import rosbag
from std_msgs.msg import String
if __name__ == "__main__":
rospy.init_node("play_p")
# 创建bag对象
bag = rosbag.Bag("../bags/test.bag",'r')
# 读数据,注意要与写入的名称一致,否则无法读取
bagMessage = bag.read_messages("chatter1")
for topic, msg, t, in bagMessage:
rospy.loginfo("%s %s %s",topic,msg,t)
# 关闭文件
bag.close()
rosrun rosbag_demo demo02_play_p.py
[INFO] [1664594555.881108]: chatter1 data: "hello python!" 1664594549126395940
[INFO] [1664594555.887100]: chatter1 data: "hello python!" 1664594549126732587
[INFO] [1664594555.891773]: chatter1 data: "hello python!" 1664594549126883029