基于 docker 环境的 LET-VINS 复现

简介: 该文介绍了在Docker环境下实践LET-NET的步骤。从GitHub克隆LET-NET代码,使用Docker运行vins-mono环境。安装ncnn,配置代理,更新源,安装依赖并验证安装成功。在运行LET-NET时遇到opencv版本不兼容,指出怎么安装指定版本的 opencv。解决Docker容器中的显示问题,通过`xhost +`命令运行LET-NET。在ROS中构建VINS-Mono时,cv_bridge找不到的问题,通过安装cv_bridge,设置ROS环境和工作空间,以及解决ncnn的配置问题,最终成功运行VINS-Mono。还需要下载UMA-VI数据集并修改相关路径以运行演示。

该文介绍了在Docker环境下实践LET-NET的步骤。首先,从GitHub克隆LET-NET代码,然后使用Docker运行vins-mono环境。接着,安装ncnn,配置代理,更新源,安装依赖并验证安装成功。在运行LET-NET时遇到opencv版本不兼容问题,因此将opencv从3.2升级到3.4.20,通过克隆特定版本的opencv,编译并安装。之后,解决Docker容器中的显示问题,通过xhost +命令运行LET-NET。在ROS中构建VINS-Mono时,遇到了cv_bridge找不到的问题,通过安装cv_bridge,设置ROS环境和工作空间,以及解决ncnn的配置问题,最终成功运行VINS-Mono。同时,还需要下载UMA-VI数据集并修改相关路径以运行演示。

基于 docker 实践

下载代码:

git clone https://github.com/linyicheng1/LET-NET.git
cd LET-NET/

安装思路:

先安装 vins-mono 环境:

我们先去 docker hub 找个镜像:

docker pull hyeonjaegil/vins-mono

docker run -it --privileged     --network host  --gpus all \
-v /tmp/.X11-unix:/tmp/.X11-unix   \
-e DISPLAY -e NVIDIA_VISIBLE_DEVICES=all   \
-e NVIDIA_DRIVER_CAPABILITIES=all   \
-e FASTRTPS_DEFAULT_PROFILES_FILE=/usr/local/share/middleware_profiles/rtps_udp_profile.xml   \
-v /dev/*:/dev/*       \
-v /etc/localtime:/etc/localtime:ro       \
-v ~/.Xauthority:/root/.Xauthority:rw   \
-v /home/h/projects/LET-NET:/root/LET-NET       \
--name vins-mono-v1      \
hyeonjaegil/vins-mono:melodic     /bin/bash

lsb_release -a # 查看系统版本

安装 ncnn

https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-linux
https://blog.csdn.net/weixin_44855366/article/details/130165967

# 配置代理
git config --global http.proxy http://127.0.0.1:7890 
git config --global https.proxy http://127.0.0.1:7890
# 更新源
apt-get update
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
# 安装依赖
sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libomp-dev libvulkan-dev vulkan-utils libopencv-dev
# 安装 ncnn
mkdir build
cd build
 cmake ..
 make -j$(nproc)
 make install # ncnn 的文件都安装在 build 下的 install 里面

# 验证
cd ../examples
../build/examples/squeezenet ../images/256-ncnn.png
# 得到输出
532 = 0.165951
920 = 0.094098
716 = 0.062193

运行 LET-NET

cd /root/LET-NET/build
cmake .. && make -j4

报错:

/root/LET-NET/tracking.cpp:147:6: error: invalid initialization of reference of type ‘const cv::ParallelLoopBody&’ from expression of type ‘corner_tracking::extractFeature(const cv::Mat&, int, const std::vector<cv::Point_<float> >&)::<lambda(const cv::Range&)>’
 });
  ^

原因:

opencv 版本不兼容,这个镜像是 opencv 3.2,我们给它升级下

更新 opencv 3.2 到 opencv 3.4.20

怎么 安装 指定版本的 opencv?

要使用 git clone 命令克隆特定版本的 OpenCV,可以按照以下步骤操作。这些步骤包括克隆 OpenCV 仓库、切换到指定版本的分支或标签,然后继续编译和安装。

步骤 1:克隆 OpenCV 仓库
首先,克隆 OpenCV 和 OpenCV Contrib 仓库:

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

步骤 2:切换到指定版本
进入克隆的 OpenCV 仓库并列出所有可用的版本标签:

cd opencv
git tag

这将显示所有版本的标签。例如,您可能会看到以下标签:

2.4.13
3.4.0
4.5.1
4.5.2
4.5.3
4.5.4
4.5.5
4.6.0
...

假设您想切换到版本 3.4.20,可以使用以下命令:

git checkout 3.4.20

同样,对于 OpenCV Contrib 仓库:

cd ../opencv_contrib
git tag
git checkout 3.4.20

步骤 3:编译和安装 OpenCV
回到 OpenCV 仓库目录,创建一个 build 目录并进入:

cd ../opencv
mkdir build && cd build

然后使用 cmake 配置 OpenCV 构建系统,指定 OpenCV Contrib 模块路径:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..

卡住(clash):

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

接着编译 OpenCV:

make -j$(nproc)

最后安装 OpenCV:

sudo make install
sudo ldconfig

通过这些步骤,您可以克隆并安装特定版本的 OpenCV。这将确保您使用的是所需的版本,无论是为了兼容性还是特定的功能需求。

继续运行 LET-NET

cd /root/LET-NET/build
cmake .. && make -j4
cd ..
./build/demo ./model/model.param ./model/model.bin ./assets/nyu_snippet.mp4

在 docker 容器中,报错:

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.20) /home/shaozu/opencv/modules/highgui/src/window_gtk.cpp:624: error: (-2:Unspecified error) Can't initialize GTK backend in function 'cvInitSystem'

运行 Docker 容器时,需要将主机的显示环境传递给容器。这样,GTK 可以在容器中正确初始化。

xhost +

然后再运行即可。

Build VINS-Mono on ROS

LET-NET/assets/VINS-Mono.zip copy 到 /root/catkin_ws/src 路径下

修改 ncnn 的路径:

cd ~/catkin_ws/src
vim  VINS-Mono/feature_tracker/CMakeLists.txt
# set(ncnn_DIR "/root/ncnn/build/install/lib/cmake/ncnn" CACHE PATH "Directory that contains ncnnConfig.cmake")

cd ../
catkin_make

报错:

-- Could NOT find cv_bridge (missing: cv_bridge_DIR)
-- Could not find the required component 'cv_bridge'. The following CMake error indicates that you either need to install the package with the same name or change your environment so that it can be found.
CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
Could not find a package configuration file provided by "cv_bridge" with
any of the following names:
cv_bridgeConfig.cmake
cv_bridge-config.cmake
Add the installation prefix of "cv_bridge" to CMAKE_PREFIX_PATH or set
"cv_bridge_DIR" to a directory containing one of the above files. If
"cv_bridge" provides a separate development package or SDK, be sure it has
been installed.

原因:

这个错误表明 CMake 无法找到 cv_bridge 包的配置文件,这通常发生在配置 ROS(机器人操作系统)项目时。cv_bridge 是一个用于在 ROS 中转换 OpenCV 图像与 ROS 图像消息的包。如果您遇到这个错误,请按照以下步骤进行排查和解决:

步骤 1:安装 cv_bridge
确保您已经安装了 cv_bridge。可以通过以下命令安装:

sudo apt-get update
sudo apt-get install ros-<distro>-cv-bridge

将 替换为您的 ROS 发行版,例如 melodic, noetic 等。

这里我们选择:melodic

步骤 2:设置 ROS 环境

确保您已经设置了 ROS 环境变量。通常在 ~/.bashrc 中添加以下内容:

source /opt/ros/<distro>/setup.bash

同样,将 替换为您的 ROS 发行版。

然后,重新加载 ~/.bashrc:

source ~/.bashrc

步骤 3:确保工作空间的正确性

如果您正在使用 ROS 工作空间,请确保您已经在工作空间中构建并安装了所有依赖项。

  1. 初始化工作空间:

    cd ~/catkin_ws
    catkin_make

报错:

CMake Error at VINS-Mono/feature_tracker/CMakeLists.txt:20 (find_package):
  By not providing "Findncnn.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "ncnn", but
  CMake did not find one.

  Could not find a package configuration file provided by "ncnn" with any of
  the following names:

    ncnnConfig.cmake
    ncnn-config.cmake

  Add the installation prefix of "ncnn" to CMAKE_PREFIX_PATH or set
  "ncnn_DIR" to a directory containing one of the above files.  If "ncnn"
  provides a separate development package or SDK, be sure it has been
  installed.

原因:

需要设置环境变量:

export ncnn_DIR=/root/ncnn/build/install/lib/cmake/ncnn

然后再:

catkin_make
source devel/setup.bash

修改 /root/catkin_ws/src/VINS-Mono/feature_tracker/src/feature_tracker_illu.cpp

void readImage() {
    const std::string path = "/root/LET-NET/datasets/lab-module-csc_2019-02-01-14-28-51_InOut/";

修改 src/VINS-Mono/feature_tracker/src/feature_tracker.cpp

// net.load_param("/home/c211/lyc/ncnn/let_net/LET-NET/model/model.param");
// net.load_model("/home/c211/lyc/ncnn/let_net/LET-NET/model/model.bin");
net.load_param("/root/LET-NET/model/model.param");
net.load_model("/root/LET-NET/model/model.bin");

修改:src/VINS-Mono/feature_tracker/src/parameters.cpp

config_file = "/root/catkin_ws/src/VINS-Mono/config/uma-vi.yaml";//readParam<std::string>(n, "config_file");
std::string VINS_FOLDER_PATH = "/root/catkin_ws/src/VINS-Mono/";//readParam<std::string>(n, "vins_folder");


catkin_make
source devel/setup.bash

Download UMA-VI datasets

Download two sequence in https://mapir.isa.uma.es/mapirwebsite/?p=2108

lab-module-csc
lab-module-rev-csc
  1. Modified the path
    In feature_tracker folder, change the path value in function readImage() to your path.

If you want run in orign VINS, you can just delete the define #define LET_NET in feature_tracker/src/feature_tracker.h

  1. Run Demo as in VINS
    In terminal 1, run roslaunch vins_estimator uma_vi.launch
    In terminal 2, run roslaunch vins_estimator vins_rviz.launch
    In terminal 3, run ./devel/lib/feature_tracker/feature_tracker_illustration

那么如何开启多个终端呢?请参考:

参考:docker容器启动多个终端,docker启动多个终端

即可看到效果。

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
ROS入门实践
本课程将基于基础设施即代码 IaC 的理念,介绍阿里云自动化编排服务ROS的概念、功能和使用方式,并通过实际应用场景介绍如何借助ROS实现云资源的自动化部署,使得云上资源部署和运维工作更为高效。
相关文章
|
3月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
183 5
|
5月前
|
缓存 Ubuntu Docker
Ubuntu环境下删除Docker镜像与容器、配置静态IP地址教程。
如果遇见问题或者想回滚改动, 可以重启系统.
374 16
|
11月前
|
数据采集 存储 Docker
深入理解Docker:为你的爬虫项目提供隔离环境
本教程介绍如何使用Docker构建隔离环境,运行Python爬虫项目,采集小红书视频页面的简介和评论。主要内容包括: 1. **Docker隔离环境**:通过Docker容器化爬虫,确保环境独立、易于部署。 2. **代理IP技术**:利用亿牛云爬虫代理突破反爬限制。 3. **Cookie与User-Agent设置**:伪装请求头,模拟真实用户访问。 4. **多线程采集**:提高数据采集效率。 前置知识要求:Python基础、Docker基本操作及HTML解析(可选)。教程还涵盖常见错误解决方法和延伸练习,帮助你优化爬虫代码并避免陷阱。
317 7
深入理解Docker:为你的爬虫项目提供隔离环境
|
7月前
|
消息中间件 监控 Docker
Docker环境下快速部署RabbitMQ教程。
就这样,你成功地用魔法召唤出了RabbitMQ,还把它和你的应用程序连接了起来。现在,消息会像小溪流水一样,在你的系统中自由流淌。别忘了,兔子们不喜欢孤独,他们需要你细心的关怀,不时地监控它们,确保他们的世界运转得井井有条。
492 18
|
6月前
|
弹性计算 关系型数据库 Nacos
低配阿里云 ECS 如何 docker 环境部署 NACOS : 单机版模式
NACOS 单机版 Docker 安装指南。使用指定端口和 custom.env 配置文件启动 Nacos 服务,适用于 2.X 版本,包含 gRPC 支持及 MySQL 数据源配置。 -e MODE=standalone \
555 5
|
7月前
|
消息中间件 监控 Docker
Docker环境下快速部署RabbitMQ教程。
至此,这次神秘而简明的部署之旅告一段落。祝你在利用RabbitMQ打造消息队列时,一切顺风顺水!
310 8
|
6月前
|
存储 缓存 Serverless
【Azure Container App】如何在Consumption类型的容器应用环境中缓存Docker镜像
在 Azure 容器应用的 Consumption 模式下,容器每次启动均需重新拉取镜像,导致冷启动延迟。本文分析该机制,并提出优化方案:使用 ACR 区域复制加速镜像拉取、优化镜像体积、设置最小副本数减少冷启动频率,或切换至 Dedicated 模式实现镜像缓存,以提升容器启动效率和应用响应速度。
164 0
|
7月前
|
Ubuntu 机器人 开发者
Docker环境下的ROS Noetic:Ubuntu 20.04 系统下的解决方案
这就是在Docker环境下安装ROS Noetic在Ubuntu 20.04系统的一种简单方法,希望能对你有所帮助。
863 16
|
9月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
435 28

热门文章

最新文章