一.前言
大家好,这次我跟着小鱼老师步入了新的章节,从本章开始,我们将学习对机器人进行建模,并尝试让它动起来。我们将通过机器人建模语言——URDF创建简单的机器人模型,并实现在RVIZ2中的可视化。好的,话不多说,马上开始!
二.ros2学习
前13小节内容可订阅往期博客
14 URDF机器人建模语言
URDF(Unified Robot Description Format)统一机器人描述格式,URDF使用XML格式描述机器人文件。
XML是 被设计用来传输和存储数据的可扩展标记语言,注意语言本身是没有含义的,只是规定了其数据格式
XML格式在线校验工具:在线代码格式化 (oschina.net)
XML格式注释: 标签: robot
link
robot标签的属性name
: <robot name="***"></robot>
robot标签的子标签link
: <robot name="***"><link name="base_link"></link></robot>
接着我们从下面四个方面介绍URDF:
- URDF的组成介绍
- URDF-Link介绍
- URDF-Joint介绍
- 创建一个简单的URDF并在RVIZ2中可视化
14.1 URDF的组成介绍
URDF由声明信息
和两种关键组件
共同组成
声明信息
声明信息包含两部分,第一部分是xml的声明信息,放在第一行,第二部分是机器人的声明,通过robot标签就可以声明一个机器人模型
<?xml version="1.0"?>
<robot name="fishbot">
<link></link>
<joint></joint>
......
</robot>
两种关键组件
如图中机器人,可以简化为如下五个部件组成:
-
躯体
-
左右轮子
-
支撑轮
-
雷达激光
-
IMU模块
左轮,右轮、支撑轮子,IMU和雷达部件称为机器人的Link
而Link和Link之间的连接部分称之为Joint关节
我们可以使用6个link和5个joint来描述这个机器人,接着我们分别对link和joint进行详细的介绍。
14.1.1 Link
通过link标签即可声明一个link,属性name指定部件名字
<link name="base_link">
</link>
通过visual
子标签就可以声明出来机器人的visual形状
<!-- base link -->
<link name="base_link">
<visual>
<origin xyz="0 0 0.0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.12" radius="0.10"/>
</geometry>
</visual>
</link>
link的子标签列表
- visual 显示形状
<geometry>
(几何形状)<box>
长方体- 标签属性:
size
-长宽高 - 举例:
<box size="1 1 1" />
- 标签属性:
<cylinder>
圆柱体- 标签属性:
radius
-半径length
-高度 - 举例:
<cylinder radius="1" length="0.5"/>
- 标签属性:
<sphere>
球体- 属性:
radius
-半径 - 举例:
<sphere radius="0.015"/>
- 属性:
mesh
第三方导出的模型文件- 属性:filename
- 举例:
<mesh filename="package://robot_description/meshes/base_link.DAE"/>
- origin (可选:默认在物体几何中心)
- 属性
xyz
默认为零矢量rpy
弧度表示的翻滚、俯仰、偏航 - 举例:
<origin xyz="0 0 0" rpy="0 0 0" />
- 属性
- material 材质
- 属性
name
名字- color
- 属性
rgba
a代表透明度 - 举例:
<material name="white"><color rgba="1.0 1.0 1.0 0.5" /> </material>
- 属性
- color
- 属性
- collision 碰撞属性
- inertial 惯性参数 质量等
14.1.2 Joint
joint为机器人关节,机器人关节用于连接两个机器人部件,主要写明父子关系
-
父子之间的连接类型,包括是否固定的,可以旋转的等
-
父部件名字
-
子部件名字
-
父子之间相对位置
-
父子之间的旋转轴,绕哪个轴转
比如再建立一个雷达部件laser_link
,然后将laser_link
固定到base_link
<?xml version="1.0"?>
<robot name="fishbot">
<!-- base link -->
<link name="base_link">
<visual>
<origin xyz="0 0 0.0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.12" radius="0.10"/>
</geometry>
</visual>
</link>
<!-- laser link -->
<link name="laser_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.02" radius="0.02"/>
</geometry>
<material name="black">
<color rgba="0.0 0.0 0.0 0.5" />
</material>
</visual>
</link>
<!-- laser joint -->
<joint name="laser_joint" type="fixed">
<parent link="base_link" />
<child link="laser_link" />
<origin xyz="0 0 0.075" />
</joint>
</robot>
joint标签详解
joint属性
- name 关节的名称
- type 关节的类型
- revolute: 旋转关节,绕单轴旋转,角度有上下限,比如舵机0-180
- continuous: 旋转关节,可以绕单轴无限旋转,比如自行车的前后轮
- fixed: 固定关节,不允许运动的特殊关节
- prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限
- planer: 平面关节,允许在xyz,rxryrz六个方向运动
- floating: 浮动关节,允许进行平移、旋转运动
joint的子标签
parent
父link名称<parent link="base_link" />
child
子link名称<child link="laser_link" />
origin
父子之间的关系xyz rpy<origin xyz="0 0 0.014" />
axis
围绕旋转的关节轴<axis xyz="0 0 1" />
15 RVIZ2可视化移动机器人模型
我们来把我们上面定义的简单的URDF(包含身体和雷达)用RVIZ2显示出来,直观的感受下,我们的机器人模型。
URDF可视化的步骤如下:
- 建立机器人描述功能包
- 建立
urdf
文件夹编写urdf文件 - 建立
launch
文件夹,编写launch文件 - 修改
setup.py
配置,编译测试
15.1 建立功能包
先创建一个工作空间命名为urdf,然后建立src文件夹并在其中建立功能包,包的类型选ament_python
创建工程中可能会出现警告:
此警告意味着在包的package.xml中设置了一个未知的许可证,但是没有创建相应的LICENSE文件。建议使用ament许可证标识符来指定许可证类型。
你可以通过在package.xml的字段中指定一个ament标识符来解决这个问题。以下是常用的一些例子:
MIT
BSD-2-Clause
BSD-3-Clause
Apache-2.0
你可以在ament官方文档中找到完整的标识符列表,以及如何指定更复杂许可证的说明。
一旦你指定了合适的ament标识符,你就需要创建一个相应的LICENSE文件并将其放置在包的根目录中。你可以使用touch LICENSE命令来创建一个空的LICENSE文件,然后在其中添加你选择的标识符和其他信息,如作者、版权年份和其他声明。
在完成这些步骤后,你需要重新编译并运行你的节点,以确保警告已经被解决了。
当然这个暂时不影响后续操作,我们先往下进行。
15.2 建立URDF文件
建立URDF文件夹,创建urdf文件夹,并在其下新建fishbot_base.urdf
文件
编辑fishbot_base.urdf
15.3 建立launch文件
在目录src/fishbot_description
下创建launch
文件夹并在其下新建display_rviz2.launch.py
文件
编辑display_rviz2.launch.py
想要可视化模型需要三个节点参与
joint_state_publisher_gui
负责发布机器人关节数据信息,通过joint_states
话题发布robot_state_publisher_node
负责发布机器人模型信息robot_description
,并将joint_states
数据转换tf信息发布rviz2_node
负责显示机器人的信息
这里我们用到了joint_state_publisher_gui
和robot_state_publisher
两个包,如果系统没有,可以手动安装:
sudo apt install ros-$ROS_DISTRO-joint-state-publisher-gui ros-$ROS_DISTRO-robot-state-publisher
$ROS_DISTRO可以表示当前ros版本,这里把$ROS_DISTRO就当成humble字符串来用。
joint_state_publisher_gui
,还有类似的包叫做joint_state_publisher
两者区别在于joint_state_publisher_gui
运行起来会跳出一个界面,通过界面可以操作URDF中能动的关节
15.4 修改setup.py
15.5 编译测试
运行:
添加robotmodel模块,分别选择link名称如下,即可看到机器人的模型显示
节点关系图