赞
踩
tf2_ros::Buffer
的常见用法和用例tf2_ros::Buffer
是 ROS 中用于管理变换(TF)数据的核心类之一。它允许您在 ROS 中轻松地查询、缓存和管理坐标系之间的变换。下面是一些 tf2_ros::Buffer
的常见用法和用例:
tf2_ros::Buffer
对象:#include <tf2_ros/buffer.h>
tf2_ros::Buffer tfBuffer;
tf2_ros::Buffer
对象:tf2_ros::Buffer
对象通常通过订阅 /tf
主题来填充。#include <tf2_ros/transform_listener.h>
tf2_ros::TransformListener tfListener(tfBuffer);
#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());
}
try {
transformStamped = tfBuffer.lookupTransform("target_frame", "source_frame", ros::Time(1234567890));
} catch (tf2::TransformException &ex) {
ROS_WARN("Transform lookup failed: %s", ex.what());
}
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());
}
#include <tf2/LinearMath/Transform.h>
#include <tf2_geometry_msgs/tf2_geometry_msgs.h>
tf2::Transform transform;
tf2::fromMsg(transformStamped.transform, transform);
tf2_ros::Buffer
允许缓存变换数据,以减少对 TF 服务器的频繁查询。tfBuffer.setUsingDedicatedThread(true); // 启用独立线程来更新 TF 数据
tfBuffer.clear(); // 清除缓存中的所有变换数据
这些是 tf2_ros::Buffer
的常见用法和用例。通过使用这些功能,您可以在 ROS 中方便地处理坐标系之间的变换关系。
下面两行代码是用来创建一个 TF2 缓冲区(tf2_ros::Buffer
)和一个 TF2 监听器(tf2_ros::TransformListener
)的实例。
tf2_ros::Buffer tfBuffer;
:这一行创建了一个 TF2 缓冲区对象 tfBuffer
。TF2 缓冲区用于存储并管理所有的坐标系变换信息,包括静态变换和动态变换。它允许你通过时间查询任意两个坐标系之间的变换关系。
tf2_ros::TransformListener tfListener(tfBuffer);
:这一行创建了一个 TF2 监听器对象 tfListener
,并将之前创建的 TF2 缓冲区 tfBuffer
传递给监听器。TF2 监听器用于订阅 ROS 中的 TF 变换信息,并通过 TF2 缓冲区来获取坐标系变换。通过监听器,你可以查询在某个时间点下两个坐标系之间的变换关系,或者实时监听某两个坐标系之间的变换。
下面这段代码用于从 TF2 缓冲区中查询 “laser_link” 到 “base_link” 坐标系之间的变换关系,并将结果存储在 geometry_msgs::TransformStamped
类型的变量 transformStamped
中。
具体解释如下:
geometry_msgs::TransformStamped transformStamped;
:声明了一个名为 transformStamped
的变量,类型为 geometry_msgs::TransformStamped
。这个消息类型用于存储一个带有时间戳的坐标系变换信息。
tfBuffer.lookupTransform("base_link", "laser_link", ros::Time(0));
:使用 tfBuffer
中的 lookupTransform
方法查询 “laser_link” 到 “base_link” 坐标系之间的变换关系。lookupTransform
方法的第一个参数是目标坐标系,第二个参数是源坐标系,第三个参数是时间戳(这里使用 ros::Time(0)
表示最新的变换信息)。如果找到了变换关系,它将返回一个 geometry_msgs::TransformStamped
类型的消息,表示从源坐标系到目标坐标系的变换。
catch (tf2::TransformException &ex) { ... }
:如果查询失败,即没有找到变换关系,将会捕获 tf2::TransformException
异常,并在 ROS 中发布一条警告消息。
ros::Duration(1.0).sleep();
:如果发生异常,程序将睡眠 1 秒钟,然后继续下一次循环。
continue;
:继续下一次循环,跳过当前迭代中未执行完的代码。
在循环中,这段代码会持续不断地查询 “laser_link” 到 “base_link” 坐标系之间的变换关系,并将结果输出。
<?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>
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})
#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; }
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。