目录
简介
Xacro_快速体验
Xacro文件编写
具体框架 理解
Xacro文件转换成 urdf 文件
Xacro_语法详解
命名空间声明
属性与算数运算
属性定义
宏
宏定义
宏调用
文件包含
Xacro_完整使用流程示例
编写 Xacro 文件
集成launch文件
方式1:
方式2
Xacro_实操
实现流程:
摄像头和雷达 Xacro 文件实现
摄像头
雷达 xacro 文件:
组合底盘摄像头与雷达的 xacro 文件
launch 文件
运行
前面 URDF 文件构建机器人模型的过程中,存在若干问题。
问题1:在设计关节的位置时,需要按照一定的公式计算,公式是固定的,但是在 URDF 中依赖于人工计算,存在不便,容易计算失误,且当某些参数发生改变时,还需要重新计算。
问题2:URDF 中的部分内容是高度重复的,驱动轮与支撑轮的设计实现,不同轮子只是部分参数不同,形状、颜色、翻转量都是一致的,在实际应用中,构建复杂的机器人模型时,更是易于出现高度重复的设计,按照一般的编程涉及到重复代码应该考虑封装。
......
如果在编程语言中,可以通过变量结合函数直接解决上述问题,在 ROS 中,已经给出了类似编程的优化方案,称之为:Xacro
概念
Xacro 是 XML Macros 的缩写,Xacro 是一种 XML 宏语言,是可编程的 XML。
原理
Xacro 可以声明变量,可以通过数学运算求解,使用流程控制控制执行顺序,还可以通过类似函数的实现,封装固定的逻辑,将逻辑中需要的可变的数据以参数的方式暴露出去,从而提高代码复用率以及程序的安全性。
作用
较之于纯粹的 URDF 实现,可以编写更安全、精简、易读性更强的机器人模型文件,且可以提高编写效率。
另请参考:
目的:简单了解 xacro 的基本语法。
需求描述:
使用xacro优化上一节案例中驱动轮实现,需要使用变量封装底盘的半径、高度,使用数学公式动态计算底盘的关节点坐标,
使用 Xacro 宏封装轮子重复的代码并调用宏创建两个轮子(注意: 在此,演示 Xacro 的基本使用,不必要生成合法的 URDF )。
新建文件
编写 Xacro 文件,以变量的方式封装属性(常量半径、高度、车轮半径...),以函数的方式封装重复实现(车轮的添加)。
复制以下代码
上节案例问题:
1.代码复用== Xacro宏(函数)
这是左右两个轮子共用的参数
2.参数设计== Xacro变量
3.调用语法
所以实际上就是只写一个轮子的函数并且封装
然后调用两次传入对应不同的参数
就是左右两个轮子了
宏的理解
命令行进入 xacro文件 所属目录,执行:rosrun xacro xacro xxx.xacro > xxx.urdf
会将 xacro 文件解析为 urdf 文件
或是用
rosrun xacro xacro demo01_helloworld.urdf.xacro >demo01_helloworld.urdf
生成对应urdf文件
xacro 提供了可编程接口,类似于计算机语言,包括变量声明调用、函数声明与调用等语法实现。
在使用 xacro 生成 urdf 时,
不声明的话无法运行
根标签robot
中必须包含命名空间声明:xmlns:xacro="http://wiki.ros.org/xacro"
用于封装 URDF 中的一些字段,比如: PAI 值,小车的尺寸,轮子半径 ....
不调用属性的话是不显示结果的
属性调用
${属性名称}
调用完就可以显示对应结果
算数运算
${数学表达式}
类似于函数实现,提高代码复用率,优化代码结构,提高安全性
.....
参数调用格式: ${参数名}
宏定义是不显示的
只输出了根标签和调用输出部分
机器人由多部件组成,不同部件可能封装为单独的 xacro 文件,最后再将不同的文件集成,组合为完整机器人,可以使用文件包含实现
文件包含
....
运行
需求描述:
使用 Xacro 优化 URDF 版的小车底盘模型实现
实际上就是搭建框架
在框架前封装属性
对比:
直接写urdf要写两个轮子
xcaro就写一个轮子的框架(调用两次即可)
轮子的框架就是函数的具体内容
然后分成全局变量和局部变量(底盘相关的就是全局、轮子相关的就是局部)
先将 xacro 文件转换出 urdf 文件,然后集成
先将 xacro 文件解析成 urdf 文件:rosrun xacro xacro xxx.xacro > xxx.urdf
然后再按照之前的集成方式直接整合 launch 文件,内容示例:
1.在参数服务器中载入urdf
2.启动rviz
3.添加关节状态发布节点
4.添加机器人状态发布节点
5.关节运动控制节点
转换文件
运行
在 launch 文件中直接加载 xacro(建议使用)
运行
成功
需求描述:
在前面小车底盘基础之上,添加摄像头和雷达传感器。
实现分析:
机器人模型由多部件组成,可以将不同组件设置进单独文件,最终通过文件包含实现组件的拼装。
首先编写摄像头和雷达的 xacro 文件
然后再编写一个组合文件,组合底盘、摄像头与雷达
最后,通过 launch 文件启动 Rviz 并显示模型
新建文件
复制以下代码
因为只要一个摄像头无需复用,所以不需要调用宏
一个雷达和一个支架所以无需复用
所以不用宏