文章目录
- 前言
 - 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启动
 
 直接退出就可以结束录制
 
 文件是循环播放的



















