ros2--xacro

什么是xacro

在ROS 2中,Xacro(XML Macros)是一种基于XML的宏语言,专门用于简化URDF(Unified Robot Description Format)文件的编写。它通过宏定义、变量替换和代码复用等功能,让机器人模型的描述更模块化、更易维护。

Xacro与URDF的关系

  • URDF:原生XML格式,描述机器人模型(连杆、关节、传感器等),但冗长且难以复用。

  • Xacro:URDF的增强版,在预处理阶段会被展开为纯URDF,最终被ROS 2节点(如robot_state_publisher)使用。

为什么用Xacro

  • 减少代码量:宏和变量避免重复定义(如多个相同的轮子)。

  • 参数化设计:通过变量快速调整机器人尺寸(如轮径、臂长)。

  • 模块化开发:将机器人部件拆分为独立文件(如底盘、机械臂)。

  • 动态配置:结合条件语句实现不同硬件配置(如是否安装摄像头)。

xacro语法

1,常量定义

<xacro:property name="PI" value="3.14159"/>
<xacro:property name="wheel_mass" value="2.0"/>
<mass value="${wheel_mass}"/>
<inertia ixx="${wheel_mass * 0.1}" ixy="0" ixz="0"/>

转换为urdf:
 

ros2 run xacro xacro test.xacro -o test.urdf
<?xml version="1.0" ?>
<!-- =================================================================================== -->
<!-- |    This document was autogenerated by xacro from test.xacro                     | -->
<!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
<!-- =================================================================================== -->
<robot name="test_bot">
  <mass value="2.0"/>
  <inertia ixx="0.2" ixy="0" ixz="0"/>
</robot>

2,宏定义

<!-- 定义宏 -->
<xacro:macro name="wheel" params="prefix x_pos">
  <link name="${prefix}_wheel">
    <visual><geometry><sphere radius="0.1"/></geometry></visual>
  </link>
  <joint name="${prefix}_joint" type="fixed">
    <parent link="base_link"/>
    <child link="${prefix}_wheel"/>
    <origin xyz="${x_pos} 0 0"/>
  </joint>
</xacro:macro>

<!-- 调用宏-->
<xacro:wheel prefix="left" x_pos="0.2"/>
<xacro:wheel prefix="right" x_pos="-0.2"/>

xacro展开为urdf文件:

<?xml version="1.0" ?>
<!-- =================================================================================== -->
<!-- |    This document was autogenerated by xacro from test.xacro                     | -->
<!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
<!-- =================================================================================== -->
<robot name="test_bot">
  <link name="left_wheel_link">
    <visual>
      <geometry>
        <sphere radius="0.05"/>
      </geometry>
    </visual>
  </link>
  <joint name="left_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel_link"/>
    <origin xyz="0.18 0 0"/>
  </joint>
  <link name="right_wheel_link">
    <visual>
      <geometry>
        <sphere radius="0.05"/>
      </geometry>
    </visual>
  </link>
  <joint name="right_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="right_wheel_link"/>
    <origin xyz="-0.18 0 0"/>
  </joint>
</robot>

3,数值计算

<xacro:property name="PI" value="3.14159"/>
<xacro:property name="wheel_mass" value="2.0"/>
<mass value="${wheel_mass}"/>
<inertia ixx="${wheel_mass * 0.1}" ixy="0" ixz="0"/>

${}中可以运用的计算符号

1. 基础数学运算
运算符描述示例输出结果
+加法${1 + 2}3
-减法/负号${5 - 3}, ${-1}2, -1
*乘法${2 * 3}6
/除法${10 / 2}5
^幂运算${2 ^ 3}8
%取模${10 % 3}1

2. 比较运算符
运算符描述示例输出结果
==等于${radius == 0.1}true/false
!=不等于${type != 'fixed'}true/false
>大于${length > 0.5}true/false
<小于${mass < 10}true/false
>=大于等于${value >= 100}true/false
<=小于等于${angle <= 3.14}true/false

3. 逻辑运算符
运算符描述示例输出结果
and逻辑与${a > 0 and b < 0}true/false
or逻辑或${is_ready or force_execute}true/false
not逻辑非${not is_fixed}true/false
in包含于列表${joint_type in ['revolute', 'prismatic']}true/false

4. 三元条件运算
语法描述示例输出结果
${条件 ? 真值 : 假值}条件成立返回真值${is_round ? radius : length/2}动态值

5. 字符串操作
操作示例输出结果
字符串拼接${'prefix_' + name}prefix_wheel
字符串包含${'cam' in camera_name}true/false

6. 数学函数

Xacro支持部分数学函数(通过math模块):

函数描述示例输出结果
sin(x)正弦${sin(angle)}浮点数
cos(x)余弦${cos(angle)}浮点数
tan(x)正切${tan(angle)}浮点数
sqrt(x)平方根${sqrt(area)}浮点数
piπ值${pi}3.14159...

很多符号没有用过,代验证修改。

4,条件判断

xacro:if

<xacro:property name="has_camera" value="true"/>
<xacro:if value="${has_camera}">
  <link name="camera_link">...</link>
</xacro:if>
  • 作用:如果 has_cameratrue,则在 URDF 中添加名为 camera_link 的连杆(Link)定义;否则跳过。

  • 细节

    • xacro:if 是条件判断标签,value 接受表达式(如变量、比较运算等)。

    • ${has_camera} 是变量引用语法(类似 Shell 脚本中的变量展开)。

    • 如果 value 结果为 true1 或非空字符串,条件成立。

xacro:unless

等同与 if not。

<xacro:macro name="wheel" params="prefix radius type x_pos">
    <link name="${prefix}_wheel_link">
        <visual>
            <geometry>
                <sphere radius="${radius}"/>
            </geometry>
        </visual>
    </link>

    <joint name="${prefix}_wheel_joint" type="${type}">
        <parent link="base_link"/>
        <child link="${prefix}_wheel_link"/>
        <origin xyz="${x_pos} 0 0"/>
        <!-- 仅当 type 不是 'fixed' 时添加 axis -->
        <xacro:unless value="${type == 'fixed'}">
            <axis xyz="0.0 1.0 0.0"/>
        </xacro:unless>
    </joint>
</xacro:macro>

5,文件包含

URDF文件太长,可以分为多个urdf文件,通过include进来到xacro文件中。

<xacro:include filename="$(find-pkg-share test_urdf)/urdf/sensors/camera.xacro"/>
<!--或者-->
<xacro:include filename="$(find test_urdf)/urdf/sensors/camera.xacro"/>

注意:被include进来的文件,只会包含子文件的<robot>中的内容,xml声明和<robot>标签不会被包含。

xacro展开为urdf文件

ros2 run xacro xacro robot.xacro -o robot.urdf

xacro编程

1,xacro文件存放目录

urdf目录。

2,xacro命名空间

xacro本质是嗯就是urdf的简化版本,所以也需要xml声明和robot根标签,只是根标签中多了xacro命名空间:

<?xml version="1.0"?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!--这个链接是xacro的ros wiki链接-->

在Xacro文件的开头声明 xmlns:xacro="http://www.ros.org/wiki/xacro" 是XML命名空间的定义,它的核心作用是为Xacro宏语言提供语法标识和解析规则。以下是详细解释:


基本作用

  • 命名空间声明
    这行代码告诉XML解析器,文件中所有以 xacro: 为前缀的标签(如 <xacro:macro><xacro:include>)都属于Xacro宏语言的定义范畴,而非普通XML标签。

  • 类比其他语言
    类似于Python中的 import 或C++中的 namespace,用于区分不同来源的语法规则。

3,xml中的""和''的嵌套要求

xml中单引号和双引号之间的嵌套没有特殊要求一定要水嵌套谁,哪个在内,哪个在外都可以,但是不能内外都使用相同的引号类型。

xacro的配置

setup.py配置安装

(os.path.join("share",package_name,"urdf"),glob(os.path.join("urdf","*.xacro"))),

launch加载到节点中

同加载urdf文件一样:

urdf文件的加载:

    mbot_urdf_file="mbot_base.urdf"
    
    pkg_share_path=FindPackageShare(package=package_name).find(package_name)
    urdf_model_path=os.path.join(pkg_share_path,"urdf",mbot_urdf_file)

    robot_description=ParameterValue(
        Command(["xacro ",urdf_model_path]),
        value_type=str
    )

    joint_state_publisher_gui_node=Node(
        package="joint_state_publisher_gui",
        executable="joint_state_publisher_gui",
        name="joint_state_publisher_gui",
        # arguments=[urdf_model_path]
        parameters=[{"robot_description":robot_description}]
    )

    # 3,启动robot_state_publisher;
    robot_state_publisher_node=Node(
        package="robot_state_publisher",
        executable="robot_state_publisher",
        name="robot_state_publisher",
        # arguments=[urdf_model_path]
        parameters=[{"robot_description":robot_description}]
    )

xacro文件的加载:

    mbot_urdf_file="mbot_base.urdf"
    mbot_xacro_file="mbot_base_xacro.xacro"
    
    pkg_share_path=FindPackageShare(package=package_name).find(package_name)
    urdf_model_path=os.path.join(pkg_share_path,"urdf",mbot_xacro_file) #只需要改变这个地方查询的文件名即可

    robot_description=ParameterValue(
        Command(["xacro ",urdf_model_path]),
        value_type=str
    )

    joint_state_publisher_gui_node=Node(
        package="joint_state_publisher_gui",
        executable="joint_state_publisher_gui",
        name="joint_state_publisher_gui",
        # arguments=[urdf_model_path]
        parameters=[{"robot_description":robot_description}]
    )

    # 3,启动robot_state_publisher;
    robot_state_publisher_node=Node(
        package="robot_state_publisher",
        executable="robot_state_publisher",
        name="robot_state_publisher",
        # arguments=[urdf_model_path]
        parameters=[{"robot_description":robot_description}]
    )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值