1 前言
关于这方面的教程已经很多了,说的也比较完善,如果是刚开始接触gazebo的朋友,可以参考教程。上边介绍的非常详细,完全可以照着来一部一部做。
我之所以写这篇博文,是记录一下我在使用过程中遇到的奇葩bug,如果有人遇到同样的问题,希望对你有帮助。
2 出现问题
我做的项目是借助gazebo获取激光雷达与相机联合标定的数据,这里推荐一个不错的开源项目,项目不仅提供了他们标定算法的源码,而且还提供他们gazebo仿真环境中的源码。作者将每个传感器和标定版都进行函数封装,即插即用,这一点让我很喜欢。但是我在调用vlp16的时候,发现可以正常仿真不报错,但是仿真环境中不显示LiDAR模型,并且rostopic list中也没有LiDAR发布的话题。
3 解决过程
我首先参考了上述教程,其实最开始提供的.urdf文件,相当于是一个关于VLP的调用函数,param后边的是函数需要的变量,*origin 相当于指向传感器的位置和姿态。把它当作一个函数就好理解了,只需要在描述LiDAR的xacro文件调用它就可以:
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="blackflys_spawn">
<xacro:include filename="$(find Lidar_Camera_Calibration)/../gazebo_models/velodyne_VLP16/VLP-16.urdf.xacro"/>// 放置激光雷达文件的路径
<xacro:arg name="xyz" default="0 0 1.5" />
<xacro:arg name="rpy" default="0 0 0" />
<xacro:arg name="noise" default="0.008" />
<xacro:arg name="min_angle" default="-180" />
<xacro:arg name="max_angle" default="180" />
<xacro:arg name="hz" default="1" />
<xacro:arg name="lidar_name" default="vlp16" />
<gazebo>
<static>true</static>
</gazebo>
<!-- Base Footprint -->
<link name="base_footprint">
<inertial>
<mass value="0.0001" />
<origin xyz="0 0 0" />
<inertia ixx="0.0001" ixy="0.0" ixz="0.0"
iyy="0.0001" iyz="0.0"
izz="0.0001" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.001 0.001 0.001" />
</geometry>
</visual>
</link>
<gazebo reference="base_footprint">
<static>true</static>
<turnGravityOff>false</turnGravityOff>
</gazebo>
<xacro:VLP-16 parent="base_footprint" name="$(arg lidar_name)" hz="$(arg hz)" noise="$(arg noise)"
min_angle="$(arg min_angle)" max_angle="$(arg max_angle)">
<origin xyz="$(arg xyz)" rpy="$(arg rpy)"/>
</xacro:VLP-16>
</robot>
需要修改的就是文件的路径。但这些都是其次的,出现上述现象的原因就是调用函数(代码最后几行)一定要加入关键字 xacro:,末尾也是。就是这个小bug折腾我一上午。
4 结语
经过这个经历,也算是重新学习了一下xacro文件的语法。