【ROS】—— ROS常用组件—rosbag与rqt工具箱(十二)

前言

📢本系列将依托赵虚左老师的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启动
在这里插入图片描述
直接退出就可以结束录制
在这里插入图片描述
文件是循环播放的

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuan〇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值