362|2

430

帖子

0

TA的资源

版主

ROS2 中 TF 变换发布与订阅:实现 base_link 和 test_link 实时可视化显示 [复制链接]

邀请:@chenzhufly   @tagetage   @bigbat   @okhxyyo   参与回复

screenshot-20250223-215207.png  

视频讲解


 

安装环境依赖

sudo apt-get install ros-humble-tf2-ros ros-humble-tf2-geometry-msgs ros-humble-tf-transformations

创建一个包名为tf_test_pkg的包

ros2 pkg create --build-type ament_python tf_test_pkg --dependencies rclpy tf2_ros geometry_msgs

依赖为tf2_ros,geometry_msgs

 

image.png  

在tf_test_pkg/tf_test_pkg中创建tf_publisher.py

import rclpy
from rclpy.node import Node
from geometry_msgs.msg import TransformStamped
import tf2_ros
import math

class TFPublisher(Node):
    def __init__(self):
        super().__init__('tf_publisher')
        self.tf_broadcaster = tf2_ros.TransformBroadcaster(self)
        self.timer = self.create_timer(0.1, self.broadcast_tf)
        self.pitch = 0.0

    def broadcast_tf(self):
        t = TransformStamped()
        t.header.stamp = self.get_clock().now().to_msg()
        t.header.frame_id = '/base_link'
        t.child_frame_id = '/test_link'

        # 设置平移
        t.transform.translation.x = 1.0
        t.transform.translation.y = 0.0
        t.transform.translation.z = 0.0

        # 增加pitch角度
        self.pitch += 0.2
        if self.pitch > 2 * math.pi:
            self.pitch -= 2 * math.pi

        # 设置旋转(仅pitch变化)
        from tf_transformations import quaternion_from_euler
        q = quaternion_from_euler(0, self.pitch, 0)
        t.transform.rotation.x = q[0]
        t.transform.rotation.y = q[1]
        t.transform.rotation.z = q[2]
        t.transform.rotation.w = q[3]

        # 发布TF变换
        self.tf_broadcaster.sendTransform(t)

def main(args=None):
    rclpy.init(args=args)
    tf_publisher = TFPublisher()
    rclpy.spin(tf_publisher)
    tf_publisher.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

同样的,创建tf_subscriber.py

import rclpy
from rclpy.node import Node
import tf2_ros
from tf2_ros.buffer import Buffer
from tf2_ros.transform_listener import TransformListener

class TFSubscriber(Node):
    def __init__(self):
        super().__init__('tf_subscriber')
        self.tf_buffer = Buffer()
        self.tf_listener = TransformListener(self.tf_buffer, self)
        self.timer = self.create_timer(1.0, self.lookup_transform)

    def lookup_transform(self):
        try:
            trans = self.tf_buffer.lookup_transform(
                'base_link', 'test_link', rclpy.time.Time())
            self.get_logger().info(f"Translation: {trans.transform.translation}")
            self.get_logger().info(f"Rotation: {trans.transform.rotation}")
        except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException):
            self.get_logger().warn("Could not find transform between /base_link and /test_link")

def main(args=None):
    rclpy.init(args=args)
    tf_subscriber = TFSubscriber()
    rclpy.spin(tf_subscriber)
    tf_subscriber.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

修改setup.py,增加内容如下:

entry_points={
        'console_scripts': [
            'tf_publisher = tf_test_pkg.tf_publisher:main',
            'tf_subscriber = tf_test_pkg.tf_subscriber:main',
        ],
    },

编译运行

colcon build --packages-select tf_test_pkg

 

 

get?code=Zjg3NmUzZDM0NmM0NzUzMWZjMmIxMjgyMzgzZTgzZTAsMTc0MDMxOTUyODczMw==

 

source install/setup.bash 
ros2 run tf_test_pkg tf_publisher
ros2 run tf_test_pkg tf_subscriber

 

 

get?code=MmE3YTk2NThjMzk4MTNlYjEzZmIxMjMyMTEzNWI3MzcsMTc0MDMxOTUyODczMw==

 

rviz2配置

设置固定坐标系

启动 Rviz 后,在 Rviz 窗口左侧的 “Displays” 面板中,找到 “Global Options” 部分,点击 “Fixed Frame” 右侧的下拉框,选择 /base_link 作为固定坐标系。这一步很关键,因为 Rviz 会以固定坐标系为参考来显示其他坐标系的位置和姿态。

添加 TF 显示插件

在 Rviz 窗口左侧 “Displays” 面板的上方,点击 “Add” 按钮,在弹出的 “Add Display” 对话框中,选择 “TF” 选项,然后点击 “OK”。此时,“Displays” 面板中会新增一个 “TF” 条目。

调整 TF 显示设置

在 “Displays” 面板中展开 “TF” 条目

  • Marker Scale:用于调整坐标系箭头的大小。你可以根据实际情况增大或减小该值,使显示效果更清晰。
  • Show Axes:勾选该选项会显示每个坐标系的坐标轴(X 轴为红色,Y 轴为绿色,Z 轴为蓝色),方便直观地了解坐标系的方向。
  • Show Names:勾选此选项会在每个坐标系旁边显示其名称(如 /base_link 和 /test_link),便于识别不同的坐标系。

 

get?code=MmFmNzE1NzA3ZTg2Y2E4YzZkZWFkY2Q3NzA5M2I1NDIsMTc0MDMxOTUyODczMw==

 

 

最新回复

都素需要添加 TF 显示插件,才能有动作的   详情 回复 发表于 2025-2-27 07:30

回复
举报

7002

帖子

0

TA的资源

五彩晶圆(高级)

都素需要添加 TF 显示插件,才能有动作的

点评

是的  详情 回复 发表于 2025-2-27 08:54

回复

430

帖子

0

TA的资源

版主

Jacktang 发表于 2025-2-27 07:30 都素需要添加 TF 显示插件,才能有动作的

是的


回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 14

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表