一、URDF 和 XACRO 核心区别1. URDFURDFUnified Robot Description Format是原生机器人描述XML格式ROS/ROS2原生支持。✅特点标准格式rviz2、nav2、robot_state_publisher直接解析❌缺点不支持变量、循环、数学计算重复代码极多多个相同关节、连杆要复制粘贴尺寸、角度硬编码修改维护麻烦例子痛点机器人4个轮子URDF要重复写4遍轮子linkjoint。2. XACROXACRO XML Macro宏不是新格式是URDF预处理器工作流程xxx.xacro→ 命令预处理 → 生成标准xxx.urdf✅新增能力定义变量${变量}数学运算${0.3 / 2}宏函数重复组件封装条件判断、文件包含方便批量复用结构一句话总结URDF最终被系统读取的成品文件XACRO方便人编写的“模板源码”编译生成URDF。ROS2工程几乎不会手写纯URDF全部使用xacro开发。二、XACRO 基础语法 完整最简示例0. 前置依赖ROS2sudo apt install ros-foxy-xacro1. 基础标签xacro:property→ 定义变量${表达式}→ 调用变量/计算xacro:macro→ 封装重复模块xacro:include filename/→ 引入其他xacro文件拆分底盘、机械臂、传感器2. 最小可运行 demorobot.urdf.xacro?xml version1.0? robot namemy_robot xmlns:xacroshturl.cc/lyYlxgMGWQxYKgx !-- 1. 定义变量 -- xacro:property namebase_width value0.4/ xacro:property namewheel_radius value0.1/ xacro:property namewheel_separation value${base_width - 0.1}/ !-- 2. 宏封装单个轮子重复组件 -- xacro:macro namewheel paramsname x_pos y_pos link name${name}_wheel_link visual origin xyz0 0 0/ geometry cylinder radius${wheel_radius} length0.05/ /geometry /visual /link joint name${name}_wheel_joint typerevolute parent linkbase_link/ child link${name}_wheel_link/ origin xyz${x_pos} ${y_pos} 0/ axis xyz0 1 0/ /joint /xacro:macro !-- 底盘本体 -- link namebase_link visual geometry box size${base_width} 0.6 0.1/ /geometry /visual /link !-- 调用宏生成4个轮子不用重复复制代码 -- xacro:wheel nameleft_front x_pos0.2 y_pos${wheel_separation/2}/ xacro:wheel nameright_front x_pos0.2 y_pos${-wheel_separation/2}/ xacro:wheel nameleft_rear x_pos-0.2 y_pos${wheel_separation/2}/ xacro:wheel nameright_rear x_pos-0.2 y_pos${-wheel_separation/2}/ /robot三、常用操作命令1. 手动把xacro转换成urdf调试用# ROS2通用命令 xacro robot.urdf.xacro robot.urdf2. 在launch文件加载工程标准写法不需要手动生成urdflaunch.py 中直接加载xacrolaunch系统内部自动实时解析from launch_ros.actions import Node from launch.substitutions import Command, FindPackageShare from launch.launch_description_sources import PythonLaunchDescriptionSource from launch import LaunchDescription def generate_launch_description(): robot_desc Command([ xacro , FindPackageShare(robot_pkg), /urdf/robot.urdf.xacro ]) robot_state_publisher Node( packagerobot_state_publisher, executablerobot_state_publisher, parameters[{robot_description: robot_desc}] ) return LaunchDescription([robot_state_publisher])⚠️重点正式项目不要预先导出urdf文件提交代码直接加载xacro四、高频实用技巧传参给xacrolaunch动态修改尺寸robot_desc Command([ xacro , FindPackageShare(robot_pkg),/urdf/robot.urdf.xacro , wheel_radius:0.12 #运行时覆盖xacro内部变量 ])文件拆分底盘.xacro、雷达.xacro、机械臂.xacro通过xacro:include组合结构清晰数学运算支持 - * / sin() cos()五、容易踩坑根标签必须加上命名空间xmlns:xacroshturl.cc/lyYlxgMGWQxYKgx否则宏失效文件后缀规范统一命名xxx.urdf.xacrourdf不能识别xacro标签所以rviz只能接收解析完成后的robot_description文本六、最简对比表项目URDFXACRO本质最终机器人描述文件预处理器模板变量不支持支持property变量、数学计算复用只能复制粘贴macro宏封装组件launch加载直接加载launch内部调用xacro命令解析使用场景几乎仅自动生成产物日常开发编写首选?xml version1.0? !-- 机器人总名称mbot声明xacro宏命名空间启用变量、宏功能 -- robot namembot xmlns:xacroshturl.cc/eRuIlo4q9KNwl4yGQGN !-- 全局参数定义区 -- !-- 圆周率常量用于角度换算 -- xacro:property nameM_PI value3.1415926/ !-- 底盘圆柱半径 -- xacro:property namebase_radius value0.20/ !-- 底盘圆柱高度长度 -- xacro:property namebase_length value0.16/ !-- 驱动轮参数 -- xacro:property namewheel_radius value0.06/ !-- 驱动轮半径 -- xacro:property namewheel_length value0.025/ !-- 驱动轮厚度圆柱长度 -- xacro:property namewheel_joint_y value0.19/ !-- 轮子Y方向安装偏移 -- xacro:property namewheel_joint_z value0.05/ !-- 轮子Z方向安装偏移 -- !-- 万向随动轮脚轮参数 -- xacro:property namecaster_radius value0.015/ !-- 万向轮半径 -- xacro:property namecaster_joint_x value0.18/ !-- 万向轮X方向安装偏移 -- !-- 材质定义 -- !-- 定义颜色材质后面link可以直接引用name -- material nameyellow color rgba1 0.4 0 1/ /material material nameblack color rgba0 0 0 0.95/ /material material namegray color rgba0.75 0.75 0.75 1/ /material !-- 宏驱动轮模板 -- !-- xacro:macro宏定义封装重复结构 params入参列表 prefix轮子名称前缀 left / right reflect镜像系数 1 / -1实现左右对称安装 -- xacro:macro namewheel paramsprefix reflect !-- 驱动轮旋转关节 continuous无限连续旋转差分驱动轮子标准类型 -- joint name${prefix}_wheel_joint typecontinuous !-- reflect乘以坐标左侧正数、右侧负数实现左右对称 -- origin xyz0 ${reflect*wheel_joint_y} ${-wheel_joint_z} rpy0 0 0/ parent linkbase_link/ !-- 父连杆机器人底盘 -- child link${prefix}_wheel_link/ !-- 子连杆轮子本体 -- axis xyz0 1 0/ !-- 旋转轴沿着Y轴转动 -- /joint !-- 轮子实体连杆 -- link name${prefix}_wheel_link visual !-- rpy${M_PI/2} 0 0 将圆柱横放圆柱默认轴向Z旋转90度对齐车轮 -- origin xyz0 0 0 rpy${M_PI/2} 0 0 / geometry cylinder radius${wheel_radius} length ${wheel_length}/ /geometry material namegray / /visual /link /xacro:macro !-- 宏万向脚轮模板 -- xacro:macro namecaster paramsprefix reflect joint name${prefix}_caster_joint typecontinuous !-- reflect控制前后万向轮X方向正负位置 -- origin xyz${reflect*caster_joint_x} 0 ${-(base_length/2 caster_radius)} rpy0 0 0/ parent linkbase_link/ child link${prefix}_caster_link/ axis xyz0 1 0/ !-- 万向轮可以水平自由旋转 -- /joint link name${prefix}_caster_link visual origin xyz0 0 0 rpy0 0 0/ geometry sphere radius${caster_radius} / !-- 球形万向轮 -- /geometry material nameblack / /visual /link /xacro:macro !-- 机器人底盘主体根连杆 base_link -- link namebase_link visual origin xyz 0 0 0 rpy0 0 0 / geometry cylinder length${base_length} radius${base_radius}/ /geometry material nameyellow / /visual /link !-- 实例化宏生成左右驱动轮 -- xacro:wheel prefixleft reflect1/ xacro:wheel prefixright reflect-1/ !-- 实例化宏前后万向随动轮 -- xacro:caster prefixfront reflect-1/ xacro:caster prefixback reflect1/ /robot补充重点理解对应这份小车模型底盘结构差分驱动小车左右2个动力驱动轮前方、后方各一个万向脚轮仅支撑无动力reflect镜像技巧xacro非常经典用法传1和-1坐标自动正负翻转不用写两套几乎一样的左右轮子代码。joint类型continuous和revolute(有限角度旋转)区分车轮需要无限旋转必须用continuous。${M_PI/2}圆柱默认沿着Z轴延伸旋转90°让圆柱体横向摆放符合车轮形态。