锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-12-14 14:00:00 0280217518传感器tftf14传感器

目标:学习如何使用 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 所有其他参数都是可选的; 假定身份,如果没有具体的选项。


锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章