ROS学习--第12篇:ROS机器人建模与仿真---使用xacro简化URDF文件

使用Xacro包来简化URDF。它做了三件非常有用的事情:

  • 常量   

  • 简单数学   

在本教程中,我们将查看所有这些快捷方式,以帮助减小URDF文件的总体大小,并使其更易于读取和维护。


使用 Xacro

顾名思义,xacro是一种宏语言(macro language)。

xacro程序(xacro program)运行所有宏并输出结果。

典型用法如下:

xacro --inorder model.xacro > model.urdf 

我们可以在启动文件中自动生成URDF

生成确实需要一些时间,因此请注意启动文件可能需要更长的时间。

如:

<param name="robot_description"
  command="xacro --inorder '$(find pr2_description)/robots/pr2.urdf.xacro'" />

由于在rviz和Gazebo中使用xacro文件,需要将它转换成urdf文件,但是这里在启动文件中自动生成URDF,所以我们直接运行一下指令即可在rviz中查看模型:

roslaunch urdf_tutorial display.launch model:='$(find urdf_tutorial)/urdf/08-macroed.urdf.xacro

在urdf文件中,必须指定一个名称空间,以便文件能够正确的解析。

例如,这是有效xacro文件的前两行:

打开 08-macroed.urdf.xacro 前两行:

<?xml version="1.0"?>
<robot name="macroed" xmlns:xacro="http://ros.org/wiki/xacro">

1.常量(Constants)

打开 07-physics.urdf 文件,我们看一下 base_link 的描述:

这里的信息有点多余。我们将圆柱体的长度和半径指定了两次。

更糟糕的是,如果我们想改变这一点,我们需要在两个不同的地方这样做。
幸运的是,xacro允许您指定用作常量的属性:

<link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
      <material name="blue"/>
    </visual>
    <collision>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="10"/>
      <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
    </inertial>
  </link>

等价与:

<xacro:property name="width" value="0.2" />
<xacro:property name="bodylen" value="0.6" />
<link name="base_link">
    <visual>
        <geometry>
            <cylinder radius="${width}" length="${bodylen}"/>
        </geometry>
        <material name="blue"/>
    </visual>
    <collision>
        <geometry>
            <cylinder radius="${width}" length="${bodylen}"/>
        </geometry>
    </collision>
</link>
  • 这两个值在前两行中指定。它们可以在任何级别、使用之前或之后的任何位置(假设为有效的XML)定义。通常是在顶部。

  • 我们没有在几何元素中指定实际的半径,而是使用 美元符号 $ 和 {} 大括号 来表示该值。


再比如:

<xacro:property name=”robotname” value=”marvin” />
<link name=”${robotname}s_leg” />

等价与:

<link name=”marvins_leg” />

2.数学方法(Math)

在 ${} 构造中可以使用 四则运算(+ 、- 、* 、/)、一元负号、园括号 构建任意复杂的表达式。如:

<cylinder radius="${wheeldiam/2}" length="0.1"/>
<origin xyz="${reflect*(width+.02)} 0 0.25" />

所有的数学运算都是用浮点数完成的,因此:

<link name="${5/6}"/>

等价与:

<link name="0.833333333333"/>

3.宏指令(Macros)

宏指令是Xacro包中最大也是最有用的组件。

打开 08-macroed.urdf.xacro:

 <xacro:macro name="default_inertial" params="mass">
        <inertial>
                <mass value="${mass}" />
                <inertia ixx="1.0" ixy="0.0" ixz="0.0"
                     iyy="1.0" iyz="0.0"
                     izz="1.0" />
        </inertial>
 </xacro:macro>

在代码中可以直接使用上面定义的宏,这里 mass作为参数,对 inertial 进行初始化:

<xacro:default_inertial mass="10"/>

也可以使用整个块作为参数

注意:要指定块参数,请在其参数名称之前包含星号

<xacro:macro name="blue_shape" params="name *shape">
    <link name="${name}">
        <visual>
            <geometry>
                <xacro:insert_block name="shape" />
            </geometry>
            <material name="blue"/>
        </visual>
        <collision>
            <geometry>
                <xacro:insert_block name="shape" />
            </geometry>
        </collision>
    </link>
</xacro:macro>

<xacro:blue_shape name="base_link">
    <cylinder radius=".42" length=".01" />
</xacro:blue_shape>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值