持续更新....
最近在看SLAM十四讲相关内容,顺便跑一跑快半年没有开过的虚拟机
本期在Ubuntu20上跑一跑《视觉SLAM十四讲》中提到的代码,按照顺序,从第二讲开始
本文在ROS上运行cpp代码,一方面ROS与后续内容兼容性强,另一方面ROS的cpp功能做得已经十分完善了。
颜色代码
蓝色
红色
绿色
前期准备
- 有些Ubuntu相关的代码和ROS基础等,笔者放在了上一期:SLAM十四讲学习笔记 第一期:Ubuntu复健计划
- 本期所有代码均放在主页面下的
Slam_ws
工作空间下 - 将不同讲分类成了不同功能包
创建与编译工作空间
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