slam开发常用轮子
slam工程涉及诸多算法知识和开发基础,记录下学习slam时用到轮子配置,不定时补充更新。
容易遇到的神坑:
- 电脑配置低,内存小,make编译过程中随机卡死,需要在编译前临时修改swap分区
- yaml-cpp源码编译安装的版本与ROS中的yaml-cpp冲突,导致编译出错“undefined reference to `vtable for YAML::BadConversion’……”
- git clone 下载大型源码的时候,网速不给力,可以直接在国内的码云上在线复制一份,然后基于gitee下载,速度神快!
ubuntu 进入高性能模式
ubuntu下cpu默认运行在节能模式下,会比较慢,可以通过以下方式进行设定
sudo apt-get install cpufrequtils
cpufreq-info // 查看当前cpu的状态
sudo cpufreq-set -g performance // 设置为performace模式
为了能够有可视化的看到当前模式
sudo apt-get install indicator-cpufreq
重启电脑后,屏幕右上角出现一个类似SD卡形状的图标,鼠标点击既可以看到当前模式
拼音输入法
安装以下依赖项:
sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin
- 在language support里面将keyboard input method system设置为fcitx3
- 重启
- 打开fcitx configuration,搜索google-pinyin,并添加(注意要取消Only show current language前面的对勾,不然可能搜索不到)
- 最后便可以Ctrl+Space组合按键进行切换
远程桌面及ssh
有屏幕的话直接开发很爽快,但是如果经常需要在windows & ubuntu上切换工作的话,最便捷的方法是:windows利用vncviewer网络登录查看图像界面,不需要图形界面的话,直接ssh登录即可;windows上的文件利用sftp上传更新至ubuntu即可。
远程桌面配置
安装vncserver
sudo apt-get install xrdp vnc4server xbase-clients dconf-editor
安装dconf-editor
sudo apt-get install dconf-editor
打开dconf-editor, 依次展开org->gnome->desktop->remote-access,并取消勾选 “require-encryption”。
找到“设置”-“共享”-“屏幕共享”,进行如下设置,密码自己定义即可
Windows端直接使用vncviewer输入ubuntu的IP地址即可登录。(前提是两个系统在同一个网段下)
在没有屏幕的情况下,ssh可以起到临时登录操作的作用,配合sftp,可以在windows下写代码然后传输至ubuntu端
sudo apt-get install openssh-server
启动ssh服务
sudo ps -e | grep ssh" --> 回车 --> 有 sshd,说明 ssh 服务已经启动,如果没有启动,执行下面命令:
sudo service ssh start
查看ip地址后,使用putty登录即可
设置开机启动:
sudo vi /etc/rc.local
在exit 0语句前加入
/etc/init.d/ssh start
修改ubuntu swap分区大小(临时,重启失效)
对于低配置的PC或者ARM板卡,如果要编译安装的库比较大,而系统内存不够的话,容易出现编译过程中卡死的情况,因此有必要预先修改swap大小。
查看内存及swap空间的大小
free -h
修改步骤如下
(其中of=是指创建的文件名称,创建4G(bs*count)的swap)
(vm.swappiness 越大,使用率越高 0~100范围内)
cd /
sudo dd if=/dev/zero of=/swapfile bs=1M count=4k
sudo mkswap swapfile
sudo swapon swapfile
sudo sysctl vm.swappiness=60
修改完毕后,再次使用free -h命令查看内存及swap分区大小
Eigen
开源线性代数库,基于C++实现,提供了快速的有关矩阵的线性代数运算。
sudo apt-get install libeigen3-dev
安装位置在 “/usr/include/eigen3/”中,因此在使用过程中需要在CMakeLists.txt里指定Eigen的头文件目录
include_directories("/usr/include/eigen3")
在使用时,尤其需要注意的是
如果STL容器中的元素是Eigen库数据结构,例如这里定义一个vector容器,元素是Matrix4d ,如:
vector<Eigen::Matrix4d>;
编译不会出错,只有在运行push_back()的时候出错。解决的方法很简单,定义改成下面的方式:
vector<Eigen::Matrix4d,Eigen::aligned_allocator<Eigen::Matrix4d>>;
其实上述的这段代码才是标准的定义容器方法,只是一般情况下定义容器的元素都是C++中的类型,所以可以省略,这是因为在C++11标准中,aligned_allocator管理C++中的各种数据类型的内存方法是一样的,可以不需要着重写出来。但是在Eigen管理内存和C++11中的方法是不一样的,所以需要单独强调元素的内存分配和管理。
Sophus
李代数运算库
git clone https://github.com/strasdat/Sophus.git
cd Sophus
git checkout a621ff
mkdir build
cd build
cmake ..
make
sudo make install
在make时,发生错误。提示错误如下:
Sophus/sophus/so2.cpp:33:26:error: lvalue required as left operand of assignment
unit_complex_.real() = 1.;
Sophus/sophus/so2.cpp:33:26:error: lvalue required as left operand of assignment
unit_complex_.imag() = 1.;*
此时需要修改Sophus/sophus/so2.cpp文件,将33行的
SO2::SO2()
{
unit_complex_.real() = 1.;
unit_complex_.imag() = 0.;
}
修改为
SO2::SO2()
{
unit_complex_.real(1.);
unit_complex_.imag(0.);
}
https://blog.csdn.net/haxiongha/article/details/82464148
CMakeLists.txt写法
find_package( Sophus REQUIRED )
include_directories( ${Sophus_INCLUDE_DIRS} )
target_link_libraries( joinMap ${Sophus_LIBRARIES} )
vtk
VTK,全称是Visualization Toolkit,即可视化工具包。是一个开源、跨平台、可自由获取、支持并行处理的图形应用函数库。
如果不需要源码的话,可以直接用以下命令安装:
sudo apt-get install libvtk7-dev
若需要源码的话,下载源代码
wget https://www.vtk.org/files/release/8.2/VTK-8.2.0.zip
解压
unzip VTK-8.2.0.zip
编译安装
cd VTK-8.2.0
make build && cd build
cmake ..
make -j2
sudo make install
Opencv
如果项目中需要opencv和VTK一起编译,则需要先依照上一小节安装VTK,如果不需要源码的话,可以直接用以下命令安装:
sudo apt-get install libvtk7-dev
开源图像算法库,从源代码编译安装:
安装一些依赖库
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 python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
下载代码
cd ~/<my_working_directory>
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
切换到目标版本,本文只利用3.4.5版本
cd opencv
git checkout 3.4.5
cd opencv_contrib
git checkout 3.4.5
利用cmake设置编译选项
cd opencv
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DOPENCV_GENERATE_PKGCONFIG=YES -DENABLE_CXX11=ON -DCMAKE_INSTALL_PREFIX=/usr/local -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
开始编译&安装
编译过程中,如果出现 缺少boostdesc_bgm.i文件的问题,下载
链接: https://pan.baidu.com/s/1oX5-umwpiMkjntBmpCobvw 提取码: ee9v
把下列压缩包解压到目录opencv_contrib/modules/xfeatures2d/src/下即可
make -j2
sudo make install
CMakeLists.txt写法
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
target_link_libraries( joinMap ${OpenCV_LIBS} )
如果在ubuntu16.04中使用ROS kinetic,kinetic自带的opencv版本与自定义编译的epencv版本不一致,需要在CMakeLists.txt中指定opencv的路径
set(OpenCV_DIR /usr/local/lib)
boost
Boost 库通过加入一些在实践中非常有用的函数对 C++ 标准进行了补充, 在c++ 编程中有时候要用到 Boost 库
sudo apt-get install libboost-all-dev
pcl
大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。
下载pcl源码:
git clone https://github.com/PointCloudLibrary/pcl.git
切换到指定版本
git checkout 1.9.1
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
执行编译安装
cd pcl
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j2
sudo make install
CMakeLists.txt写法
find_package( PCL REQUIRED COMPONENT common io )
include_directories( ${PCL_INCLUDE_DIRS} )
add_definitions( ${PCL_DEFINITIONS} )
target_link_libraries( joinMap ${PCL_LIBRARIES} )
ROS
一个机器人软件平台,它能为异质计算机集群提供类似操作系统的功能,可以方便的开发并维护各个模块,安装教程参考ROS wiki
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
yaml-cpp
yaml-cpp可以方便的用来读取yawl文件中的参数,slam工程的yaml文件多用以记录相机内外参、IMU噪声参数等,供程序运行时获取。
获取源程序
git clone https://github.com/jbeder/yaml-cpp.git
编译安装
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON .. # ON 设置生成共享库
sudo make install
验证
pkg-config --modversion yaml-cpp
CMakeLists.txt写法
一般情况下,直接加targe_link_libraries就可以了
target_link_libraries(你的可执行文件名称 ${catkin_LIBRARIES} yaml-cpp)
但是,之前系统中安装的软件包(如旧版本的ROS)可能也会包含旧版本的yaml-cpp,按上述CMakeLists.txt的写法可能链接到旧版本的yaml-cpp上,编译会出现莫名其妙的问题,如
undefined reference to `vtable for YAML::BadConversion'……
最简单暴力的解决办法是直接写绝对路径进行链接,即
target_link_libraries(你的可执行文件名称 /usr/local/lib/libyaml-cpp.so)
anaconda 虚拟环境(不同python版本切换)
安装玩anaconda后,默认的python为3.7版本
但是在开发过程中,发现不少包是用python3.6做的,特别是opencv
解决办法:
创建基于python3.6的虚拟环境
conda create -n py36 python=3.6 anaconda
该命令指定python版本为3.6,会自动安装最新python版本
(py36是新建的虚拟环境的名字)
若要同时安装必要的包
conda create -n py36 numpy matplotlib python=2.7
切换不同的虚拟环境
conda activate your_env_name(虚拟环境名称)
关闭当前虚拟环境:
conda deactivate
删除虚拟环境:
conda remove -n your_env_name(虚拟环境名称) --all
当ROS kinetic与python3不兼容的时候,提示
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
解决方法为:
import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')