Gazebo仿真学习——1.自定义URDF以使机器人在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,这是根据测试不同的阻尼量并观察摆动的“真实性”来确定的。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值