前言

最近想搭建一个机器人移动平台,但是设备还没完全到齐,在设备全部到齐之前,我们先在gazebo中做一个仿真,进行相关的算法和功能包的部署。在这个仿真中机器人在一个移动底盘上搭载了16线激光雷达、IMU、RGB-D相机,并在最后跑了一个LIO-SAM,建图效果还不错。整个过程遇到了一些问题,都一一解决了,对主要的问题做了一些记录,有其他问题的可以在讨论区回复。另外,本工程的源码放在在GitHub上,欢迎大家下载学习。

1、下载雷达仿真包

首先下载VLP的激光雷达的仿真开发包到自己的工作空间中

git clone https://bitbucket.org/DataspeedInc/velodyne_simulator/src/master/

   
AI写代码
  • 1

下载之后 /src 的文件结构如下

1

下载好激光雷达的仿真包之后重新catkin_make一次,主要是为了生成激光雷达的点云产生库文件,不然后面仿真的时候会没有点云相关话题。编译一次之后就会在我们工作空间的的devel/lib文件夹下生成两个动态链接库如下:

2

在仿真中会调用这两个库生成点云信息。

2、添加雷达支架描述文件

给激光雷达添加一个支架,把激光雷达在车上立起来,在自己的机器人包里面的urdf文件夹里面新建一个 laser_support.xacro 文件写入如下内容

<?xml version="1.0"?>
<robot name="laser_support" xmlns:xacro="http://wiki.ros.org/xacro">
  <!-- 雷达支架 -->
  <xacro:property name="support_length" value="0.30" /> <!-- 支架长度 -->
  <xacro:property name="support_radius" value="0.025" /> <!-- 支架半径 -->
  <xacro:property name="support_x_size" value="-0.2" /> <!-- 支架安装的x坐标 -->
  <xacro:property name="support_y_size" value="0.0" /> <!-- 支架安装的y坐标 -->
  <xacro:property name="support_z_size" value="${base_z_size}" /> <!-- 支架安装的z坐标:底盘高度 / 2 + 支架高度 / 2  -->
  <xacro:property name="support_m" value="0.02" /> <!-- 支架质量 -->
  <link name="support">
      <visual>
          <geometry>
          	<cylinder radius="${support_radius}" length="${support_length}" />
          </geometry>
          <origin xyz="0 0 0" rpy="0.0 0.0 0.0" />
          <material name="red">
          	<color rgba="0.8 0.2 0.0 0.8" />
          </material>
      </visual>
      <collision>
          <geometry>
          	<cylinder radius="${support_radius}" length="${support_length}" />
          </geometry>
          <origin xyz="0 0 0" rpy="0.0 0.0 0.0" />
      </collision>
      <xacro:cylinder_inertial_matrix m="${support_m}" r="${support_radius}" h="${support_length}" />
  </link>
  <joint name="support2base_link" type="fixed">
      <parent link="base_link" />
      <child link="support" />
      <origin xyz="${support_x_size} ${support_y_size} ${support_z_size}" />
  </joint>
  <gazebo reference="support">
  <material>Gazebo/White</material>
  </gazebo>
</robot>

   
AI写代码 xml
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

3、添加雷达描述文件

在机器人的base.xacro描述文件中添加激光雷达的描述

首先,包含激光雷达的支架描述文件

5

然后,添加雷达的两个属性描述变量

3

最后,包含激光雷达的描述文件,这里会用到上面两个属性变量

4

4、启动仿真

编写launch文件,启动rviz看看我们的机器人

<launch>
    <arg name = "model_xacro" default = "$(find scout_gazebo)/urdf/base.xacro" />
    <!-- 将 Urdf 文件的内容加载到参数服务器 -->
    <param name="robot_description" command="$(find xacro)/xacro $(arg model_xacro)" />
    <!-- Launch  the joint state publisher -->
    <node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" ></node>
    <!-- Launch  the robot state publisher -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<span class="token comment">&lt;!-- Loading rviz files --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>node</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rviz<span class="token punctuation">"</span></span> <span class="token attr-name">pkg</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rviz<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rviz<span class="token punctuation">"</span></span> <span class="token attr-name">args</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-d $(find scout_gazebo)/config/show_robot.rviz<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
<span class="token comment">&lt;!-- 启动 gazebo --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span> <span class="token attr-name">file</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(find gazebo_ros)/launch/empty_world.launch<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>world_name<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(find scout_gazebo)/worlds/lab.world<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>include</span><span class="token punctuation">&gt;</span></span>
<span class="token comment">&lt;!-- 在 gazebo 中显示机器人模型  --&gt;</span>

<node pkg=gazebo_ros type=spawn_model name=model args=-urdf -model scout -param robot_description />
</launch>

AI写代码 xml
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

roslaunch之后就可以打开gazebo和rviz,并在里面显示我们的机器人携带着激光雷达如下:

6

7

此时可以打开我们的话题,看看是否有点云输出

8

可以看到是有点云话题的,我们在rviz里面尝试把点云可视化出来看看

9

可以看到我们的点云是正常输出的。注意,我们我们为了在gazebo里面看到我们的机器人,所以没有在gazebo里面吧激光点云可视化出来,如果想要可视化可以通过修改 VLP-16.urdf.xacro 文件中这个地方

9

修改之后,我们就可以在gazebo里面看到激光点云了,如下:

9

把我们的车都给盖住了,16线激光雷达的点云还是比较稠密的。现在激光雷达已经加入到仿真中了,下一步我们跑一个经典的激光SLAM框架 LIO-SAM试试看。

5、添加IMU模块

因为我们需要跑的框架是LIO-SAM,需要用到IMU模块,所以我们在仿真中也添加进去。同样地,我们在工程中的urdf文件夹下面再增加一个 imu.xacro文件

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro">  
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xacro:</span>macro</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu<span class="token punctuation">"</span></span> <span class="token attr-name">params</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>sensor_name parent_link *origin<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xacro:</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_offset_x<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xacro:</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_offset_y<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xacro:</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_offset_z<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0.2<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xacro:</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_size<span class="token punctuation">"</span></span>     <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0.05<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xacro:</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_m<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0.01<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span> <span class="token comment">&lt;!-- imu质量 --&gt;</span>
    <span class="token comment">&lt;!-- imu --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>joint</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imutobase<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>fixed<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token comment">&lt;!-- &lt;origin xyz="${imu_offset_x} ${imu_offset_y} ${imu_offset_z}" rpy="0 0 0" /&gt; --&gt;</span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xacro:</span>insert_block</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>origin<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>parent</span> <span class="token attr-name">link</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${parent_link}<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>child</span> <span class="token attr-name">link</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_base<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>joint</span><span class="token punctuation">&gt;</span></span>
        
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_base<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>visual</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>origin</span> <span class="token attr-name">rpy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 0<span class="token punctuation">"</span></span> <span class="token attr-name">xyz</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0 0 0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>geometry</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>box</span> <span class="token attr-name">size</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${imu_size} ${imu_size} ${imu_size}<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>geometry</span><span class="token punctuation">&gt;</span></span>                
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>material</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span>black<span class="token punctuation">"</span></span> <span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>color</span> <span class="token attr-name">rgba</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1.0 0.0 0.0 0.6<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>material</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>visual</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>collision</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>geometry</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>box</span> <span class="token attr-name">size</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${imu_size} ${imu_size} ${imu_size}<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>geometry</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>origin</span> <span class="token attr-name">xyz</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0.0 0.0 0<span class="token punctuation">"</span></span> <span class="token attr-name">rpy</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0.0 0.0 0.0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>collision</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xacro:</span>Box_inertial_matrix</span> <span class="token attr-name">m</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span>${imu_m}<span class="token punctuation">"</span></span> <span class="token attr-name">l</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span>${imu_size}<span class="token punctuation">"</span></span> <span class="token attr-name">w</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span>${imu_size}<span class="token punctuation">"</span></span> <span class="token attr-name">h</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span>${imu_size}<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>link</span><span class="token punctuation">&gt;</span></span>

    <span class="token comment">&lt;!-- 被引用的link --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>gazebo</span> <span class="token attr-name">reference</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_base<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>material</span><span class="token punctuation">&gt;</span></span>Gazebo/Bule<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>material</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>gravity</span><span class="token punctuation">&gt;</span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>gravity</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>sensor</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_sensor<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>always_on</span><span class="token punctuation">&gt;</span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>always_on</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>update_rate</span><span class="token punctuation">&gt;</span></span>100<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>update_rate</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>visualize</span><span class="token punctuation">&gt;</span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>visualize</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>topic</span><span class="token punctuation">&gt;</span></span>__default_topic__<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>topic</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>plugin</span> <span class="token attr-name">filename</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>libgazebo_ros_imu_sensor.so<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>imu_plugin<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>topicName</span><span class="token punctuation">&gt;</span></span>imu/data<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>topicName</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>bodyName</span><span class="token punctuation">&gt;</span></span>imu_base<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>bodyName</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>updateRateHZ</span><span class="token punctuation">&gt;</span></span>100.0<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>updateRateHZ</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>gaussianNoise</span><span class="token punctuation">&gt;</span></span>0.01<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>gaussianNoise</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>xyzOffset</span><span class="token punctuation">&gt;</span></span>0 0 0<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>xyzOffset</span><span class="token punctuation">&gt;</span></span>     
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rpyOffset</span><span class="token punctuation">&gt;</span></span>0 0 0<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>rpyOffset</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>frameName</span><span class="token punctuation">&gt;</span></span>imu_base<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>frameName</span><span class="token punctuation">&gt;</span></span>        
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>plugin</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>pose</span><span class="token punctuation">&gt;</span></span>0 0 0 0 0 0<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>pose</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>sensor</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>gazebo</span><span class="token punctuation">&gt;</span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">xacro:</span>macro</span><span class="token punctuation">&gt;</span></span>

</robot>

AI写代码 html
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

然后在我们主描述文件 base.xacro中包含这个文件

image-20220918224800561

6、添加RGB-D相机

我们这里使用一个realsense系列的RGB-D相机,先去下载它的仿真SDK

$ git clone https://github.com/nilseuropa/realsense_ros_gazebo.git

 
AI写代码 sh
  • 1

这里是下载到工程的源码目录下

image-20220918225325309

然后同样地,在主描述文件base.xarco中把相机也包含进去

image-20220918225423235

添加完之后,我们这个仿真机器人已经配备了 IMU、RGB-D相机、16线激光雷达这些传感器,我们把环境启动起来,看看发布了多少话题

topic

可以看到发布了很多话题,双目的、IMU的、点云的……都有,基本是机器人配置已经完成,下面准备跑一个SLAM框架试试

7、LIO-SAM仿真

安装依赖
$ sudo apt-get install -y ros-noetic-navigation
$ sudo apt-get install -y ros-noetic-robot-localization
$ sudo apt-get install -y ros-noetic-robot-state-publisher

 
AI写代码 sh
  • 1
  • 2
  • 3
安装GTSAM
$ git clone https://github.com/borglab/gtsam
$ cd gtsam
$ mkdir build && cd build
# 注意这里要加-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF这个选项,不然后面运行会报错
$ cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF ..
$ sudo make install -j8
$ sudo ln -s /usr/local/lib/libmetis-gtsam.so /usr/lib/libmetis-gtsam.so

 
AI写代码 sh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
编译LIO-SAM
$ cd ~/robot_ws/src
$ git clone https://github.com/TixiaoShan/LIO-SAM
$ cd ..
$ catkin_make

 
AI写代码 sh
  • 1
  • 2
  • 3
  • 4
运行

首先启动仿真环境

$ roslaunch scout_gazebo scout_gazebo.launch

 
AI写代码 sh
  • 1

gazebo

然后启动 lio-sam

$ roslaunch lio_sam run.launch

 
AI写代码 sh
  • 1

rviz

最后启动我们的控制机器人移动的节点,这个节点是ros自带的一个包,通过sudo apt install ros-noetic-teleop-twist-keyboard命令安装,这个节点主要是发布速度信息到 /cmd_val控制机器人在gazebo中进行移动,移动机器人即可进行建图

$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py

 
AI写代码 sh
  • 1

mapping

可以看到机器人在gazebo中接收我们的运动控制指令进行运动,lio-sam节点进行了位姿估计与建图。

8、源码

这里我把源码上传到我的GitHub仓库,大家可以自行下载进行实验

https://github.com/linzs-online/robot_gazebo.git

遇到的问题

1、error: ‘class std::unordered_map<unsigned int, std::vector >’ has no member named ‘serialize’

原因:PCl库依赖的flann与Opencv冲突。opencv头文件中的一些宏定义和flann库中的冲突
解决:保证pcl库中依赖的flann在opencv头文件之前先包含进去。我这里是把opencv的头文件放在PCL库之后就解决 了
image-20220923084018213

2、gazebo中机器人静止,rviz中反复横跳

原因:lio-sam会对点云进行下采样滤波,滤波体素设置太大了,匹配过程出现误差,导致机器人优化出来的位姿反复横跳。

解决: 因为我们这里是在室内建图,所以在lio-sam的配置文件中把体素大小设置小一些

image-20220919092444182

3、运行时报错 [lio_sam_mapOptmization-5] process has died [pid 260348, exit code -11

解决: gtsam编译时带上这个参数,cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF …

4、运行时报错 error while loading shared libraries: libmetis-gtsam.so: cannot open shared object file: No such file or directory

解决: sudo ln -s /usr/local/lib/libmetis-gtsam.so /usr/lib/libmetis-gtsam.so

5、运行时报 Warning: TF_REPEATED_DATA ignoring data with redundant timestamp for frame

原因:机器人TF变换不正常

error

解决:通过运行 roswtf 命令分析目前环境中的TF变换,这里查到是 base_linkodom这两个坐标之间的变换产生了冲突

analisy

显然,是我们的gazebo仿真中的控制已经发布了 base_linkodom 的TF变换,但是我们的 SLAM节点又发布了一次,这两个产生了冲突,下面我们通过修改lio-sam发布的TF变换来解决这个问题,修改lio-sam的配置文件,把SLAM位姿估计结果发布的坐标换个名字即可

image-20220919094556770

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐