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

【ROS的TF系统】

系列文章目录


TF系统简介

前面的章节实现了SLAM节点的建图功能:
激光雷达节点—> /scan话题 —>hector_mapping节点—> 地图数据话题/map
本期来实现SLAM节点的定位功能:

TF(TransForm)主要描述的是两个坐标系的空间关系,可以理解为坐标系变换;

TF发布节点—> /tf话题
其它节点订阅上述/tf话题即可查询当前运行的节点网络中的坐标系、坐标系间的空间关系;
rviz的显示原理:rviz订阅了/tf话题,此外在rviz中可以直接显示TF的坐标系;

输出机器人的坐标在地图中的位置关系

运行slam仿真
roslaunch wpr_simulation wpb_hector.launch

在rviz窗口中添加TF;
可以适当调节标签大小(Marker Scale,例如调成5);
展开Frames,只保留base_footprint和map选项;
这样可以方便观察两个坐标系的位置和空间关系;

在这里插入图片描述rostopic list

查看其中/tf话题的类型
rostopic type /tf
查询结果为tf2_msgs/TFMessage

在index.ros.org中查看对应的tf2_msgs消息类型的具体介绍信息
描述为geometry_msgs/TransformStamped[]transforms
这是一个TransformStamped类型的数组,点击查看其结构:

geometry_msgs/TransformStamped Message
std_msgs/Header header
string child_frame_id (子坐标系的名称)
geometry_msgs/Transform transform (两个坐标系的空间关系)

std_msgs/Header Message
uint32 seq
time stamp
string frame_id (父坐标系的名称)

重点介绍一下geometry_msgs/Transform transform
geometry_msgs/Transform Message
geometry_msgs/vector3 translation
geometry_msgs/Quaternion rotation
其中geometry_msgs/vector3 translation,是float64 x、y、z,代表的是子坐标系相对于父坐标系在空间位置偏移量;
geometry_msgs/Quaternion rotation,是四元数,float64 x、y、z、w,表示的是子坐标系相对于父坐标系的角度偏差;

四元数计算欧拉角参照:文章
这里只需要知道四元数和欧拉角可以相互转换即可,感兴趣的话可以去深入了解其中的数学原理;

TF树

查看/tf消息中的消息包rostopic echo /tf
在这里插入图片描述translation部分表示子坐标系与父坐标系的距离偏差;
rotation是一个四元数,表示了子坐标系与父坐标系的角度偏差,可以用公式将其转换为欧拉角(roll pitch yaw);


transforms: 
  - 
    header: 
      seq: 0
      stamp: 
        secs: 421
        nsecs: 394000000
      frame_id: "map"
    child_frame_id: "odom"
    transform: 
      translation: 
        x: -0.01747243289675815
        y: 0.03656238974946313
        z: 0.0
      rotation: 
        x: 0.0
        y: 0.0
        z: -0.010764158207004907
        w: 0.9999420647708018

为了理清消息包中的关系,执行
rosrun rqt_tf_tree rqt_tf_tree
当一个ROS程序运行起来的时候,所有的空间坐标关系都可以从如下tf树里获得;
其中每个椭圆代表一个坐标系,位于上方的椭圆是连线下方椭圆的父级坐标系;
整个tf系统由父级、子级坐标系这样的多级的分支结构组成;
在ROS系统运行过程中,所有的空间坐标关系都可以从tf树中获得;
前面的例子只用到了输出机器人的坐标在地图中的位置关系这一功能,tf系统还有更多其它功能;
在这里插入图片描述


总结

简单介绍了ROS中的TF系统、TF消息包部分内容、TF树。


http://www.kler.cn/a/375550.html

相关文章:

  • 从线性代数到unity mvp矩阵
  • Kafka物理存储机制深度解析
  • 【果蔬识别】Python+卷积神经网络算法+深度学习+人工智能+机器学习+TensorFlow+计算机课设项目+算法模型
  • ubuntu禁止自动更新设置
  • 【Java Web】使用JDBC操作数据库(含代码示例)
  • C语言如何进行数据类型转换?
  • 基于Transformer的路径规划 - 第五篇 GPT生成策略_解码方法优化
  • [系统优化] 系统调度策略调整笔记
  • 重新修改我的标志
  • metasploit/modules/payloads 有哪些模块,以及具体使用案例
  • springboot框架使用RabbitMQ举例代码
  • ansible详细介绍和具体步骤
  • 4路CAN转WiFi网关
  • 《影像科学与光化学》
  • php反序列化常见魔术方法整理
  • 硅谷甄选(三)登录注册
  • Cloud Native Spring in Action
  • 排序算法:从原理到 Java 实现
  • 【JavaGuide】十大经典排序算法总结
  • B站狂神说+mybatis增删改查操作
  • 提升网站安全性 HTTPS的重要性与应用指南
  • 后端:Spring、Spring Boot-实例化Bean依赖注入(DI)
  • 【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】
  • (10)文件操作
  • linux虚拟机上使用USB转串口工具
  • HTTP 全知道:请求与响应的深度剖析