当前位置: 首页 > news >正文

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;// 设置 headertransform.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 2rclcpp::init(argc, argv);// 创建节点并保持运行auto node = std::make_shared<StaticTFBroadcaster>();rclcpp::spin(node);// 关闭 ROS 2rclcpp::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"  // 使用 TransformBroadcasterclass 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;// 设置 headertransform.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 2rclcpp::init(argc, argv);// 创建节点并保持运行auto node = std::make_shared<DynamicTFBroadcaster>();rclcpp::spin(node);// 关闭 ROS 2rclcpp::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 保持节点运行。

相关文章:

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

TF&#xff08;Transform&#xff09; 是 ROS&#xff08;Robot Operating System&#xff09;中的一个核心功能&#xff0c;用于管理和发布坐标系之间的变换关系。TF 的主要作用是描述机器人系统中各个部分&#xff08;如传感器、执行器、底盘等&#xff09;之间的位置和姿态关…...

Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普

引言&#xff1a; 今天我们聊聊Android生态中最“硬核”的话题&#xff1a;通用内核镜像&#xff08;GKI&#xff09;与内核模块接口&#xff08;KMI&#xff09;。这是内核碎片化终结者的秘密武器&#xff0c;解决了内核和供应商模块之间无尽的兼容性问题。为什么重要&#x…...

dp 凸优化

时间有点仓促&#xff0c;过几天会补。 来自 czz 学长的课&#xff0c;SMWC -> Day4 。 目录 凸函数介绍WQS二分1. P2619【国家集训队 2】Tree I2. CF739E Gosha is hunting 闵可夫斯基和1. QOJ-5421 Factories Once More2. GD 省集 tower Slope Trick1. CF713C2. ABC217H3.…...

详细介绍:Kubernetes(K8s)的技术架构(核心概念、调度和资源管理、安全性、持续集成与持续部署、网络和服务发现)

目录 前言1、K8s架构概述1.1、控制面&#xff08;Control Plane&#xff09;1.2、工作节点&#xff08;Worker Node&#xff09; 2、Kubernetes核心概念2.1、Pod2.2、ReplicaSet2.3、Deployment2.4、Service2.5、Namespace2.6、ConfigMap与Secret2.7、Persistent Volume&#x…...

[SAP ABAP] Dialog屏幕开发

Dialog屏幕开发在SAP ABAP环境中被广泛应用于创建交互式的用户界面&#xff0c;允许终端用户与应用程序进行互动 Dialog屏幕开发相关资料 [Dialog屏幕开发] 设置GUI Status 菜单/GUI Title 标题 [Dialog屏幕开发] 屏幕绘制(文本/输入框/按钮控件)...

安全测试之 SSTI 模板注入入门

文章目录 一、什么是SSTI&#xff1f;二、python 中的 Jinja2 漏洞验证三、Java 的 Thymeleaf 模版漏洞验证四、小结 一、什么是SSTI&#xff1f; SSTI&#xff08;Server-Side Template Injection&#xff09;是一种服务器端模板注入漏洞&#xff0c;它出现在使用模板引擎的W…...

滑动窗口解题模板

滑动窗口适用于固定长度的窗口问题&#xff0c;或者需要动态维护一个窗口的场景。 模板 public int slidingWindowTemplate(int[] nums, int k) { int n nums.length; int maxSum 0; // 记录最大值&#xff08;或最小值&#xff09; int windowSum 0; // 当前窗口的值 …...

SOC和SOH的含义

SOC 和 SOH 是在电池管理系统中常见的两个概念&#xff0c;通常用于描述电池的状态&#xff0c;以下是具体解释&#xff1a; SOC&#xff08;State of Charge&#xff09; 定义&#xff1a;荷电状态&#xff0c;也叫剩余电量&#xff0c;反映的是电池在一定条件下当前所剩余的…...

Genetic Prompt Search via Exploiting Language Model Probabilities

题目 利用语言模型概率的遗传提示搜索 论文地址&#xff1a;https://www.ijcai.org/proceedings/2023/0588.pdf 项目地址&#xff1a;https://github.com/zjjhit/gap3 摘要 针对大规模预训练语言模型(PLMs)的即时调优已经显示出显著的潜力&#xff0c;尤其是在诸如fewshot学习…...

1561. 你可以获得的最大硬币数目

class Solution:def maxCoins(self, piles: List[int]) -> int:piles.sort()res,n0,len(piles)for i in range(n//3):respiles[n-2-2*i]return res这里如果"你"想要获取最大&#xff0c;那么从最大的开始找 每隔俩算一个最大累计&#xff0c;Bob默认自己从最小那找…...

DNA结合之Motif_1:CNN

1&#xff0c;首先可以识别在KO前后的motif——》由CNN模型做出识别&#xff0c;看看这个有没有什么灵感 2&#xff0c;ZNF143等都可以使用来识别 3&#xff0c;暂时只使用单个peak文件&#xff0c;后期可以使用ENCODE中所有的对应的TF的peak文件 1&#xff0c;文件解压之后…...

kong 网关和spring cloud gateway网关性能测试对比

该测试只是简单在同一台机器设备对spring cloud gateway网关和kong网关进行对比&#xff0c;受限于笔者所拥有的资源&#xff0c;此处仅做简单评测。 一、使用spring boot 的auth-service作为服务提供者 该服务提供了一个/health接口&#xff0c;接口返回"OK"&…...

【2024 CSDN博客之星】个人收获分享

目录 [ C 语言 ] [ 数据结构 ] [ 算法 ] [ C ] [Linux] [Mysql] [Redis 文档学习] [Docker 云原生] [Git] [Qt] 转眼间大学就过了一年半&#xff0c;这一年半间好像习惯了&#xff0c;开心了那就学会吧&#xff0c;不开心了学会吧就开心了......期间在学习上面也走了…...

Codeforces Round 998 (Div. 3)(部分题解)

补题链接 A. Fibonacciness 思路&#xff1a;了解清楚题意&#xff0c;求得是最大的斐波那契的度&#xff0c;数组只有5个数(最多度为3)&#xff0c;能列出其对应的式子 或 或 #include <bits/stdc.h> using namespace std; #define int long long void solve() {int …...

[创业之路-261]:《向流程设计要效率》-1-流程体系的建立是一场全方位的变革,一定会遇到各种阻力,需要全方位、系统性地进行流程管理

目录 一、思想和思维方式的转变 1.1 使能流程的战略 1.2 使能流程的组织 1. 流程决定组织 2. 基于流程分配责权利与资源 3. 从“管控”到“赋能” 1.3 使能流程的人才 1. 人才战略&#xff1a;从职能导向到流程导向 2. 能力模型&#xff1a;从职能专家到作战专家 3. …...

深入理解 Spring 的 Lazy Loading:原理、实现与应用场景

延迟加载&#xff08;Lazy Loading&#xff09;是 Spring 容器管理 Bean 的一种策略&#xff0c;指 只有在需要时&#xff08;调用 getBean() 方法获取 Bean 时&#xff09;才会实例化该 Bean。这是 Spring 提供的一种优化机制&#xff0c;用于提高启动效率和降低资源占用。 1.…...

扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、移除链表元素思路一思路二 二、合并两个有序链表思路&#xff1a;优化&#xff1a; 三、反转链表思路一思路二 四、链表的中间节点思…...

【unity游戏开发之InputSystem——02】InputAction的使用介绍(基于unity6开发介绍)

文章目录 一、InputAction简介1、InputAction是什么&#xff1f;2、示例 二、InputAction参数相关1、点击齿轮1.1 Actions 动作&#xff08;1&#xff09;动作类型&#xff08;Action Type&#xff09;&#xff08;2&#xff09;初始状态检查&#xff08;Initial State Check&a…...

Excel常用功能总结

Excel 是微软办公软件套装中的一个重要组件&#xff0c;用于数据处理和分析。以下是一些 Excel 的常用功能总结&#xff1a; 基本操作 1.单元格操作&#xff1a;选择、插入、删除单元格、行或列。 2.数据输入&#xff1a;输入文本、数字、日期和时间。 3.格式设置&#xff1a;设…...

【go语言】变量和常量

一、变量 1.1 变量的定义 程序 &#xff1a; 我们向电脑说了一段话&#xff0c;需要电脑才能理解 &#xff08;沟通机制 &#xff0c;xxx语言 -- 汇编 -- 机器码&#xff09;&#xff0c;电脑实际上识别的是机器码 &#xff1a; 0 1 1 1 0 1 &#xff08;高低电频&#xff09…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...