1、为什么要用docker安装
1.1docker是啥
自我理解:如果要运行某一个开源库前需要安装太多的依赖,一个一个安装浪费时间且麻烦,docker将相应的依赖放在一个容器里,类似虚拟机,但是虚拟机会安装一些我不需要的东西。所以docker更轻量,docker里的容器可以随便删除。
1.2docker常用指令
1.2.1首先自行百度安装docker
1.2.2docker常见命令
查看所有正在运行的容器:
docker ps
查看所有容器(包括已停止的):
docker ps -a --size
-a 查看所有容器 --size 显示容器大小
创建并启动容器:
docker run -it 镜像名
或者指定容器的名称:
docker run --name my_container -d my_image
这里,-it 表示交互模式运行容器,并分配一个伪终端;--name 用于指定容器的名称;-d 表示在后台运行容器。
停止容器:
docker stop 容器名/容器ID
强制停止容器:
docker kill 容器名/容器ID
启动容器:
docker start 容器名/容器ID
重启容器:
docker restart 容器名/容器ID
删除容器:
docker rm 容器名/容器ID
注意,只能删除已停止的容器。
进入容器:
docker attach 容器ID
或者更常用的:
docker exec -it 容器ID /bin/bash
后者可以在正在运行的容器中启动一个新的shell。
查看所有本地镜像:
docker images
从远程仓库拉取镜像:
docker pull 镜像名
查看容器内部细节:
docker inspect 容器ID
查看容器内运行的进程:
docker top 容器ID
查看容器日志:
bash
docker logs 容器名/容器ID
1.3区分容器和镜像
Docker镜像是容器的模板或基础,而容器则是镜像的运行实例。
- Docker镜像:是一个只读的模板,包含了运行应用程序所需的所有内容,如代码、运行时、库、环境变量和配置文件等。镜像可以被视为一个独立的文件系统,包含了创建和启动容器所需的所有依赖。镜像具有轻量级和高效的特点,基于分层的文件系统构建,使得多个镜像可以共享相同的基础层,从而优化存储和传输效率。
- Docker容器:是由Docker镜像创建的运行实例。容器完全使用沙箱机制,相互隔离,互不影响。容器启动时,Docker引擎会在镜像的基础上创建一个可读写的容器层,并将其与镜像层级联在一起,形成一个新的文件系统作为容器的文件系统。容器中的进程依赖于镜像中的文件,但容器对文件的任何修改都只会在容器层进行,不会影响到原始的镜像文件。
2、如何安装ORBSLAM2(cpu版)
2.1从网上下载好别人的安装脚本(在2.2.3安装运行)
git clone https://github.com/jike5/orbslam2-docker.git
以下为下载好的脚本,写好了注释,不需要自己在终端添加
# UI permisions
#定义一个变量XSOCK,指向主机上的X11 Unix socket位置。这个socket通常用于X11客户端和服务器之间的通信。
XSOCK=/tmp/.X11-unix
#定义一个变量XAUTH,指定一个临时文件,用于存储X11认证信息。
XAUTH=/tmp/.docker.xauth
#创建或更新$XAUTH指向的文件
touch $XAUTH
#使用xauth命令列出当前显示(由$DISPLAY指定)的认证信息,并使用sed命令修改它,然后将修改后的认证信息合并到$XAUTH文件中。这一步是为了让Docker容器能够访问主机的X11服务器。
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
#修改X11服务器的访问控制,允许名为docker的本地用户访问。
xhost +local:docker
# docker pull jike5/orbslam2-dev:latest
# Create a new container
#-t表示分配一个伪终端,-d表示在后台运行容器。
#--privileged: 给予容器在主机上几乎全部的权限。
#--net=host: 使容器使用主机的网络栈,这样容器内的应用就可以直接看到和使用主机的网络接口。
#--ipc=host: 允许容器使用主机的IPC(进程间通信)命名空间。
docker run -td --privileged --net=host --ipc=host \
--name="orbslam2" \
#使docker可以使用USB接口,比如你要外接相机或者雷达
--device=/dev/bus/usb \
#-e "DISPLAY=$DISPLAY": 设置环境变量DISPLAY,这样容器内的应用就知道应该连接到哪个X11显示
-e "DISPLAY=$DISPLAY" \
#-e "QT_X11_NO_MITSHM=1": 设置环境变量,通常用于解决某些Qt应用在Docker容器中与X11服务器通信的问题。
-e "QT_X11_NO_MITSHM=1" \
#-v "/tmp/.X11-unix:/tmp/.X11-unix:rw": 将主机上的X11 Unix socket目录挂载到容器内,允许容器访问。
-v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \
#-e "XAUTHORITY=$XAUTH": 设置环境变量,指向前面创建的X11认证文件。
-e "XAUTHORITY=$XAUTH" \
#: 设置ROS(机器人操作系统)的IP地址为127.0.0.1。
-e ROS_IP=127.0.0.1 \
#为容器添加SYS_PTRACE能力,这通常用于调试。
--cap-add=SYS_PTRACE \
#将当前目录(pwd)下的workspace目录挂载到容器内的/workspace目录。
-v `pwd`/workspace:/workspace \
#使用jike5/orbslam2-dev镜像的最新版本。bash: 在容器内启动一个bash shell。
jike5/orbslam2-dev:latest bash
2.2运行脚本,基于大佬的镜像建立好一个容器
具体安装参考原网站
2.2.1拉取镜像
docker image pull jike5/orbslam2-dev
tip:docker拉取镜像超时
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
解决办法:
1、修改或新建/etc/docker/daemon.json文件(搜索最新的镜像地址,不要用几年前的,下方24.10找的)
{
"registry-mirrors": [
"https://docker.211678.top",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.m.daocloud.io",
"https://do.nark.eu.org",
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://docker.awsl9527.cn"
]
}
2、
systemctl daemon-reload
systemctl restart docker
2.2.2
在主机建立好路径并下载ORBSLAM2
mkdir -p workspace/data
cd workspace
git clone https://github.com/jike5/ORB_SLAM2
2.2.3 运行2.1下载内容里的脚本,你则可以搭建一个容器,并且容器里有你需要要的配置
sudo ./run_container_cpu.sh
2.3在容器内运行大佬写的脚本
2.3.1进入容器
docker ps -a | grep orbslam
# you will find you container ID
docker exec -it orbslam3[or container ID] bash
2.3.2 运行两个容器内的脚本
cd /workspace/ORB_SLAM2
./build.sh
./build_ros.sh
2 ORBSLAM2-(gpu)
参考https://github.com/dongwookheo/study-ORB-SLAM2/tree/main
1、 docker build -t orb_slam:v2.0 .
一键安装,不过在安装opencv时花费了很久
如果在Dockerfile里最后一个RUN一直无法下载,
报错停止后修改Dockerfile
将其注释,手动下载zip文件
2、生成容器
docker run -it --privileged --gpus all --net=host --ipc=host \
-e "DISPLAY=$DISPLAY" \
--name="orbslam2_t7" \
-e "QT_X11_NO_MITSHM=1" \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \
-v /home/adw/Music/workspace:/workspace \
orb_slam:v2.0
3、把1手动下载的内容解压后移动到容器里(),运行
./build.sh
3、测试是否安装成功
我是基于某蓝学院给的第一讲案例进行测试
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/T
UM1.yaml ../data/rgbd_dataset_freiburg1_desk/
tips:运行上述命令时,路径处于STUDY-ORBSLAM2-MAN下,
数据集rgbd_dataset_freiburg1_desk/放在上层路径date文件夹下
解释各个文件
3.1 可执行文件
/Examples/Monocular/mono_tum
这是一个,ORBSLAM2框架里面有很多文件,相当与零件
实际使用应该按照传感器输入分类
3.2 词袋
Vocabulary/ORBvoc.txt
ocabulary/ORBvoc.txt
是 ORB-SLAM2 中的词袋(Bag of Words)词汇表文件。它用于特征描述子的量化和匹配。该文件由一组视觉词汇组成,通常是通过大量图像数据训练得到的。ORB-SLAM2 使用这个词汇表来有效地进行回环检测和特征匹配。
具体内容就是一堆数字,咱也看不懂
3.3 相机和算法参数
Examples/Monocular/TUM1.yaml
是 ORB-SLAM2 中的配置文件,用于单目摄像头的设置。这个文件包含了与相机参数和算法相关的配置,例如镜头的内参、畸变系数、图像帧率、ORB特征提取参数等。这些参数需要根据具体的相机模型和数据集进行调整,以确保算法的准确性和效率。
3.4 数据集
../data/rgbd_dataset_freiburg1_desk/
-
depth 文件夹:
- 这个文件夹通常包含深度图像数据。深度图像是一种特殊的图像,每个像素值代表该点到相机的距离,通常用于三维重建和SLAM系统中。
-
rgb 文件夹:
- 这个文件夹包含彩色图像数据。这些图像用于SLAM系统中的视觉信息处理,包括特征提取、匹配和相机位姿估计。
-
accelerometer.txt 文件:
- 这个文件记录了加速度计的数据,通常包括三个轴(x, y, z)的加速度值。这些数据可以用于估计相机的运动,尤其是在没有视觉信息的情况下。
-
depth.txt 文件:
- 这个文件可能包含深度图像的元数据,例如深度图像的分辨率、相机参数等,或者是深度图像数据的索引。
-
groundtruth.txt 文件:
- 这个文件包含了相机轨迹的真值,即相机在每个时间点的真实位置和姿态。这些数据用于评估SLAM算法的性能,通过比较算法估计的轨迹和这个文件中的真值。
-
rgb.txt 文件:
- 这个文件可能包含彩色图像的元数据,例如图像的分辨率、相机参数等,或者是彩色图像数据的索引
4、在vscode上运行docker
4.1 安装vscode插件
docker ----ssh
4.2 添加配置文件
- Host :连接的主机名称,可自定义;
- Hostname :远程主机的 IP 地址;
- User :用于登录远程主机的用户名;
- Port :用于登录远程主机的端口,SSH 默认为 22 ;