当前位置:   article > 正文

ROS2机器人坐标工具→tf2静态广播←Python_ros2 用命令tf静态转换

ros2 用命令tf静态转换

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

 

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

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

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

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

官方示例程序:

  1. import sys
  2. from geometry_msgs.msg import TransformStamped
  3. import rclpy
  4. from rclpy.node import Node
  5. from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster
  6. import tf_transformations
  7. class StaticFramePublisher(Node):
  8. """
  9. Broadcast transforms that never change.
  10. This example publishes transforms from `world` to a static turtle frame.
  11. The transforms are only published once at startup, and are constant for all
  12. time.
  13. """
  14. def __init__(self, transformation):
  15. super().__init__('static_turtle_tf2_broadcaster')
  16. self._tf_publisher = StaticTransformBroadcaster(self)
  17. # Publish static transforms once at startup
  18. self.make_transforms(transformation)
  19. def make_transforms(self, transformation):
  20. static_transformStamped = TransformStamped()
  21. static_transformStamped.header.stamp = self.get_clock().now().to_msg()
  22. static_transformStamped.header.frame_id = 'world'
  23. static_transformStamped.child_frame_id = sys.argv[1]
  24. static_transformStamped.transform.translation.x = float(sys.argv[2])
  25. static_transformStamped.transform.translation.y = float(sys.argv[3])
  26. static_transformStamped.transform.translation.z = float(sys.argv[4])
  27. quat = tf_transformations.quaternion_from_euler(
  28. float(sys.argv[5]), float(sys.argv[6]), float(sys.argv[7]))
  29. static_transformStamped.transform.rotation.x = quat[0]
  30. static_transformStamped.transform.rotation.y = quat[1]
  31. static_transformStamped.transform.rotation.z = quat[2]
  32. static_transformStamped.transform.rotation.w = quat[3]
  33. self._tf_publisher.sendTransform(static_transformStamped)
  34. def main():
  35. logger = rclpy.logging.get_logger('logger')
  36. # obtain parameters from command line arguments
  37. if len(sys.argv) < 8:
  38. logger.info('Invalid number of parameters. Usage: \n'
  39. '$ ros2 run learning_tf2_py static_turtle_tf2_broadcaster'
  40. 'child_frame_name x y z roll pitch yaw')
  41. sys.exit(0)
  42. else:
  43. if sys.argv[1] == 'world':
  44. logger.info('Your static turtle name cannot be "world"')
  45. sys.exit(0)
  46. # pass parameters and initialize node
  47. rclpy.init()
  48. node = StaticFramePublisher(sys.argv)
  49. try:
  50. rclpy.spin(node)
  51. except KeyboardInterrupt:
  52. pass
  53. 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


  1. transforms:
  2. - header:
  3. stamp:
  4. sec: 1654068653
  5. nanosec: 131708700
  6. frame_id: world
  7. child_frame_id: mystaticturtle
  8. transform:
  9. translation:
  10. x: 0.0
  11. y: 0.0
  12. z: 1.0
  13. rotation:
  14. x: 0.0
  15. y: 0.0
  16. z: 0.0
  17. w: 1.0
  18. ---
  19. transforms:
  20. - header:
  21. stamp:
  22. sec: 1654068688
  23. nanosec: 537395500
  24. frame_id: world
  25. child_frame_id: mystaticturtle
  26. transform:
  27. translation:
  28. x: 0.0
  29. y: 0.0
  30. z: 1.0
  31. rotation:
  32. x: 0.0
  33. y: 0.0
  34. z: 0.0
  35. w: 1.0
  36. ---

如果使用命令如下

使用以米为单位的 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 既设计为手动使用的命令行工具,也可在启动文件中使用以设置静态转换。 例如:

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

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


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/555328
推荐阅读
  

闽ICP备14008679号