目录

一、rosbag

1.1 本节引言

1.2 rosbag使用_命令行

1.3 rosbag使用_编码 

1.3.1 写实现

1.3.2 读实现 

二、rqt工具箱 

2.1 本章简介

2.2 rqt工具箱的基本使用

2.2.1 rqt常用插件:rqt_graph

2.2.2 rqt常用插件:rqt_console

2.2.2 rqt常用插件:rqt_plot

2.2.3 rqt常用插件:rqt_bag

2.3 本章小结


一、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坐标变换是重点,也是难点,需要大家熟练掌握坐标变换的应用场景以及代码实现。下一章开始将介绍机器人系统仿真,我们将在仿真环境下,创建机器人、控制机器人运动、搭建仿真环境,并以机器人的视角去感知世界。