SLAM十四讲学习笔记 第二讲:部分课后实践代码


最近在看SLAM十四讲相关内容,顺便跑一跑快半年没有开过的虚拟机
本期在Ubuntu20上跑一跑《视觉SLAM十四讲》中提到的代码,按照顺序,从第二讲开始

代码库
https://github.com/gaoxiang12/slambook2

本文在ROS上运行cpp代码,一方面ROS与后续内容兼容性强,另一方面ROS的cpp功能做得已经十分完善了。

颜色代码
蓝色
红色
绿色

前期准备

创建与编译工作空间

mkdir -p ~/Slam_ws/src
cd ~/Slam_ws/src
catkin_init_workspace 
cd ../
catkin_make

记得source!

第二讲

实验一:简单输出

创建功能包

cd ~/Slam_ws/src
catkin_create_pkg Lec2

新建hello.cpp

#include <iostream>

int main()
{
    
    
  std::cout << "Hello, SLAM!" << std::endl;
  return 0;
}

编辑CMakeLists.txt
打开CMakeLists.txt文件在最后面添加以下行:

此处暂时不需要添加库

add_executable(HelloSlam hello.cpp)
target_link_libraries(HelloSlam ${
    
    catkin_LIBRARIES})

编译后运行

cd ~/Slam_ws
catkin_make
source devel/setup.bash
rosrun Lec2 HelloSlam 

显示结果
在这里插入图片描述

第五讲

任务一:imageBasics(Ubuntu配置opencv)

配置opencv3.X
参考这篇文章 Ubuntu20安装OpenCV3(图解亲测)

检验是否配置成功

pkg-config opencv --modversion

在这里插入图片描述


创建功能包

cd ~/Slam_ws/src
catkin_create_pkg lec5  # 尽量选择小写,符合功能包命名标准

搬运源代码
将源代码中的三个小功能包搬过来,最后的结构如下:
在这里插入图片描述

修改主文件夹的CMakeLists.cpp
为了适配ROS环境(主要是加了一个catkin的包),对ROS自动生成的CMakeLists.txt稍加修改:

## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)

# 其他地方不做修改
# ....
# ....
# ....
# ....
# 在最后面加上源代码在主功能包下的配置信息:

# Eigen
include_directories("/usr/include/eigen3")

# 寻找OpenCV库
find_package(OpenCV REQUIRED)
# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})

add_subdirectory(imageBasics)
# add_subdirectory(stereo)
# add_subdirectory(rgbd)

修改undistortImage.cpp中读取图片的格式,使其和imageBasics.cpp一致

cv::Mat image = cv::imread(argv[1]);   // 图像是灰度图,CV_8UC1
// 判断图像文件是否正确读取
if (image.data == nullptr) {
    
     //数据不存在,可能是文件不存在
  cerr << "文件" << argv[1] << "不存在." << endl;
  return 0;
}

编译后运行

cd ~/Slam_ws
catkin_make
source devel/setup.bash

运行
【要在虚拟机运行,SSH远程连接无法直接在Windows端显示虚拟机中的新窗口】

rosrun lec5 imageBasics ~/Slam_ws/src/lec5/imageBasics/ubuntu.png
rosrun lec5 undistortImage ~/Slam_ws/src/lec5/imageBasics/ubuntu.png

在这里插入图片描述

任务二:双目匹配点云(Ubuntu配置pangolin)

配置pangolin
参考Ubuntu20.04 —— 新系统从头安装ORB-SLAM3过程(2022年)

大哥的这个文档里说Pangolin只有v0.6能用,事实上最新版也能用

如果在cmake时,遇到以下错误:在这里插入图片描述
是因为没有pybind11
事实上笔者只遇到了这一个问题,但是这个问题在网上没找到合适的解决方法

其实主要原因一句话就说明白了:库里的pybind是空的,需要另外下载后导入
可以看我的这篇博客Ubuntu20下载Pangolin

检验是否配置成功

检验部分我认为可以加深对CMake的理解

  • 进入Pangolin/examples/HelloPangolin/
  • 进行编译
    # 进入examples/HelloPangolin/目录下
    mkdir build && cd build
    cmake ..
    make
    
  • 运行
    ./HelloPangolin
    
  • 运行结果
    在这里插入图片描述
    可以看到,在v0.6和最新版都能运行起来

修改主文件夹的CMakeLists.cpp
把任务一中注释掉的

# add_subdirectory(stereo)

解注释即可

编译后运行

cd ~/Slam_ws
catkin_make
source devel/setup.bash

运行
【要进入stereo文件夹下,不然读不到图片】

cd ~/Slam_ws/src/lec5/stereo/
rosrun lec5 imageBasics ~/Slam_ws/src/lec5/imageBasics/ubuntu.png

在这里插入图片描述

任务三:rgbd匹配点云(Ubuntu配置Sophus)

配置sophus
参考ubuntu20.04 安装 Sophus库 slambook2

下文的CMakeLists.txt也是搬运自该文章

检验是否配置成功
查看/usr/local/include下是否已经有sophus文件夹
在这里插入图片描述

修改rgbd的CMakeLists.txt
完成配置后,仍不可直接catkin_make,需要修改CMakeLists.txt
全部替换为:

cmake_minimum_required( VERSION 2.8 )
project(rgbd)

##  使用模板类sophus
# set(Sophus_DIR "/usr/local/sophus-template/share/sophus/")
#或 
set(Sophus_INCLUDE_DIRS "/usr/local/sophus-template/include")
##set(Sophus_LIBS )

# 为使用 sophus,需要使用find_package命令找到它
find_package(Sophus REQUIRED)

find_package(Pangolin REQUIRED)
find_package(OpenCV REQUIRED)

include_directories(
	${Sophus_INCLUDE_DIRS}
	${OpenCV-INCLUDE_DIRS}
)
include_directories("/usr/local/include/eigen3")

add_executable(joinMap joinMap.cpp)
target_link_libraries(joinMap ${OpenCV_LIBS})
target_link_libraries(joinMap ${Pangolin_LIBRARIES})
target_link_libraries(joinMap ${Sophus_LIBS} fmt)

其作用是添加了eigon和fmt依赖。

修改主文件夹的CMakeLists.cpp
把任务一中注释掉的

# add_subdirectory(rgbd)

解注释即可

编译与运行

cd ~/Slam_ws
catkin_make
source devel/setup.bash

运行
【要进入rgbd文件夹下,不然读不到位置文件】

cd ~/Slam_ws/src/lec5/rgbd/
rosrun lec5 joinMap

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51772802/article/details/131579851
今日推荐