gazebo中插入激光雷达velodyne VLP16

gazebo中插入激光雷达velodyne VLP16

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文件的语法。