ROS中tf2命令行调试工具详解(解析+代码示例+执行逻辑)

目录

监控“坐标信息的发出者”的运行状态

坐标系转换数据的实时显示

创建坐标系相对位置关系的发布者

PDF格式的坐标信息生成工具

异常分析指令

项目结构

对文件进行分析

对launch文件进行检查

ROS中常用的Linux指令


Tf2命令行工具的意义在于“我们可以用这些命令行工具了解整个坐标系树状结构以及任意两个坐标系之间转换的信息”。我们会发现几乎全部的tf2命令行工具并不和rostopic一样有自己专属的执行指令,tf2命令行工具的调用更像是我们运行可执行文件的格式。这就对了,tf2命令行工具其实就是官方封装的CPP源文件,我们使用命令行对CPP源文件进行传参调用使其完成相应的功能,tf2功能包所有功能的实现大都基于话题通信的方式实现的。

监控“坐标信息的发出者”的运行状态

命令格式:rosrun tf tf_monitor “原坐标系名称” “目标坐标系名称”

运行命令:rosrun tf tf_monitor "laser" "base_link"

运行结果如下所示:

命令的执行逻辑:

其实,我们要想监听节点的运行状态,被监听节点与监听节点必须订阅同一个topic话题,使用话题通信实时传输状态信息。该命令的作用就是“设置一个名为“tf_monitor_随机数”的监听节点,然后该节点/被监听的发布节点分别订阅/发布话题为tf_static的消息内容”:

坐标系转换数据的实时显示

命令格式:rosrun tf tf_echo “源坐标系名称” “目标坐标系名称”

运行命令:rosrun tf tf_echo "laser" "base_link"

运行结果如下所示:

上述输出在命令行中的数据就是我们发布端发布的表征着坐标系相对位置关系的geometry_msgs::TransformStamped数据类型的数据。

命令执行逻辑:

其实,我们要想获取节点运行状态的信息,被监听节点与监听节点必须订阅同一个topic话题,使用话题通信实时传输状态信息。该命令的作用就是“设置一个名为“tf_echo_随机数”的监听节点,然后该节点/被监听的发布节点分别订阅/发布话题为tf_static的消息内容”:

创建坐标系相对位置关系的发布者

发布坐标系相对位置关系有两种形式:编写发布端CPP文件命令行工具。其实,正如前面所说的那样:我们启动的是tf功能包中的一个节点,节点本质上还是通过CPP源文件进行封装的,我们使用“rosrun tf static_transform_publisher param1 …”的格式调用源文件完成功能的调用。

命令格式1:rosrun static_transform_publisher X轴偏移距离 Y轴偏移距离 Z轴偏移距离 X轴旋转角度 Y轴旋转角度 Z轴旋转角度 目标坐标系 源坐标系 信息发布间隔时间(/ms)

命令格式2:rosrun static_transform_publisher X轴偏移距离 Y轴偏移距离 Z轴偏移距离 Quaternion_w Quaternion_x Quaternion_y Quaternion_z 目标坐标系 源坐标系 信息发布间隔时间(/ms)

运行命令:rosrun tf static_transform_publisher 2 3 4 10 10 10 "world" "son3" 1000

运行结果如下所示:(使用rqt工具箱查看坐标系树状结构)

命令执行逻辑:

在订阅端的实现中,我们一般会声明一个tf2_ros::Buffer对象在tf2_ros::TransformListener对象实例化时作为参数传入其中,这个buffer对象的作用正是“汇聚有关坐标转换的所有信息”,正是如此我们无论使用命令行还是CPP源文件发布坐标系相对关系信息,最终都会存入tf2_ros::Buffer对象当中。

PDF格式的坐标信息生成工具

我们需要使用tf_tools功能包进行文件的生成,由于ROS2未默认安装,因此我们要手动安装一下:

// 1.运行该句可以跳转至主工作目录下  
cd ~  
// 2.运行该句可以进行tf2_tools功能包的安装  
sudo apt install ros-noetic-tf2-tools  

命令运行格式:rosrun tf2_tools view_frames.py

命令运行结果如下所示:

文件内容如下所示:

异常分析指令

项目结构

项目名称:turtle_test;

功能包名称:tf2_turtle、turtle_action、turtle_opera。

对文件进行分析

在运行roswtf命令之前,需要运行rosdep update更新项目依赖项!

1. 命令格式:roswtf

2. 运行结果如下所示:

1)启动位置信息:

在工程主目录中运行roswtf命令:

No package or stack in the current directory:说明“我们没在功能包工作目录中启动roswtf工具”。那我们如果roscd tf2_turtle(或者cd ./tf2_turtle)跳转至我们自定义的功能包工作目录下运行roswtf命令就会发现:

“Package:tf2_turtle”表明我们是在tf2_turtle功能包工作目录下启动的roswtf命令。

2)静态检查:

主要是在不开启roscore时,系统进行的检查。如果我们ROS系统安装没出现问题并且环境变量正确,那么静态检查就不会出现错误。我们将环境变量随意赋值:

ROS_PACKAGE_PATH=bad_path,我们将字符串赋值给表征“功能包存放路径的环境变量”,

然后再查看roswtf静态检查输出的信息:

要想将ROS_PACKAGE_PATH环境变量恢复正常,重新刷新环境变量即可:

我们看到又恢复到了正常的功能包搜索路径:/home/rosnetic/turtle_test/src:/opt/ros/noetic/share,

其中包含两个路径:/home/rosnetic/turtle_test/src是我们自定义功能包存放的路径,而/opt/ros/noetic/share则是ROS官方功能包存放的路径。总而言之,ROS_PAKCAGE_PATH变量中包含着系统去寻找功能包(自定义功能包+ROS官方功能包)的路径。为了证明这一点,我们进行如下操作:

 tf功能包的存放路径为“/opt/ros/noetic/share/tf”;

 turtle_test项目存放目录为"/home/rosnetic/turtle_test",那么项目文件的源文件存放地址为“/home/rosnetic/turtle_test/src”。

ROS_PACKAGE_PATH详解如下所示:

4.3 ROS工作空间覆盖 · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程http://www.autolabor.com.cn/book/ROSTutorials/5/41-rosgong-zuo-kong-jian-fu-gai.html3)在线检查:

当我们启动roscore之后,roswtf才会对所在工作目录下正在运行节点的通信状态进行在线检查。如果不启动roscore,系统则会显示如下信息:

说明系统无法根据ROS项目的文件系统进行节点通信状态的获取和检查。

在线检查中,系统会检查工作目录下的所有话题订阅发布双方的通信状态,话题订阅发布双方必须同时处于运行状态才可以,只要缺失一方在线检查结果就会有错误提示。

我们跳转到turtle_test的tf2_turtle功能包中,当我们仅启动turtlesim_node节点同时启动roscore,运行roswtf则会显示如下错误提示:

上述错误显示:turtlesim_node节点订阅的话题仅有一方对象实例化(比如:当我们启动turtlesim_node节点时,/spawn话题的客户端被系统自动实例化但是该话题的服务端未被我们实例化,即我们没有使用rosrun命令运行实例化服务端的可执行文件),说明turtlesim_node节点运行不正常,即turtlesim_node节点发布/订阅的消息没有与之相同话题的节点订阅/发布。

注意:我们使用cd指令跳转至turtle_test的tf2_turtle功能包工作目录下,当我们运行roswtf命令时,系统检测的是turtle_test的tf2_turtle功能包工作目录下正在运行节点的通信状态。但是如果我们在turtle_test主工作目录下运行roswtf命令,那么系统将会检测该工程下所有功能包正在运行节点的通信状态

有时,我们会遇到如下警告:

对launch文件进行检查

在运行roswtf命令之前,需要运行rosdep update更新项目依赖项!

命令格式:roswtf launch文件所在文件夹路径/launch_name.launch

命令作用:我们想要对launch文件中指定几个节点的通信状态进行检查。

对launch文件中启动的节点的通信状态进行检查,假设launch文件中代码如下:

<launch>  
    <!-- 启动第一只乌龟节点与键盘控制节点 -->  
    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node" output="screen" />  
    <node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen"/>  
    <!-- 发布第一只乌龟的坐标信息 -->  
    <node pkg="tf2_turtle" type="getTurtle1Pose" name="getTurtle1Pose" output="screen"/>  
    <!-- 创建第二只乌龟并且订阅发布坐标信息 -->  
    <node pkg="tf2_turtle" type="getTurtle2Pose" name="getTurtle2Pose" output="screen"/>  
    <!-- 坐标变换 -->  
    <node pkg="tf2_turtle" type="frameTransform" name="frameTransform" output="screen"/>  
</launch>

那么当我们运行如下的命令:

roswtf /home/rosnetic/turtle_test/src/tf2_turtle/launch/setupGUI.launch

运行结果如下所示:

我们会知道launch文件中包含的turtlesim_node、turtle_teleop_key、getTurtle1Pose、getTurtle2Pose、frameTransform这五个节点的通信状态是否正常,即通信双方是否存在且是否可以正常通信。

注意:roswtf命令后面加launch文件的绝对路径

ROS中常用的Linux指令

1. cd和roscd跳转指令:“cd ./当前工作目录下的文件名”等同于“roscd 当前工作目录下的文件名”;

2. “echo $环境变量”或者“$环境变量”:显示环境变量的内容;

3. “export 变量名=变量值”或者“变量名=变量值”:更改变量的值;

4. ls命令:Is是List的缩写,表示显示文件目录列表。(只显示非隐藏文件的文件名)

参数:

-a:--all的缩写,显示所有文件,包括隐藏文件(以 . 开头的文件)

-L:列出长数据串,显示文件的大小,时间等数据信息。

使用示例:ls -la:表示显示文件包括的所有信息,结果如下所示:


版权声明:本文为weixin_45590473原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。