导图社区 ROS中的常用组件
ROS技术基础及应用第四章ROS中的常用组件,内容有launch启动文件、TF坐标变换、Qt工具箱、viz三维可视化平台、Gazebo仿真环境、rosbag数据记录与回放。
编辑于2023-06-11 16:59:05 江苏省ROS中的常用组件
launch启动文件
启动文件(Launch File)是ROS中一种同时启动多个节点的途径
它还可以自动启动ROS Master节点管理器,并且可以实现每个节点的各种配置
基本元素
一个简单的launch文件
<launch> <node pkg="turtlesim" name="sim1" type="turtlesim_node"/> <node pkg="turtlesim" name="sim2" type="turtlesim_node"/> </launch>
采用XML的形式进行描述
包含一个根元素<launch>和两个节点元素<node>
<launch>
XML文件必须包含一个根元素,launch文件中的根元素采用<launch>标签定义,文件中的其他内容都必须包含在这个标签中:
<node>
启动文件的核心是启动ROS节点,采用<node>标签定义,语法如下
<node pkg="package-name" type="executable-name" name="node-name" />
在启动文件中启动一个节点需要三个属性:
pkg
定义节点所在的功能包名称
type
定义节点的可执行文件名称
这两个属性等同于在终端中使用rosrun命令执行节点时的输入参数
name
属性用来定义节点运行的名称,将覆盖节点中init()赋予节点的名称
某些情况下,用到以下属性
output="screen"
将节点的标准输出打印到终端屏幕,默认输出为日志文档
respawn="true"
复位属性,该节点停止时,会自动重启,默认为false
required="true"
必要节点,当该节点终止时,launch文件中的其他节点也被终止
ns="namespace"
命名空间,为节点内的相对名称添加命名空间前缀
args="arguments"
节点需要的输入参数
参数设置
launch文件支持参数设置的功能,类似于编程语言中的变量声明
关于参数设置的标签元素有两个
<param>
parameter是ROS系统运行中的参数,存储在参数服务器中
<param>的使用方法
<param name="output_frame" value="odom"/>
运行launch文件后,output_frame这个parameter的值就设置为odom,并且加载到ROS参数服务器上了
参数很多时:
另外一种类似的参数(<rosparam>)加载方式
<rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml" command="load" ns="local_
将一个YAML格式文件中的参数全部加载到ROS参数服务器中
需要设置command属性为“load”,还可以选择设置命名空间“ns”
<arg>
argument是另外一个概念,类似于launch文件内部的局部变量,仅限于launch文件使用,便于launch文件的重构,与ROS节点内部的实现没有关系。
设置argument使用<arg>标签元素,语法如下
<arg name="arg-name" default= "arg-value"/>
launch文件中需要使用到argument时,可以使用如下方式调用
<param name="foo" value="$(arg arg-name)" /> <node name="node" pkg="package" type="type " args="$(arg arg-name)" />
重映射机制
不需要修改别人的功能包的接口,只需要将接口名称重映射一下,取一个别名,我们的系统就认识了
接口的数据类型必须相同
launch文件中的<remap>标签可以帮助我们实现这个重映射功能
例如
<remap from="/turtlebot/cmd_vel" to="/cmd_vel"/>
嵌套复用
launch文件之间也会存在依赖关系
如果要直接复用一个已有launch文件中的内容,可以使用<include>标签包含其他launch文件,这与C语言中的include几乎是一样的
<include file="$(dirname)/other.launch" />
launch是ROS框架中非常实用、灵活的功能,它类似于一种高级编程语言
在使用ROS的过程中,很多情况下我们并不需要编写大量代码,仅需要使用已有的功能包,编辑一下launch文件就可以完成很多机器人功能。
TF坐标变换
在机器人设计和机器人应用中都会涉及不同组件的位置和姿态,这就需要引入坐标系以及坐标变换的概念标变换
坐标变换是机器人系统中常用的基础功能,ROS中的坐标变换系统由TF功能包维护
TF功能包
TF是一个让用户随时间跟踪多个坐标系的功能包,它使用树形数据结构,根据时间缓冲并维护多个坐标系之间的坐标变换关系,可以帮助开发者在任意时间、在坐标系间完成点、向量等坐标的变换
一个机器人系统通常有很多三维坐标系,而且 会 随 着 时 间 的 推 移 发 生 变 化
如 世界坐标系 ( WorldFrame ) 、 基 坐 标 系 ( Base Frame ) 、 机 械 夹 爪 坐 标 系(Gripper Frame)、机器人头部坐标系(Head Frame)等
TF可以在分布式系统中进行操作
所有订阅TF消息的节点都会缓冲一份所有坐标系的变换关系数据
要使用TF功能包,总体来说需要以下两个步骤
监听TF变换
接收并缓存系统中发布的所有坐标变换数据,并从中查询所需要的坐标变换关系
广播TF变换
向系统中广播坐标系之间的坐标变换关系
系统中可能会存在多个不同部分的TF变换广播,每个广播都可以直接 将坐标变换关系插入TF树中,不需要再进行同步
TF工具
tf_monitor
功能是打印TF树中所有坐标系的发布状态
rosrun tf tf_monitor
也可以通过输入参数来查看指定坐标系之间的发布状态
rosrun tf tf_monitor<source_frame> <target_target>
tf_echo
功能是查看指定坐标系之间的变换关系
tf_echo <source_frame> <target_frame>
.static_transform_publisher
功能是发布两个坐标系之间的静态坐标变换
这两个坐标系不发生相对位置变化
命令的格式如下
static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
static_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms
需要设置坐标的偏移参数和旋转参数
偏移参数使用相对于x、y、z三轴的坐标位移
旋转参数的第一种命令格式使用以弧度为单位的yaw/pitch/roll角度
第二种命令格式使用四元数表达旋转角度
发布频率以ms为单位
该命令不仅可以在终端中使用,还可以在launch文件中使用,方法如下
<launch> <node pkg="tf" type="static_transform_publisher" name="link1_broadcaster" args="1 0 0 0 0 </launch>
view_frames
view_frames是可视化的调试工具,可以生成pdf文件,显示整棵TF树的信息
该命令的执行方式
rosrun tf view_frames
然后使用如下命令
evince frames.pdf
rqt_tf_tree
rqt_tf_tree是一个运行时工具,用于可视化通过ROS广播的TF树。只需通过图表左上角的刷新按钮刷新树即可
命令: rosrun rqt_tf_tree rqt_tf_tree 或: rqt &
乌龟例程中的TF
在乌龟仿真器中通过一个例程(turtle_tf)来理解TF 的作用
安装turtle_tf包
sudo apt-get install ros-noetic-turtle-tf
运行例程
roslaunch turtle_tf turtle_tf_demo.launch
打开键盘控制节点,控制中心位置的小乌龟运行
rosrun turtlesim turtle_teleop_key
TF是如何运用
首先使用TF工具来看一下这个例程中的TF树
rosrun tf view_frames
当前系统中存在三个坐标系
world
world是TF树的根节点
是世界坐标系,作为系统的基础坐标系,其他坐标系都相对该坐标系建立
turtle1
turtle2
两个乌龟坐标系,这两个坐标系的原点就是乌龟在世界坐标系下的坐标位置
使用tf_echo工具在TF树中查找乌龟坐标系 之间的变换关系
rosrun tf tf_echo turtle1 turtle2
创建TF广播器
首先需要创建一个发布乌龟坐标系与世界坐标系之间 TF变换的节点
实现源码learning_tf/src/turtle_tf_broadcaster.cpp的具体内容
关键部分是处理乌龟pose消息的回调函数poseCallback
在广播TF消息之前需要定义tf::TransformBroadcaster广播器,然后根据乌龟当前的位姿设置tf::Transform类型的坐标变换
包含setOrigin设置的平移变换以及setRotation设置的旋转变换
然后使用广播器将坐标变换插入TF树并进行发布
TF消息广播之后,其他节点就可以监听该TF消息,从而获取需要的坐标变换了
监听TF消息,并从中获取turtle2相对于turtle1坐标系的变换,从而控制turtle2移动
实现源码learning_tf/src/turtle_tf_listener.cpp的详细内容如下
该节点首先通过服务调用产生乌龟turtle2
然后声明控制turtle2速度的Publisher
在监听TF消息之前,需要创建一个tf::TransformListener类型的监听器
创建成功后监听器会自动接收TF树的消息,并且缓存10秒
然后在循环中就可以实时查找TF树中的坐标变换了,这里需要调用的是tf::TransformListener中的两个接口:
waitForTransform
给定源坐标系(source_frame)和目标坐标系(target_frame)
等待两个坐标系之间指定时间(time)的变换关系
lookupTransform
给定源坐标系(source_frame)和目标坐标系(target_frame),得到两个坐标系之间指定时间(time)的坐标变换(transform)
ros::Time(0)表示我们想要的是最新一次的坐标变 换
然后根据坐标系之间的位置关系,计算得到turtle2需要运动的线速度和角速度,并发布速度控制指令使turtle2向turtle1移动
实现乌龟跟随运动
来编写一个launch文件,使所有节点运行起来
实现源码learning_tf/launch/start_demo_with_listener.launch的详细内容如下
<launch> <!-- 海龟仿真器 --> <node pkg="turtlesim" type="turtlesim_node" name="sim"/> <!-- 键盘控制 --> <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/> <!-- 两只海龟的tf广播 --> <node pkg="learning_tf" type="turtle_tf_broadcaster“ args="/turtle1" name="turtle1_tf_broadcaster" /> <node pkg="learning_tf" type="turtle_tf_broadcaster“ args="/turtle2" name="turtle2_tf_broadcaster" /> <!-- 监听tf广播,并且控制turtle2移动 --> <node pkg="learning_tf" type="turtle_tf_listener" name="listener" /> </launch>
Qt工具箱
ROS提供了一个 Qt 架构的后台图形工具套件 ——rqt_common_plugins
日志输出工具(rqt_console)
rqt_console工具用来图像化显示和过滤ROS系统运行状态中的所有日志消息,包括info、warn、error等级别的日志
使用以下命令即可启动该工具
rqt_console
计算图可视化工具(rqt_graph)
rqt_graph工具可以图形化显示当前ROS系统中的计 算图
数据绘图工具(rqt_plot)
rqt_plot是一个二维数值曲线绘制工具,可以将需要显示的数据在xy坐标系中使用曲线描绘
rviz三维可视化平台
机器人系统中存在大量数据
需要将数据可视化显示
机器人模型的可视化
图像数据的可视化
地图数据的可视化
可以使用XML对机器人、周围物体等任何实物进行尺寸、质量、位置、材质、关节等属性的描述,并且在界面中呈现出来;
可以通过图形化方式,实时显示机器人传感器的信息、机器人的运动状态、周围环境的变化等
可以帮助开发者实现所有可监测信息的图形化显示
可以在rviz的控制界面下,通过按钮、滑动条、数值等方式控制机器人的行为
安装并运行rviz
在终端中分别运行如下命令即可启动ROS和rviz平台
roscore
rosrun rviz rviz
rviz主界面主要包含以下几个部分
3D视图区,用于可视化显示数据,目前没有任何数据,所以显示黑色0
工具栏,用于提供视角控制、目标设置、发布地点等工具
显示项列表,用于显示当前选择的显示插件,可以配置每个插件的属性
视角设置区,用于选择多种观测视角
时间显示区,用于显示当前的系统时间和ROS时间
数据可视化
需要可视化的数据以对应的消息类型发布,我们在rviz中使用相应的插件订阅该消息即可实现显示
首先,需要添加显示数据的插件
点击rviz界面左侧下方的“Add”按钮,rviz会将默认支持的所有数据类型的显示插件罗列出来
列表中选择需要的数据类型插件,然后在“Display Name”文本框中填入一个唯一的名称,用来识别显示的数据
添加完成后,rviz左侧的Dispalys中会列出已经添加的显示插件;点击插件列表前的加号,可以打开一个属性列表,根据需求设置属性
一般情况下“Topic”属性较为重要,用来声明该显示插件所订阅的数据来源,如果订阅成功,在中间的显示区应该会出现可视化后的数据
如果显示有问题,请检查属性区域的“Status”状态
插件扩展机制
默认数据类型
如果需要添加其他数据的显示,也可以通过编写插件的形式进行添加
Interactive Makers教程
启动包含 interactivemarker server的节点
rosrun interactive_marker_tutorials basic_controls
在另一个终端中运行以下命令来启动 RViz
rosrun rviz rviz
在 RViz 中,执行以下操作
将“Fixed Frame”设置为“/base_link”
通过单击“Displays”面板中的“Add”来添加“Interactive Markers”显示
将此显示的Update Topic设置为“/basic_controls/update”。这应该会立即在 rviz 中调出几个灰色立方体
现在在工具栏中选择“Interact”。这将启用主视图中的所有交互式元素,在框周围显示额外的箭头和环
添加“Grid”显示
Gazebo仿真环境
Gazebo是一个功能强大的三维物理仿真平台
虽然Gazebo中的机器人模型与rviz使用的模型相同,但是需要在模型中加入机器人和周围环境的物理属性,例如质量、摩擦系数、弹性系数等
Gazebo的特点
动力学仿真
支持多种高性能的物理引擎
三维可视化环境
支持显示逼真的三维环境,包括光线、纹理、影子
传感器仿真
可扩展插件
多种机器人模型
官方提供PR2、Pioneer2 DX、TurtleBot等机器人模型
当然也可以使用自己创建的机器人模型
TCP/IP传输
Gazebo的后台仿真处理和前台图形显示可以通过网络通信实现远程仿真
云仿真
Gazebo仿真可以在Amazon、Softlayer等云端运行
终端工具
用户可以使用Gazebo提供的命令行工具在终端实现仿真控制
Gazebo的版本变化虽然较大,但是兼容性保持得比较好
安装并运行Gazebo
roscore rosrun gazebo_rosgazebo
验证Gazebo是否与ROS系统成功连接,可以查看ROS的话题列表
rostopic list
如果连接成功,应该可以看到Gazebo发布/订阅的如下话题列表
Gazebo提供的服务列表:$ rosservice list
构建仿真环境
Gazebo中有两种创建仿真环境的方法
直接插入模型
Building Editor
rosbag数据记录与回放
rosbag,可以帮助开发者收集ROS系统运行时的消息数据,然后在离线状态下回放
记录数据
使用rosbag抓取这些话题的消息,并且打包成一个文件放置到指定文件夹中
$ mkdir ~/bagfiles $ cd ~/bagfiles $ rosbag record -a
-a(all)参数意为记录所有发布的消息
以.bag为后缀的文件,这就是成功生成的数据记录文件了
回放数据
rosbag功能包提供了info命令,可以查看数据记录文件的详细信息
rosbag info <your bagfile>
使用如下命令回放所记录的话题数据:$ rosbag play <your bagfile>