參考視頻:【奧特學園】ROS機器人入門課程《ROS理論與實踐》零基礎教程_嗶哩嗶哩_bilibili
參考文檔:http://www.autolabor.com.cn/book/ROSTutorials/
xacro 提供了可編程接口,類似於計算機語言,包括變量聲明調用、函數聲明與調用等語法實現。在使用 xacro 生成 urdf 時,根標簽robot
中必須包含命名空間聲明:xmlns:xacro="http://wiki.ros.org/xacro"
1.屬性與算數運算
用於封裝 URDF 中的一些字段,比如: PAI 值,小車的尺寸,輪子半徑 ....
屬性定義
<xacro:property name="xxxx" value="yyyy" />
屬性調用
${屬性名稱}
算數運算
${數學表達式}
例如:新建一個 demo02_field.urdf.xacro ,編寫如下代碼:
<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro" > <!--1.屬性定義--> <xacro:property name="PI" value="3.1415927" /> <xacro:property name="radius" value="0.03" /> <!--2.屬性調用--> <myUsePropertyXxx name="${PI}" /> <myUsePropertyXxx name="${radius}" /> <!--3.算術運算--> <myUsePropertyYyy result="${PI / 2}" /> <myUsePropertyYyy result="${radius * 2}" /> </robot>
運行:
rosrun xacro xacro demo02_field.urdf.xacro
輸出:
cys@ubuntu:~/demo05_ws/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo02_field.urdf.xacro <?xml version="1.0" ?> <!-- =================================================================================== --> <!-- | This document was autogenerated by xacro from demo02_field.urdf.xacro | --> <!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | --> <!-- =================================================================================== --> <robot name="mycar"> <!--2.屬性調用--> <myUsePropertyXxx name="3.1415927"/> <myUsePropertyXxx name="0.03"/> <!--3.算術運算--> <myUsePropertyYyy result="1.57079635"/> <myUsePropertyYyy result="0.06"/> </robot>
2.宏
類似於函數實現,提高代碼復用率,優化代碼結構,提高安全性
宏定義
<xacro:macro name="宏名稱" params="參數列表(多參數之間使用空格分隔)"> ..... 參數調用格式: ${參數名} </xacro:macro>
宏調用
<xacro:宏名稱 參數1=xxx 參數2=xxx/>
例子:創建求和的宏並調用
<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro" > <!--1.宏的定義--> <xacro:macro name="getSum" params="num1 num2"> <result value="${num1 + num2}" /> </xacro:macro> <!--2.宏調用--> <xacro:getSum num1="1" num2="2" /> </robot>
輸出:
cys@ubuntu:~/demo05_ws/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo03_macro.urdf.xacro <?xml version="1.0" ?> <!-- =================================================================================== --> <!-- | This document was autogenerated by xacro from demo03_macro.urdf.xacro | --> <!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | --> <!-- =================================================================================== --> <robot name="mycar"> <result value="3"/> </robot>
3.文件包含
機器人由多部件組成,不同部件可能封裝為單獨的 xacro 文件,最后再將不同的文件集成,組合為完整機器人,可以使用文件包含實現
文件包含
<robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro"> <xacro:include filename="my_base.xacro" /> <xacro:include filename="my_camera.xacro" /> <xacro:include filename="my_laser.xacro" /> .... </robot>
例子:包含上述兩個例子的xacro
<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro" > <!--1.演示文檔包含--> <xacro:include filename="demo02_field.urdf.xacro" /> <xacro:include filename="demo03_macro.urdf.xacro" /> </robot>
運行輸出:
cys@ubuntu:~/demo05_ws/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo04_sum.urdf.xacro <?xml version="1.0" ?> <!-- =================================================================================== --> <!-- | This document was autogenerated by xacro from demo04_sum.urdf.xacro | --> <!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | --> <!-- =================================================================================== --> <robot name="mycar"> <!--2.屬性調用--> <myUsePropertyXxx name="3.1415927"/> <myUsePropertyXxx name="0.03"/> <!--3.算術運算--> <myUsePropertyYyy result="1.57079635"/> <myUsePropertyYyy result="0.06"/> <result value="3"/> </robot>