用ROS制作我们的机器人小车(一): URDF简介

相信许多爱好者止步于昂贵的机器人价格。虽然有了Arduino,但一个载重能力很弱的机器人小车成本也得一两百块钱。搭建自己的机器人更是费时费力。

所以如果你只是普通机器人爱好者,或者还没想好要拿机器人做什么,那我们还是从模拟器开始吧……


URDF

为了制作我们的模拟器,首先我们得了解下什么是URDF

什么是URDF? Unified Robot Description Format——统一机器人描述格式。总觉得这和Sensor支持才是ROS的精华所在,通信frameworks的并不见得出彩。

可能大部分读者都像我这样穷没钱买ROS支持的机器人,不过ROS还是很Nice的考虑到了这一群体,提供了模拟器支持。(明明是为了更快速的软件开发,喂!)

本想从ROS网站的培训教程开始http://wiki.ros.org/urdf/Tutorials开始的,不过本着实践为本的目的,我们还是以《Learning ROS for Robostic Programming》为基础吧。


参考文献

1. ROS urdf教程:http://wiki.ros.org/urdf/Tutorials

2. 《Learning ROS for Robostic Programming》


准备工作

安装urdf_tutorial包

sudo apt-get install ros-hydro-urdf-tutorial

执行

rosrun rviz rviz

当然,没有运行roscore你的rviz也无法启动。不过如果错误显示你的rviz找不到执行文件的话,请参照http://wiki.ros.org/rviz

URDF基本语法

统一机器人描述格式URDF,其实就是为了能够抽象描述一个机器人的硬件。而且URDF是基于XML的,所以阅读起来应该非常容易。

笔者以为要理解URDF用自顶向下的方式更快。即从为了解决一个怎样的问题开始。在这里我们先用一个简单场景熟悉一下会用到的工具。

不得不说小车是最简单实用的机器人, 一个车身加四个轮子就组成了最基本的小车结构,而且具备一定载重能力的小车也不会太贵。

见如下图片。

(图一)

用ROS制作我们的机器人小车(一): URDF简介_第1张图片


第一版

在URDF语言中,机器人都会由各个部件(Link)通过关节(Joint)连接而成。而这里的关键就是描述部件和关节之间的关系。

在这个简单的小车模型中,一共有5个部件: 车身 + 4个轮子。 4个关节: 每个轮子一个。

于是,我们得到了最初了URDF版本 01_car_skeleton.urdf


  
  
  
  
  


  
    
    
  


  
    
    
  


  
    
    
  


  
    
    
  

很简单对吧?

tag描述各个部件, tag描述各个关节。用描述关节连接的部件。

只要描述了Link和Joint之间的关系,我们很容易就能构建机器人的框架。

我们可以用如下命令来检查urdf文件是否有语法问题。

check_urdf 01_skeleton.urdf

只要得到如下结果就表明语法没问题。

robot name is: test_robot
---------- Successfully Parsed XML ---------------
root Link: base_link has 4 child(ren)
    child(1):  wheel_1
    child(2):  wheel_2
    child(3):  wheel_3
    child(4):  wheel_4
但请注意这虽然描述了各个部件之间的关系,但仍是一个不完整的URDF,无法在模拟器中显示。


第二版

tag用来描述模块的视觉效果。

tag 用来描述模块的形状和大小。

tag用来描述模块的位置。

加上模块大小之后的小车文件如下所示。02_visual.urdf


  
    
       
         
       
       
    
  

  
    
      
        
      
      
    
  

  
    
      
        
      
      
    
  

  
    
      
        
      
      
    
  

  
    
      
        
      
      
    
  

  
    
    
  

  
    
    
  

  
    
    
  

  
    
    
  

现在通过如下命令,你就通过rviz查看你的小车模型啦。

roslaunch urdf_tutorial display.launch model:=02_visual.urdf

用ROS制作我们的机器人小车(一): URDF简介_第2张图片


第三步: 上色

Mmm,我们的小车就快完成了,但全是红色总觉得怪怪的而且很难辨认。

不过上色同样很简单。使用 tag并且设置 tag

我们得到第三个版本:03_color.urdf


  
    
       
         
       
       
       
         
       
    
  

  
    
      
        
      
      
      
        
      
    
  

  
    
      
        
      
      
      
    
  

  
    
      
        
      
      
      
    
  

  
    
      
        
      
      
      
    
  

  
    
    
  

  
    
    
  

  
    
    
  

  
    
    
  


我们可以看到rviz的结果,如图一所示。

这下我们差不多完成了。我们马上就可以移动我们的小车啦。

但是等等,在我们的URDF文件中,内嵌了关于各个部件的大小参数以及位置。这些当然是我们根据草图用计算器算出来的。

但是这样的扩展性也太差了吧?难道对每个模型我们都得这么计算吗?对于相同模型的不同尺寸我们还得重新计算一次?


第四步: Xacro

什么是Xacro? 我们可以把它理解成为针对URDF的扩展性和配置性而设计的宏语言(macro language)。

有了Xacro,我们就可以像编程一样来写URDF文件了。

首先我们来看Xacro文件的变量定义:

只要定义了body_width,我们就可以通过${body_width}来引用其值了。有了这个,至少我们可以把需要配置的变量进行统一管理。

其次,我们来看一下Xacro如何进行宏定义。

这里的宏和C语言的宏很像,在转换成URDF文件时编译器会将其展开。其基本语法为:

  
  

我们来看下URDF文件中关于车身和车轮的大小描述。

这里涉及到的参数有:

车身的大小(body_size),车身中心的位置(body_pos)。

车轮半径(wheel_radius)和轮胎宽度(wheel_width),车轮圆心的位置(wheel1_pos, wheel2_pos, wheel3_pos, wheel4_pos)。

相应的在Xacro中定义参数的语法为:

  
  
  
  
  
  
  
  

并且每个轮子和连接的代码也基本相同。

基于上述亮点,我们可以得到以下xacro文件。04_xacro.xacro




  
  
  
  
  
  
  
  

  
    
      
        
          
        
        
        
          
        
      
    

    
      
      
    
  
  
  
  
  

  
    
       
         
       
       
       
         
       
    
  

验证该文件的正确性可以有两种方法。

1. 转换成URDF文件,使用check_urdf

rosrun xacro xacro.py 04_xacro.xacro > 04_xacro.urdf

2. 使用xacrodisplay.launch

roslaunch urdf_tutorial xacrodisplay.launch model:=04_xacro.xacro

我们都会得到和图1一样的小车模型。这下我们就可以用Xacro来构建机器人模型了。

用ROS制作我们的机器人小车(一): URDF简介_第3张图片


你可能感兴趣的:(Robot)