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_camera
为true
,则在 URDF 中添加名为camera_link
的连杆(Link)定义;否则跳过。 -
细节:
-
xacro:if
是条件判断标签,value
接受表达式(如变量、比较运算等)。 -
${has_camera}
是变量引用语法(类似 Shell 脚本中的变量展开)。 -
如果
value
结果为true
、1
或非空字符串,条件成立。
-
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中单引号和双引号之间的嵌套没有特殊要求一定要水嵌套谁,哪个在内,哪个在外都可以,但是不能内外都使用相同的引号类型。