您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.

编写静态广播器(Python)

目标 了解如何向 tf2 广播静态坐标框架。

辅导水平: 中级

时间 15 分钟

背景介绍

发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如,在激光扫描仪中心的框架内进行激光扫描测量是最简单的推理方法。

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

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

先决条件

在前面的教程中,您学习了如何 创建工作区创建软件包.

任务

1 创建软件包

首先,我们将创建一个软件包,这个软件包将用于本教程和后续教程。软件包名为 学习_tf2_py 将取决于 几何参数, python3-numpy, rclpy, tf2_ros_py海龟.本教程的代码存储在 这里.

打开一个新终端,然后 为您的 ROS 2 安装提供源代码 以便 玫瑰2 命令将起作用。导航至工作区的 来源 文件夹并创建一个新软件包:

ros2 pkg create --build-type ament_python --license Apache-2.0 -- learning_tf2_py

您的终端将返回一条信息,验证是否创建了软件包 学习_tf2_py 及其所有必要的文件和文件夹。

2 写入静态广播节点

让我们先创建源文件。在 src/learning_tf2_py/learning_tf2_py 输入以下命令,下载静态广播员代码示例:

wget https://raw.githubusercontent.com/ros/geometry_tutorials/ros2/turtle_tf2_py/turtle_tf2_py/static_turtle_tf2_broadcaster.py

现在打开名为 static_turtle_tf2_broadcaster.py 使用您喜欢的文本编辑器。

舶来品 算术
舶来品 系统

 几何_msgs.msg 舶来品 TransformStamped

舶来品 numpy 作为 np

舶来品 rclpy
 rclpy.node 舶来品 节点

 tf2_ros.static_transform_broadcaster 舶来品 静态变换广播


捍卫 来自欧拉的四元数(ai, aj, 牦牛):
    ai /= 2.0
    aj /= 2.0
    牦牛 /= 2.0
    ci = 算术.系数(ai)
    si = 算术.罪过(ai)
    cj = 算术.系数(aj)
    sj = 算术.罪过(aj)
    ck = 算术.系数(牦牛)
    鳐鱼 = 算术.罪过(牦牛)
    cc = ci*ck
    cs = ci*鳐鱼
    科学 = si*ck
    ss = si*鳐鱼

    q = np.空的((4, ))
    q[0] = cj*科学 - sj*cs
    q[1] = cj*ss + sj*cc
    q[2] = cj*cs - sj*科学
    q[3] = cj*cc + sj*ss

    返回 q


 静态框架发布者(节点):
    """;
    广播转型,永不改变。

    此示例将 `world` 中的变换发布到静态海龟框架中。
    变换只在启动时发布一次,并且在所有情况下都保持不变。
    时间
    """;

    捍卫 启动(自我, 变革):
        棒极了().启动('static_turtle_tf2_broadcaster';)

        自我.tf_static_broadcaster = 静态变换广播(自我)

        # 启动时发布一次静态变换
        自我.make_transforms(变革)

    捍卫 make_transforms(自我, 变革):
        t = TransformStamped()

        t.页眉.盖章 = 自我.获取时钟().现在().to_msg()
        t.页眉.frame_id = '世界';
        t.子帧标识 = 变革[1]

        t..译文.x = 浮动(变革[2])
        t..译文.y = 浮动(变革[3])
        t..译文.z = 浮动(变革[4])
        夸特 = 来自欧拉的四元数(
            浮动(变革[5]), 浮动(变革[6]), 浮动(变革[7]))
        t..自转.x = 夸特[0]
        t..自转.y = 夸特[1]
        t..自转.z = 夸特[2]
        t..自转.w = 夸特[3]

        自我.tf_static_broadcaster.发送变换(t)


捍卫 主要():
    记录仪 = rclpy.伐木.get_logger('记录仪';)

    # 从命令行参数中获取参数
    如果 (系统.参数) != 8:
        记录仪.信息('参数数量无效。使用方法: \n'
                    '$ ros2 run learning_tf2_py static_turtle_tf2_broadcaster';
                    'child_frame_name x y z roll pitch yaw';)
        系统.出口(1)

    如果 系统.参数[1] == '世界';:
        记录仪.信息('您的静态乌龟名称不能是 "世界"';)
        系统.出口(2)

    # 传递参数并初始化节点
    rclpy.启动()
    网站 = 静态框架发布者(系统.参数)
    尝试:
        rclpy.后旋(网站)
    除开 键盘中断:
        通过

    rclpy.关闭()

2.1 检查代码

现在让我们来看看将静态乌龟姿势发布到 tf2 的相关代码。第一行导入所需软件包。首先我们导入 TransformStamped几何参数为我们提供了向转换树发布信息的模板。

 几何_msgs.msg 舶来品 TransformStamped

之后、 rclpy 被导入,因此其 节点 类可以使用。

舶来品 rclpy
 rclpy.node 舶来品 节点

"(《世界人权宣言》) tf2_ros 软件包提供了一个 静态变换广播 以方便发布静态变换。要使用 静态变换广播,我们需要从 tf2_ros 模块。

 tf2_ros.static_transform_broadcaster 舶来品 静态变换广播

"(《世界人权宣言》) 静态框架发布者 类的构造函数将节点初始化为名称为 静态海龟_TF2_播音员.那就.....、 静态变换广播 会在启动时发送一个静态转换。

自我.tf_static_broadcaster = 静态变换广播(自我)
自我.make_transforms(变革)

在这里,我们创建一个 TransformStamped 对象,它将是我们在填充后发送的信息。在传递实际变换值之前,我们需要给它提供适当的元数据。

  1. 我们需要给正在发布的变换加一个时间戳,然后用当前时间戳记、 self.get_clock().now()

  2. 然后,我们需要设置所创建链接的父框架名称,本例中为 世界

  3. 最后,我们需要设置所创建链接的子框架名称

t = TransformStamped()

t.页眉.盖章 = 自我.获取时钟().现在().to_msg()
t.页眉.frame_id = '世界';
t.子帧标识 = 变革[1]

在这里,我们将填充乌龟的 6D 姿态(平移和旋转)。

t..译文.x = 浮动(变革[2])
t..译文.y = 浮动(变革[3])
t..译文.z = 浮动(变革[4])
夸特 = 来自欧拉的四元数(
    浮动(变革[5]), 浮动(变革[6]), 浮动(变革[7]))
t..自转.x = 夸特[0]
t..自转.y = 夸特[1]
t..自转.z = 夸特[2]
t..自转.w = 夸特[3]

最后,我们使用 发送变换( ) 功能。

自我.tf_static_broadcaster.发送变换(t)

2.2 更新 package.xml

导航一级回到 src/learning_tf2_py 目录中的 setup.py, setup.cfgpackage.xml 文件已为您创建。

开放 package.xml 使用文本编辑器。

正如 创建软件包 教程,确保填写 <描述>;, <维护者>;许可证 标签

<描述>;学习 tf2  rclpy</description>;
维护者 电子邮件="[email protected]";>;您的 名称维护人员</maintainer>;
许可证阿帕奇 许可证 2.0</license>;

在上面的行之后,添加以下与节点的导入语句相对应的依赖关系:

执行依赖关系;几何参数</exec_depend>;
执行依赖关系;python3-numpy</exec_depend>;
执行依赖关系;rclpy</exec_depend>;
执行依赖关系;tf2_ros_py</exec_depend>;
执行依赖关系;海龟</exec_depend>;

这声明了所需的 几何参数, python3-numpy, rclpy, tf2_ros_py海龟 执行其代码时的依赖关系。

确保保存文件。

2.3 添加入口

玫瑰2 运行 命令来运行您的节点,您必须将入口点添加到 setup.py 位于 src/learning_tf2_py 目录)。

控制台脚本 括号:

'static_turtle_tf2_broadcaster = learning_tf2_py.static_turtle_tf2_broadcaster:main';,

3 建

运行 rosdep 在工作区的根目录中,以便在构建前检查是否有缺失的依赖项:

rosdep install -i --from-path src --rosdistro iron -y

还是在工作区的根目录下,构建新软件包:

colcon build --packages-select learning_tf2_py

打开一个新终端,导航到工作区的根目录,然后获取设置文件:

install/setup.bash

4 运行

现在运行 静态海龟_TF2_播音员 节点:

ros2 run learning_tf2_py static_turtle_tf2_broadcaster mystaticturtle 0 0 1 0 0 0

这将为 神秘乌龟 漂浮在离地面 1 米高的地方。

现在,我们可以通过回显 tf_static 主题

ros2 topic echo /tf_static

如果一切顺利,您应该看到一个单一的静态变换

变换:
- 头
   盖章:
      sec: 1622908754
      Nanosec: 208515730
   frame_id: world
child_frame_id: mystaticturtle
转型:
   翻译:
      x: 0.0
      y:0.0
      z: 1.0
   轮换:
      x: 0.0
      y:0.0
      z: 0.0
      w:1.0

发布静态变换的正确方法

本教程旨在展示如何 静态变换广播 可用于发布静态转换。在实际开发过程中,您不必自己编写这些代码,而应使用专用的 tf2_ros 工具来实现。 tf2_ros 提供了一个名为 静态转换发布者 既可以作为命令行工具使用,也可以作为节点添加到启动文件中。

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

ros2 run tf2_ros static_transform_publisher --x x --y y --z z --yaw yaw --pitch pitch --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

静态转换发布者 既可作为手动使用的命令行工具,也可在 启动 文件,用于设置静态变换。例如

 启动 舶来品 启动说明
 launch_ros.actions 舶来品 节点

捍卫 生成发射描述():
    返回 启动说明([
        节点(
            包装='tf2_ros';,
            可执行='static_transform_publisher';,
            论点 = ['--x', '0', '--y', '0', '--z', '1', '--yaw';, '0', '-pitch';, '0', '--滚';, '0', '--frame-id';, '世界';, '--child-frame-id', 'mystaticturtle';]
        ),
    ])

请注意,除了 --frame-id--儿童帧--ID 是可选项;如果没有指定特定选项,则将假定其身份。

摘要

在本教程中,您将了解静态变换如何用于定义帧间的静态关系,例如 神秘乌龟 关于 世界 帧。此外,你们还了解了静态变换如何通过将数据与通用坐标框架相关联来帮助理解传感器数据(如激光扫描仪的数据)。最后,你们编写了自己的节点来向 tf2 发布静态变换,并学习了如何使用 静态转换发布者 执行文件和启动文件。