_check that: - your xml">
当前位置:   article > 正文

0基础在ROS系统中实现RRT算法(二)xacro语法以及完整使用_check that: - your xml is well-formed - you have t

check that: - your xml is well-formed - you have the xacro xmlns declaration

时隔半个月继续整毕设的ROS部分,中间在做路径规划算法matlab仿真的部分。不知道还能不能毕业。

我接下来的笔记多来源于:

Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

这位老师讲解的非常棒。我的笔记增加的内容主要是视频中一些具体示例的操作和代码,以及一些报错的解决,还有视频中提到,但教程中没有写出来的知识。原创是不可能原创的。

URDF文件的缺点:

1.URDF依赖人工计算,参数改变需要重新计算。

2.URDF代码存在高度重复,没有考虑封装。

Xacro的优势:

1.能实现代码复用。

2.Xacro变量方便参数设计。

一、建立Xacro文件并且转换成URDF文件

首先演示一下如何将Xacro文件转换成urdf文件。

首先,在/DEMO05_WS/src/urdf01_rviz/urdf/xacro目录下建立Xacro文件,文件名为demo01_helloworld.urdf.xacro,内容如下:

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 属性封装 -->
  3. <xacro:property name="wheel_radius" value="0.0325" />
  4. <xacro:property name="wheel_length" value="0.0015" />
  5. <xacro:property name="PI" value="3.1415927" />
  6. <xacro:property name="base_link_length" value="0.08" />
  7. <xacro:property name="lidi_space" value="0.015" />
  8. <!-- 宏 -->
  9. <xacro:macro name="wheel_func" params="wheel_name flag" >
  10. <link name="${wheel_name}_wheel">
  11. <visual>
  12. <geometry>
  13. <cylinder radius="${wheel_radius}" length="${wheel_length}" />
  14. </geometry>
  15. <origin xyz="0 0 0" rpy="${PI / 2} 0 0" />
  16. <material name="wheel_color">
  17. <color rgba="0 0 0 0.3" />
  18. </material>
  19. </visual>
  20. </link>
  21. <!-- 3-2.joint -->
  22. <joint name="${wheel_name}2link" type="continuous">
  23. <parent link="base_link" />
  24. <child link="${wheel_name}_wheel" />
  25. <!--
  26. x 无偏移
  27. y 车体半径
  28. z z= 车体高度 / 2 + 离地间距 - 车轮半径
  29. -->
  30. <origin xyz="0 ${0.1 * flag} ${(base_link_length / 2 + lidi_space - wheel_radius) * -1}" rpy="0 0 0" />
  31. <axis xyz="0 1 0" />
  32. </joint>
  33. </xacro:macro>
  34. <xacro:wheel_func wheel_name="left" flag="1" />
  35. <xacro:wheel_func wheel_name="right" flag="-1" />
  36. </robot>

将Xacro文件转换成URDF文件:命令行进入 xacro文件 所属目录,执行:rosrun xacro xacro xxx.xacro > xxx.urdf

milk@milk:~/DEMO05_WS/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo01_helloworld.urdf.xacro >demo01_helloworld.urdf

执行以上操作后,xacro 文件解析为 名为demo01_helloworld.urdf的urdf 文件,内容如下:

  1. <?xml version="1.0" ?>
  2. <!-- =================================================================================== -->
  3. <!-- | This document was autogenerated by xacro from test.xacro | -->
  4. <!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | -->
  5. <!-- =================================================================================== -->
  6. <robot name="mycar">
  7. <link name="left_wheel">
  8. <visual>
  9. <geometry>
  10. <cylinder length="0.0015" radius="0.0325"/>
  11. </geometry>
  12. <origin rpy="1.57079635 0 0" xyz="0 0 0"/>
  13. <material name="wheel_color">
  14. <color rgba="0 0 0 0.3"/>
  15. </material>
  16. </visual>
  17. </link>
  18. <!-- 3-2.joint -->
  19. <joint name="left2link" type="continuous">
  20. <parent link="base_link"/>
  21. <child link="left_wheel"/>
  22. <!--
  23. x 无偏移
  24. y 车体半径
  25. z z= 车体高度 / 2 + 离地间距 - 车轮半径
  26. -->
  27. <origin rpy="0 0 0" xyz="0 0.1 -0.0225"/>
  28. <axis xyz="0 1 0"/>
  29. </joint>
  30. <link name="right_wheel">
  31. <visual>
  32. <geometry>
  33. <cylinder length="0.0015" radius="0.0325"/>
  34. </geometry>
  35. <origin rpy="1.57079635 0 0" xyz="0 0 0"/>
  36. <material name="wheel_color">
  37. <color rgba="0 0 0 0.3"/>
  38. </material>
  39. </visual>
  40. </link>
  41. <!-- 3-2.joint -->
  42. <joint name="right2link" type="continuous">
  43. <parent link="base_link"/>
  44. <child link="right_wheel"/>
  45. <!--
  46. x 无偏移
  47. y 车体半径
  48. z z= 车体高度 / 2 + 离地间距 - 车轮半径
  49. -->
  50. <origin rpy="0 0 0" xyz="0 -0.1 -0.0225"/>
  51. <axis xyz="0 1 0"/>
  52. </joint>
  53. </robot>

PS:在执行以上操作之前,先在另一个新终端输入roscore

二、Xacro语法

这里学习如何封装变量并使用算术运算,以及Xacro语法中的文件包含

1.属性与算数运算

属性用于封装 URDF 中的一些字段,比如: PAI 值,小车的尺寸,轮子半径 ....

举例:在/DEMO05_WS/src/urdf01_rviz/urdf/xacro目录下新建:demo02_field.urdf.xacro

在这个文件里进行属性定义、属性调用、算术运算

(1)属性定义

  1. <robot name = "maycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 1.属性定义-->
  3. <xacro:property name = "PI" value = "3.1415927">
  4. <xacro:property name = "radius" value = "0.03">
  5. <!-- 2.属性调用 -->
  6. <!-- 3.算术运算 -->
  7. </robot>

定义pai :          属性名称:PI ;属性值:3.1415927

定义车轮半径:           属性名称:radius; 属性值:0.03

(2)属性调用

调用方式:

${属性名称}

示例:自定义标签 myUsePropertyxxx ,调用PI和radius

  1. <robot name = "maycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 1.属性定义-->
  3. <xacro:property name = "PI" value = "3.1415927" />
  4. <xacro:property name = "radius" value = "0.03" />
  5. <!-- 2.属性调用 -->
  6. <myUsePropertyxxx name="${PI}" />
  7. <myUsePropertyxxx name="${radius}" />
  8. <!-- 3.算术运算 -->
  9. </robot>

执行一下当前文件以输出结果:

milk@milk:~/DEMO05_WS/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo02_field.urdf.xacro

输出结果:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- =================================================================================== -->
  3. <!-- | This document was autogenerated by xacro from demo02_field.urdf.xacro | -->
  4. <!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | -->
  5. <!-- =================================================================================== -->
  6. <robot name="mycar">
  7. <!-- 2.属性调用 -->
  8. <myUsePropertyxxx name="3.1415927"/>
  9. <myUsePropertyxxx name="0.03"/>
  10. <!-- 3.算术运算 -->
  11. </robot>

在这一步我出现了一个运行错误:

  1. milk@milk:~/DEMO05_WS/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo02_field.urdf.xacro
  2. XML parsing error: no element found: line 1, column 0
  3. when processing file: demo02_field.urdf.xacro
  4. Check that:
  5. - Your XML is well-formed
  6. - You have the xacro xmlns declaration: xmlns:xacro="http://www.ros.org/wiki/xacro"

原来在执行rosrun之前,要先把这个文件保存一下……

(3)算术运算

对刚才定义的参数进行加减乘除取余等算术运算操作,实现方式:

${数学表达式}

编写数学表达式,实现以下功能:将PI除以2,radius乘2:

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 1.属性定义-->
  3. <xacro:property name = "PI" value = "3.1415927" />
  4. <xacro:property name = "radius" value = "0.03" />
  5. <!-- 2.属性调用 -->
  6. <myUsePropertyxxx name="${PI}" />
  7. <myUsePropertyxxx name="${radius}" />
  8. <!-- 3.算术运算 -->
  9. <myUsePropertyYyy result="${PI / 2}" />
  10. <myUsePropertyYyy result="${radius * 2}" />
  11. </robot>

执行(步骤同上)结果:

  1. <robot name="mycar">
  2. <!-- 2.属性调用 -->
  3. <myUsePropertyxxx name="3.1415927"/>
  4. <myUsePropertyxxx name="0.03"/>
  5. <!-- 3.算术运算 -->
  6. <myUsePropertyYyy result="1.57079635"/>
  7. <myUsePropertyYyy result="0.06"/>
  8. </robot>

2.宏

宏类似于函数实现,作用是:提高代码复用率,优化代码结构,提高安全性。

(1)宏定义

  1. <xacro:macro name="宏名称" params="参数列表(多参数之间使用空格分隔)">
  2. .....
  3. 参数调用格式: ${参数名}
  4. </xacro:macro>

(2)宏调用

<xacro:宏名称 参数1=xxx 参数2=xxx/>

(3)举例

在/DEMO05_WS/src/urdf01_rviz/urdf/xacro目录下新建:demo03_macro.urdf.xacro,用于演示宏的定义和调用

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 1.宏定义-->
  3. <xacro:macro name = "getSum" params= "num1 num2" >
  4. <result value = "${num1 + num2}" />
  5. </xacro:macro >
  6. <!-- 2.宏调用-->
  7. <xacro:getSum num1= " 1" num2 = "5" />
  8. </robot>

rosrun执行以上代码,实现将num1和num2相加。

milk@milk:~/DEMO05_WS/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo03_macro.urdf.xacro

执行结果:

  1. <robot name="mycar">
  2. <result value="6"/>
  3. </robot>

3.文件包含

机器人由多部件组成,不同部件可以封装为单独的 xacro 文件,最后再将不同的文件集成,组合为完整机器人的机器人模型,可以使用文件包含实现。

(1)文件包含的语法:

  1. <robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:include filename="my_base.xacro" />
  3. <xacro:include filename="my_camera.xacro" />
  4. <xacro:include filename="my_laser.xacro" />
  5. ....
  6. </robot>

filename的值是被包含的文件。

(2)案例

要求:创建一个新的文件,在此文件中包含之前写过的demo02和demo03

实现:

首先,在/DEMO05_WS/src/urdf01_rviz/urdf/xacro目录下新建:demo04_sum.urdf.xacro

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 1.演示文件包含-->
  3. <xacro:include filename="demo02_field.urdf.xacro" />
  4. <xacro:include filename="demo03_macro.urdf.xacro" />
  5. </robot>

执行。

milk@milk:~/DEMO05_WS/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo04_sum.urdf.xacro

结果:

  1. <robot name="mycar">
  2. <!-- 2.属性调用 -->
  3. <myUsePropertyxxx name="3.1415927"/>
  4. <myUsePropertyxxx name="0.03"/>
  5. <!-- 3.算术运算 -->
  6. <myUsePropertyYyy result="1.57079635"/>
  7. <myUsePropertyYyy result="0.06"/>
  8. <result value="6"/>
  9. </robot>

输出了demo02和demo03的结果。

三、Xacro的完整使用

需求:使用 Xacro 优化 URDF 版的小车底盘模型实现。

1.编写Xacro文件

首先,在/DEMO05_WS/src/urdf01_rviz/urdf/xacro目录下新建:demo05_car_base.urdf.xacro

  1. <!--
  2. 使用 xacro 优化 URDF 版的小车底盘实现:
  3. 实现思路:
  4. 1.将一些常量、变量封装为 xacro:property
  5. 比如:PI 值、小车底盘半径、离地间距、车轮半径、宽度 ....
  6. 2.使用 宏 封装驱动轮以及支撑轮实现,调用相关宏生成驱动轮与支撑轮
  7. -->
  8. <!-- 根标签,必须声明 xmlns:xacro -->
  9. <robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
  10. <!-- 封装变量、常量 -->
  11. <xacro:property name="PI" value="3.141"/>
  12. <!-- 宏:黑色设置 -->
  13. <material name="black">
  14. <color rgba="0.0 0.0 0.0 1.0" />
  15. </material>
  16. <!-- 底盘属性 -->
  17. <xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint 半径 -->
  18. <xacro:property name="base_link_radius" value="0.1" /> <!-- base_link 半径 -->
  19. <xacro:property name="base_link_length" value="0.08" /> <!-- base_link 长 -->
  20. <xacro:property name="earth_space" value="0.015" /> <!-- 离地间距 -->
  21. <!-- 底盘 -->
  22. <link name="base_footprint">
  23. <visual>
  24. <geometry>
  25. <sphere radius="${base_footprint_radius}" />
  26. </geometry>
  27. </visual>
  28. </link>
  29. <link name="base_link">
  30. <visual>
  31. <geometry>
  32. <cylinder radius="${base_link_radius}" length="${base_link_length}" />
  33. </geometry>
  34. <origin xyz="0 0 0" rpy="0 0 0" />
  35. <material name="yellow">
  36. <color rgba="0.5 0.3 0.0 0.5" />
  37. </material>
  38. </visual>
  39. </link>
  40. <joint name="base_link2base_footprint" type="fixed">
  41. <parent link="base_footprint" />
  42. <child link="base_link" />
  43. <origin xyz="0 0 ${earth_space + base_link_length / 2 }" />
  44. </joint>
  45. <!-- 驱动轮 -->
  46. <!-- 驱动轮属性 -->
  47. <xacro:property name="wheel_radius" value="0.0325" /><!-- 半径 -->
  48. <xacro:property name="wheel_length" value="0.015" /><!-- 宽度 -->
  49. <!-- 驱动轮宏实现 -->
  50. <xacro:macro name="add_wheels" params="name flag">
  51. <link name="${name}_wheel">
  52. <visual>
  53. <geometry>
  54. <cylinder radius="${wheel_radius}" length="${wheel_length}" />
  55. </geometry>
  56. <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
  57. <material name="black" />
  58. </visual>
  59. </link>
  60. <joint name="${name}_wheel2base_link" type="continuous">
  61. <parent link="base_link" />
  62. <child link="${name}_wheel" />
  63. <origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
  64. <axis xyz="0 1 0" />
  65. </joint>
  66. </xacro:macro>
  67. <xacro:add_wheels name="left" flag="1" />
  68. <xacro:add_wheels name="right" flag="-1" />
  69. <!-- 支撑轮 -->
  70. <!-- 支撑轮属性 -->
  71. <xacro:property name="support_wheel_radius" value="0.0075" /> <!-- 支撑轮半径 -->
  72. <!-- 支撑轮宏 -->
  73. <xacro:macro name="add_support_wheel" params="name flag" >
  74. <link name="${name}_wheel">
  75. <visual>
  76. <geometry>
  77. <sphere radius="${support_wheel_radius}" />
  78. </geometry>
  79. <origin xyz="0 0 0" rpy="0 0 0" />
  80. <material name="black" />
  81. </visual>
  82. </link>
  83. <joint name="${name}_wheel2base_link" type="continuous">
  84. <parent link="base_link" />
  85. <child link="${name}_wheel" />
  86. <origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" />
  87. <axis xyz="1 1 1" />
  88. </joint>
  89. </xacro:macro>
  90. <xacro:add_support_wheel name="front" flag="1" />
  91. <xacro:add_support_wheel name="back" flag="-1" />
  92. </robot>

xacro文件写入urdf:

milk@milk:~/DEMO05_WS/src/urdf01_rviz/urdf/xacro$ rosrun xacro xacro demo05_car_base.urdf.xacro > demo05_car_base.urdf

这样在xacro目录下多了一个demo05_car_base.urdf

注意,这里要把demo05_car_base.urdf中的中文注释删掉,否则在后面启动rivz的时候会报错。

2.集成launch文件

集成launch文件有两种方法:

(1)将xacro文件转化成urdf文件后集成

先将 xacro 文件解析成 urdf 文件:rosrun xacro xacro xxx.xacro > xxx.urdf然后再按照之前的集成方式直接整合 launch 文件。

具体实现:

首先,在/DEMO05_WS/src/urdf01_rviz/urdf/xacro目录下新建:demo06_car_base.launch

内容:

  1. <launch>
  2. <!-- 1.在参数服务器中载入urdf-->
  3. <param name="robot_description" textfile="$(find demo01_urdf_helloworld)/urdf/xacro/demo05_car_base.urdf" />
  4. <!-- 2.启动rviz-->
  5. <node pkg="rviz" type="rviz" name="rviz" args="-d $(find demo01_urdf_helloworld)/config/helloworld.rviz" />
  6. <!-- 3.添加关节状态发布节点-->
  7. <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" />
  8. <!-- 4.添加机器人状态发布节点-->
  9. <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />
  10. <!-- 5.添加关节运动控制节点-->
  11. <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" />
  12. </launch>

执行:

首先进入当前工作空间进行source

milk@milk:~/DEMO05_WS$ source ./devel/setup.bash

(ps:这一步我一开始出现错误:

bash: ./devel/setup/bash: 没有那个文件或目录

我的解决办法:回到工作空间下重新编译:

catkin_make

这样再source就没有错误了。)

roslaunch:

milk@milk:~/DEMO05_WS$ roslaunch urdf01_rviz demo06_car_base.launch

rivz启动,启动后是没有模型的,需要增加模型,点左边的add,选择RobotModel如图

并且,将Fixed Frame的map改为base_footprint,这样就可以看到小车模型。

(2)在 launch 文件中直接加载 xacro(建议使用)

这种方法不需要生成中间文件.urdf,直接集成xacro

将demo06_car_base.launch修改一下,文件内容:

  1. <launch>
  2. <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf.xacro" />
  3. <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />
  4. <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" />
  5. <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />
  6. <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" />
  7. </launch>

这样,我们不需要生成对应的urdf文件,直接进行roslaunch:

milk@milk:~/DEMO05_WS$ roslaunch urdf01_rviz demo06_car_base.launch

rviz启动。

 四、Xacro添加部件

需求:在前面小车底盘基础之上,添加摄像头和雷达传感器。

实现分析:机器人模型由多部件组成,可以将不同组件设置进单独文件,最终通过文件包含实现组件的拼装。

实现流程:

  1. 首先编写摄像头和雷达的 xacro 文件

  2. 然后再编写一个组合文件,组合底盘、摄像头与雷达

  3. 最后,通过 launch 文件启动 Rviz 并显示模型

我们需要建立以及几个文件:1.摄像头文件demo06_car_camera.urdf.xacro雷达文件demo07_car_laser.urdf.xacro。2.用于汇总小车底盘、摄像头和雷达的文件car.urdf.xacro。3.用于集成的launch文件car.launch。

 1.组合底盘摄像头与雷达的 xacro 文件

用于汇总小车底盘、摄像头和雷达的文件car.urdf.xacro

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:include filename="demo05_car_base.urdf.xacro" />
  3. <xacro:include filename="demo06_car_camera.urdf.xacro" />
  4. <xacro:include filename="demo07_car_laser.urdf.xacro" />
  5. </robot>

2.launch 文件

和之前的launch文件类似,car.launch的内容如下:

  1. <launch>
  2. <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/car.urdf.xacro" />
  3. <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />
  4. <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" />
  5. <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />
  6. <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" />
  7. </launch>

3.摄像头和雷达 Xacro 文件实现

(1)摄像头

关于摄像头,我们需要设置的有摄像头的参数,以及连杆和关节。

 上图的摄像头(小车前方黑色小方块)是一个立方体,需要考虑:立方体的宽度、高度、厚度。

摄像头的关节需要设置:关节的XYZ偏移量。

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 参数-->
  3. <!-- 参数:
  4. 连杆属性:宽度/高度/厚度
  5. 关节属性: x y z
  6. -->
  7. <xacro:property name = "camera_length" value = "0.02"> <!-- 厚度 x-->
  8. <xacro:property name = "camera_width" value = "0.05"> <!-- 宽度 y-->
  9. <xacro:property name = "camera_height" value = "0.05"> <!-- 高度z-->
  10. <xacro:property name = "joint_camera_x" value = "0.08">
  11. <xacro:property name = "joint_camera_y" value = "0">
  12. <xacro:property name = "joint_camera_z" value = "${base_length / 2 + camera_height / 2}">
  13. <link name = "camera">
  14. <visual>
  15. <geometry>
  16. <box size = ${camera_length} ${ camera_width} ${camera_height} />
  17. </geometry>
  18. <material name = "black ">
  19. <color rgba = "0 0 0 0.8" />
  20. </material>
  21. </visual>
  22. </link>
  23. <joint name = "camera2base" type = "fixed">
  24. <parent link = "base_link" />
  25. <child link = "camera" />
  26. <origin xyz ="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}" rpy= "0 0 0">
  27. </joint>
  28. </robot>

(2)雷达

雷达包括两部分:雷达本身与雷达支架。以及和摄像头一样,雷达也要设计参数。

如:支架与雷达都是圆柱状,我们要知道它们的半径和高度。并且,支架安装在小车底盘上,雷达安装在支架上,这两种操作都需要joint,这时候就要知道joint的XYZ偏移量。

 对于参数,这里我们参考一开始提到的教程中的数值。

支架半径和高度分别为0.01和0.15,雷达半径的长度分别为0.03和0.05,这部分代码如下

  1. <xacro:property name = "support_radius" value = "0.01" />
  2. <xacro:property name = "support_length" value = "0.15" />
  3. <xacro:property name = "laser_radius" value = "0.03" />
  4. <xacro:property name = "laser_length" value = "0.05" />

接下来设置偏移量。首先二者都位于小车正中心的位置,所以XY偏移量都是0,只看Z轴偏移量。

支架的Z轴偏移量是小车底盘高度的一半加上支架高度的一半,雷达相对于支架的偏移量是支架高度的一半加上雷达高度的一半。这部分代码如下:

  1. <xacro:property name = "joint_support_x" value = "0" />
  2. <xacro:property name = "joint_support_y" value = "0" />
  3. <xacro:property name = "joint_support_z" value = "${base_link_length / 2 +support_length / 2}" />
  4. <xacro:property name = "joint_laser_x" value = "0" />
  5. <xacro:property name = "joint_laser_y" value = "0" />
  6. <xacro:property name = "joint_laser_z" value = "${support_length / 2 + laser_length_ / 2}" />

设置完参数再进行雷达和支架相关的link和joint实现:

支架的link实现:要设置支架的半径和高度支架是圆柱所以标签是cylinder,半径和高度都是之前设置好的直接用${}调用。颜色设置为黄色,rgb值为0.8 0.5 0.0,透明度0.5。

  1. <link name ="support">
  2. <visual>
  3. <geometry>
  4. <cylinder radius = "${support_radius}" length = "${support_length}">
  5. </geometry>
  6. <material name = "yellow">
  7. <color rgba = "0.8 0.5 0.0 0.5"/>
  8. </material>
  9. </visual>
  10. </link>

支架的joint实现:支架和小车主体连接,父级link是小车底盘base_link,子级是支架support。偏移量XYZ已经封装好,直接通过${}调用。

  1. <joint name = "support2base" type = "fixed">
  2. <parent link ="base_link" />
  3. <child link = "support"/>
  4. <origin xyz = "${joint_support_x} ${joint_support_y} ${joint_support_z}" rpy ="0 0 0">
  5. </joint>

这样,支架部分就完成了,接下来进行雷达的设置。

雷达的link和joint设置和支架类似,只需要更改一下名称颜色、parent 和child link、偏移量。

  1. <link name ="laser">
  2. <visual>
  3. <geometry>
  4. <cylinder radius = "${laser_radius}" length = "${laser_length}"/>
  5. </geometry>
  6. <material name = "black">
  7. <color rgba = "0 0 0 0.5" />
  8. </material>
  9. </visual>
  10. </link>
  11. <joint name = "laser2support" type = "fixed">
  12. <parent link ="support" />
  13. <child link = "laser"/>
  14. <origin xyz = "${joint_laser_x} ${joint_laser_y} ${joint_laser_z}" rpy ="0 0 0" />
  15. </joint>

至此设置完毕,雷达文件整体代码如下:

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 雷达部件 -->
  3. <!-- 参数-->
  4. <!-- 支架:
  5. 支架尺寸:半径 高度
  6. 关节偏移量:xyz
  7. -->
  8. <!-- 雷达:
  9. 雷达尺寸:半径 高度
  10. 关节偏移量:xyz
  11. -->
  12. <xacro:property name = "support_radius" value = "0.01" />
  13. <xacro:property name = "support_length" value = "0.15" />
  14. <xacro:property name = "laser_radius" value = "0.03" />
  15. <xacro:property name = "laser_length" value = "0.05" />
  16. <xacro:property name = "joint_support_x" value = "0" />
  17. <xacro:property name = "joint_support_y" value = "0" />
  18. <xacro:property name = "joint_support_z" value = "${base_link_length / 2 +support_length / 2}" />
  19. <xacro:property name = "joint_laser_x" value = "0" />
  20. <xacro:property name = "joint_laser_y" value = "0" />
  21. <xacro:property name = "joint_laser_z" value = "${support_length / 2 + laser_length_ / 2}" />
  22. <!-- 支架-->
  23. <link name ="support">
  24. <visual>
  25. <geometry>
  26. <cylinder radius = "${support_radius}" length = "${support_length}"/>
  27. </geometry>
  28. <material name = "yellow">
  29. <color rgba = "0.8 0.5 0.0 0.5" />
  30. </material>
  31. </visual>
  32. </link>
  33. <joint name = "support2base" type = "fixed">
  34. <parent link ="base_link" />
  35. <child link = "support"/>
  36. <origin xyz = "${joint_support_x} ${joint_support_y} ${joint_support_z}" rpy ="0 0 0" />
  37. </joint>
  38. <!-- 雷达-->
  39. <link name ="laser">
  40. <visual>
  41. <geometry>
  42. <cylinder radius = "${laser_radius}" length = "${laser_length}"/>
  43. </geometry>
  44. <material name = "black">
  45. <color rgba = "0 0 0 0.5" />
  46. </material>
  47. </visual>
  48. </link>
  49. <joint name = "laser2support" type = "fixed">
  50. <parent link ="support" />
  51. <child link = "laser"/>
  52. <origin xyz = "${joint_laser_x} ${joint_laser_y} ${joint_laser_z}" rpy ="0 0 0" />
  53. </joint>
  54. </robot>

接下来保存文件后,运行一下代码,看看效果。

  1. milk@milk:~/DEMO05_WS$ source ./devel/setup.bash
  2. milk@milk:~/DEMO05_WS$ roslaunch urdf01_rviz car.launch

好了,到这里Xacro的部分就结束了,接下来是arbotix控制机器人运动~好期待~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/789452
推荐阅读
相关标签
  

闽ICP备14008679号