当前位置:   article > 正文

tf2_ros::Buffer 用法用例汇总_ros tf2

ros tf2

tf2_ros::Buffer 的常见用法和用例

tf2_ros::BufferROS 中用于管理变换(TF)数据的核心类之一。它允许您在 ROS 中轻松地查询、缓存和管理坐标系之间的变换。下面是一些 tf2_ros::Buffer 的常见用法和用例:

  1. 创建 tf2_ros::Buffer 对象
#include <tf2_ros/buffer.h>

tf2_ros::Buffer tfBuffer;
  • 1
  • 2
  • 3
  1. 填充 tf2_ros::Buffer 对象tf2_ros::Buffer 对象通常通过订阅 /tf 主题来填充。
#include <tf2_ros/transform_listener.h>

tf2_ros::TransformListener tfListener(tfBuffer);
  • 1
  • 2
  • 3
  1. 查找两个坐标系之间的变换
#include <geometry_msgs/TransformStamped.h>

geometry_msgs::TransformStamped transformStamped;

try {
    transformStamped = tfBuffer.lookupTransform("target_frame", "source_frame", ros::Time(0));
} catch (tf2::TransformException &ex) {
    ROS_WARN("Transform lookup failed: %s", ex.what());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 查找特定时间点的两个坐标系之间的变换
try {
    transformStamped = tfBuffer.lookupTransform("target_frame", "source_frame", ros::Time(1234567890));
} catch (tf2::TransformException &ex) {
    ROS_WARN("Transform lookup failed: %s", ex.what());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 查找最新时间戳的两个坐标系之间的变换
try {
    transformStamped = tfBuffer.lookupTransform("target_frame", "source_frame", ros::Time(0), ros::Duration(1.0));
} catch (tf2::TransformException &ex) {
    ROS_WARN("Transform lookup failed: %s", ex.what());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 将变换消息转换为 TF2 数据类型
#include <tf2/LinearMath/Transform.h>
#include <tf2_geometry_msgs/tf2_geometry_msgs.h>

tf2::Transform transform;
tf2::fromMsg(transformStamped.transform, transform);
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 缓存变换数据以提高性能tf2_ros::Buffer 允许缓存变换数据,以减少对 TF 服务器的频繁查询。
tfBuffer.setUsingDedicatedThread(true); // 启用独立线程来更新 TF 数据
  • 1
  1. 清除缓存
tfBuffer.clear(); // 清除缓存中的所有变换数据
  • 1

这些是 tf2_ros::Buffer 的常见用法和用例。通过使用这些功能,您可以在 ROS 中方便地处理坐标系之间的变换关系。

代码实战

下面两行代码是用来创建一个 TF2 缓冲区(tf2_ros::Buffer)和一个 TF2 监听器tf2_ros::TransformListener)的实例。

  1. tf2_ros::Buffer tfBuffer;:这一行创建了一个 TF2 缓冲区对象 tfBuffer。TF2 缓冲区用于存储并管理所有的坐标系变换信息,包括静态变换和动态变换。它允许你通过时间查询任意两个坐标系之间的变换关系。

  2. tf2_ros::TransformListener tfListener(tfBuffer);:这一行创建了一个 TF2 监听器对象 tfListener,并将之前创建的 TF2 缓冲区 tfBuffer 传递给监听器。TF2 监听器用于订阅 ROS 中的 TF 变换信息,并通过 TF2 缓冲区来获取坐标系变换。通过监听器,你可以查询在某个时间点下两个坐标系之间的变换关系,或者实时监听某两个坐标系之间的变换。

下面这段代码用于从 TF2 缓冲区中查询 “laser_link” 到 “base_link” 坐标系之间的变换关系,并将结果存储在 geometry_msgs::TransformStamped 类型的变量 transformStamped 中。

具体解释如下:

  1. geometry_msgs::TransformStamped transformStamped;:声明了一个名为 transformStamped 的变量,类型为 geometry_msgs::TransformStamped。这个消息类型用于存储一个带有时间戳的坐标系变换信息。

  2. tfBuffer.lookupTransform("base_link", "laser_link", ros::Time(0));:使用 tfBuffer 中的 lookupTransform 方法查询 “laser_link” 到 “base_link” 坐标系之间的变换关系。lookupTransform 方法的第一个参数是目标坐标系,第二个参数是源坐标系,第三个参数是时间戳(这里使用 ros::Time(0) 表示最新的变换信息)。如果找到了变换关系,它将返回一个 geometry_msgs::TransformStamped 类型的消息,表示从源坐标系到目标坐标系的变换。

  3. catch (tf2::TransformException &ex) { ... }:如果查询失败,即没有找到变换关系,将会捕获 tf2::TransformException 异常,并在 ROS 中发布一条警告消息。

  4. ros::Duration(1.0).sleep();:如果发生异常,程序将睡眠 1 秒钟,然后继续下一次循环。

  5. continue;:继续下一次循环,跳过当前迭代中未执行完的代码。

在循环中,这段代码会持续不断地查询 “laser_link” 到 “base_link” 坐标系之间的变换关系,并将结果输出。

package.xml

<?xml version="1.0"?>
<package format="2">
  <name>transform_listener</name>
  <version>0.0.1</version>
  <description>A ROS package for listening to transforms</description>
  <maintainer email="xiaoqiuslam@qq.com">xiaoqiuslam</maintainer>
  <license>TODO</license>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>roscpp</build_depend>
  <build_depend>tf2</build_depend>
  <build_depend>tf2_ros</build_depend>
  <build_depend>geometry_msgs</build_depend>
  <build_depend>sensor_msgs</build_depend>
  
  <exec_depend>roscpp</exec_depend>
  <exec_depend>tf2</exec_depend>
  <exec_depend>tf2_ros</exec_depend>
  <exec_depend>geometry_msgs</exec_depend>
  <exec_depend>sensor_msgs</exec_depend>

  <export>
  </export>
</package>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(transform_listener)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  tf2
  tf2_ros
  geometry_msgs
)

catkin_package()

include_directories(
  ${catkin_INCLUDE_DIRS}
)

add_executable(transformlistener src/transformlistener.cpp)
target_link_libraries(transformlistener ${catkin_LIBRARIES})

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

transformlistener.cpp

#include <ros/ros.h>
#include <tf2_ros/transform_listener.h>
#include <geometry_msgs/TransformStamped.h>

int main(int argc, char** argv) {

    ros::init(argc, argv, "transform_listener");
    ros::NodeHandle node;

    tf2_ros::Buffer tfBuffer;
    tf2_ros::TransformListener tfListener(tfBuffer);

    ros::Rate rate(1.0);

    while (node.ok()) {
        geometry_msgs::TransformStamped transformStamped;
        try {
            // 监听 "laser_link" 和"base_link" 坐标系之间的变换
            transformStamped = tfBuffer.lookupTransform("base_link", "laser_link", ros::Time(0));
        } catch (tf2::TransformException &ex) {
            ROS_WARN("Transform lookup failed: %s", ex.what());
            ros::Duration(1.0).sleep();
            continue;
        }

        // laser_link 和 base_link 在 z 轴上的偏移是 0.254 米
        ROS_INFO("Translation: [%.3f, %.3f, %.3f]", 
                 transformStamped.transform.translation.x,
                 transformStamped.transform.translation.y,
                 transformStamped.transform.translation.z);
        // 绕 z 轴的旋转角度为 3.1415926 弧度表示坐标系 base_link 和坐标系 laser_link 的旋转
        ROS_INFO("Rotation: [%.3f, %.3f, %.3f, %.3f]",
                 transformStamped.transform.rotation.x,
                 transformStamped.transform.rotation.y,
                 transformStamped.transform.rotation.z,
                 transformStamped.transform.rotation.w);

        rate.sleep();
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

编译运行

rosrun tf2_ros static_transform_publisher 0 0 0.254 0 0 3.1415926 base_link laser_link

catkin_make
source devel/setup.bash 
rosrun transform_listener transformlistener

rviz
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/885260
推荐阅读
相关标签
  

闽ICP备14008679号