当前位置: 首页 > news >正文

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


http://www.mrgr.cn/news/96623.html

相关文章:

  • Python-八股总结
  • 【群智能算法改进】一种改进的蜣螂优化算法IDBO[3](立方混沌映射Cubic、融合鱼鹰勘探策略、混合高斯柯西变异)【Matlab代码#92】
  • 【MVC简介-产生原因、演变历史、核心思想、组成部分、使用场景】
  • 【Pandas】pandas Series to_markdown
  • 六种光耦综合对比——《器件手册--光耦》
  • 十五届蓝桥杯省赛Java B组(持续更新..)
  • ISIS【路由协议讲解】-通俗易懂!
  • 汇编学习之《数据传输指令》
  • Sentinel[超详细讲解]-1
  • JAVASE(十二)常用类(一)Object类
  • HTML实现图片上添加水印的工具
  • 使用大语言模型进行Python图表可视化
  • 高级java每日一道面试题-2025年3月20日-虚拟化操作系统篇[Docker篇]-如何控制docker容器的启动顺序?
  • 网络攻防快速入门笔记pwn|01 Pwn栈溢出基础
  • 戴尔电脑安装Ubuntu双系统
  • Adobe Lightroom 2025安装下载和激活指南
  • leetcode 169.Majority Element
  • Vue3中的Icon处理方案(包括将svg转化为Icon)
  • 一个极简的词法分析器实现
  • Java-01-源码篇-JUC并发编程-原子类