目录
一、rosbag
1.1 本节引言
1.应用场景
机器人传感器获取到的信息,有时我们可能需要时时处理,有时可能只是采集数据,事后分析,比如:
机器人导航实现中,可能需要绘制导航所需的全局地图,地图绘制实现,有两种方式,方式1:可以控制机器人运动,将机器人传感器感知到的数据实时处理,生成地图信息。
方式2:同样是控制机器人运动,将机器人传感器感知到的数据留存,事后,再重新读取数据,生成地图信息。两种方式比较,显然方式2使用上更为灵活方便。
在ROS中关于数据的留存以及读取实现,提供了专门的工具: rosbag。
2.概念
是用于录制和回放 ROS 主题的一个工具集。
3.作用
实现了数据的复用,方便调试、测试。
4.本质
rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。
1.2 rosbag使用_命令行
1.需求
ROS 内置的乌龟案例并操作,操作过程中使用 rosbag 录制,录制结束后,实现重放
2.实现
Ⅰ.准备
创建目录保存录制的文件
mkdir ./xxx cd xxx
Ⅱ.开始录制
rosbag record -a -o 目标文件
ctrl + C停止录制
Ⅲ.查看文件
rosbag info 文件名
liuhongwei@liuhongwei-virtual-machine:~/bags$ rosbag info hello_2022-04-17-19-39-25.bag path: hello_2022-04-17-19-39-25.bag version: 2.0 duration: 1:32s (92s) start: Apr 17 2022 19:39:25.03 (1650195565.03) end: Apr 17 2022 19:40:57.47 (1650195657.47) size: 797.9 KB messages: 11546 compression: none [1/1 chunks] types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a] rosgraph_msgs/Log [acffd30cd6b6de30f120938c17c593fb] turtlesim/Color [353891e354491c51aabe32df673fb446] turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9] topics: /rosout 8 msgs : rosgraph_msgs/Log (2 connections) /turtle1/cmd_vel 10 msgs : geometry_msgs/Twist /turtle1/color_sensor 5764 msgs : turtlesim/Color /turtle1/pose 5764 msgs : turtlesim/Pose
Ⅳ.回放文件
rosbag play 文件名
1.3 rosbag使用_编码
1.需求
命令实现不够灵活,可以使用编码的方式,增强录制与回放的灵活性,本节将通过简单的读写实现演示rosbag的编码实现。
1.3.1 写实现
Ⅰ.新建功能包 rosbag_demo,添加依赖roscpp rospy std_msgs rosbag
Ⅱ.大体流程
使用rosbag向磁盘文件写出数据(有话题有消息)
1.导包
2.初始化
3.创建rosbag对象
4.打开文件流
5.写数据
6.关闭文件流Ⅲ.code
#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,"bagwrite"); ros::NodeHandle nh; rosbag::Bag bag; //参数一:文件名 参数二:文件的读取方式 bag.open("hello.bag",rosbag::BagMode::Write); //参数 (话题名称,时间戳,消息) std_msgs::String msg; msg.data = "hello xxx"; bag.write("/chatter",ros::Time::now(),msg); bag.close(); return 0; }
Ⅳ.运行
1.3.2 读实现
#include "ros/ros.h" #include "std_msgs/String.h" #include "rosbag/bag.h" #include "rosbag/view.h" int main(int argc, char *argv[]) { setlocale(LC_ALL,""); ros::init(argc,argv,"bag_read"); ros::NodeHandle nh; rosbag::Bag bag; bag.open("hello.bag",rosbag::BagMode::Read); //读取数据: //取出话题,时间戳和消息内容 //可以先获取消息的集合,再迭代取出消息的字段 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()); } bag.close(); return 0; }
Ⅱ.逻辑:
需求:使用rosbag读取磁盘上的bag文件
1.导包
2.初始化
3.创建rosbag对象
4.打开文件流
5.读数据
6.关闭文件流
二、rqt工具箱
2.1 本章简介
1.rqt工具箱有啥用
之前,在 ROS 中使用了一些实用的工具,比如: ros_bag 用于录制与回放、tf2_tools 可以生成 TF 树 ..... 这些工具大大提高了开发的便利性,但是也存在一些问题: 这些工具的启动和使用过程中涉及到一些命令操作,应用起来不够方便,在ROS中,提供了rqt工具箱,在调用工具时以图形化操作代替了命令操作,应用更便利,提高了操作效率,优化了用户体验。
2.概念
ROS基于 QT 框架,针对机器人开发提供了一系列可视化的工具,这些工具的集合就是rqt
3.作用
可以方便的实现 ROS 可视化调试,并且在同一窗口中打开多个部件,提高开发效率,优化用户体验。
4.组成
rqt 工具箱组成有三大部分
rqt——核心实现,开发人员无需关注
rqt_common_plugins——rqt 中常用的工具套件
rqt_robot_plugins——运行中和机器人交互的插件(比如: rviz)
2.2 rqt工具箱的基本使用
1.启动
rqt
2.2.1 rqt常用插件:rqt_graph
步骤
Ⅰ.启动乌龟跟随案例
Ⅱ.启动RQT添加插件
<launch> <!-- 1. 启动乌龟GUI结点 --> <node pkg = "turtlesim" type = "turtlesim_node" name = "turtle1" output = "screen"/> <node pkg = "turtlesim" type = "turtle_teleop_key" name = "key" /> <!-- 2.生成新的乌龟结点--> <node pkg = "tf04_test" type = "test_new_turtle" name = "turtle2" output = "screen"/> <!-- 3.需要启动两个乌龟相对于世界的坐标关系的发布--> <!-- 一、只编写一个结点 结点启动两次 二、结点启动时动态传参 三、第一次传turtle1 第二次传turtle2--> <node pkg = "tf04_test" type = "test02_pub_turtle" name = "pub1" args = "turtle1" output = "screen"/> <node pkg = "tf04_test" type = "test02_pub_turtle" name = "pub2" args = "turtle2" output = "screen"/> <!-- 4.需要订阅turtle1 与 turtle2 相对于世界坐标系的坐标消息,并转换成turtle1相对于turtle2的坐标关系--> <!-- 再生成速度消息--> <node pkg = "tf04_test" type = "test03_control_turtle2" name = "control" output = "screen"/> </launch>
2.2.2 rqt常用插件:rqt_console
1.简介
rqt_console 是 ROS 中用于显示和过滤日志的图形化插件
2.准备
/* 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.查看
可以在 rqt 的 plugins 中添加
2.2.2 rqt常用插件:rqt_plot
1.简介
图形绘制插件,可以以 2D 绘图的方式绘制发布在 topic 上的数据
2.准备
启动 turtlesim 乌龟节点与键盘控制节点,通过 rqt_plot 获取乌龟位姿
3.启动
可以在 rqt 的 plugins 中添加,或者使用
rqt_plot
启动
2.2.3 rqt常用插件:rqt_bag
1.简介
录制和重放 bag 文件的图形化插件
2.准备
启动 turtlesim 乌龟节点与键盘控制节点
3.启动
可以在 rqt 的 plugins 中添加,或者使用
rqt_bag
启动
4.演示
Ⅰ.这么启动
Ⅱ.这样操作
Ⅲ.怎么重放
继续添加bag插件,点击文件夹按钮,点击播放按钮,开始播放,右击publish才可以发布。
2.3 本章小结
本章主要介绍了ROS中的常用组件,内容如下:
- TF坐标变换(重点)
- rosbag 用于ros话题的录制与回放
- rqt工具箱,图形化方式调用组件,提高操作效率以及易用性
其中 TF坐标变换是重点,也是难点,需要大家熟练掌握坐标变换的应用场景以及代码实现。下一章开始将介绍机器人系统仿真,我们将在仿真环境下,创建机器人、控制机器人运动、搭建仿真环境,并以机器人的视角去感知世界。