警告
您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.
将 URDF 与机器人状态发布器结合使用
目标 用 URDF 模拟行走机器人,并在 Rviz 中查看。
辅导水平: 中级
时间 15 分钟
背景介绍
本教程将向您展示如何为行走机器人建模,并将其状态发布为 /tf2 首先,我们创建描述机器人装配的 URDF 模型。接下来,我们编写一个节点,模拟运动并发布 JointState 和变换。然后,我们使用 机器人状态发布者
将整个机器人状态发布到 /tf2
.

先决条件
任务
1 创建软件包
cd ~/dev_ws/src # 根据需要更改
ros2 pkg create urdf_tutorial --build-type ament_python --dependencies rclpy
现在您应该看到一个 urdf_tutorial
文件夹。接下来你将对其进行几处修改。
2 创建 URDF 文件
以下是 URDF 文件 的 7 连杆模型,大致与 R2-D2 相似。保存为 ~/dev_ws/src/urdf_tutorial/urdf/r2d2.urdf.xml
要在 Rviz 中查看机器人,请保存以下内容 Rviz 配置 作为 ~/dev_ws/src/urdf_tutorial/urdf/r2d2.rviz
请注意: 两个文件都必须位于子文件夹 urdf
3 公布状态
现在,我们需要一种方法来指定机器人所处的状态。为此,我们必须指定所有三个关节和整体运动轨迹。
启动您最喜欢的编辑器,将以下代码粘贴到 src/urdf_tutorial/urdf_tutorial/state_publisher.py
请注意: 确保将其保存在 Python "urdf_tutorial" 子文件夹中,其中的 __init__.py
文件的位置。
#!/usr/bin/env python
从 算术 舶来品 罪过, 系数, 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 创建启动文件
创建一个新的 启动
文件夹。打开编辑器,粘贴以下代码,保存为 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_file_name : {}";.格式(urdf_file_name))
urdf = os.路.加入(
获取软件包共享目录('urdf_tutorial'),
urdf_file_name)
返回 启动说明([
声明启动参数(
'use_sim_time',
默认值='false';,
描述='如果为 true,则使用模拟(Gazebo)时钟';),
节点(
包装='robot_state_publisher';,
可执行='robot_state_publisher';,
名字='robot_state_publisher';,
产量='屏幕';,
参数=[{'use_sim_time': 使用模拟时间}],
论点=[urdf]),
节点(
包装='urdf_tutorial',
可执行='state_publisher';,
名字='state_publisher';,
产量='屏幕';),
])
5 编辑 setup.py 文件
您必须告诉 胶管 构建工具如何安装 Python 软件包。编辑 setup.py
文件如下
包括这些导入语句
舶来品 os
从 水珠 舶来品 水珠
从 设置工具 舶来品 设置
从 设置工具 舶来品 查找软件包
将这两行添加到
数据文件
数据文件=[
...
(os.路.加入('分享';, 包名), 水珠('launch/*.py')),
(os.路.加入('分享';, 包名), 水珠('urdf/*';))
],
修改
入口
表,这样以后就可以从控制台运行 "state_publisher
'console_scripts';: [
'state_publisher = urdf_tutorial.state_publisher:main';
],
保存 setup.py
文件中作出更改。
6 安装软件包
cd ~/dev_ws
colcon build --symlink-install --packages-select urdf_tutorial
source install/setup.bash
7 查看结果
启动软件包
ros2 launch urdf_tutorial demo.launch.py
打开一个新终端,使用以下命令运行 Rviz
rviz2 -d ~/dev_ws/install/urdf_tutorial/share/urdf_tutorial/r2d2.rviz
请参阅《用户指南》(http://wiki.ros.org/rviz/UserGuide) 获取如何使用 Rviz 的详细信息。
摘要
您创建了一个 JointState 发布节点,并将其与 机器人状态发布者
来模拟行走机器人。这些示例中使用的代码可在以下网站找到 这里.
本文作者 ROS 1 教程 其中一些内容被重复使用。