从0.3开始搭建LeGO-LOAM+VLP雷达+小车实时建图(保姆级教程,小白踩坑日记)

2023-11-07

背景:SLAM小白,因为项目需要花了两天时间编译代码+连接雷达实现了交互。

踩了很多坑,简单记录一下,让后面感兴趣的朋友少走点弯路~ 肯定有很多不专业的、错误的地方,还请大家不吝赐教(噗通)

也可以见知乎:https://zhuanlan.zhihu.com/p/357020888/ (我发现从知乎复制内容到CSDN特别方便啊)未完待续惹 

主要分为5个部分:

  1. 编译算法前的准备(对应目录第1-4章)
  2. 编译SLAM算法 LeGO-LOAM-BOR (对应目录第5章)
  3. 编译SLAM算法 LeGO-LOAM和跑包 (对应目录第6-7章)
  4. 连接Velodyne激光雷达 VLP-16 (对应目录第8章)
  5. 基于小车的实时建图(对应目录第9-10章)

目录

1. 安装 ROS

2. 安装 OpenCV

3. 安装 GTSAM (Georgia Tech Smoothing and Mapping library, 4.0.0-alpha2)

4. 安装 PCL

5. 重头戏来了!编译 LeGO-LOAM-BOR

6. 跑包,在数据集上进行测试

7 删除LeGO-LOAM-BOR,重新下载编译LeGO-LOAM

8 与Velodyne VLP-16 三维激光雷达连接

9 实时建图:算法和雷达交互

10 小车及大范围场景的实时建图

参考文献


源代码github:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/

优化版本的代码:https://github.com/facontidavide/LeGO-LOAM-BOR/tree/speed_optimization

硬件设备:Intel NUC 10代i7(NUC10i7FNH)

软件系统:Ubuntu 16.04

如果要正确编译、运行算法,相关依赖库必须准确、完整安装好,要不然会各种报错,绕路踩坑。下面对相关依赖库安装流程简要叙述。观察CMakeLists.txt,主要需要以下几个库:

find_package(GTSAM REQUIRED QUIET)
find_package(PCL REQUIRED QUIET)
find_package(OpenCV REQUIRED QUIET)

当然,还有必须要的ROS。


1. 安装 ROS

机器预先已装 ROS-kinetic,具体安装过程这里不再赘述。


2. 安装 OpenCV

机器预先已装 OpenCV 4.3.0,具体安装过程这里不再赘述。

测试是否安装正确:

转到~/opencv-4.3.0/samples/cpp/example_cmake 目录下,打开终端,输入:

cmake .
make
./opencv_example

如果右上角,弹框出现 Hello OpenCV 则证明安装成功,如下图:


3. 安装 GTSAM (Georgia Tech Smoothing and Mapping library, 4.0.0-alpha2)

参考https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/中Dependency

wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2.zip
cd ~/Downloads/ && unzip gtsam.zip -d ~/Downloads/
cd ~/Downloads/gtsam-4.0.0-alpha2/
mkdir build && cd build
cmake ..
sudo make install

正在编译

安装完成示意


4. 安装 PCL

一开始没有注意要安装PCL,直接尝试编译LeGO-LOAM,发现无法通过编译,报错

Invoking "cmake" failed

或者

Invoking "make cmake_check_build_system" failed

后来才发现,需要安装PCL (捂脸)

PCL Address: https://github.com/PointCloudLibrary/pcl

4.1 首先提前安装PCL需要的各种依赖包

 sudo apt-get update
 sudo apt-get install git build-essential linux-libc-dev
 sudo apt-get install cmake cmake-gui 
 sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
 sudo apt-get install mpi-default-dev openmpi-bin openmpi-common 
 sudo apt-get install libflann1.8 libflann-dev
 sudo apt-get install libeigen3-dev
 sudo apt-get install libboost-all-dev
 sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev
 sudo apt-get install libqhull* libgtest-dev
 sudo apt-get install freeglut3-dev pkg-config
 sudo apt-get install libxmu-dev libxi-dev 
 sudo apt-get install mono-complete
 sudo apt-get install qt-sdk openjdk-8-jdk openjdk-8-jre

PCL可视化相关函数库安装

sudo apt-get install libopenni-dev 
sudo apt-get install libopenni2-dev

(有的教程表示 Boost >= 1.43,CMake >= 2.6,at least gcc 4.7.3 on Linux,so, 装过的朋友尽量装新版的API。)

4.2 从Github上clone PCL源码

 git clone https://github.com/PointCloudLibrary/pcl.git

4.3 编译PCL

  cd pcl
 mkdir release
 cd release
 cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr \
 -DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON \
 -DCMAKE_INSTALL_PREFIX=/usr ..
 make

4.4 安装

sudo make install

4.5 在自己的代码里,测试PCL点云显示(这步非常关键!)

测试代码pcl_test.cpp:

#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/console/parse.h>
 
 
int main(int argc, char **argv) {
    std::cout << "Test PCL !!!" << std::endl;
    
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
    uint8_t r(255), g(15), b(15);
    for (float z(-1.0); z <= 1.0; z += 0.05)
    {
      for (float angle(0.0); angle <= 360.0; angle += 5.0)
      {
	pcl::PointXYZRGB point;
	point.x = 0.5 * cosf (pcl::deg2rad(angle));
	point.y = sinf (pcl::deg2rad(angle));
	point.z = z;
	uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
		static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
	point.rgb = *reinterpret_cast<float*>(&rgb);
	point_cloud_ptr->points.push_back (point);
      }
      if (z < 0.0)
      {
	r -= 12;
	g += 12;
      }
      else
      {
	g -= 12;
	b += 12;
      }
    }
    point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
    point_cloud_ptr->height = 1;
    
    pcl::visualization::CloudViewer viewer ("test");
    viewer.showCloud(point_cloud_ptr);
    while (!viewer.wasStopped()){ };
    return 0;
}

CMakeLists.txt文件

cmake_minimum_required(VERSION 2.6)
project(pcl_test)

find_package(PCL 1.2 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(pcl_test pcl_test.cpp)

target_link_libraries (pcl_test ${PCL_LIBRARIES})

install(TARGETS pcl_test RUNTIME DESTINATION bin)

将pcl_test.cpp和CMakeLists.txt放在同一个文件夹下,如下图(具体文件夹没有要求)

执行:

cmake .
make
./pcl_test

4.6 然后报错:o(╥﹏╥)o 这个错误还是很常见的

bug: fatal error: pcl/visualization/pcl_visualizer.h: No such file or directory

这就体现了,运行测试代码的重要性,之前编译PCL都没有任何问题。

错误的原因是:没有正确安装好PCL库,PCL库的可视化需要依赖VTK库,所以如果没有提前装VTK,就会遇到这个问题。

解决方法:先装VTK和其他依赖包,再装PCL。(仔细一想,我是没有装VTK,惹)

4.7 安装VTK

4.7.1 在按照VTK之前,要安装依赖库X11,OpenGL和CMake-gui

首先安装X11

 sudo apt-get install libx11-dev libxext-dev libxtst-dev libxrender-dev libxmu-dev libxmuu-dev

安装OpenGL

sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev

安装 CMake-gui

sudo apt-get install cmake cmake-gui

4.7.2 下载VTK源代码

下载链接:https://www.vtk.org/download/

PCL和VTK可能存在版本需求,截止安装日2020年3月9日,PCL官网版本为1.11,(可以在/usr/include中寻找自己的PCL版本。)这里我下载的VTK版本是7.1.1,选择下图中的,VTK-7.1.1.tar.gz,下载完成后解压缩到文件夹中,自定义安装目录。(亲测可以使用。具体对应关系还不清楚惹。)

4.7.3 安装VTK

(1) 终端输入下指令,启动cmake-gui;

cmake-gui

(2) 设置where is the source code:的路径为文件夹VTK-7.1.1所在路径,如这里是/home/js/VTK-7.1.1;

(3) 设置where to build the binaries:的路径为/home/js/VTK-7.1.1/build,即在/home/VTK-7.1.1的路径下新建文件夹build;如下图

(4) 点击“Configure”,在弹出对话框中选择“Current Generator”为“Unix MakeFiles”,完成之后会提示“Configuring done”;

(5) 然后在里面勾选“VTK_GROUP_Qt”选项,再次点击“Configure”按钮,若提示警告信息,需要设置Qt安装路径,则设置路径后,再次点击“Configure”按钮;

(6) 提示“Configure done”,点击“Generate”按钮,在vtk_build会生成工程文件,完成之后会提示“Generating done”,如下图

(7) cd到vtk目录下的build文件夹,若没有则在使用$mkdir build来创建

(8) 终端输入,编译和安装

sudo make
sudo make install

至此,VTK安装完成!

4.8 卸载PCL

因为之前装了错误的PCL,所以需要卸载掉PCL,再重新安装。

终端内输入

sudo rm -r /usr/include/pcl-1.11 /usr/share/pcl-1.11 /usr/bin/pcl* /usr/lib/libpcl*
sudo apt-get remove libpcl-dev pcl-tools

即可。

4.9 重新安装PCL

因为已经安装好了依赖包,所以无需重新安装。重复4.2~4.4即可。

4.10 测试PCL

重复4.5步骤,此时不再显示错误,显示如下图形!

如果一开始不显示圆环(可能是一个矩形块)也不要紧,缩小即可见到。

PCL-1.11, VTK-7.1.1,Yes!


5. 重头戏来了!编译 LeGO-LOAM-BOR

因为一开始编译LeGO-LOAM出错,所以这次装一下优化版本LeGO-LOAM-BOR,希望不出错(事实证明只是我一厢情愿罢了)。

执行:

cd ~/catkin_ws/src
git clone https://github.com/facontidavide/LeGO-LOAM-BOR.git
cd ..
catkin_make

呃,非常抱歉,还是没有编译成功。

5.1 出错1

报错:

Invoking "cmake" failed
pip install -U rosdep rosinstall_generator wstool rosinstall six vcstools
Invoking "make cmake_check_build_system" failed
-- Could NOT find cv_bridge (missing: cv_bridge_DIR)

cv_bridge 是opencv和ros连接起来的桥,这个意思就是ROS缺少了cv_bridge,下面提供解决方案。

5.1.1 下载cv_bridge

git clone https://github.com/ros-perception/vision_opencv.git

5.1.2 找到下载文件地址,将vision_opencv中的cv_bridge/拿出来,放到工作空间(catkin_wa/src)中,编译:

cd ~/catkin_ws/src/cv_bridge
mkdir build
cd build
cmake ..
make
sudo make install

(1) 很不幸,编译不通过,报错:

Boost include path: /usr/include
Could not find the following Boost libraries:
boost_python37
No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the
directory containing Boost libraries or BOOST_ROOT to the location of Boost.

这个意思是,电脑里找不到boost_python37库,这个原因可能是装了其他的python版本。导致命名出现问题。

解决方案:进入/usr/lib/x86_64-linux-gnu文件夹中查看相关boost_python库,如图所示,发现没有boost_python37的相关库,只有python-py35的库。

我们要建立python-py35到python-py37的软连接。如果没找到python-py35而是找到了python-py3x(x为数字,可能为6,对应python3.6版本;可能为7,对应python3.7版本或者其他数字),解决方案相同,建立软连接即可。

即 py35.s0 -> py37.so py35.a -> py37.a,打开终端,输入

cd /usr/lib/x86_64-linux-gnu/
sudo ln -s libboost_python-py35.so libboost_python37.so
sudo ln -s libboost_python-py35.a libboost_python37.a

5.1.3 重新编译cv_bridge,重复(2)中操作

编译成功啦!


5.2 出错2

然后我们重新编译LeGO-LOAM-BOR,继续报错:

Could not find a package configuration file provided by "pcl_ros" with any of the following names:
pcl_rosConfig.cmake
pcl_ros-config.cmake

这个好解决,缺少pcl-ros

打开终端输入

sudo apt-get install ros-kinetic-pcl-ros

安装pcl-ros。

5.3 出错3

然后我们重新编译LeGO-LOAM-BOR,继续报错:

CMake Error at /home/js/catkin_ws/devel/share/ddynamic_reconfigure/cmake/ddynamic_reconfigureConfig.cmake:113 (message):
 Project 'ddynamic_reconfigure' specifies
 '/home/js/catkin_ws/src/ddynamic_reconfigure-kinetic-devel/include' as an
 include dir, which is not found. It does neither exist as an absolute
directory nor in

这个问题是缺少ddynamic_reconfigure

我们打开终端输入

sudo apt-get install ros-kinetic-ddynamic-reconfigure

安装ddynamic-reconfigure,然后将文件夹复制到catkin_ws/src中,如下图

5.4 出错4

然后我们重新编译LeGO-LOAM-BOR,继续报错:

make 66%时错误

error: return-statement with no value, in function returning ‘int’ [-fpermissive]
efine import_array() {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); return NUMPY_IMPORT_ARRAY_RETVAL; } }
note: in definition of macro ‘import_array’
efine import_array() {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); return NUMPY_IMPORT_ARRAY_RETVAL; } }
src/CMakeFiles/cv_bridge_boost.dir/build.make:62: recipe for target 'src/CMakeFiles/cv_bridge_boost.dir/module.cpp.o' failed
make[2]: *** [src/CMakeFiles/cv_bridge_boost.dir/module.cpp.o] Error 1
CMakeFiles/Makefile2:930: recipe for target 'src/CMakeFiles/cv_bridge_boost.dir/all' failed
make[1]: *** [src/CMakeFiles/cv_bridge_boost.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2

解决方法是,修改/home/js/catkin_ws/src/cv_bridge/src/module.hpp(根据自己的路径),将最后一段(36~40)行改为

static void do_numpy_import( )
{
 import_array( );
}

5.5 然后我们重新编译LeGO-LOAM-BOR,终于成功了!!

catkin_make


6. 跑包,在数据集上进行测试

6.1 针对LeGO-LOAM-BOR方法,在数据集上进行测试。

数据集地址:

https://github.com/TixiaoShan/Stevens-VLP16-Dataset​github.com

 

https://github.com/RobustFieldAutonomyLab/jackal_dataset_20170608​github.com

 

下载数据集,然后在catkin_ws中新建dataset文件夹,保存数据包,打开终端输入

cd ~/catkin_ws
mkdir dataset

然后拷贝数据包,如下图。

其中,nsh_indoor_outdoor.bag有国内百度网盘链接,提取码:l5rl

https://pan.baidu.com/s/1UswMElc81AKY8hnpmkjnrA​pan.baidu.com

 

打开终端,输入

roslaunch lego_loam_bor run.launch rosbag:=~catkin_ws/dataset/nsh_indoor_outdoor.bag lidar_topic:=/velodyne_points imu_topic:=/imu/data

其中,~catkin_ws/dataset/nsh_indoor_outdoor.bag 为数据集绝对路径,也可以cd进数据集文件夹,输入相对路径。其中,/imu/data是可选的

但是,很遗憾,失败了,提示无法打开数据包。

6.2 针对LeGO-LOAM-BOR方法,实时建图。

也不知道这个方法啥原因,我决定再试试给个机会,基于VLP雷达实时建图试试。

(1)首先要修改run.launch,可以另存为run1.launch:

<launch>
    
    <!--- Sim Time -->
    <param name="/use_sim_time" value="false" />

    <!--- Run Rviz-->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find lego_loam_bor)/launch/test.rviz" />

    <!--- TF -->
    <node pkg="tf" type="static_transform_publisher" name="camera_init_to_map"  args="0 0 0 1.570795   0        1.570795 /map    /camera_init 10" />
    <node pkg="tf" type="static_transform_publisher" name="camera_to_base_link" args="0 0 0 -1.570795 -1.570795 0        /camera /base_link   10" />
    <!--- 根据雷达和小车相对位置确定 -->
    <node pkg="tf" type="static_transform_publisher" name="base_link_to_velodyne" args="0 0 0 0 0 0      /base_link  /velodyne 10" />  
    <!--- LeGO-LOAM    
    <arg name="rosbag"  default=""/>
    <arg name="imu_topic" default="/imu/data"/>
    <arg name="lidar_topic" default="/velodyne_points"/>
    --> 
    <rosparam file="$(find lego_loam_bor)/config/loam_config.yaml" command="load"/>

    <node pkg="lego_loam_bor" type="lego_loam_bor"    name="lego_loam_bor"    output="screen" >
<!--
       <remap from="/lidar_points" to="$(arg lidar_topic)"/>
       <remap from="/imu/data" to="$(arg imu_topic)"/>
       <param name="rosbag"      value="$(arg rosbag)" type="string" />
       <param name="imu_topic"   value="$(arg imu_topic)" type="string" />
       <param name="lidar_topic" value="$(arg lidar_topic)" type="string" />

       <remap from="/imu/data" to="/imu"/>
--> 
       <remap from="/lidar_points" to="/velodyne_points"/>

    </node>

</launch>

(2)启动Velodyne16激光雷达

roslaunch velodyne_pointcloud VLP16_points.launch

(3)启动LeGO-LOAM-BOR

roslaunch lego_loam_bor run1.launch

可以正常启动,但是建图效果十分怪异,无法进行旋转,只是一个二维的,不给机会了,换回原来的方法!


7 删除LeGO-LOAM-BOR,重新下载编译LeGO-LOAM

7.1 编译LeGO-LOAM

我怀疑可能是LeGO-LOAM-BOR算法的问题,也有可能是我的问题。不管了,我准备卸载掉LeGO-LOAM-BOR,重新编译LeGO-LOAM。

搜索LeGO-LOAM-BOR,将所有与LeGO-LOAM-BOR相关的文件、文件夹都删去

因为LeGO-LOAM-BOR和LeGO-LOAM需要的依赖库相同,所以无需重复安装依赖库,直接下载编译即可。

cd ~/catkin_ws/src
git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git
cd ..
catkin_make -j1

编译完成示意图:

7.2 跑包,在数据集上进行测试LeGO-LOAM

打开终端输入

roslaunch lego_loam run.launch

cd到数据集文件夹下面,重新开启一个终端,输入

rosbag play --clock nsh_indoor_outdoor.bag

或者是

rosbag play nsh_indoor_outdoor.bag --clock --topic /velodyne_points /imu/data

(也可以输入数据集绝对路径)

即可看到数据集运行效果

也可以更换数据集,

rosbag play --clock 1.bag

其他数据集加载方式完全相同。


8 与Velodyne VLP-16 三维激光雷达连接

VLP-16与计算机采用网线连接,而不是2D雷达多采用USB连接。

此时,出现了一个问题,终端输入ifconfig,找不到有限网卡,只有lo,无线网卡,并没有表示eth0等的有限网卡。

8.1 尝试重新装有限网卡驱动

尝试了重新装有限网卡驱动,首先

lspci | grep -i net. 

找网络控制器,lspci. 找所有硬件设备,很抱歉,一串字母,我也不知道这个设备是什么网卡。如果有了解这个啥意思的欢迎留言告诉~

查阅了网上的资料,应该是I219-V网卡,对应的驱动型号是e1000e。从

Download Intel® Network Adapter Driver for PCIe* Intel® Gigabit Ethernet Network Connections under Linux*​downloadcenter.intel.com

 

下载了网卡驱动,直接下载点击安装即可。

下载了两个版本:3.8.4和3.5.1,进行安装。

但是,并没有work,无法安装上有限网卡驱动,我怀疑是有限网卡驱动已经安装了。

8.2 尝试重新启动网络管理服务

该操作针对有线连接图标不见,ifconfig查看也无网卡的情况。

但是,并没有work,可能是由于这个解决方案是针对有线连接的图标不见的情形,并不是现在遇到的现在的找不到有限网卡的情形。

8.3 尝试更新系统内核

查阅了网上资料,有人也遇到同样的问题,他通过更新内核解决了,我于是也是尝试更新一下。

键入:uname -r

可以查看当前内核版本:目前是5.2.20

准备更新的内核:5.6.16

8.3.1 开始升级内核。先安装升级所需的libssl1.1

wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb
sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb

8.3.2 下载内核

地址:https://kernel.ubuntu.com/~kernel-ppa/mainline/

选择 5.6.16

选择下面amd64中,标框的4个deb包。

直接下载即可

8.3.3 安装内核

然后双击安装即可,安装的顺序是 headers_all, headers_generic, modules_generic, image_generic。(不依照也没事,它会提示有依赖关系)。也可以sudo dpkg -i linux-*(包名)安装,但是直接安装更简单。

安装完执行sudo update-grub后重启计算机

打开终端即可看到内核已经更新( uname -r 也可以),5.6.16-050616-generic

8.4 查看有限网卡

打开终端输入 ifconfig,终于!出现了有限网卡eno1。原来就是内核版本的问题。

8.5 新建有线连接

新增有限连接网络 VLP-16 (名称任意设置)

然后选择IPV4 Settings,方法选为 Manual,更改网络配置。

address: 192.168.1.77 
netmask: 255.255.255.0 
gateway: 192.168.1.1

然后点击保存。(注意IP地址的77,可以为1到254除开201以外的所有值,因为201是激光雷达的默认IP。)

8.6 安装ROS依赖包(激光雷达驱动)

sudo apt-get install ros-kinetic-velodyne

PS: kinetic:与机器安装的ROS版本一致。

8.7 创建ROS工程

mkdir -p catkin_velodyne/src
cd catkin_velodyne/src
git clone https://github.com/ros-drivers/velodyne.git
cd ..
rosdep install --from-paths src --ignore-src --rosdistro kinetic -y
catkin_make
source devel/setup.bash

编译一切正常,准备与雷达连接。

8.8 开始连接雷达

Velodyne雷达与电脑网线连接,并给雷达供电(12V),可以发现右上角图标更换。

打开网络连接界面,可以发现网络已经连接。

在更新内核之前,是怎么都连接不上的!

当然,这也就意味着NUC无法通过WIFI上网了。需要联网的工作,尽量选择在之前完成。

此时,打开网页,网址处输入192.168.1.201,会弹出激光雷达的参数界面:

这表明,雷达连接一切正常。

8.9 测试雷达

打开终端,输入

 roslaunch velodyne_pointcloud VLP16_points.launch

打开新的终端,输入下式,可以打开rviz,进行结果可视化

rosrun rviz rviz -f velodyne

不过刚打开是啥都没有的,需要自己订阅。

首先点击Add,添加pointsCloud2,

然后会发现左边的目录中多了个PointsCloud2,在该目录下点击topic,选择/velodyne_points,

即可以看到三维点云信息,如下图。

在终端中输入,可以记录数据:

rosbag record -o xxx.bag topic -name

比如velodyne_points,只保存/velodyne_points这个topic的数据(可以用rostopic list -v开看当前可用的topic),保存在当前目录的out.bag当中。

想简单点就

rosbag record -a

不过这个应该是保存了所有内容,所以体量非常大。

下图是连接激光雷达与NUC。


9 实时建图:算法和雷达交互

这里只针对LeGO-LOAM方法

首先,将LeGO-LOAM包里的run.launch文件进行修改,只需要将文件第4行中的true改成false即可,即

<param name="/use_sim_time" value="false" />

因为第4行 true表示虚拟运行,false表示真机器人运行。(之前的适用于LeGO-LOAM-BOR方法的launch文件不用管了)

打开终端输入

roslaunch velodyne_pointcloud VLP16_points.launch

再打开一个终端输入

roslaunch lego_loam run.launch

即可显示建图信息。(这是俺的教研室)

打开终端输入 rosbag record -a可以记录当前的数据。

运行结束后,打开两个终端,输入

roslaunch lego_loam run.launch
rosbag play --clock xxxxx.bag

xxxxx为自己保存的包名字。

即可以跑自己做出来的数据集。效果如下图,因为保存了所有的topic,所以内容会比较多。


10 小车及大范围场景的实时建图

装车

远距离通讯采用的是INSIGHT实时图传设备

办公室走廊实时建图

环土木交通楼实时建图

参考文献

https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/

https://github.com/facontidavide/LeGO-LOAM-BOR/tree/speed_optimization

https://blog.csdn.net/acyddlm/article/details/82974012

https://blog.csdn.net/fsencen/article/details/79386570

https://blog.csdn.net/weixin_41827934/article/details/90175635

https://blog.csdn.net/qq_29761791/article/details/94135193

https://www.cnblogs.com/winslam/p/12074432.html

http://www.bubuko.com/infodetail-3341579.html

http://blog.sina.com.cn/s/blog_c0468c8f0101ld2x.html

https://blog.csdn.net/qq_39346534/article/details/108617770

https://blog.csdn.net/yehe111/article/details/106800025/

https://blog.csdn.net/MIRANA0/article/details/106696334

https://www.jb51.net/article/192497.htm

https://blog.csdn.net/sinat_36502563/article/details/102996736

https://blog.csdn.net/m0_37931718/article/details/106612478

https://blog.csdn.net/mrh1714348719/article/details/103896168

https://blog.csdn.net/learning_tortosie/article/details/86527542

https://blog.csdn.net/qq_43535779/article/details/102579230

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从0.3开始搭建LeGO-LOAM+VLP雷达+小车实时建图(保姆级教程,小白踩坑日记) 的相关文章

随机推荐

  • 用Windbg解决一个Bug

    摘要 可以看到无论对于开发还是测试人员 windbg很多时候可以帮我们快速的定位问题 如果借助符号文件 Windbg完全可以实现比VC IDE更强大的调试供功能 并且有时候我们不需要源代码 不需要重新编译 直接就可以通过windbg调试和解
  • 对称加密和非对称加密

    对称加密 什么是对称加密 对称加密就是指 加密和解密使用同一个密钥的加密方式 对称加密的工作过程 发送方使用密钥将明文数据加密成密文 然后发送出去 接收方收到密文后 使用同一个密钥将密文解密成明文读取 对称加密的优点 加密计算量小 速度块
  • llinux 开发环境环境配置

    1 安装好Ubuntu后 关闭软件中的更新及检测 2 安装vmware tool 不用sudo mount t vmhgfs host mnt hgfs 不用vmhgfs fuse host mnt hgfs命令挂载 只要在安装VMware
  • C++常用函数之sort函数,头文件 algorithm

    1 sort 函数是C 标准库中的排序函数 头文件为algorithm 2 sort 函数时间复杂度 我们最熟悉的冒泡排序和选择排序的时间复杂度过高o nn 不能满足我们写题的需要 sort函数的排序方法类似于快排方法 时间复杂度为nlog
  • 图示电路中的等效电阻rab_可调电阻即电位器,各种敏感电阻的介绍和使用(电阻二)...

    上一篇讲了固定阻值电阻器 这一篇主要讲可变电阻 和敏感电阻器 电位器是一种阻值可以通过调节而变化的电阻器 又称可变电阻器 电位器和图形符号 电位器结构示意图 电位器有A C B三个引出极 在A B极之间连接着一段电阻体 该电阻体的阻值用RA
  • ctfshow-网络迷踪-密集恐惧( 世界上最大的飞机墓地)

    ctf show 网络迷踪模块 密集恐惧关卡 这一关的图片给了一个很荒凉的地方 里面有很多飞机 看样子是荒废很久了 推荐使用百度识图获取具体的地点 在通过百度搜索得到具体的经纬度 将图片下载到本地 像是一个荒凉的农场 里面有很多飞机 很明显
  • 人脸识别引擎SeetaFaceEngine中Alignment模块使用的测试代码

    人脸识别引擎SeetaFaceEngine中Alignment模块用于检测人脸关键点 包括5个点 两个眼的中心 鼻尖 两个嘴角 以下是测试代码 int test alignment std vector
  • QT关闭标题栏setWindowFlags不生效问题

    QT关闭标题栏setWindowFlags不生效问题 setWindowFlags不生效原因 主窗口使用该函数时可以正常关闭标题栏 但是当子窗口MyQDialog新建中使用到this时 并使用这个函数并不能正常闭关标题栏 问题在于这个thi
  • 常用的 c++ 函数汇总(持续更新)

    1 数组 列表类 1 列表初始化 vector
  • 2022年蓝队初级护网总结

    1 设备误报如何处理 答 来自外网的误报说明安全设备需要进行策略升级 不需要处置 如果是来自内网的误报可以和负责人协商一下看能不能解决 有必要的话添加白名单处理 2 如何区分扫描流量和手工流量 答 1 扫描流量数据量大 请求流量有规律可循且
  • 秒杀超卖 解决方案(史上最全)

    文章很长 建议收藏起来慢慢读 疯狂创客圈总目录 语雀版 总目录 码云版 总目录 博客园版 为您奉上珍贵的学习资源 免费赠送 经典图书 Java高并发核心编程 卷1 面试必备 大厂必备 涨薪必备 加尼恩免费领 免费赠送 经典图书 Java高并
  • mysql连接

    package com bochy jdbc import java sql Connection import java sql DriverManager author zhaoYuguang version 1 0 链接Mysql数据
  • 热更新_ToLua学习示例 05_LuaCoroutine

    Lua文件名字 这个是个 bytes后缀的文本 跟xlu里面用txt文件放lua代码一样外面拖拽赋值 public TextAsset luaFile null Lua状态 private LuaState lua null 这个类继承Mo
  • 【超详细】SSM框架项目实战

    相关资料网盘链接 CRM客户管理系统资料 提取码 0u04 P1 CRM阶段简介 web项目开发 如何分析 设计 编码 测试 形成编程思想和编程习惯 P2 CRM的技术架构 视图层 View 展示数据 跟用户交互 html css js j
  • Unity3d打开的时候,卡在loading界面白屏的解决方法

    本文首发于 洪流学堂 公众号 洪流学堂 让你快人几步 你好 我是你的技术探路者郑洪智 你可以叫我大智 vx zhz11235 Unity3d打开的时候 当遇见卡Loading的时候 可以看看Editor log C Users
  • 12.6 包的声明和访问

    包的概念 java的包 其实就是我们电脑系统中的文件夹 包里存放的是类文件 当类文件很多的时候 通常我们会采用多个包进行存放管理他们 这种方式称为分包管理 在项目中 我们将相同功能的类放到一个包中 方便管理 并且日常项目的分工也是以包作为边
  • 使用cmake工具多文件编译

    使用cmake工具多文件编译 创建CMakeLists txt project PEOPLE add executable my cmake people main cpp people cpp ctrl shift p 为了生成build
  • 多线程(七)线程池

    线程池 又是一个池 我们已经见识过很多池了 数据库连接池 字符串常量池 那我们这个线程池又是个啥呢 我们提前将线程准备好 需要用的时候直接取 不需要用的时候 在直接还回去 这样就不需要去从系统中申请了 这样做 最大的好处就是减少每次启动 销
  • 十大排序算法-----归并排序

    归并排序 原理 归并排序是一种概念上最简单的排序算法 归并排序是基于分治法的 归并排序将待排序的元素序列分成两个长度相等的子序列 为每一个子序列排序 然后再将他们合并成一个子序列 合并两个子序列的过程也就是两路归并 算法基本步骤 1 申请空
  • 从0.3开始搭建LeGO-LOAM+VLP雷达+小车实时建图(保姆级教程,小白踩坑日记)

    背景 SLAM小白 因为项目需要花了两天时间编译代码 连接雷达实现了交互 踩了很多坑 简单记录一下 让后面感兴趣的朋友少走点弯路 肯定有很多不专业的 错误的地方 还请大家不吝赐教 噗通 也可以见知乎 https zhuanlan zhihu