std::shared_ptr<tf2_ros::Buffer>
是 C++ 中的一个智能指针,用于管理 tf2_ros::Buffer
类型的实例。tf2_ros::Buffer
是 ROS (Robot Operating System) 中的一个类,用于存储和查询变换信息(transform data)。
用法简介
-
创建智能指针:
使用std::make_shared<tf2_ros::Buffer>()
来创建一个tf2_ros::Buffer
的智能指针。 -
获取变换:
使用lookupTransform
成员函数来查询两个坐标系之间的变换。 -
发布变换:
使用transform
消息类型和advertise
函数来发布变换信息。 -
订阅变换:
使用subscribe
函数订阅变换信息。 -
缓存管理:
tf2_ros::Buffer
可以配置缓存大小和超时时间,以优化性能。
成员变量
tf2_ros::Buffer
通常不直接暴露成员变量,而是通过成员函数来访问和管理内部状态。
成员函数
以下是一些常用的 tf2_ros::Buffer
成员函数:
-
lookupTransform
: 查询从一个坐标系到另一个坐标系的变换。- 参数:目标坐标系、源坐标系、时间点。
- 返回:如果找到变换,则返回一个
geometry_msgs::TransformStamped
对象。
-
setTransformAuthority
: 设置变换的发布者。- 参数:坐标系名称、发布者名称。
-
clear
: 清除缓存中的所有变换。 -
canTransform
: 检查是否存在从一个坐标系到另一个坐标系的变换。- 参数:目标坐标系、源坐标系、时间点。
-
_frameIDs
: 一个私有成员,包含所有已知坐标系的列表。
示例代码
#include <tf2_ros/buffer.h>
#include <tf2_ros/transform_listener.h>
int main(int argc, char **argv)
{
// 初始化 ROS 节点
ros::init(argc, argv, "tf2_listener");
ros::NodeHandle nh;
// 创建 tf2_ros::Buffer 的智能指针
std::shared_ptr<tf2_ros::Buffer> buffer = std::make_shared<tf2_ros::Buffer>();
// 创建一个 TransformListener,它会自动订阅所有需要的变换
tf2_ros::TransformListener listener(*buffer);
// 等待直到可以查询变换
ros::spinOnce();
ros::Duration(1.0).sleep();
// 查询变换
try
{
geometry_msgs::TransformStamped transformStamped;
transformStamped = buffer->lookupTransform("base_link", "camera_frame", ros::Time(0));
// 使用 transformStamped
}
catch (tf2::TransformException &ex)
{
ROS_ERROR("%s", ex.what());
}
ros::spin();
return 0;
}