• 详解xacro语法并优化封装urdf


    0 专栏介绍

    本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。

    🚀详情:《ROS从入门到精通》

    1 xacro文件是什么?

    XML 宏语言(XML Macros, Xacro)是可编程的XML文件。在xacro中可以声明变量,可以通过数学运算求解,使用流程控制控制执行顺序,还可以通过类似函数的实现,封装固定的逻辑,将逻辑中需要的可变的数据以参数的方式暴露出去,从而提高代码复用率以及程序的安全性。简言之,xacro为urdf文件提供了封装性,使机器人描述更安全、更精简、更高效

    2 xacro语法详解

    在使用xacro生成urdf时,根标签robot中必须包含命名空间声明:xmlns:xacro="http://wiki.ros.org/xacro",例如:

    <robot name="left_drive_wheel" xmlns:xacro="http://www.ros.org/wiki/xacro">
    
    • 1

    xacro主要为xml提供了封装,相较于一般的编程语言更容易上手,具体如下:

    2.1 属性

    xacro属性采用键值对的方式,封装urdf中的一些常量字段,比如: 小车尺寸、轮子半径等,使数据语义更清晰易懂,语法格式如下

    <xacro:property name="xxxx" value="yyyy" />
    
    • 1

    属性调用格式为

    ${property_name}
    
    • 1

    数值属性也可参与数学运算

    ${f(property_name)}
    
    • 1

    2.2 宏

    xacro宏类似于函数封装,可以提高代码复用率,优化代码结构,语法格式如下

    <xacro:macro name="宏名称" params="参数列表(多参数之间使用空格分隔)">
        .....
        参数调用格式: ${参数名}
    xacro:macro>
    
    • 1
    • 2
    • 3
    • 4

    宏调用格式为

    <xacro:宏名称 参数1=xxx 参数2=xxx/>
    
    • 1

    2.3 模块化

    xacro模块化类似于C++中头文件的含义,提供模块级别的封装。一般机器人由多个组件构成,不同组件就可以封装为单独的xacro文件,最后再将不同的文件集成为完整机器人,语法格式如下

    <robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro">
          <xacro:include filename="y1.xacro" />
          <xacro:include filename="y2.xacro" />
          <xacro:include filename="y3.xacro" />
          ....
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3 案例:差速轮式机器人描述

    实现如下图所示的差速轮式移动机器人,它有两个驱动轮和两个主动轮。接下来用xacro文件进行封装。

    在这里插入图片描述
    最终的目录结构如图所示

    在这里插入图片描述

    3.1 属性

    props文件夹中存放属性配置模块,如颜色、数学常数、几何参数等。

    <robot name="config" xmlns:xacro="http://www.ros.org/wiki/xacro">
        
        <xacro:property name="PI" value="3.141"/>
        
        <xacro:property name="base_footprint_radius" value="0.001" />
        <xacro:property name="base_link_radius" value="0.1" /> 
        <xacro:property name="base_link_length" value="0.08" />
        <xacro:property name="earth_space" value="0.015" />
        
        <xacro:macro name="black">
            <material name="black">
                <color rgba="0 0 0 1"/>
            material>
        xacro:macro>
        <xacro:macro name="yellow">
            <material name="yellow">
                <color rgba="1.0 1.0 0.0 1.0" />
            material>
        xacro:macro>
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.2 底盘

    
    
    <robot name="base" xmlns:xacro="http://www.ros.org/wiki/xacro">
        
        <xacro:include filename="$(find xacro_lab)/urdf/props/config.urdf.xacro" />
    
        <link name="base_footprint">
          <visual>
            <geometry>
              <sphere radius="${base_footprint_radius}" />
            geometry>
          visual>
        link>
    
        <link name="base_link">
          <visual>
            <geometry>
              <cylinder radius="${base_link_radius}" length="${base_link_length}" />
            geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <xacro:yellow />
          visual>
        link>
    
        <joint name="base_link2base_footprint" type="fixed">
          <parent link="base_footprint" />
          <child link="base_link" />
          <origin xyz="0 0 ${earth_space + base_link_length / 2 }" />
        joint>
        
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    3.3 轮子

    限于篇幅只展示驱动轮

    
    
    <robot name="add_drive_wheels" xmlns:xacro="http://www.ros.org/wiki/xacro">
        
        <xacro:include filename="$(find xacro_lab)/urdf/props/config.urdf.xacro" />
        
        <xacro:property name="wheel_radius" value="0.0325" />
        <xacro:property name="wheel_length" value="0.015" />
    
        
        <xacro:macro name="add_drive_wheels" params="name flag">
          <link name="${name}_wheel">
            <visual>
              <geometry>
                <cylinder radius="${wheel_radius}" length="${wheel_length}" />
              geometry>
              <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
              <xacro:black />
            visual>
          link>
    
          <joint name="${name}_wheel2base_link" type="continuous">
            <parent link="base_link" />
            <child link="${name}_wheel" />
            <origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
            <axis xyz="0 1 0" />
          joint>
        xacro:macro>
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    3.4 集成

    将所有模块集成起来,非常简洁

    <robot name="main" xmlns:xacro="http://www.ros.org/wiki/xacro">
        
        <xacro:include filename="$(find xacro_lab)/urdf/base/base.urdf.xacro" />
        
        <xacro:include filename="$(find xacro_lab)/urdf/wheels/add_drive_wheels.urdf.xacro" />
        
        <xacro:include filename="$(find xacro_lab)/urdf/wheels/add_support_wheels.urdf.xacro" />
    
        
        <xacro:add_drive_wheels name="left" flag="1" />
        <xacro:add_drive_wheels name="right" flag="-1" />
    
        <xacro:add_support_wheel name="front" flag="1" />
        <xacro:add_support_wheel name="back" flag="-1" />
    
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    🔥 更多精彩专栏


    👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇
  • 相关阅读:
    九州未来参与编制的《基于C-V2X的智能化网联化融合发展路线图》正式发布!
    Python 模拟Hermite Polynomial厄米特多项式
    PyQt5入门2——添加一个画布并且显示特定的图片
    Ansible中的角色使用
    国内低代码开发平台靠谱的都有哪些?
    别低头,皇冠会掉;别流泪,贱人会笑。
    代码随想录第40天|62.不同路径,63. 不同路径 II
    CMake教程-第 12 步:打包调试和发布
    CentOS 7离线升级OpenSSH至9.1p1操作过程及遇上的问题
    Shiro和Cas的集成
  • 原文地址:https://blog.csdn.net/FRIGIDWINTER/article/details/126274865