一、源码下载
1.1 SMMR源码获取及依赖安装
1.1.1源码获取
或者利用git命令获取源码到工作空间
mkdir -p test_ws/src
cd test/src
git clone https://github.com/efc-robot/SMMR-Explore.git
1.1.2依赖安装
1.pip安装torch,官方给的是下图中的命令,但是下载的太慢了,这里我们利用清华源加速下载 。
替换的命令如下:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision
2. 针对 Github中SMMR给出的四个依赖安装方式如下,我们将其更改为适合Ubuntu20.04版本的安装指令。
在Ubuntu20.04中安装四个依赖的命令如下:
sudo apt install ros-noetic-turtlebot3*
sudo apt install liborocos-bfl-dev
pip install future
sudo apt install ros-noetic-teb-local-planner
1.2 Cartographer-for-SMMR源码获取
1.2.1源码获取
Github上Cartographer-for-SMMR源码下载地址
将其与SMMR源码放到同一工作空间中的src下,新开终端,输入依次以下命令。
cd test_ws/src
git clone https://github.com/efc-robot/Cartographer-for-SMMR.git
获取的源码如下图所示:
!!!另外需要说明的是,Cartographer-for-SMMR文件夹下有三个子文件夹,我们需要在Cartographer-for-SMMR文件夹下新建一个src文件夹,将原来的三个子文件夹放到src文件夹下,方便后续编译。如下图所示:
1.2.2依赖安装
一些基本的库和工具
sudo apt-get update
sudo apt-get install -y python3-wstool python3-rosdep ninja-build stow
!!!这里我们仅介绍一些基本的依赖安装,编译的过程中会遇到很多因缺少依赖而产生的报错,具体报错及解决将在第三节具体说明。
二、增加OpenCV3.2.0版本
此项目原来是在Ubuntu18.04中进行部署的,适配的OpenCV版本是3.2.0,而Ubuntu20.04安装ROS后自带的OpenCV版本是4.2.0,SMMR源码中涉及到的一些OpenCV的函数已被删除或更改名称,修改源代码的话台非常麻烦,这里我们选择直接在系统中增添一个OpenCV3.2.0。
需要注意的是,我们不需要删除ROS自带的OpenCV4.2.0,两个版本的OpenCV是可以共存的,使用的时候在Cmakelists文件和系统配置文件中指定需要的OpenCV版本路径即可,具体更改下面展示。
2.1 OpenCV3.2.0源码获取
1.首先,进入到Github中找到opencv的页面
https://github.com/opencv/opencv
2.点击下图红框的releases。
3.进入到该页面后,大概在第五页左右,找到OpenCV3.2.0版本,点击Assets,点击红框的压缩包开始下载。
4.下载后将其解压到某一文件夹中,如下图所示:
2.2OpenCV3.2.0编译及安装
2.2.1 安装所需依赖
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
2.2.2 修改OpenCV3.2.0代码
我使用的是vscode编辑器。修改两处源码防止后面编译报错,具体修改如下:
(1)找到 ~/opencv-3.2.0/modules/videoio/src下的cap_ffmpeg_impl.hpp文件,增加下图中红框内的三行代码。
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
(2)找到~/opencv-3.2.0/modules/python/src2下的/cv2.cpp文件,修改第730行的代码,集体修改如下:
char* str = PyString_AsString(obj);
改为
char* str = (char *)PyString_AsString(obj);
2.2.3 开始编译及安装
#以下命令都是一行一个命令,按顺序完成
cd ~/software/opencv-3.2.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local/opencv320 -D ENABLE_PRECOMPILED_HEADERS=OFF ..
make -j12
sudo make install
!!!!!!!!!!!!!!!!!!!说明!!!!!!!!!!!!!!!!!!!!
执行cmake命令时可能会报下面的错误,错误如下:
这是因为网络问题,这里我们选择手动下载ippicv_linux_20151201.tgz,下载为网站如下:https://github.com/lonesoul/ippicvhttps://github.com/lonesoul/ippicv
或者可以使用给git下载,在~/opencv-3.2.0/3rdparty/ippicv/downloads/新开终端,输入以下命令:
git clone https://github.com/lonesoul/ippicv.git
将文件复制到指定的文件夹下:
之后我们重新cmake编译下,在build文件夹中新开终端,输入如下命令:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_PERF_TESTS=OFF -D WITH_CUDA=OFF -D WITH_IPP=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF -D CMAKE_INSTALL_PREFIX=/usr/local/opencv320 ..
如下是cmake成功的结果:
接下来我们开始编译,输入make -j12命令 ,编译时间有点久,编译成功如下图所示:
另外,命令中的-j12根据自己的电脑进行配置,我的电脑是12,查看步骤如下:
点击Ubuntu左下角,打开“系统监视器”。
查看下方红框内CPU的数量,即可利用的最大核数,即-j后面的最大数字,不要超过这个数字。
最后进行安装,输入:
sudo make install
安装过程会很快,下面是安装完成后的情况,可以看到安装路径在/usr/local/opencv320,也就是我们在cmake时指定的安装路径。
进入到 /usr/local/文件夹下,我们可以看到已经安装好的OpenCV3.2.0:
在~/opencv320/include/中可以看到opencv2,我们要用到这个opencv2的路径。
2.2.4 修改cmake文件
!!!要想要后续SMMR编译成功。我们还需要修改两个文件:
(1)修改cv_bridgeConfig.cmake文件
打开终端,输入以下命令,打开cv_bridgeConfig.cmake文件:
sudo gedit /opt/ros/noetic/share/cv_bridge/cmake/cv_bridgeConfig.cmake
打开文件后,找到第94、96行,将/usr/include/opencv4修改为我们刚刚安装的opencv320中/include/opencv2,具体修改如下:
修改前:
修改后:
修改完成后保存。
(2)修改image_geometryConfig.cmake文件
打开终端,输入以下命令,打开image_geometryConfig.cmake文件:
sudo gedit /opt/ros/noetic/share/image_geometry/cmake/image_geometryConfig.cmake
打开文件后,找到第94、96行,修改和上面一样,具体修改如下:
修改前:
修改后:
这样OpenCV3.2.0就配置好啦
三、编译Cartographer-for-SMMR
3.1 编译
进入到cartographer-for-SMMR文件夹下,打开终端,输入如下命令:
catkin_make_isolated --install
3.2 报错及解决方法
(1)缺少ceres库
解决方法:
下载ceres库,新开终端,输入如下命令:
sudo apt install libceres*
之后,重新编译~
(2)缺少absl库
解决方法:
进入到~/cartographer-for-SMMR/src/cartographer-master/scripts中,打开终端,输入如下命令,下载absl库。
./install_abseil.sh
下载并安装成功如下图所示:
之后,重新编译~
(3)Lua版本问题
解决方法:
下载Lua库,新开终端,输入以下命令:
sudo apt install liblua*
之后,重新编译~
(4)缺少gmock库
解决方法:
下载gmock库,新开终端,输入以下命令:
sudo apt install libgmock-dev
之后,重新编译~
最后我们编译成功!
之后我们打开./bashrc文件,添加如下语句:
到此Cartographer-for-SMMR的编译完成~
四、SMMR编译
4.1编译
进入到SMMR-Explore文件夹下,打开终端,输入如下命令:
catkin_make
最后我们可以编译成功:
至此,SMMR-Explore部分也编译完成~
4.2源码修改
(1)用vscode打开SMMR-Explore源码,检查所有功能包中的.py文件,将最顶端的一行修改,修改如下:
修改前:
修改后:
(2)cpu设置
找到matchStamps2tf_pointnet_map_tf.py文件,具体路径为~/test_ws/SMMR-Explore/src/smmr_explore_wrapper/scripts/matchStamps2tf_pointnet_map_tf.py。
如果电脑是AMD的,没有CUDA功能的话则释放第71行,注释掉第70行。
---------------------------------------------------------------------------------------------------------------------------------到此,SMMR项目在Ubuntu20.04上部署完成,之后的工作开会进行调试源码,跑仿真,并部署到实车。
参考文章:
ubuntu20.04安装opencv 3.2.0以及cv_bridge踩坑记录_ubuntu安装opencv-3.2.0-优快云博客