目标:学习如何使用 tf2 获取帧变换。
教程级别:中级
时间:10 分钟
目录
背景
先决条件
任务
1.编写监听节点
2.更新启动文件
3.构建
4.运行
摘要
背景
在之前的教程中,我们创建了一个 tf2 广播器来发布乌龟的姿态到 tf2。
在本教程中,我们将创建一个 tf2 监听器以开始使用 tf2。
先决条件
本教程假设您已经完成了 tf2 静态广播器教程(C++)https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Static-Broadcaster-Cpp.html 和 tf2 广播器教程(C++)https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Broadcaster-Cpp.html。在上一个教程中,我们创建了一个 learning_tf2_cpp
包,我们将继续在此基础上进行工作。
任务
1. 编写监听节点
让我们首先创建源文件。转到我们在上一个教程中创建的 learning_tf2_cpp
包。在 src
目录中,通过输入以下命令下载示例监听器代码:
cxy@ubuntu2404-cxy:~/ros2_ws/src/learning_tf2_cpp/src$ wget https://raw.githubusercontent.com/ros/geometry_tutorials/ros2/turtle_tf2_cpp/src/turtle_tf2_listener.cpp
使用您喜欢的文本编辑器打开文件。
#include <chrono> // 包含C++标准库的时间库
#include <functional> // 包含C++标准库的函数库
#include <memory> // 包含C++标准库的内存库
#include <string> // 包含C++标准库的字符串库
#include "geometry_msgs/msg/transform_stamped.hpp" // 包含geometry_msgs包的TransformStamped消息
#include "geometry_msgs/msg/twist.hpp" // 包含geometry_msgs包的Twist消息
#include "rclcpp/rclcpp.hpp" // 包含ROS2的rclcpp库
#include "tf2/exceptions.h" // 包含tf2的异常处理库
#include "tf2_ros/transform_listener.h" // 包含tf2_ros的TransformListener库
#include "tf2_ros/buffer.h" // 包含tf2_ros的Buffer库
#include "turtlesim/srv/spawn.hpp" // 包含turtlesim的Spawn服务
using namespace std::chrono_literals; // 使用std::chrono_literals命名空间
class FrameListener : public rclcpp::Node // 定义一个名为FrameListener的类,继承自rclcpp::Node
{
public:
FrameListener() // FrameListener类的构造函数
: Node("turtle_tf2_frame_listener"), // 初始化节点名为"turtle_tf2_frame_listener"
turtle_spawning_service_ready_(false), // 初始化乌龟生成服务的状态为未准备好
turtle_spawned_(false) // 初始化乌龟的生成状态为未生成
{
// 声明并获取`target_frame`参数
target_frame_ = this->declare_parameter<std::string>("target_frame", "turtle1");
tf_buffer_ =
std::make_unique<tf2_ros::Buffer>(this->get_clock()); // 创建一个新的tf2_ros::Buffer对象
tf_listener_