【ROS2】中级:tf2-添加框架(C++)

目标:学习如何向 tf2 添加额外的框架。

教程级别:中级

 时间:15 分钟

 目录

  •  背景

  •  tf2 树

  •  任务

    • 1 编写固定帧广播器

    • 1.1 检查代码

    • 1.2 CMakeLists.txt

    • 1.3 编写启动文件

    •  1.4 构建

    •  1.5 运行

    • 2 编写动态帧广播器

    • 2.1 检查代码

    • 2.2 CMakeLists.txt

    • 2.3 编写启动文件

    •  2.4 构建

    •  2.5 运行

  •  摘要

 背景

在之前的教程中,我们通过编写 tf2 广播器 https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Broadcaster-Cpp.html 和 tf2 监听器 https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Listener-Cpp.html 重新创建了乌龟演示。本教程将教您如何向变换树添加额外的固定和动态帧。事实上,在 tf2 中添加帧与创建 tf2 广播器非常相似,但本示例将向您展示 tf2 的一些附加功能。

对于许多与变换相关的任务,在局部坐标系中思考更容易。例如,最容易在激光扫描仪中心的坐标系中推理激光扫描测量值。tf2 允许您为系统中的每个传感器、链接或关节定义一个局部坐标系。当从一个坐标系变换到另一个坐标系时,tf2 将处理所有引入的隐藏中间坐标系变换。

 tf2 树 🌳

tf2 构建了一个帧的树结构,因此不允许帧结构中存在闭环。这意味着一个帧只有一个父帧,但它可以有多个子帧。目前,我们的 tf2 树包含三个帧: world 、 turtle1 和 turtle2 。两个乌龟帧是 world 帧的子帧。如果我们想向 tf2 添加一个新帧,三个现有帧中的一个需要成为父帧,而新帧将成为其子帧。

53fcc78a7f3d7dcc129d22a4a6c2da84.png

 任务

1 编写固定帧广播器

在我们的乌龟示例中,我们将添加一个新的框架 carrot1 ,它将是 turtle1 的子框架。这个框架将作为第二只乌龟的目标。

首先创建源文件。进入我们在前面的教程中创建的 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/fixed_frame_tf2_broadcaster.cpp

现在打开名为 fixed_frame_tf2_broadcaster.cpp 的文件。

#include <chrono>  // 导入 chrono 库
#include <functional>  // 导入 functional 库
#include <memory>  // 导入 memory 库


#include "geometry_msgs/msg/transform_stamped.hpp"  // 导入 TransformStamped 消息类型
#include "rclcpp/rclcpp.hpp"  // 导入 rclcpp 库
#include "tf2_ros/transform_broadcaster.h"  // 导入 TransformBroadcaster 类


using namespace std::chrono_literals;  // 使用 std::chrono_literals 命名空间


class FixedFrameBroadcaster : public rclcpp::Node  // 定义一个名为 FixedFrameBroadcaster 的类,继承自 rclcpp::Node 类
{
public:
  FixedFrameBroadcaster()  // 构造函数
  : Node("fixed_frame_tf2_broadcaster")  // 调用父类构造函数,并设置节点名称为 "fixed_frame_tf2_broadcaster"
  {
    tf_broadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(this);  // 创建一个 TransformBroadcaster 对象
    timer_ = this->create_wall_timer(  // 创建一个定时器
      100ms, std::bind(&FixedFrameBroadcaster::broadcast_timer_callback, this));  // 每 100 毫秒调用一次 broadcast_timer_callback 方法
  }


private:
  void broadcast_timer_callback()  // 定义定时器回调方法
{
    geometry_msgs::msg::TransformStamped t;  // 创建一个 TransformStamped 对象


    t.header.stamp = this->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值