Using a URDF in Gazebo
1.要明确的问题:
- URDF是什么?
统一机器人描述格式(URDF)是用来描述机器人的所有元素的,它采用 XML 文件格式。想要在Gazebo中仿真机器人,首要就是要有机器人模型,所以就涉及到了URDF。然而要在Gazebo中使用URDF,还需要添加一些特定于仿真的标签才可以,以下这篇笔记将记录如何编写这些标签及成功使用。 - Gazebo元素:
可以理解< Gazebo >为URDF的扩展,用于指定在Gazebo中仿真所需的其他属性。< Gazebo >元素有< robot >、< link >、< joint >三个标签。 - 仿真机器人第一步:
获取URDF文件,然后在Rviz中测试一下获取的URDF是否正确。 - 仿真机器人第二步:
如果Rviz验证正确的话再使用< Gazebo >配置机器人。 - 仿真机器人第三步:
打开Gazebo验证。
2.下面以最简单的两关节机械臂RRBot开启我的学习之旅:
- 第一步:获取RRBot
mkdir RRBot_ws/src
cd RRBot_ws/src
git clone https://github.com/ros-simulation/gazebo_ros_demos.git
cd ..
catkin_make
- 在Rviz中测试RRBot的URDF:
roslaunch rrbot_description rrbot_rviz.launch
还可以使用joint_state_publisher中的滑块来移动两个关节
- 看一下RRBot的URDF:
其中:
materials.xacro是一个简单的Rviz颜色文件,用于存储rgba值
rrbot.gazebo是一个特定于Gazebo的文件,其中包含大多数特定于Gazebo的XML元素,包括标签
先看一下Gazebo仿真结果:
roslaunch rrbot_gazebo rrbot_world.launch
3.代码是如何实现的:
首先它是XML格式的代码
根元素标签:机器人名称+xacro的xml命名空间
定义变量:
导入另外两个文件:
将URDF模型永久的连接到Gazebo中的世界框架,通过创建一个“world”链接和一个固定到模型本身的关节:
<!-- Used for fixing robot to Gazebo 'base_link' -->
<link name="world"/>
<joint name="fixed" type="fixed">
<parent link="world"/>
<child link="link1"/>
</joint>
3.1 Link
看RRBot的Base link:
<!-- Base Link -->
<link name="link1">
<collision>
<origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
<geometry>
<box size="${width} ${width} ${height1}"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
<geometry>
<box size="${width} ${width} ${height1}"/>
</geometry>
<material name="orange"/>
</visual>
<inertial>
<origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
<mass value="${mass}"/>
<inertia
ixx="${mass / 12.0 * (width*width + height1*height1)}" ixy="0.0" ixz="0.0"
iyy="${mass / 12.0 * (height1*height1 + width*width)}" iyz="0.0"
izz="${mass / 12.0 * (width*width + width*width)}"/>
</inertial>
</link>
3.1.1 < collision >和< visual >elememt:
从上可见,< collision >和< visual >两元素代码内容几乎一致。这两个标签的工作原理在Gazebo和Rviz中一致,但是必须同时指定两者,否则Gazebo不会将< visual >元素用作< collision >元素而将该 link 视为“不可见”的激光扫描仪和碰撞检查。
那么这两个元素有一处不同,就是< visual >中的< material name=“orange”/ >,这为Link指定了颜色,而颜色的定义就在materials.xacro中。
<?xml version="1.0"?>
<robot>
<material name="black">
<color rgba="0.0 0.0 0.0 1.0"/>
</material>
<material name="blue">
<color rgba="0.0 0.0 0.8 1.0"/>
</material>
<material name="green">
<color rgba="0.0 0.8 0.0 1.0"/>
</material>
<material name="grey">
<color rgba="0.2 0.2 0.2 1.0"/>
</material>
<material name="orange">
<color rgba="${255/255} ${108/255} ${10/255} 1.0"/>
</material>
<material name="brown">
<color rgba="${222/255} ${207/255} ${195/255} 1.0"/>
</material>
<material name="red">
<color rgba="0.8 0.0 0.0 1.0"/>
</material>
<material name="white">
<color rgba="1.0 1.0 1.0 1.0"/>
</material>
</robot>
但是,这种指定链接颜色的方法在Gazebo中并不起作用,因为它采用了OGRE的材质脚本对链接进行着色和纹理化。必须为每个链接指定一个凉亭材料标签,在rrbot.gazebo中:
<!-- Link1 -->
<gazebo reference="link1">
<material>Gazebo/Orange</material>
</gazebo>
<!-- Link2 -->
<gazebo reference="link2">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Black</material>
</gazebo>
<!-- Link3 -->
<gazebo reference="link3">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Orange</material>
</gazebo>
<!-- camera_link -->
<gazebo reference="camera_link">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Red</material>
</gazebo>
3.1.2 < interial >element
这个标签是为了使Gazebo物理引擎正常工作而设置的。为了使LINK在Gazebo中不被忽略,Link质量必须大于0,零主惯性矩(ixx,iyy,izz)的链接可能在任何有限扭矩应用下导致无限加速;所以为了在Gazebo中获得准确的物理近似值,需要确定每个Link的正确值。
<origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
原点标签表示此Link的质心,这里的意思是将质心设置为Link高度的一半。
- 其他的一些关于Link的< Gazebo >元素:
3.2 Joints
<joint name="joint2" type="continuous">
<parent link="link2"/>
<child link="link3"/>
<origin xyz="0 ${width} ${height2 - axel_offset*2}" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<dynamics damping="0.7"/>
</joint>
Joint中必须包含< origin >,< parent >和< child >,这里动力学元件的粘性阻尼系数是0.7 N * m * s / rad,这是根据测试不同的阻尼量并观察摆动的“真实性”来确定的。