25/1/22 算法笔记<ROS2> TF变换

TF(Transform) 是 ROS(Robot Operating System)中的一个核心功能,用于管理和发布坐标系之间的变换关系。TF 的主要作用是描述机器人系统中各个部分(如传感器、执行器、底盘等)之间的位置和姿态关系,从而实现数据的统一和模块化。

静态 TF(Static Transform) 是 ROS(Robot Operating System)中用于描述两个坐标系之间固定不变的变换关系的一种机制。静态 TF 适用于那些在机器人系统中不会随时间变化的坐标系关系,例如传感器相对于机器人底盘的位置和姿态。

以下是使用 C++ 编写的发布静态 TF 变换的完整代码。代码实现了一个 ROS 2 节点,用于发布静态 TF 变换,描述 camera_link 相对于 base_link 的位置和姿态。

#include "geometry_msgs/msg/transform_stamped.hpp"
#include "rclcpp/rclcpp.hpp"
#include "tf2/LinearMath/Quaternion.h"
#include "tf2_ros/static_transform_broadcaster.h"

class StaticTFBroadcaster : public rclcpp::Node
{
private:
    std::shared_ptr<tf2_ros::StaticTransformBroadcaster> broadcaster_;

public:
    StaticTFBroadcaster() : Node("static_tf_broadcaster")
    {
        // 初始化静态 TF 广播器
        broadcaster_ = std::make_shared<tf2_ros::StaticTransformBroadcaster>(this);
        // 发布静态 TF 变换
        publish_static_tf();
    }

    void publish_static_tf()
    {
        // 创建 TransformStamped 消息
        geometry_msgs::msg::TransformStamped transform;

        // 设置 header
        transform.header.stamp = this->get_clock()->now();
        transform.header.frame_id = "base_link";  // 父坐标系
        transform.child_frame_id = "camera_link"; // 子坐标系

        // 设置平移
        transform.transform.translation.x = 0.5;
        transform.transform.translation.y = 0.3;
        transform.transform.translation.z = 0.6;

        // 设置旋转(欧拉角转换为四元数)
        tf2::Quaternion q;
        q.setRPY(M_PI, 0.0, 0.0); // roll=180°, pitch=0°, yaw=0°
        transform.transform.rotation.x = q.x();
        transform.transform.rotation.y = q.y();
        transform.transform.rotation.z = q.z();
        transform.transform.rotation.w = q.w();

        // 发布静态 TF 变换
        broadcaster_->sendTransform(transform);
        RCLCPP_INFO(this->get_logger(), "发布静态 TF: camera_link 相对于 base_link");
    }
};

int main(int argc, char **argv)
{
    // 初始化 ROS 2
    rclcpp::init(argc, argv);
    // 创建节点并保持运行
    auto node = std::make_shared<StaticTFBroadcaster>();
    rclcpp::spin(node);
    // 关闭 ROS 2
    rclcpp::shutdown();
    return 0;
}

1. 静态 TF 的实现步骤

1. 创建节点
  • 创建一个 ROS 2 节点,用于发布静态 TF 变换。

2. 初始化静态 TF 广播器
  • 使用 tf2_ros::StaticTransformBroadcaster 初始化静态 TF 广播器。

3. 设置 TF 变换
  • 创建 geometry_msgs::msg::TransformStamped 消息,设置 header、平移和旋转。

4. 发布静态 TF 变换
  • 调用 sendTransform 发布静态 TF 变换。

  • 静态 TF 只需要发布一次,不需要定期更新。

5. 保持节点运行
  • 使用 rclcpp::spin 保持节点运行。

动态 TF(Dynamic Transform) 是 ROS 2 中用于描述两个坐标系之间随时间变化的变换关系的一种机制。与静态 TF 不同,动态 TF 适用于那些在机器人系统中会随时间变化的坐标系关系,例如移动的机器人底盘、机械臂的末端执行器等。

动态 TF 的实现

在 ROS 2 中,动态 TF 通过 tf2_ros::TransformBroadcaster 实现。与静态 TF 不同,动态 TF 需要定期发布变换关系。

#include "geometry_msgs/msg/transform_stamped.hpp"
#include "rclcpp/rclcpp.hpp"
#include "tf2/LinearMath/Quaternion.h"
#include "tf2_ros/transform_broadcaster.h"  // 使用 TransformBroadcaster

class DynamicTFBroadcaster : public rclcpp::Node
{
public:
    DynamicTFBroadcaster() : Node("dynamic_tf_broadcaster")
    {
        // 初始化动态 TF 广播器
        broadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(this);
        // 创建定时器,每 0.1 秒调用一次 publish_tf 函数
        timer_ = this->create_wall_timer(std::chrono::milliseconds(100), std::bind(&DynamicTFBroadcaster::publish_tf, this));
    }

private:
    void publish_tf()
    {
        // 创建 TransformStamped 消息
        geometry_msgs::msg::TransformStamped transform;

        // 设置 header
        transform.header.stamp = this->get_clock()->now();
        transform.header.frame_id = "base_link";  // 父坐标系
        transform.child_frame_id = "camera_link"; // 子坐标系

        // 设置平移
        transform.transform.translation.x = 0.5;
        transform.transform.translation.y = 0.3;
        transform.transform.translation.z = 0.6;

        // 设置旋转(欧拉角转换为四元数)
        tf2::Quaternion q;
        q.setRPY(M_PI, 0.0, 0.0); // roll=180°, pitch=0°, yaw=0°
        transform.transform.rotation.x = q.x();
        transform.transform.rotation.y = q.y();
        transform.transform.rotation.z = q.z();
        transform.transform.rotation.w = q.w();

        // 发布动态 TF 变换
        broadcaster_->sendTransform(transform);
        RCLCPP_INFO(this->get_logger(), "发布动态 TF: camera_link 相对于 base_link");
    }

    std::shared_ptr<tf2_ros::TransformBroadcaster> broadcaster_;
    rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char **argv)
{
    // 初始化 ROS 2
    rclcpp::init(argc, argv);
    // 创建节点并保持运行
    auto node = std::make_shared<DynamicTFBroadcaster>();
    rclcpp::spin(node);
    // 关闭 ROS 2
    rclcpp::shutdown();
    return 0;
}

2. 动态 TF 的实现步骤

1. 创建节点
  • 创建一个 ROS 2 节点,用于发布动态 TF 变换。

2. 初始化动态 TF 广播器
  • 使用 tf2_ros::TransformBroadcaster 初始化动态 TF 广播器。

3. 设置 TF 变换
  • 创建 geometry_msgs::msg::TransformStamped 消息,设置 header、平移和旋转。

4. 创建定时器
  • 使用 create_wall_timer 创建一个定时器,定期调用发布函数。

5. 发布动态 TF 变换
  • 在定时器回调函数中,更新 transform.header.stamp 为当前时间。

  • 调用 sendTransform 发布动态 TF 变换。

6. 保持节点运行
  • 使用 rclcpp::spin 保持节点运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java开发,IDEA转战VSCODE配置(mac)

一、基本java开发环境配置 前提&#xff1a;已经安装了jdk、maven、vscode&#xff0c;且配置了环境变量 1、安装java相关的插件 2、安装spring相关的插件 3、vscode配置maven环境 打开 VsCode -> 首选项 -> 设置&#xff0c;也可以在setting.json文件中直接编辑&…

AI模型提示词(prompt)优化-实战(一)

一、prompt作用 用户与AI模型沟通的核心工具&#xff0c;用于引导模型生成特定内容、控制输出质量、调整行为模式&#xff0c;并优化任务执行效果&#xff0c;从而提升用户体验和应用效果 二、prompt结构 基本结构 角色&#xff1a;设定一个角色&#xff0c;给AI模型确定一个基…

Unreal Engine 5 C++ Advanced Action RPG 十章笔记

第十章 Survival Game Mode 2-Game Mode Test Map 设置游戏规则进行游戏玩法 生成敌人玩家是否死亡敌人死亡是否需要刷出更多 肯定:难度增加否定:玩家胜利 流程 新的游戏模式类游戏状态新的数据表来指定总共有多少波敌人生成逻辑UI告诉当前玩家的敌人波数 3-Survival Game M…

设计模式的艺术-代理模式

结构性模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解代理模式 代理模式&#xff08;Proxy Pattern&#xff09;&#xff1a;给某一个对象提供一个代理&#xff0c;并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。 代理模式类型较多…

每日一题洛谷P1423 小玉在游泳c++

#include<iostream> using namespace std; int main() {double s;cin >> s;int n 0;double sum 0;double k 2;while (sum < s) {sum k;n;k * 0.98;}cout << n << endl;return 0; }

Python3 OS模块中的文件/目录方法六

一. 简介 前面文章简单学习了Python3中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS模块中文件、目录的操作方法。 二. Python3 OS模块中的文件/目录方法 1. os.lseek() 方法、os.lstat() 方法 os.lseek() 方法用于在打开的文件中移动文件指针的位置。在Unix&#…

HTB:Heist[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用smbclient匿…

【HarmonyOS NEXT】华为分享-碰一碰开发分享

关键词&#xff1a;鸿蒙、碰一碰、systemShare、harmonyShare、Share Kit 华为分享新推出碰一碰分享&#xff0c;支持用户通过手机碰一碰发起跨端分享&#xff0c;可实现传输图片、共享wifi等。我们只需调用系统 api 传入所需参数拉起对应分享卡片模板即可&#xff0c;无需对 U…

使用Inno Setup软件制作.exe安装包

1.下一步&#xff1a; 2. 填写 程序名字 和 版本号&#xff1a; 3.设置安装路径信息 4.添加要打包的exe和依赖文件 5.为应用程序创建关联的文件 如果不需要就直接取消勾选 6.创建快捷方式 &#xff08;1&#xff09;第一种&#xff1a;常用 &#xff08;1&#xff09;第二种&am…

CPU 缓存基础知识

并发编程首先需要简单了解下现代CPU相关知识。通过一些简单的图&#xff0c;简单的代码&#xff0c;来认识CPU以及一些常见的问题。 目录 CPU存储与缓存的引入常见的三级缓存结构缓存一致性协议MESI协议缓存行 cache line 通过代码实例认识缓存行的重要性 CPU指令的乱序执行通过…

初步搭建并使用Scrapy框架

目录 目标 版本 实战 搭建框架 获取图片链接、书名、价格 通过管道下载数据 通过多条管道下载数据 下载多页数据 目标 掌握Scrapy框架的搭建及使用&#xff0c;本文以爬取当当网魔幻小说为案例做演示。 版本 Scrapy 2.12.0 实战 搭建框架 第一步&#xff1a;在D:\pyt…

Python - itertools- pairwise函数的详解

前言&#xff1a; 最近在leetcode刷题时用到了重叠对pairwise,这里就讲解一下迭代工具函数pairwise,既介绍给大家&#xff0c;同时也提醒一下自己&#xff0c;这个pairwise其实在刷题中十分有用&#xff0c;相信能帮助到你。 参考官方讲解&#xff1a;itertools --- 为高效循…

YOLO-cls训练及踩坑记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、模型训练 二、测试 三、踩坑记录 1、推理时设置的imgsz不生效 方法一&#xff1a; 方法二&#xff1a; 2、Windows下torchvision版本问题导致报错 总结 前…

云计算、AI与国产化浪潮下DBA职业之路风云变幻,如何谋破局启新途?

引言 在近日举办的一场「云和恩墨大讲堂」直播栏目中&#xff0c;云和恩墨联合创始人李轶楠、副总经理熊军和欧冶云商数据库首席薛晓刚共同探讨了DBA的现状与未来发展。三位专家从云计算、人工智能、国产化替代等多个角度进行了深入的分析和探讨&#xff0c;为从业者提供了宝贵…

PAT甲级-1017 Queueing at Bank

题目 题目大意 银行有k个窗口&#xff0c;每个窗口只能服务1个人。如果3个窗口已满&#xff0c;就需要等待。给出n个人到达银行的时间和服务时间&#xff0c;要求计算每个人的平均等待时间。如果某个人的到达时间超过17:00:00&#xff0c;则不被服务&#xff0c;等待时间也不计…

从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑

文章目录 从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑一 参考二 安装三 启动准备大模型文件 四 数据集&#xff08;关键&#xff09;&#xff01;4.1 Alapaca格式4.2 sharegpt4.3 在 dataset_info.json 中注册4.4 官方 alpaca_zh_demo 例子 999条数据, 本机微调 5分…

AI刷题-策略大师:小I与小W的数字猜谜挑战

问题描述 有 1, 2,..., n &#xff0c;n 个数字&#xff0c;其中有且仅有一个数字是中奖的&#xff0c;这个数字是等概率随机生成的。 Alice 和 Bob 进行一个游戏&#xff1a; 两人轮流猜一个 1 到 n 的数字&#xff0c;Alice 先猜。 每完成一次猜测&#xff0c;主持会大声…

【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…

CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅

CSDN 博客之星 2024&#xff1a;默语的技术进阶与社区耕耘之旅 &#x1f31f; 默语&#xff0c;是一位在技术分享与社区建设中坚持深耕的博客作者。今年&#xff0c;我有幸再次入围成为 CSDN 博客之星TOP300 的一员&#xff0c;这既是对过往努力的肯定&#xff0c;也是对未来探…

计算机网络 (56)交互式音频/视频

一、定义与特点 定义&#xff1a;交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术&#xff0c;包括语音、视频图像等多媒体实时通信。 特点&#xff1a; 实时性&#xff1a;音频和视频数据是实时传输和播放的&#xff0c;用户之间可以进行即时的交流。交互…