这里选择的是opencv3.4.10版本,由于源代码支持的是2.4.x / 3.1 版本,因此这修改了一点代码,如果安装的版本和源码的一致就不需要修改
将所有 CV_GRAY2BGR 修改为 cv::COLOR_GRAY2BGR
将所有CV_LOAD_IMAGE_GRAYSCALE 修改为 cv::IMREAD_GRAYSCALE
安装参考https://www.jianshu.com/p/59608e83becb
下载地址
编译g2o前需要安装一些依赖
sudo apt-get install cmake libeigen3-dev #eigen版本出错则需要手动安装3.3.7
sudo apt-get install libqglviewer-dev-qt5
sudo apt-get install libsuitesparse-dev
在g2o目录下运行
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig
注:卸载g2o的命令
sudo rm -r /usr/local/include/g2o
sudo rm -r /usr/local/lib/libg2o*
sudo rm -r /usr/local/bin/g2o*
mkdir catkin_se2lam
cd satkin_se2lam
mkdir src
# 把之前下载的se2lam源码放到src目录下
catkin_make
下载数据集和字典,这两个下载速度很慢
数据集地址
其中有两个轮速计测量,一个是较精确的odo_raw_accu.txt,一个是较粗糙的odo_raw_roug.txt,要使用哪个,就把它拷贝到DatasetRoom/目录下的odo_raw.txt。
如果编译通过,就可以运行
source devel/setup.bash
rosrun rviz rviz -d src/se2lam/rviz.rviz
#另一个终端运行
rosrun se2lam test_vn PATH_TO_DatasetRoom PATH_TO_ORBvoc.bin
出现libg2o_opengl_helper.so: cannot open shared object file: No such file or directory 是因为g2o运行完需要sudo ldconfig
另外注意odo_raw.txt文件一定要有。
另外,需要将程序中的"/se2lam/World"
修改为"se2lam/World"
才能有可视化效果。
安装docker
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates software-properties-common curl
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
sudo service docker start
sudo chmod 777 /var/run/docker.sock
配置docker
# docker build -t 【用户名/镜像名称】:【版本】 -f 【Dockerfile 文件地址】 .
docker build -t sch/se2lam:1.0 -f Dockerfile .
#查看镜像
docker images ls
#查看容器
docker container ls
#查看运行镜像的容器线程号
docker ps
#启动容器线程
docker attach 8ccdc3e33da3 #exit后容器会停止
docker exec -it 8ccd bash #exit后不会导致容器停止 推荐使用
#删除镜像
docker image rm [imageID]
#删除none的悬浮镜像
docker image prune
#如果不是在存储卷上的修改,例如安装了ssh,需要保存容器镜像
docker commit -m="描述信息,类似git提交的信息" -a="作者" 容器id 镜像名:[TAG]
tip:这里的镜像名:[TAG]可以和之前一样(那就覆盖了),也可以不一样,这样又创建了新的容器。
启动镜像,可写入.sh脚本文件
xhost +local:root; #显示的
docker run -it -d --net=host\ #加入-d参数后后台运行
--privileged \ #加上会有root权限
-p 6622:22 \ #端口号要映射 否则会直接占用本地端口 -p参数可以出现多次,绑定多个端口号
--env="DISPLAY" \ #修改环境变量DISPLAY
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ #共享本地unix端口
--volume="/dev:/dev" \
-v /home/sch/docker/dataset:/home/datasets \
-v /home/sch/docker/code:/home/code \
sch/se2lam:1.0 \
/bin/bash
–net=host会导致端口映射不管用,如果不共用网络时可以删掉–net=host
不加- -net=host时默认是bridge模式,bridge模式无法指定容器IP(但非绝对,还是可以修改滴)
加上就是host模式,不能使用端口映射和自定义路由规则,这些都与主机一致,-p 与-icc 参数是无效的
Dockerfile文件
FROM osrf/ros:melodic-desktop-full
USER root
ENV DEBIAN_FRONTEND noninteractive
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
ENV HOME=/root SHELL=/bin/bash
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
RUN apt-get update -q --fix-missing && \
apt-get -y install --no-install-recommends apt-utils software-properties-common && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE && \
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE && \
add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
RUN apt-get update -q --fix-missing && \
apt-get install -y --no-install-recommends --allow-unauthenticated \
build-essential cmake gcc g++ clang git pkg-config libpython2.7-dev python-pip libusb-1.0-0-dev \
libgl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols libglew-dev libglfw3-dev \
libatlas-base-dev libgoogle-glog-dev libgflags-dev libgtk2.0-dev libavcodec-dev libavformat-dev \
libswscale-dev librealsense2-dkms librealsense2-utils librealsense2-dev librealsense2-dbg \
ros-melodic-uvc-camera ros-melodic-image-view ros-melodic-usb-cam python-catkin-tools \
python-rosdep python-rosinstall python-rosinstall-generator python-wstool \
libqglviewer-dev-qt5 libsuitesparse-dev
#RUN git config --global http.proxy http://127.0.0.1:7890
#RUN git config --global http.postBuffer 20000000
ENV EIGEN3_VERSION="3.3.7"
RUN git clone https://gitlab.com/libeigen/eigen.git && \
cd eigen && git checkout tags/${EIGEN3_VERSION} && \
mkdir build && cd build && \
cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local .. && \
cmake --build . && make install
ENV g2o_VERSION="20160424_git"
RUN git clone --branch 20160424_git https://github.com/RainerKuemmerle/g2o.git && \
cd g2o && \
mkdir build && cd build && \
cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local .. && \
cmake --build . && make install
RUN apt-get clean && \
apt-get autoremove -y && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /root/opencv /root/eigen /root/g2o
RUN ( \
echo 'source /opt/ros/melodic/setup.bash'; \
) > /root/.bashrc
解决每次使用docker命令都需要sudo
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
# 增加读写权限(这个需要执行,因为这个文件的权限不对)
sudo chmod a+rw /var/run/docker.sock
# 重启docker
sudo systemctl restart docker
为了显示rviz主机中需要运行xhost + 或者在启动脚本加入 xhost +local:root;
g2o出现找不到的情况还是需要sudo ldconfig
docker中使用pangolin时会出现显示相关的错误
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
解决
在容器内运行
export QMLSCENE_DEVICE=softwarecontext
export LIBGL_ALWAYS_INDIRECT=y
对于出现错误
X11 Error: BadMatch (invalid parameter attributes)
X11 Error: BadValue (integer parameter out of range for operation)
terminate called after throwing an instance of 'std::runtime_error'
what(): Pangolin X11: Failed to create an OpenGL context
Aborted (core dumped)
这是显卡驱动问题,需要启动时添加
-v /usr/local/cuda-11.3:/usr/local/cuda \
--gpus all\
加入后出现错误
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
需要安装 nvidia-container-toolkit
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit