ROS——TF坐标变换

2023-05-16

78ab647a5a0a48959d9ca7280bd0c587.png

 9e009ee5d91b4ec68d05131f48eb4838.png

 TF功能包

创建功能包

cd ~/catkin_ws/src
catkin_creat_pkg learning_tf roscpp rospy tf turtlesim
//如果此时依赖包已有tf,后文中CMakeLists文件中的find_package内则不需要添加tf
//编译功能包
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

TF是一个让用户随时间跟踪多个坐标系的功能包,它使用树形结构,根据时间缓冲并维护多个坐标系之间的坐标变换关系,可以帮助开发者在任意时间、坐标系间完成点、向量等坐标的变换。

TF可以在分布式系统中进行操作,也就是说,一个机器人系统中所有的坐标变换关系,对于所有的节点组件都是可用的,所有订阅TF消息的节点都会缓冲一份所有坐标系的变换关系数据,所以这种结构不需要中心服务器来存储任何数据

使用TF功能包需要完成以下两个步骤

1、监听TF变换

接受并缓存系统中发布的所有坐标变换数据,并从中查询所需要的坐标变换关系

2、广播TF变换

向系统中广播坐标系之间的坐标变换关系。系统中可能存在多个不同部分的TF变换广播,每个广播都可以直接将坐标变换关系插入TF树中,不需要再进行同步。

TF编程实现

安装功能包

sudo apt-get install ros-noetic-turtle-tf
//我的ros安装版本是noetic,不同的ros版本需要对应不同的功能包安装命令
//查看ros安装版本
roscore
//另起终端
rosparam list
rosparam get /rosdistro

安装功能包完成后执行以下命令

roslaunch turtle_tf turtle_tf_demo.launch
//另起新终端
rosrun turtlesim turtle_teleop_key

然后就可以通过键盘方向键来控制小海龟移动,注意鼠标此时要放在新终端上

d0e58be9fe3d441d8fbc96b1319aaf3f.png

 

//创建一个TF监听器监听5s,得到TF结构关系图
rosrun tf view_frames
//查看节点信息
rqt_graph				

                                                     可视化的TF树信息

2a7ac95ea07d44a0a4b0402ede296ca4.png

 使用tf_echo工具在TF树中查找乌龟坐标系之间的变换关系

rosrun tf tf_echo turtle turtle2

也可以通过rviz的图形界面更加形象的看到这三者之间的坐标关系

rosrun rviz rviz -d `rospack find turtle_tf` /rviz/turtle_rviz.rviz

创建TF广播器

实现功能:创建TF广播器,创建坐标变换值并实时发布坐标变换

——初始化ROS节点,并订阅 turtle 的位置消息;
——循环等待话题消息,接收到之后进入回调函数,该回调函数用以处理并发布坐标变换;
——在该回调函数内部定义一个广播器;
——根据接收到的小海龟的位置消息,创建坐标变换值
——通过定义的广播器发布坐标变换
 

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>

std::string turtle_name;

void PoseCallBack(const turtlesim::PoseConstPtr& msg)
{
	//定义一个tf广播器
	static tf::TransformBroadcaster br;
	
	//根据turtle的位置信息,得到其相对于世界坐标系的变换
	tf::Transform transform;
	transform.setOrigin(tf::Vector3(msg->x, msg->y, 0.0));
	tf::Quaternion q;
	q.setRPY(0,0,msg->theta);
	transform.setRotation(q);
	
	//tf广播器发布2只海龟相对于世界坐标系的坐标变换
	br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}

int main(int argc, char** argv)
{
	//初始化节点
	ros::init(argc, argv, "my_tf_broadcaster");
	
	//判断并且获取turtle_name
	if(argc != 2)
	{
		ROS_ERROR("Need a turtle name!");
		return -1;
	}
	turtle_name = argv[1];
	
	//订阅turtle的pose信息
	ros::NodeHandle n;
	ros::Subscriber sub = n.subscribe(turtle_name + "/pose", 10, &PoseCallBack);
	
	ros::spin();
	
	return 0;
}

TF监听器

实现功能:创建TF监听器,创建第二只海龟,监听坐标变换并发布运动控制指令使第二只海龟向第一只海龟运动

——初始化ROS节点,并向MASTER注册节点信息;
——通过服务调用产生第二只海龟;
——创建turtle2的速度控制发布器;
——创建tf监听器并监听turtle2相对于turtle1的坐标变换;
——根据坐标变换发布速度控制指令;

#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>

int main(int argc, char** argv)
{
	//初始化节点
	ros::init(argc, argv, "my_tf_listener");
	ros::NodeHandle n;
	
	//service调用产生第二只海龟
	ros::service::waitForService("spawn");
	ros::ServiceClient add_turtle = n.serviceClient<turtlesim::Spawn>("spawn");
	turtlesim::Spawn srv;
	add_turtle.call(srv);
	
	//定义速度控制指令的消息发布者
	ros::Publisher turtle_vel = n.advertise<geometry_msgs::Twist>("turtle2/cmd_vel", 10);
	
	//定义一个tf监听器
	tf::TransformListener listener;
	
	ros::Rate rate(10.0);
	
	while(ros::ok())
	{
		//申明一个空的坐标变换
		tf::StampedTransform transform;
		try
		{
			//监听turtle2和turtle1的坐标变换
			listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));
			listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);
		}
		catch(tf::TransformException &ex)
		{
			ROS_ERROR("%s", ex.what());
			ros::Duration(1.0).sleep();
			continue;
		}
		//根据坐标变换计算得出turtle2的角速度和线速度,并发布该消息
		geometry_msgs::Twist vel_msg;
		vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(), transform.getOrigin().x());
		vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(),2) + pow(transform.getOrigin().y(),2));
		
		turtle_vel.publish(vel_msg);
		
		rate.sleep();
	}

	return 0;
}

完成后打开CMakeLists文件添加编译规则

f9387b2e1d214f929a13517ee32c77ec.png

 

add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})

add_executable(turtle_tf_listener src/turtle_tf_listener.cpp) 
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES}) 

同时在find_package中添加TF依赖

0ef29d02ee5d4457b41f200750adaf9a.png

 然后进行功能包的编译

cd ~/catkin_ws
catkin_make

编译完成后进行如下操作

roscore //启动ROS Master
rosrun turtlesim turtlesim_node //启动海龟仿真器
rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1
//发布海龟turtle1的坐标系关系
rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2
//发布海龟turtle2的坐标系关系
rosrun learning_tf turtle_tf_listener
//启动自定义节点
rosrun turtlesim turtle_teleop_key
//启动海龟控制节点

完成后如下所示

71f38b04aa5549ad8ab9bd0bc6c99977.png

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS——TF坐标变换 的相关文章

  • 喜获蚂蚁offer,定级p7,面经分享,万字长文带你走完面试全过程

    前言 在今天 xff0c 我收到了蚂蚁金服A级的实习录用offer 从开始面试到拿到口头offer xff08 四面技术 43 一面HR xff09 战线大约拉了半个月 xff0c 从拿到口头offer到收到正式录用邮件大概又是半个月 思前
  • C++中 #define的用法

    C 43 43 中 define的用法 转自 xff1a http www dingge com main article asp id 61 10 今天整理了一些 define的用法 xff0c 与大家共享 xff01 1 简单的defi
  • LeetCode的语言使用

    看来以后不能再用python来写算法的题目了 用python竟然是一种取巧的办法 xff0c 以后还是用C 43 43 来写吧 python里面有很多内置的库 xff0c 这也就导致掩盖了很多复杂的算法的特性 虽然在写代码的时候很简单 xf
  • Windows10安装Ubuntu16.04

    由于最近要在Ubuntu上面开发 xff0c 得安装一个Ubuntu的系统 xff0c 这些是很常见的安装 xff0c 但是也踩了一些坑 xff0c 下面记录下来 安装环境 Windows10Ubuntu16 04 基础理论 在安装的时候有
  • python 下划线 _ __ 开头的变量 详解

    在python中 xff0c 我们经常能看到很多变量名以 下划线开头 xff0c 而且下划线的数量还不一样 xff0c 那么这些变量的作用到底是什么 xff1f 变量名分类 xff1a 以数字 字母开头 xff1a 正常的公有变量名 a 6
  • 两个画图工具助力论文绘图

    欢迎关注笔者的微信公众号 如果使用matplotlib绘制论文图片时需要做非常多的设置 xff0c 字体 xff0c 大小 xff0c 间距 xff0c 多子图配置等 xff0c 而这些操作可以封装好从而简化用户工作量 Proplot对ma
  • 对自然数e的理解,推导(基础)

    对自然数e的理解 xff0c 推导 基础 在前面的博文 古典概型事件数计算 分房 xff0c 配对 xff0c 乱序 概统1 一文中 xff0c 已经写到了对e的理解 xff0c 在n把钥匙配n把锁的 乱序配对 问题中 xff0c 当n很大
  • 检验和算法

    1 CRC xff08 循环冗余码 校验和的算法为 xff1a 所有各字节的和模256的余 即各字节二进制算术和 xff0c 不计超过256的溢出值 xff08 即只取其和 的低8位数据 xff09 xff0c 然后用0x100减去这个算数
  • 我的四轴专用PID参数整定方法及原理---超长文慎入

    给四轴调了好久的PID xff0c 总算是调好了 xff0c 现分享 PID 参数整定的心得给大家 xff0c 还请大家喷的时候手下留情 首先说明一下 xff0c 这篇文章的主旨并不是直接教你怎么调 xff0c 而是告诉你这么调有什么道理
  • px4原生源码学习-(1)

    接触px4代码有几天了 xff0c 想把自己所学所想记录下来 px4就不过多介绍了 xff0c 算得上目前使用的最广泛的开源飞控了 为什么说 px4原生代码学习呢 xff0c 这还得追溯到被大疆干死的3DR xff0c 3DR想做消费级无人
  • px4原生源码学习-(2)--实时操作系统篇

    po上我使用到的硬件和开发环境 px4硬件 xff1a 某宝销量最高的pixhawk套件 xff08 主机 xff0c gps 43 指南针 xff0c 数传 xff0c pwm转pmm xff0c 安全开关 xff0c 蜂鸣器 xff0c
  • px4原生源码学习-(3)--Nuttx实时操作系统的使用

    po上我使用到的硬件和开发环境 px4硬件 xff1a 某宝销量最高的pixhawk套件 xff08 主机 xff0c gps 43 指南针 xff0c 数传 xff0c pwm转pmm xff0c 安全开关 xff0c 蜂鸣器 xff0c
  • 为单反拍摄照片批量加入地理位置信息(POS点)和EXIF信息

    很多航测朋友对于照片中没有POS点很是懊恼 xff0c 单反同飞控是分离的 xff0c 照片由单反生成 xff0c 而POS点的数据由飞控生成 对于后期数据处理相当不利 xff0c 尤其是目前对于倾斜摄影的朋友 xff0c 地理位置信息一定
  • 解决angular中的版本问题,Metadata version mismatch for module,found version 4, expected 3

    angular版本问题解决办法 xff1b 第一步 xff1a 查出错误模块的当前安装版本 以 ng bootstrap模块为例 npm list ng bootstrap 第二步 xff1a 查出所有版本号 npm view ng boo
  • python2.7爬取京东商品评论

    大神请绕路 xff0c 新手先别急着上车 我们先来了解一下京东商品评论的地址 xff0c 他们的客户评论看似是在商品页 xff08 item jd com xff09 xff0c 但实际上是在club jd com review 这个url
  • 进入docker容器的方法

    最近想着怎么进入到容器内部 xff0c 然后把里面的配置文件拷贝出来 xff0c 下面是一些操作记录 1 进入docker容器的方法 命令 xff1a docker exec it 容器id bin sh 进入容器后相当于进入了另外一个li
  • spring bean的循环引用

    看过一次spring公开课 xff0c 记录一下bean的循环引用问题 问题 public class IndexService 64 Autowired IndexDao indexDao public class IndexDao 64
  • Excel文本格式怎么出现小三角

    左上角的小三角是文本型数字标志 xff0c 将一列数值的左上角一次性加上绿色的三角标示 就是将常规或数值型的数字改变为文本格式数字 办法 xff1a 选定该列数据 xff0c 点菜单 数据 分列 xff0c 点两次 下一步 xff0c 在
  • docker磁盘占用清理问题

    本文转自http dockone io article 3056 如何清理Docker占用的磁盘空间 编者的话 用了Docker xff0c 好处挺多的 xff0c 但是有一个不大不小的问题 xff0c 它会一不小心占用太多磁盘 xff0c
  • sql exists用法

    转自https www cnblogs com xuanhai p 5810918 html 转载于 https www cnblogs com yongan p 11362595 html

随机推荐

  • 深入了解QtCreator的实用功能

    重构代码 在源代码中搜索 重命名 重排代码格式是原生支持的功能 在代码中右键弹出的菜单中 xff0c 有一个Refactor菜单项 xff0c 根据当前光标位置不同的代码元素 xff0c 具有相应的重构子菜单 xff0c 可以很方便地完成很
  • ubuntu20.04server下安装hadoop2.8.5

    参考Ubuntu下Hadoop安装 xff08 全命令行版 xff09 安装环境 项目名称版本电脑硬件Huwei Matebook X Proi7 8550U 16G 512G操作系统Windows 10家庭中文版虚拟机VMware Wor
  • 几个VS/QT常见错误解决方法

    X86与X64冲突 问题 1 gt Qt5Widgetsd lib Qt5Widgetsd dll fatal error LNK1112 模块计算机类型 X86 与目标计算机类型 x64 冲突 解决方法 在Qt VS Tools里添加正确
  • NMAKE编译CTK

    NMAKE编译CTK 启动编译环境 从VC中启动命令行或通过VC提供的批处理启动命令行 xff0c 以能运行编译环境 如果装了多个VC版本 xff0c 注意使用想要的VC版本启动安装编译环境 外链图片转存失败 源站可能有防盗链机制 建议将图
  • VERILOG实现四位七段数码管显示

    filename dyp v author lyq Date 2016 3 2 9 36 Lattice XP2 17 DEMO BOARD 4位七段带小数点数码管显示控制模块 clk 50M d1 d4 d 7 dp d 6 0 ASCI
  • 网络编程一些重要的面试题

    为什么需要三次握手 xff1f 答 xff1a 三次握手的目的是 为了防止已经失效的连接请求报文段突然又传到服务端 xff0c 因而产生错误 xff0c 这种情况是 xff1a 一端 client A发出去的第一个连接请求报文并没有丢失 x
  • XILNIXSDK2018为FreeRTOS增加配置项的方法

    在安装目录下找到目录 xff1a SDK 2018 1 data embeddedsw ThirdParty bsp freertos10 xilinx v1 0 data 然后通过两个步骤来完成配置项的增加 1 编辑文件 freertos
  • STM32F系列USART的IDLE中断要注意了

    只是调用USART ClearITPendingBit之类的方法是清除不了中断标志的 xff0c 必须必须在调用USART GetITStatus之后调用 USART ReceiveData xff0c 因为IDLE被搞成了一个帧 xff0
  • STM32库USART_ITConfig的坑

    USART ITConfig只能使用一个中断标志 xff01 看看中断参数的定义 xff1a define USART IT PE uint16 t 0x0028 define USART IT TXE uint16 t 0x0727 de
  • 最强大易用的开源MODBUS库-YMODBUS,包含MASTER/SLAVE

    无论是MASTER或SLAVE xff0c 构建MODBUS应用都极其简单 xff0c 可通过设置Master为Slave的Player轻松实现MODBUS网关 项目使用C 43 43 11编写 xff0c 支持多线程 xff0c 可在WI
  • keil5 添加注释说明模板

    我们使用 Keil uvision5 编写代码时 xff0c 为了规范代码 xff0c 一般会在文件开头对本文件进行注释说明 xff0c 同时我们也会在函数的开头对函数进行说明 但 Keil5 集成开发环境中没有这些注释模板 xff0c 而
  • Putty 使用记录

    Putty 显示时间戳 需要三个软件 Putty xff0c ExtraPuTTY xff0c mtputty Putty用来提供基本功能 ExtraPuTTY用来提供时间戳功能 mtputty用于多链接多页面显示 ExtraPuTTY中的
  • 学习java方面的一点收获

    学习JAVA方面的收获 经过将近两年的时间学习java xff0c 觉得在java方面有比较大的收获 在学习和实践过程中逐渐对代码习惯 软件思维都有比较进一步的了解 java语言的纯面向对象 平台无关性是java能够得到比较多的程序开发者的
  • ROS使用catkin_make编译指定功能包

    指定要编译的功能包 xff08 多个用分号相隔 xff09 catkin make DCATKIN WHITELIST PACKAGES 61 34 需要单独编译的包名 34 但是如再次使用catkin make编译所有功能包时会出现仅仅只
  • python中_、__、__xx__(单下划线、双下划线等)的含义

    默认情况下 xff0c Python中的成员函数和成员变量都是公开的 相当于java中的public xff0c 或者OC中定义在 h文件中的公开成员变量 在python中没有public private等关键词来修饰成员函数和成员变量 为
  • 龙芯1B核心板使用alsa音频播放设置,aplay播放

    龙芯1B核心板是默认启用alsa音频工具的 只需要进行一些配置就能使用 1 先检查你的板子的alsa工具是否正常 aplay l 可以查看 xff0c 是否已正确安装音频驱动 如果正常 xff0c 能看到你的音频驱动的信息 可能会出现 xf
  • centos 64bit安装arm-none-linux-gnueabi交叉编译工具链

    xfeff xfeff yum install glibc i686在centos中安装arm none Linux gnueabi有两种方法 xff0c 一种是apt get 安装容易但是不易成功 xff0c 一种是下载压缩包或安装程序
  • 旋转矩阵和欧拉角

    欧拉角介绍 旋转可以参考两种坐标系 内部坐标系 XYZ 角度 外部坐标系 xyz 角度 不考虑参考坐标系情况下 按照旋转方式可以分为两种 Proper Euler angles z x z x y x y z y z y z x z x y
  • SIP 鉴权 & HTTP 认证

    sip 鉴权是基于摘要签名认证的 具体来说 每一个用户都有一个用户名和密码 用户名和密码在客户端和SIP 服务器的数据库中都有保存 在认证的过程中 客户端将自己的信息 用户名 密码 url 等信息 做一些复杂的MD5 或者SHA256 SH
  • ROS——TF坐标变换

    TF功能包 创建功能包 cd catkin ws src catkin creat pkg learning tf roscpp rospy tf turtlesim 如果此时依赖包已有tf xff0c 后文中CMakeLists文件中的f