ROS2机器人坐标工具→tf2静态广播←Python

举报
zhangrelay 发表于 2022/06/02 22:42:24 2022/06/02
1.8k+ 0 0
【摘要】 目标:学习如何使用 tf2 广播静态坐标系。   发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系很有用。 例如,最容易推断激光扫描仪中心框架中的激光扫描测量值。 这是一个独立的教程,涵盖了静态转换的基础知识,由两部分组成。 在第一部分中,将编写代码以将静态转换发布到 tf2。 在第二部分中,将解释如何...

目标:学习如何使用 tf2 广播静态坐标系。

发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系很有用。 例如,最容易推断激光扫描仪中心框架中的激光扫描测量值。

这是一个独立的教程,涵盖了静态转换的基础知识,由两部分组成。 在第一部分中,将编写代码以将静态转换发布到 tf2。 在第二部分中,将解释如何使用 tf2_ros 中的命令行 static_transform_publisher 可执行工具。

在接下来的两个教程中,将编写代码来重现 tf2 教程简介中的演示。 之后,以下教程将重点介绍使用更高级的 tf2 功能扩展演示。

使用sudo apt install ros-humble-geometry-tutorials 或直接下载源码编译。

官方示例程序:


      import sys
      from geometry_msgs.msg import TransformStamped
      import rclpy
      from rclpy.node import Node
      from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster
      import tf_transformations
      class StaticFramePublisher(Node):
        """
       Broadcast transforms that never change.
       This example publishes transforms from `world` to a static turtle frame.
       The transforms are only published once at startup, and are constant for all
       time.
       """
        def __init__(self, transformation):
           super().__init__('static_turtle_tf2_broadcaster')
            self._tf_publisher = StaticTransformBroadcaster(self)
           # Publish static transforms once at startup
            self.make_transforms(transformation)
        def make_transforms(self, transformation):
            static_transformStamped = TransformStamped()
            static_transformStamped.header.stamp = self.get_clock().now().to_msg()
            static_transformStamped.header.frame_id = 'world'
            static_transformStamped.child_frame_id = sys.argv[1]
            static_transformStamped.transform.translation.x = float(sys.argv[2])
            static_transformStamped.transform.translation.y = float(sys.argv[3])
            static_transformStamped.transform.translation.z = float(sys.argv[4])
            quat = tf_transformations.quaternion_from_euler(
                 float(sys.argv[5]), float(sys.argv[6]), float(sys.argv[7]))
            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]
            self._tf_publisher.sendTransform(static_transformStamped)
      def main():
         logger = rclpy.logging.get_logger('logger')
        # obtain parameters from command line arguments
        if len(sys.argv) < 8:
            logger.info('Invalid number of parameters. Usage: \n'
                       '$ ros2 run learning_tf2_py static_turtle_tf2_broadcaster'
                       'child_frame_name x y z roll pitch yaw')
            sys.exit(0)
        else:
           if sys.argv[1] == 'world':
                  logger.info('Your static turtle name cannot be "world"')
                  sys.exit(0)
        # pass parameters and initialize node
         rclpy.init()
         node = StaticFramePublisher(sys.argv)
        try:
            rclpy.spin(node)
        except KeyboardInterrupt:
           pass
         rclpy.shutdown()
  
 

ros2 run tf2_ros static_transform_publisher --x 0 --y 0 --z 1 --yaw 0 --pitch 0 --roll 0 --frame-id world --child-frame-id mystaticturtle



      transforms:
      - header:
          stamp:
            sec: 1654068653
            nanosec: 131708700
          frame_id: world
        child_frame_id: mystaticturtle
        transform:
          translation:
            x: 0.0
            y: 0.0
            z: 1.0
          rotation:
            x: 0.0
            y: 0.0
            z: 0.0
            w: 1.0
      ---
      transforms:
      - header:
          stamp:
            sec: 1654068688
            nanosec: 537395500
          frame_id: world
        child_frame_id: mystaticturtle
        transform:
          translation:
            x: 0.0
            y: 0.0
            z: 1.0
          rotation:
            x: 0.0
            y: 0.0
            z: 0.0
            w: 1.0
      ---
  
 

如果使用命令如下

使用以米为单位的 x/y/z 偏移量和以弧度为单位的滚动/俯仰/偏航向 tf2 发布静态坐标变换。 在例子中,roll/pitch/yaw 分别指的是围绕 x/y/z 轴的旋转。

ros2 run tf2_ros static_transform_publisher --x x --y y --z z --yaw yaw --pitch pitch --roll roll --frame-id frame_id --child-frame-id child_frame_id

使用以米和四元数为单位的 x/y/z 偏移将静态坐标变换发布到 tf2。

ros2 run tf2_ros static_transform_publisher --x x --y y --z z --qx qx --qy qy --qz qz --qw qw --frame-id frame_id --child-frame-id child_frame_id

static_transform_publisher 既设计为手动使用的命令行工具,也可在启动文件中使用以设置静态转换。 例如:


      from launch import LaunchDescription
      from launch_ros.actions import Node
      def generate_launch_description():
        return LaunchDescription([
            Node(
                  package='tf2_ros',
                  executable='static_transform_publisher',
                  arguments = ['--x', '0', '--y', '0', '--z', '1', '--yaw', '0', '--pitch', '0', '--roll', '0', '--frame-id', 'world', '--child-frame-id', 'mystaticturtle']
            ),
         ])
  
 

请注意,除了 --frame-id 和 --child-frame-id 之外的所有参数都是可选的; 如果未指定特定选项,则将假定身份。


文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/125083376

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。