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

将 URDF 与 机器人状态发布者

目标 模拟以 URDF 为模型的行走机器人,并在 Rviz 中查看。

辅导水平: 中级

时间 15 分钟

背景介绍

本教程将向您展示如何为行走机器人建模,并将其状态发布为 tf2 首先,我们创建描述机器人装配的 URDF 模型。接下来,我们编写一个节点,模拟运动并发布 JointState 和变换。然后,我们使用 机器人状态发布者 将整个机器人状态发布到 /tf2.

././././_images/r2d2_rviz_demo.gif

先决条件

与往常一样,别忘了在 您打开的每个新终端.

任务

1 创建软件包

创建目录:

mkdir -p second_ros2_ws/src

然后创建软件包:

cd second_ros2_ws/src
ros2 pkg create --build-type ament_python --license Apache-2.0 urdf_tutorial_r2d2 --dependencies rclpy
cd urdf_tutorial_r2d2

现在您应该看到一个 urdf_tutorial_r2d2 文件夹。接下来你将对其进行几处修改。

2 创建 URDF 文件

创建目录,我们将在其中存储一些资产:

mkdir -p urdf

下载 URDF 文件 并将其保存为 second_ros2_ws/src/urdf_tutorial_r2d2/urdf/r2d2.urdf.xml.下载 Rviz 配置 文件 并将其保存为 second_ros2_ws/src/urdf_tutorial_r2d2/urdf/r2d2.rviz.

3 公布状态

现在,我们需要一种方法来指定机器人所处的状态。为此,我们必须指定所有三个关节和整体运动轨迹。

启动您最喜欢的编辑器,将以下代码粘贴到 second_ros2_ws/src/urdf_tutorial_r2d2/urdf_tutorial_r2d2/state_publisher.py

 算术 舶来品 罪过, 系数, pi
舶来品 rclpy
 rclpy.node 舶来品 节点
 rclpy.qos 舶来品 QoSProfile
 几何_msgs.msg 舶来品 四元数
 传感器_msgs.msg 舶来品 联合国家
 tf2_ros 舶来品 改造播音员, TransformStamped

 国家出版商(节点):

    捍卫 启动(自我):
        rclpy.启动()
        棒极了().启动('state_publisher';)

        qos_profile = QoSProfile(深度=10)
        自我.联合出版 = 自我.创建出版商(联合国家, 'joint_states', qos_profile)
        自我.广播 = 改造播音员(自我, 优先权=qos_profile)
        自我.节点名 = 自我.获取名称()
        自我.get_logger().信息(";{0} 开始";.格式(自我.节点名))

        程度 = pi / 180.0
        循环速率 = 自我.创建速率(30)

        # 机器人状态
        倾斜度 = 0.
         = 程度
        转动 = 0.
        观点 = 0.
        高度 = 0.
         = 0.005

        # 消息声明
        odom_trans = TransformStamped()
        odom_trans.页眉.frame_id = '奥多姆';
        odom_trans.子帧标识 = '轴';
        joint_state = 联合国家()

        尝试:
            虽然 rclpy.好的():
                rclpy.自旋一次(自我)

                # 更新 joint_state
                现在 = 自我.获取时钟().现在()
                joint_state.页眉.盖章 = 现在.to_msg()
                joint_state.名字 = ['旋转';, '倾斜';, '潜望镜';]
                joint_state.位置 = [转动, 倾斜度, 高度]

                # 更新变换
                # (在半径=2 的圆内移动)
                odom_trans.页眉.盖章 = 现在.to_msg()
                odom_trans..译文.x = 系数(观点)*2
                odom_trans..译文.y = 罪过(观点)*2
                odom_trans..译文.z = 0.7
                odom_trans..自转 = \
                    欧拉到四元数(0, 0, 观点 + pi/2) # 滚动、俯仰、偏航

                # 发送联合状态和变换
                自我.联合出版.发布(joint_state)
                自我.广播.发送变换(odom_trans)

                # 创建新的机器人状态
                倾斜度 += 
                如果 倾斜度 <; -0.5  倾斜度 >; 0.0:
                     *= -1
                高度 += 
                如果 高度 >; 0.2  高度 <; 0.0:
                     *= -1
                转动 += 程度
                观点 += 程度/4

                # 这将根据每次迭代的需要进行调整
                循环速率.睡眠()

        除开 键盘中断:
            通过

捍卫 欧拉到四元数(滚动, 沥青, 打呵欠):
    qx = 罪过(滚动/2) * 系数(沥青/2) * 系数(打呵欠/2) - 系数(滚动/2) * 罪过(沥青/2) * 罪过(打呵欠/2)
    qy = 系数(滚动/2) * 罪过(沥青/2) * 系数(打呵欠/2) + 罪过(滚动/2) * 系数(沥青/2) * 罪过(打呵欠/2)
    qz = 系数(滚动/2) * 系数(沥青/2) * 罪过(打呵欠/2) - 罪过(滚动/2) * 罪过(沥青/2) * 系数(打呵欠/2)
    qw = 系数(滚动/2) * 系数(沥青/2) * 系数(打呵欠/2) + 罪过(滚动/2) * 罪过(沥青/2) * 罪过(打呵欠/2)
    返回 四元数(x=qx, y=qy, z=qz, w=qw)

捍卫 主要():
    网站 = 国家出版商()

如果 姓名____ == '__main__';:
    主要()

4 创建启动文件

创建一个新的 second_ros2_ws/src/urdf_tutorial_r2d2/launch 文件夹。打开编辑器,粘贴以下代码,保存为 second_ros2_ws/src/urdf_tutorial_r2d2/launch/demo_launch.py

舶来品 os
 ament_index_python.packages 舶来品 获取软件包共享目录
 启动 舶来品 启动说明
 launch.actions 舶来品 声明启动参数
 launch.substitutions 舶来品 启动配置
 launch_ros.actions 舶来品 节点

捍卫 生成发射描述():

    使用模拟时间 = 启动配置('use_sim_time', 默认='false';)

    urdf_file_name = 'r2d2.urdf.xml'
    urdf = os..加入(
        获取软件包共享目录('urdf_tutorial_r2d2'),
        urdf_file_name)
     (urdf, 'r') 作为 infp:
        机器人说明 = infp.阅读()

    返回 启动说明([
        声明启动参数(
            'use_sim_time',
            默认值='false';,
            描述='如果为 true,则使用模拟(Gazebo)时钟';),
        节点(
            包装='robot_state_publisher';,
            可执行='robot_state_publisher';,
            名字='robot_state_publisher';,
            产量='屏幕';,
            参数=[{'use_sim_time': 使用模拟时间, 'robot_description';: 机器人说明}],
            论点=[urdf]),
        节点(
            包装='urdf_tutorial_r2d2',
            可执行='state_publisher';,
            名字='state_publisher';,
            产量='屏幕';),
    ])

5 编辑 setup.py 文件

您必须告诉 胶管 构建工具如何安装 Python 软件包。编辑 second_ros2_ws/src/urdf_tutorial_r2d2/setup.py 文件如下

  • 包括这些导入语句

舶来品 os
 水珠 舶来品 水珠
 设置工具 舶来品 设置
 设置工具 舶来品 查找软件包
  • 将这两行添加到 数据文件

数据文件=[
  ...
  (os..加入('分享';, 包名, 'launch';), 水珠(os..加入('launch';, '*launch.[pxy][yma]*'))),
  (os..加入('分享';, 包名), 水珠('urdf/*';)),
],
  • 修改 入口 表,这样以后就可以从控制台运行 "state_publisher

'console_scripts';: [
    'state_publisher = urdf_tutorial_r2d2.state_publisher:main';
],

保存 setup.py 文件中作出更改。

6 安装软件包

cd second_ros2_ws
colcon build --symlink-install --packages-select urdf_tutorial_r2d2

源设置文件:

source install/setup.bash

7 查看结果

启动软件包

ros2 launch urdf_tutorial_r2d2 demo_launch.py

打开一个新终端,使用以下命令运行 Rviz

rviz2 -d second_ros2_ws/install/urdf_tutorial_r2d2/share/urdf_tutorial_r2d2/r2d2.rviz

参见 用户指南 了解如何使用 Rviz 的详细信息。

摘要

您创建了一个 联合国家 发布节点,并将其与 机器人状态发布者 来模拟行走机器人。这些示例中使用的代码最初来自 这里.

本文作者 ROS 1 教程 其中一些内容被重复使用。