文章目录
- 前言
- 1. rosbag
- 1.1 rosbag使用_命令行
- 2. rosbag使用_编码
- 2.1 C++实现
- 2.1.1 写bag
- 2.1.2 读bag
- 2.2 python实现
- 2.2.1 写bag
- 2.2.2 读bag
- 3. rqt工具箱
- 3.1 rqt安装启动与基本使用
- 3.2 rqt常用插件:rqt_graph
- 3.3 rqt常用插件:rqt_console
- 3.4 rqt常用插件:rqt_plot
- 3.5 rqt常用插件:rqt_bag
前言
📢本系列将依托赵虚左老师的ROS课程,写下自己的一些心得与笔记。
📢课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ
📢讲义链接:http://www.autolabor.com.cn/book/ROSTutorials/index.html
📢 文章可能存在疏漏的地方,恳请大家指出。
1. rosbag
在ROS中关于数据的留存以及读取实现,提供了专门的工具: rosbag。
概念
是用于录制和回放 ROS 主题的一个工具集。
作用
实现了数据的复用,方便调试、测试。
本质
rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。
1.1 rosbag使用_命令行
1.准备,创建目录保存录制的文件
mkdir ./xxx
cd xxx
2.开始录制
rosbag record -a -o 目标文件
操作小乌龟一段时间,结束录制使用 ctrl + c,在创建的目录中会生成bag文件。
3.查看文件
rosbag info 文件名
yuan@yuan-Legion-Y9000P-IAH7H:~$ rosbag info bag/demo01_2023-01-10-19-59-47.bag
path: bag/demo01_2023-01-10-19-59-47.bag
version: 2.0
duration: 14.9s
start: Jan 10 2023 19:59:47.37 (1673351987.37)
end: Jan 10 2023 20:00:02.27 (1673352002.27)
size: 149.8 KB
messages: 1951
compression: none [1/1 chunks]
types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
rosgraph_msgs/Log [acffd30cd6b6de30f120938c17c593fb]
turtlesim/Color [353891e354491c51aabe32df673fb446]
turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics: /rosout 6 msgs : rosgraph_msgs/Log (2 connections)
/turtle1/cmd_vel 109 msgs : geometry_msgs/Twist
/turtle1/color_sensor 918 msgs : turtlesim/Color
/turtle1/pose 918 msgs : turtlesim/Pose
4.回放文件
rosbag play 文件名
重启乌龟节点,会发现,乌龟按照录制时的轨迹运动。
更多内容http://wiki.ros.org/rosbag/Commandline
2. rosbag使用_编码
2.1 C++实现
2.1.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[])
{
// 2.初始化
setlocale(LC_ALL,"");
ros::init(argc,argv,"rosbag_write");
ros::NodeHandle nh;
// 3.创建rosbag对象
rosbag::Bag bag;
// 4.打开文件流
bag.open("hello.bag",rosbag::BagMode::Write);
// 5.写数据
std_msgs::String msg;
msg.data = "hello";
/*
参数1:话题
参数2:时间戳
参数3:消息
*/
bag.write("/chatter",ros::Time::now(),msg);
// 6.关闭文件流
bag.close();
return 0;
}
查看
yuan@yuan-Legion-Y9000P-IAH7H:~/catkin_ws$ rosbag info hello.bag path: hello.bag
version: 2.0
duration: 0.0s
start: Jan 10 2023 20:21:07.13 (1673353267.13)
end: Jan 10 2023 20:21:07.13 (1673353267.13)
size: 4.6 KB
messages: 1
compression: none [1/1 chunks]
types: std_msgs/String [992ce8a1687cec8c8bd883ec73ca41d1]
topics: /chatter 1 msg : std_msgs/String
2.1.2 读bag
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "rosbag/view.h"
#include "std_msgs/String.h"
/*
需求:使用rosbag向磁盘文件写出数据(话题+消息)
流程:
1.导包
2.初始化
3.创建rosbag对象
4.打开文件流(以读的方式打开)
5.读数据
6.关闭文件流
*/
int main(int argc, char *argv[])
{
// 2.初始化
setlocale(LC_ALL,"");
ros::init(argc,argv,"rosbag_read");
ros::NodeHandle nh;
// 3.创建rosbag对象
rosbag::Bag bag;
// 4.打开文件流(以读的方式打开)
bag.open("hello.bag",rosbag::BagMode::Read);
// 5.读数据
//取出话题\时间戳\消息内容
//可以先获取消息的集合,再迭代取出消息的字段
for (auto &&m : rosbag::View(bag))
{
//解析
std::string topic = m.getTopic();
ros::Time time = m.getTime();
std_msgs::String::ConstPtr p = m.instantiate<std_msgs::String>();
ROS_INFO("解析的内容,话题:%s,时间戳:%0.2f,消息内容:%s",
topic.c_str(),
time.toSec(),
p ->data.c_str());
}
// 6.关闭文件流
bag.close();
return 0;
}
内容如下
yuan@yuan-Legion-Y9000P-IAH7H:~/catkin_ws$ rosrun rosbag_demo demo02_read_bag
[ INFO] [1673355585.834041271]: 解析的内容,话题:/chatter,时间戳:1673353897.95,消息内容:hello
[ INFO] [1673355585.834978975]: 解析的内容,话题:/chatter,时间戳:1673353897.95,消息内容:hello
[ INFO] [1673355585.834995757]: 解析的内容,话题:/chatter,时间戳:1673353897.95,消息内容:hello
[ INFO] [1673355585.835001959]: 解析的内容,话题:/chatter,时间戳:1673353897.95,消息内容:hello
2.2 python实现
2.2.1 写bag
#! /usr/bin/env python
import rospy
import rosbag
from std_msgs.msg import String
if __name__ == "__main__":
#初始化节点
rospy.init_node("w_bag_p")
# 创建 rosbag 对象
bag = rosbag.Bag("/home/rosdemo/demo/test.bag",'w')
# 写数据
s = String()
s.data= "hahahaha"
bag.write("chatter",s)
bag.write("chatter",s)
bag.write("chatter",s)
# 关闭流
bag.close()
2.2.2 读bag
#! /usr/bin/env python
import rospy
import rosbag
from std_msgs.msg import String
if __name__ == "__main__":
#初始化节点
rospy.init_node("w_bag_p")
# 创建 rosbag 对象
bag = rosbag.Bag("/home/rosdemo/demo/test.bag",'r')
# 读数据
bagMessage = bag.read_messages("chatter")
for topic,msg,t in bagMessage:
rospy.loginfo("%s,%s,%s",topic,msg,t)
# 关闭流
bag.close()
3. rqt工具箱
概念
ROS基于 QT 框架,针对机器人开发提供了一系列可视化的工具,这些工具的集合就是rqt
作用
可以方便的实现 ROS 可视化调试,并且在同一窗口中打开多个部件,提高开发效率,优化用户体验。
组成
rqt 工具箱组成有三大部分
- rqt——核心实现,开发人员无需关注
- rqt_common_plugins——rqt 中常用的工具套件
- rqt_robot_plugins——运行中和机器人交互的插件(比如: rviz)
3.1 rqt安装启动与基本使用
一般只要你安装的是desktop-full版本就会自带工具箱
如果需要安装可以以如下方式安装
$ sudo apt-get install ros-melodic-rqt
$ sudo apt-get install ros-melodic-rqt-common-plugins
rqt的启动方式有两种:
- 方式1:
rqt
- 方式2:
rosrun rqt_gui rqt_gui
启动 rqt 之后,可以通过 plugins 添加所需的插件
话题发布控制
服务控制
3.2 rqt常用插件:rqt_graph
简介:可视化显示计算图
启动:可以在 rqt 的 plugins 中添加,或者使用rqt_graph启动
乌龟跟随案例的rqt_graph如下
3.3 rqt常用插件:rqt_console
简介: rqt_console 是 ROS 中用于显示和过滤日志的图形化插件
准备: 编写 Node 节点输出各个级别的日志信息
/*
ROS 节点:输出各种级别的日志信息
*/
#include "ros/ros.h"
int main(int argc, char *argv[])
{
ros::init(argc,argv,"log_demo");
ros::NodeHandle nh;
ros::Rate r(0.3);
while (ros::ok())
{
ROS_DEBUG("Debug message d");
ROS_INFO("Info message oooooooooooooo");
ROS_WARN("Warn message wwwww");
ROS_ERROR("Erroe message EEEEEEEEEEEEEEEEEEEE");
ROS_FATAL("Fatal message FFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
r.sleep();
}
return 0;
}
3.4 rqt常用插件:rqt_plot
简介:图形绘制插件,可以以 2D 绘图的方式绘制发布在 topic 上的数据
准备:启动 turtlesim 乌龟节点与键盘控制节点,通过 rqt_plot 获取乌龟位姿
启动:可以在 rqt 的 plugins 中添加,或者使用rqt_plot启动
3.5 rqt常用插件:rqt_bag
简介:录制和重放 bag 文件的图形化插件
准备:启动 turtlesim 乌龟节点与键盘控制节点
启动:可以在 rqt 的 plugins 中添加,或者使用rqt_bag启动
直接退出就可以结束录制
文件是循环播放的