第一章 ROS空间创建、helloworld的实现、开启多个节点
第二章 话题通信
第三章 服务通信
第四章 参数服务器
第五章 常用指令
第六章 通信机制实操
第七章 ROS通信机制进阶(常用API、Python模块的导入)
第八章 元功能包、节点运行管理launch文件(teleop_twist安装方法)
第九章 重名问题、分布式通信
第十章-第一节 TF坐标变换(内含PyKDL 和PyInit__tf2功能缺失等解决)
第十章-第二节 TF坐标变换实操
第十章-第三节 rosbag、rqt工具箱
现在大二,之前大一有幸参加了2021的国赛,很壮烈的拿了个江苏赛区的二等奖。但发现无人机这个题,真的是往堆钱上走了。不上ROS不行,现在来记录一下一个纯小白学习ROS的过程和遇到的问题。防止学弟、学妹们再走我走过的弯路。板子用的是学长给的Jetson Nano(4GB),版本是Ubuntu18.04(已配置好基础ROS所需配置)
机器人传感器获取到的信息,有时我们可能需要时时处理,有时可能只是采集数据,事后分析,比如:
机器人导航实现中,可能需要绘制导航所需的全局地图,地图绘制实现,有两种方式:
方式1:可以控制机器人运动,将机器人传感器感知到的数据时时处理,生成地图信息。
方式2:同样是控制机器人运动,将机器人传感器感知到的数据留存,事后,再重新读取数据,生成地图信息。两种方式比较,显然方式2使用上更为灵活方便。
在ROS中关于数据的留存以及读取实现,提供了专门的工具: rosbag。
概念
是用于录制和回放 ROS 主题的一个工具集。
作用
实现了数据的复用,方便调试、测试。
本质
rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。
需求:
ROS 内置的乌龟案例并操作,操作过程中使用 rosbag 录制,录制结束后,实现重放
实现:
mkdir ./xxx
cd xxx
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文件。
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
rosbag play 文件名
这里注意,rosbag本质上是一个功能包 record和play实质上都是节点
可以采用调用节点的方式进行:rosrun rosbag play bags/hello_2022-07-01-17-13-06.bag
命令实现不够灵活,可以使用编码的方式,增强录制与回放的灵活性,本节将通过简单的读写实现演示rosbag的编码实现。
#! /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
#! /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
之前,在 ROS 中使用了一些实用的工具,比如: ros_bag 用于录制与回放、tf2_tools 可以生成 TF 树 … 这些工具大大提高了开发的便利性,但是也存在一些问题: 这些工具的启动和使用过程中涉及到一些命令操作,应用起来不够方便,在ROS中,提供了rqt工具箱,在调用工具时以图形化操作代替了命令操作,应用更便利,提高了操作效率,优化了用户体验。
概念
ROS基于 QT 框架,针对机器人开发提供了一系列可视化的工具,这些工具的集合就是rqt
作用
可以方便的实现 ROS 可视化调试,并且在同一窗口中打开多个部件,提高开发效率,优化用户体验。
组成
启动
rqt的启动方式有两种:
rqt
rosrun rqt_gui rqt_gui
简介:可视化显示计算图
启动:可以在 rqt 的 plugins 中添加,或者使用rqt_graph
启动
打开一个命令行:roscore
打开一个命令行:
source ./devel/setup.bash
roslaunch tf04_test test.launch
打开一个命令行:rqt
简介: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
简介:图形绘制插件,可以以 2D 绘图的方式绘制发布在 topic 上的数据
准备:启动 turtlesim 乌龟节点与键盘控制节点,通过 rqt_plot 获取乌龟位姿
启动:可以在 rqt 的 plugins 中添加,或者使用rqt_plot
启动
打开一个命令行:roscore
打开一个命令行:rosrun turtlesim turtlesim_node
打开一个命令行:rosrun turtlesim turtle_teleop_key
打开一个命令行:rqt
打开一个命令行:rqt_plot
简介:录制和重放 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]。