在Jetson Nano上学习ROS的记录(版本Ubuntu18.04,课程来源赵虚左老师的《ROS理论与实践》)第十章-第三节 rosbag、rqt工具箱

系列文章目录

第一章 ROS空间创建、helloworld的实现、开启多个节点
第二章 话题通信
第三章 服务通信
第四章 参数服务器
第五章 常用指令
第六章 通信机制实操
第七章 ROS通信机制进阶(常用API、Python模块的导入)
第八章 元功能包、节点运行管理launch文件(teleop_twist安装方法)
第九章 重名问题、分布式通信
第十章-第一节 TF坐标变换(内含PyKDL 和PyInit__tf2功能缺失等解决)
第十章-第二节 TF坐标变换实操
第十章-第三节 rosbag、rqt工具箱

文章目录

  • 系列文章目录
  • 前言
  • 一、rosbag
    • 1.rosbag使用_命令行
    • 2.rosbag使用_编码
  • 二、rqt工具箱
    • 1.rqt安装启动与基本使用
    • 2.rqt常用插件:rqt_graph
    • 3.rqt常用插件:rqt_console
    • 4.rqt常用插件:rqt_plot
    • 5.rqt常用插件:rqt_bag
  • 三、本章小结
  • 总结


前言

现在大二,之前大一有幸参加了2021的国赛,很壮烈的拿了个江苏赛区的二等奖。但发现无人机这个题,真的是往堆钱上走了。不上ROS不行,现在来记录一下一个纯小白学习ROS的过程和遇到的问题。防止学弟、学妹们再走我走过的弯路。板子用的是学长给的Jetson Nano(4GB),版本是Ubuntu18.04(已配置好基础ROS所需配置)

一、rosbag

机器人传感器获取到的信息,有时我们可能需要时时处理,有时可能只是采集数据,事后分析,比如:
机器人导航实现中,可能需要绘制导航所需的全局地图,地图绘制实现,有两种方式:
方式1:可以控制机器人运动,将机器人传感器感知到的数据时时处理,生成地图信息。
方式2:同样是控制机器人运动,将机器人传感器感知到的数据留存,事后,再重新读取数据,生成地图信息。两种方式比较,显然方式2使用上更为灵活方便。

在ROS中关于数据的留存以及读取实现,提供了专门的工具: rosbag。

概念
是用于录制和回放 ROS 主题的一个工具集。

作用
实现了数据的复用,方便调试、测试。

本质
rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。

1.rosbag使用_命令行

需求:
ROS 内置的乌龟案例并操作,操作过程中使用 rosbag 录制,录制结束后,实现重放

实现:

  1. 准备
    创建目录保存录制的文件
    打开一个命令行:
mkdir ./xxx
cd xxx
  1. 开始录制
    打开一个命令行:roscore
    打开一个命令行:rosrun turtlesim turtlesim_node
    打开一个命令行:rosrun turtlesim turtle_teleop_key
    打开一个命令行:
rosbag record -a -O 目标文件 #-a是指录制所有话题 -o是设置输出路径

例子:rosbag record -a -o bags/hello.bag
操作小乌龟一段时间,结束录制使用 ctrl + c,在创建的目录中会生成bag文件。

  1. 查看文件
    打开一个命令行:rosbag info 文件名
    输出:
path:        bags/hello_2022-07-01-17-13-06.bag
version:     2.0
duration:    25.9s
start:       Jul 01 2022 17:13:06.09 (1656666786.09)
end:         Jul 01 2022 17:13:31.00 (1656666812.00)
size:        232.1 KB	#文件大小
messages:    3222	#有多少条消息
compression: none [1/1 chunks]     #是否压缩
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
             turtlesim/Color     [353891e354491c51aabe32df673fb446]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /rosout                    4 msgs    : rosgraph_msgs/Log   (2 connections)
             /turtle1/cmd_vel           7 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   1605 msgs    : turtlesim/Color    
             /turtle1/pose           1606 msgs    : turtlesim/Pose
  1. 回放文件
    打开一个命令行:rosbag play 文件名

这里注意,rosbag本质上是一个功能包 record和play实质上都是节点
可以采用调用节点的方式进行:rosrun rosbag play bags/hello_2022-07-01-17-13-06.bag

2.rosbag使用_编码

命令实现不够灵活,可以使用编码的方式,增强录制与回放的灵活性,本节将通过简单的读写实现演示rosbag的编码实现。

  1. 写 bag
    代码如下:
#! /usr/bin/env python2.7
#encoding:utf-8
import rospy
import rosbag
from std_msgs.msg import String
"""
    需求:写出消息数据到磁盘上的bag文件
    流程:
            1.导包
            2.初始化
            3.创建rosbag对象并且打开文件流
            4.写数据
            5.关闭流——释放资源

"""
if __name__=="__main__":
    # 2.初始化
    rospy.init_node("write_bag_p")

    # 3.创建rosbag对象并且打开文件流
    #f文件路径, mode='r'文件操作模式,默认是read模式,可改为w写入模式,
    bag = rosbag.Bag("hello_p.bag","w")  

    # 4.写数据
    #topic: 话题, msg: 消息, t: 指定时间戳,默认值是当前时间
    msg = String()  #创建字符串对象消息
    msg.data = "hello_bag"
    bag.write("/liaotian",msg)  #topic: 话题, msg: 消息
    bag.write("/liaotian",msg)
    bag.write("/liaotian",msg)
    bag.write("/liaotian",msg)
    bag.write("/liaotian",msg)

    # 5.关闭流——释放资源
    bag.close()

打开一个命令行:roscore
打开一个命令行:

source ./devel/setup.bash
rosrun rosbag_demo demo01_write_bag_p.py
  1. 读bag
    代码如下:
#! /usr/bin/env python2.7
#encoding:utf-8
import rospy
import rosbag

"""
    需求:读取消息数据到磁盘上的bag文件
    流程:
            1.导包
            2.初始化
            3.创建rosbag对象并且打开文件流 以读的方式打开
            4.读数据
            5.关闭流——释放资源

"""
if __name__=="__main__":
    # 2.初始化
    rospy.init_node("read_bag_p")

    # 3.创建rosbag对象并且打开文件流 以读的方式打开
    bag = rosbag.Bag("hello_p.bag","r")

    # 4.读数据
    #每个消息有三个内容:topic话题,message消息,timestamp时间戳
    msgs = bag.read_messages() #参数:topics话题,返回值:把所有消息以一个列表传回来
    for topic,msg,time in msgs:
        rospy.loginfo("话题:%s,消息:%s,时间:%s",topic,msg.data,time)

    # 5.关闭流——释放资源
    bag.close()

打开一个命令行:roscore
打开一个命令行:

source ./devel/setup.bash
rosrun rosbag_demo demo02_read_bag_p.py

输出:

[INFO] [1656673631.103384]: 话题:/liaotian,消息:hello_bag,时间:1656670278428220033
[INFO] [1656673631.108272]: 话题:/liaotian,消息:hello_bag,时间:1656670278428842067
[INFO] [1656673631.114471]: 话题:/liaotian,消息:hello_bag,时间:1656670278429126977
[INFO] [1656673631.118914]: 话题:/liaotian,消息:hello_bag,时间:1656670278429312944
[INFO] [1656673631.124065]: 话题:/liaotian,消息:hello_bag,时间:1656670278429626941

二、rqt工具箱

之前,在 ROS 中使用了一些实用的工具,比如: ros_bag 用于录制与回放、tf2_tools 可以生成 TF 树 … 这些工具大大提高了开发的便利性,但是也存在一些问题: 这些工具的启动和使用过程中涉及到一些命令操作,应用起来不够方便,在ROS中,提供了rqt工具箱,在调用工具时以图形化操作代替了命令操作,应用更便利,提高了操作效率,优化了用户体验。

概念
ROS基于 QT 框架,针对机器人开发提供了一系列可视化的工具,这些工具的集合就是rqt

作用
可以方便的实现 ROS 可视化调试,并且在同一窗口中打开多个部件,提高开发效率,优化用户体验。

组成

  • rqt 工具箱组成有三大部分
  • rqt——核心实现,开发人员无需关注
  • rqt_common_plugins——rqt 中常用的工具套件
  • rqt_robot_plugins——运行中和机器人交互的插件(比如: rviz)

1.rqt安装启动与基本使用

启动
rqt的启动方式有两种:

rqt
rosrun rqt_gui rqt_gui

2.rqt常用插件:rqt_graph

简介:可视化显示计算图
启动:可以在 rqt 的 plugins 中添加,或者使用rqt_graph启动
打开一个命令行:roscore
打开一个命令行:

source ./devel/setup.bash
roslaunch tf04_test test.launch

打开一个命令行:rqt

3.rqt常用插件:rqt_console

简介:rqt_console 是 ROS 中用于显示和过滤日志的图形化插件

准备:编写 Node 节点输出各个级别的日志信息
代码如下:

#! /usr/bin/env python
#encoding:utf-8
import rospy

if __name__ == "__main__":
    rospy.init_node("rqt_shuchu_test_p")
    rate = rospy.Rate(10)#循环发送 频率是10
    while not rospy.is_shutdown():
        try:
            rospy.logdebug("hello,debug")  #不会输出
            rospy.loginfo("hello,info")  #默认白色字体
            rospy.logwarn("hello,warn")  #默认黄色字体
            rospy.logerr("hello,error")  #默认红色字体
            rospy.logfatal("hello,fatal") #默认红色字体
        except Exception as e:
            rospy.logwarn("错误提示:%s",e)

        rate.sleep()

打开一个命令行:roscore
打开一个命令行:

source ./devel/setup.bash
rosrun tf04_test rqt_shuchu_test_p.py

打开一个命令行:rqt

4.rqt常用插件:rqt_plot

简介:图形绘制插件,可以以 2D 绘图的方式绘制发布在 topic 上的数据

准备:启动 turtlesim 乌龟节点与键盘控制节点,通过 rqt_plot 获取乌龟位姿

启动:可以在 rqt 的 plugins 中添加,或者使用rqt_plot启动

打开一个命令行:roscore
打开一个命令行:rosrun turtlesim turtlesim_node
打开一个命令行:rosrun turtlesim turtle_teleop_key
打开一个命令行:rqt
打开一个命令行:rqt_plot

5.rqt常用插件:rqt_bag

简介:录制和重放 bag 文件的图形化插件

准备:启动 turtlesim 乌龟节点与键盘控制节点

启动:可以在 rqt 的 plugins 中添加,或者使用rqt_bag启动

打开一个命令行:roscore
打开一个命令行:rosrun turtlesim turtlesim_node
打开一个命令行:rosrun turtlesim turtle_teleop_key
打开一个命令行:rqt
打开一个命令行:rqt_bag

三、本章小结

本章主要介绍了ROS中的常用组件,内容如下:

TF坐标变换(重点)
rosbag 用于ros话题的录制与回放
rqt工具箱,图形化方式调用组件,提高操作效率以及易用性
其中 TF坐标变换是重点,也是难点,需要大家熟练掌握坐标变换的应用场景以及代码实现。下一章开始将介绍机器人系统仿真,我们将在仿真环境下,创建机器人、控制机器人运动、搭建仿真环境,并以机器人的视角去感知世界。

总结

以上就是今天要讲的内容,本文仅仅简单记录了ROS的rosbag、rqt工具箱,如果有问题请在博客下留言或者咨询邮箱:[email protected]

你可能感兴趣的:(ROS学习,嵌入式硬件,visual,studio,code,python,ubuntu,单片机)