ROS探索总结(二十三)——解读URDF

  • 内容
  • 评论
  • 相关

Unified Robot Description Format,统一机器人描述格式,简称为URDFROS中的urdf功能包包含一个URDFC++解析器,URDF文件使用XML格式描述机器人模型。

1      URDF语法规范

参见:XML specifications

2      组件

      URDF由一些不同的功能包和组件组成,下图描述了这些组件之间的联系。

11

3      URDF教程

如下图所示,本节将创建一个如下图所示结构的机器人模型。

12

3.1       基础模型

上图所示是一个树形机器人模型,我们先从机器人的整体结构出发,不考虑过多的细节,可以将机器人通过如下的URDF表示:

  1. <robot name="test_robot">
  2.   <link name="link1" />
  3.   <link name="link2" />
  4.   <link name="link3" />
  5.   <link name="link4" />
  6.  
  7.   <joint name="joint1" type="continuous">
  8.     <parent link="link1"/>
  9.     <child link="link2"/>
  10.   </joint>
  11.  
  12.   <joint name="joint2" type="continuous">
  13.     <parent link="link1"/>
  14.     <child link="link3"/>
  15.   </joint>
  16.  
  17.   <joint name="joint3" type="continuous">
  18.     <parent link="link3"/>
  19.     <child link="link4"/>
  20.   </joint>
  21. </robot>

上边的URDF模型定义了机器人的4个环节(link),然后定义了三个关节(joint)来描述环节之间的关联。

ROS为用户提供了一个检查URDF语法的工具:

$ sudo apt-get install liburdfdom-tools

安装完毕后,执行检查:

check_urdf my_robot.urdf

如果一切正常,将会有如下显示:

robot name is: test_robot

---------- Successfully Parsed XML ---------------

root Link: link1 has 2 child(ren)

    child(1):  link2

    child(2):  link3

        child(1):  link4

3.2       添加机器人尺寸

在基础模型之上,我们为机器人添加尺寸大小。由于每个环节的参考系都位于该环节的底部,关节也是如此,所以在表示尺寸大小时,只需要描述其相对于连接的关节的相对位置关系即可。URDF中的<origin>域就是用来表示这种相对关系。

例如,joint2相对于连接的link1x轴和y轴都有相对位移,而且在x轴上还有90度的旋转变换,所以表示成<origin>域的参数就如下所示:

  1. <origin xyz="-2 5 0" rpy="0 0 1.57" />

为所有关节应用尺寸:

  1. <robot name="test_robot">
  2.   <link name="link1" />
  3.   <link name="link2" />
  4.   <link name="link3" />
  5.   <link name="link4" />
  6.  
  7.   <joint name="joint1" type="continuous">
  8.     <parent link="link1"/>
  9.     <child link="link2"/>
  10.     <origin xyz="5 3 0" rpy="0 0 0" />
  11.   </joint>
  12.  
  13.   <joint name="joint2" type="continuous">
  14.     <parent link="link1"/>
  15.     <child link="link3"/>
  16.     <origin xyz="-2 5 0" rpy="0 0 1.57" />
  17.   </joint>
  18.  
  19.   <joint name="joint3" type="continuous">
  20.     <parent link="link3"/>
  21.     <child link="link4"/>
  22.     <origin xyz="5 0 0" rpy="0 0 -1.57" />
  23.   </joint>
  24. </robot>

再次使用check_urdf检查通过后继续下一步。

3.3       添加运动学参数

如果我们为机器人的关节添加旋转轴参数,那么该机器人模型就可以具备基本的运动学参数。

例如,joint2围绕正y轴旋转,可以表示成:

  1. <axis xyz="0 1 0" />

同理,joint1的旋转轴是:

  1. <axis xyz="-0.707 0.707 0" />

应用到我们的URDF中:

  1. <robot name="test_robot">
  2.   <link name="link1" />
  3.   <link name="link2" />
  4.   <link name="link3" />
  5.   <link name="link4" />
  6.  
  7.   <joint name="joint1" type="continuous">
  8.     <parent link="link1"/>
  9.     <child link="link2"/>
  10.     <origin xyz="5 3 0" rpy="0 0 0" />
  11.     <axis xyz="-0.9 0.15 0" />
  12.   </joint>
  13.  
  14.   <joint name="joint2" type="continuous">
  15.     <parent link="link1"/>
  16.     <child link="link3"/>
  17.     <origin xyz="-2 5 0" rpy="0 0 1.57" />
  18.     <axis xyz="-0.707 0.707 0" />
  19.   </joint>
  20.  
  21.   <joint name="joint3" type="continuous">
  22.     <parent link="link3"/>
  23.     <child link="link4"/>
  24.     <origin xyz="5 0 0" rpy="0 0 -1.57" />
  25.     <axis xyz="0.707 -0.707 0" />
  26.   </joint>
  27. </robot>

       便忘记使用check_urdf检查语法错误。

3.4       图形化显示URDF模型

我们现在已经完成了一个简单的URDF模型创建,ROS提供了相应的工具可以让URDF图像化显示出来。

  $ urdf_to_graphiz my_robot.urdf

然后打开生成的pdf文件,即可看到图形化的URDF

13

4      示例

参见:Example

5      调试工具

5.1       验证工具

上文已经提到了URDF语法检查工具check_urdf,在indigo版本的ROS中,执行如下命令即可:

rosrun urdfdom check_urdf /tmp/pr2.urdf

检查结果如下:

image

5.2       可视化工具

上文同样提到的URDF可视化工具urdf_to_graphiz,在indigo版本额ROS中属于liburdfdom-tools包中的一个工具,可以使用如下命令安装:

sudo apt-get install liburdfdom-tools

可视化工具的使用方法:

urdf_to_graphiz pr2.urdf

结果如下所示:

14

 

参考链接

1、urdf功能包:http://wiki.ros.org/urdf

2、urdf语法规范:http://wiki.ros.org/urdf/XML

3、urdf教程:http://wiki.ros.org/urdf/Tutorials

4、urdf示例:http://wiki.ros.org/urdf/Examples


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS探索总结(二十三)——解读URDF

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

23条评论
  1. Gravatar 头像

    sunanger 回复

    大师你好,我有一个问题,一直困扰着,ros是基于自己写的urdf文件来完成一些运动学的控制,但实际硬件机器人与自己写的urdf文件间是存在一些误差的,ros里边是怎样来校正这两个间的误差的呢?谢谢。

    • 古月

      古月 回复

      @sunanger 如果你需要用URDF模型进行仿真,确实和真实机器人存在误差,仿真永远不能等于真实,只能通过完善模型逼近真实而已。如果你只是用URDF模型做显示,那么模型只是将真实机器人的状态以可视化的形式呈现出来而已。你说的运动学控制应该属于第一种情况,基于模型的算法和ROS本身没有关系,ROS只是提供了URDF这种建模工具,功能比较强大,但也绝对不是万能的。

  2. Gravatar 头像

    yan 回复

    您好,我出现的问题是urdfdom notfound,好像是我少下了一个包,不知道是哪个包呢,网上也搜不到

    • 古月

      古月 回复

      @yan 用这个安装:
      sudo apt-get install liburdfdom-tools

      • Gravatar 头像

        yan 回复

        @古月 这个包我两台电脑都下载了,但是还是出现urdfdom notfound,在一台电脑上我下了那个包就没有出现问题,另一台上忘了要下哪个包就出现这个问题了

      • Gravatar 头像

        yan 回复

        @古月 顺便问一下,urdf代码中link内容和joint内容位置可以交换吗,有没有编写的先后之分

        • 古月

          古月 回复

          @yan 不用package,直接用这个命令试一下:check_urdf my_robot.urdf
          link和joint的位置可以交换的,没有先后之分

          • Gravatar 头像

            yan 回复

            @古月 照你说的做,然后也出现了ERROR: Model Parsing the xml failed,我改了一下urdf文件后就弄好了,非常感谢

          • Gravatar 头像

            yan 回复

            @古月 文件倒是正常的,但是运行rosrun urdfdom check_urdf /tmp/pr2.urdf这里还是出现了[rospack] Error:package 'urdfdom' not found。。。

            • Gravatar 头像

              yan 回复

              @yan 再请问一下,srdf的作用是什么呢

              • 古月

                古月 回复

                @yan 也是机器人模型的一种描述格式,在某些功能包中需要,比如moveit

            • 古月

              古月 回复

              @yan urdfdom功能包在某些ROS版本中没有,改成了check_urdf命令,两种方法是一样的。

              • Gravatar 头像

                yan 回复

                @古月 这样啊,我懂了,十分感谢

  3. Gravatar 头像

    孔维霞 回复

    Error: Error document empty.
    at line 72 in /build/buildd/urdfdom-0.2.10+dfsg/urdf_parser/src/model.cpp
    ERROR: Model Parsing the xml failed
    您好,这个错误是什么意思啊

    • 古月

      古月 回复

      @孔维霞 模型文件有问题,仔细检查一下urdf文件是不是问题

  4. Gravatar 头像

    李响 回复

    [ERROR] [1493085521.336593342]: Error retrieving file [file:///home/cx/catkin_ws/src/Basic1/meshes/base_link.stl]: Couldn't open file /home/cx/catkin_ws/src/Basic1/meshes/base_link.stl
    [ERROR] [1493085521.372680776]: Could not load model 'package://Basic1/meshes/base_link.stl' for link 'base_link': OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource package://Basic1/meshes/base_link.stl in resource group Autodetect or any other group. in ResourceGroupManager::openResource at /build/buildd/ogre-1.8-1.8.1+dfsg/OgreMain/src/OgreResourceGroupManager.cpp (line 756)
    ........后面都是类似的错误显示
    但是我的Basic1文件夹下的meshes文件夹里面有base_link_STL等文件
    请问如何解决这个问题呢,谢谢

  5. Gravatar 头像

    李响 回复

    您好!请问,我用RVIZ直接打开urdf,只显示tf变换,不显示机器人模型怎么解决?用RVIZ打开setup_saaistant配置好的demo.launch文件也一样。urdf文件是我用solidworks用官方的插件转的

  6. Gravatar 头像

    Watermelon 回复

    您好,我刚学完新手教程,请问下我应该把my_robot.urdf这个文件放到哪个文件夹里?还要进行其他的操作吗?比如说修改cmake? 为什么我运行check_urdf my_robot.urdf命令时,显示
    Error document empty.
    at line 72 in /build/buildd/urdfdom-0.2.10+dfsg/urdf_parser/src/model.cpp
    ERROR: Model Parsing the xml failed

    • 古月

      古月 回复

      @Watermelon 你好,如果不指定路径,check_urdf命令会搜索当前文件夹下的urdf文件,不用修改cmake

    • Gravatar 头像

      Ale 回复

      @Watermelon 你好!我运行check_urdf报同样的错误,你是怎么解决的呢

  7. Gravatar 头像

    王方 回复

    🙄 加油!

发表评论

电子邮件地址不会被公开。 必填项已用*标注