当前位置:   article > 正文

ROS2自学笔记:TF坐标管理_ros2 tf

ros2 tf

显示5秒中坐标关系:

ros2 run tf2_tools view_frames.py

查看一个坐标系关于另一个坐标系相对位置

ros2 run tf2_ros tf2_echo (坐标1) (坐标2)

在这里插入图片描述

使用rviz2对TF坐标进行可视化显示:

ros2 run rviz2 rviz2

在选项栏左下角add里加入新TF,把fixed Frame设为World,可以看到随着海龟移动各自在坐标系上位置也在移动
在这里插入图片描述

静态TF广播
有些时候一个物体坐标关于另一个参考系为固定的,如一般来说房子相对地面是静态的

import rclpy                                                                 # ROS2 Python接口库
from rclpy.node import Node                                                  # ROS2 节点类
from geometry_msgs.msg import TransformStamped                               # 坐标变换消息
import tf_transformations                                                    # TF坐标变换库
from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster  # TF静态坐标系广播器类

class StaticTFBroadcaster(Node):
    def __init__(self, name):
        super().__init__(name)                                                  # ROS2节点父类初始化
        self.tf_broadcaster = StaticTransformBroadcaster(self)                  # 创建一个TF广播器对象

        static_transformStamped = TransformStamped()                            # 创建一个坐标变换的消息对象
        static_transformStamped.header.stamp = self.get_clock().now().to_msg()  # 设置坐标变换消息的时间戳
        static_transformStamped.header.frame_id = 'world'                       # 设置一个坐标变换的源坐标系
        static_transformStamped.child_frame_id  = 'house'                       # 设置一个坐标变换的目标坐标系
        static_transformStamped.transform.translation.x = 10.0                  # 设置坐标变换中的X、Y、Z向的平移
        static_transformStamped.transform.translation.y = 5.0                    
        static_transformStamped.transform.translation.z = 0.0
        quat = tf_transformations.quaternion_from_euler(0.0, 0.0, 0.0)          # 将欧拉角转换为四元数(roll, pitch, yaw)
        static_transformStamped.transform.rotation.x = quat[0]                  # 设置坐标变换中的X、Y、Z向的旋转(四元数)
        static_transformStamped.transform.rotation.y = quat[1]
        static_transformStamped.transform.rotation.z = quat[2]
        static_transformStamped.transform.rotation.w = quat[3]

        self.tf_broadcaster.sendTransform(static_transformStamped)              # 广播静态坐标变换,广播后两个坐标系的位置关系保持不变

def main(args=None):
    rclpy.init(args=args)                                # ROS2 Python接口初始化
    node = StaticTFBroadcaster("static_tf_broadcaster")  # 创建ROS2节点对象并进行初始化
    rclpy.spin(node)                                     # 循环等待ROS2退出
    node.destroy_node()                                  # 销毁节点对象
    rclpy.shutdown()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

1 static_transformStamped = TransformStamped()
创建广播器对象,该对象在ROS2里是定义好的,在前面from geometry_msgs.msg import TransformStamped 即可。这里类似于话题发布,先创建发布者对象,再往对象里填充消息

2 static_transformStamped.header.stamp = self.get_clock().now().to_msg()
获取对应时间

3 static_transformStamped.header.frame_id = ‘world’
header为静态参考系,这里我们选择world为参考系

4 static_transformStamped.child_frame_id = ‘house’
child为物体“house”坐标

5 static_transformStamped.transform.translation.x = 10.0
static_transformStamped.transform.translation.y = 5.0
static_transformStamped.transform.translation.z = 0.0
设置x,y,z三个方向水平坐标

6 quat = tf_transformations.quaternion_from_euler(0.0, 0.0, 0.0)
static_transformStamped.transform.rotation.x = quat[0]
static_transformStamped.transform.rotation.y = quat[1]
static_transformStamped.transform.rotation.z = quat[2]
static_transformStamped.transform.rotation.w = quat[3]
设置角度坐标。ROS2里默认使用四元数作为角度坐标,不过我们可以先用欧拉角表示然后使用函数tf_transformations.quaternion_from_euler将其转换为四元数

7 self.tf_broadcaster.sendTransform(static_transformStamped)
广播消息,由于这里坐标为静态,广播一次即可

效果如下:
在这里插入图片描述
TF监听器

import rclpy                                              # ROS2 Python接口库
from rclpy.node import Node                               # ROS2 节点类
import tf_transformations                                 # TF坐标变换库
from tf2_ros import TransformException                    # TF左边变换的异常类
from tf2_ros.buffer import Buffer                         # 存储坐标变换信息的缓冲类
from tf2_ros.transform_listener import TransformListener  # 监听坐标变换的监听器类

class TFListener(Node):

    def __init__(self,
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/885216
推荐阅读
相关标签
  

闽ICP备14008679号