autodl配置OpenREALM

autodl配置OpenREALM

AutoDL 上复现 OpenREALM + ROS1 Bridge 全流程记录(Ubuntu 20.04 + ROS Noetic + RTX 4090)

1. 复现环境

本次复现环境如下:

系统:Ubuntu 20.04.5 平台:AutoDL GPU:RTX 4090 CUDA:11.8 ROS:ROS Noetic 工作目录:/root/autodl-tmp/openrealm_ws 数据盘:/root/autodl-tmp,50GB,可写

前置状态:

roscore 可以正常启动 RViz 可以正常打开 VNC/noVNC 正常 rostopic list 可以看到: /rosout /tf /tf_static

由于 AutoDL 访问 GitHub 经常出现 443 超时,本次没有直接在服务器上git clone,而是选择在本地下载源码压缩包,再上传到 AutoDL。


2. 源码与依赖包准备

本地下载并上传到 AutoDL 的包如下:

OpenREALM-master.zip OpenREALM_ROS1_Bridge-master.zip PSL-master.zip openvslam-master.zip FBoW-master.zip g2o-9b41a4e.zip

其中:

OpenREALM-master.zip OpenREALM 主库 OpenREALM_ROS1_Bridge-master.zip ROS1 Bridge PSL-master.zip OpenREALM densifier 的子模块 openvslam-master.zip OpenVSLAM FBoW-master.zip OpenVSLAM 的 BoW 依赖 g2o-9b41a4e.zip OpenVSLAM / OpenREALM 需要的 g2o

上传后的目录:

cd /root/autodl-tmp/openrealm_ws ls -lh

我的结果大致如下:

OpenREALM-master.zip OpenREALM_ROS1_Bridge-master.zip PSL-master.zip openvslam-master.zip FBoW-master.zip g2o-9b41a4e.zip

3. 解压 OpenREALM 和 ROS1 Bridge

cd /root/autodl-tmp/openrealm_ws unzip OpenREALM-master.zip unzip OpenREALM_ROS1_Bridge-master.zip mv OpenREALM-master OpenREALM mkdir -p catkin_ws/src mv OpenREALM_ROS1_Bridge-master catkin_ws/src/OpenREALM_ROS1_Bridge

检查 ROS 包:

find catkin_ws/src/OpenREALM_ROS1_Bridge -maxdepth 2 -name package.xml

正常输出应包含:

catkin_ws/src/OpenREALM_ROS1_Bridge/realm_msgs/package.xml catkin_ws/src/OpenREALM_ROS1_Bridge/realm_ros/package.xml catkin_ws/src/OpenREALM_ROS1_Bridge/realm_rviz_plugin/package.xml

4. 检查 PSL 子模块是否为空

GitHub 页面直接 Download ZIP 时,通常不会包含 git submodule。

检查:

ls -lah /root/autodl-tmp/openrealm_ws/OpenREALM/modules/realm_densifier/realm_densifier_impl/psl

我的结果是空目录:

total 0 drwxr-xr-x 2 root root 10 ... drwxr-xr-x 3 root root 25 ...

这说明 PSL 子模块缺失,后续 OpenREALM CMake 会报:

does not contain a CMakeLists.txt file

因此需要手动补 PSL。


5. 安装基础 apt 依赖

先安装 OpenREALM / OpenVSLAM / ROS Bridge 可能用到的基础依赖:

sudo apt update sudo apt install -y \ build-essential cmake pkg-config git wget curl unzip \ apt-utils ca-certificates lsb-release gnupg2 \ libproj-dev libeigen3-dev gdal-bin \ libcgal-dev libcgal-qt5-dev \ libpcl-dev exiv2 libexiv2-dev \ libglew-dev libxkbcommon-dev libglu1-mesa-dev freeglut3-dev \ libxi-dev libxmu-dev libxmu-headers x11proto-input-dev \ libatlas-base-dev libsuitesparse-dev \ libgtk-3-dev ffmpeg \ libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavresample-dev \ gfortran libyaml-cpp-dev libgoogle-glog-dev libgflags-dev \ libboost-all-dev libopencv-dev

如果安装mesa-common-dev时出现类似:

mesa-common-dev : Depends: libdrm-dev but it is not going to be installed

可以先跳过mesa-common-dev。我这里 RViz 已经能正常打开,所以没有继续纠结 Mesa 依赖。

ROS 相关依赖:

source /opt/ros/noetic/setup.bash sudo apt install -y \ python3-catkin-tools \ ros-noetic-geographic-msgs \ ros-noetic-geodesy \ ros-noetic-cv-bridge \ ros-noetic-rviz \ ros-noetic-pcl-ros \ ros-noetic-grid-map-core \ ros-noetic-grid-map-ros \ ros-noetic-grid-map-msgs \ ros-noetic-grid-map-rviz-plugin

6. 补 PSL 子模块

cd /root/autodl-tmp/openrealm_ws rm -rf /tmp/psl_unpack mkdir -p /tmp/psl_unpack unzip -q PSL-master.zip -d /tmp/psl_unpack rm -rf OpenREALM/modules/realm_densifier/realm_densifier_impl/psl mkdir -p OpenREALM/modules/realm_densifier/realm_densifier_impl mv /tmp/psl_unpack/PSL-master OpenREALM/modules/realm_densifier/realm_densifier_impl/psl test -f OpenREALM/modules/realm_densifier/realm_densifier_impl/psl/CMakeLists.txt && echo "PSL OK"

看到:

PSL OK

说明 PSL 已经补好。


7. 编译安装 g2o

解压 g2o:

cd /root/autodl-tmp/openrealm_ws mkdir -p deps rm -rf deps/g2o deps/g2o-* unzip -q g2o-9b41a4e.zip -d deps/ mv deps/g2o-* deps/g2o

配置:

cd /root/autodl-tmp/openrealm_ws/deps/g2o mkdir -p build cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DCMAKE_CXX_FLAGS=-std=c++11 \ -DBUILD_SHARED_LIBS=ON \ -DBUILD_UNITTESTS=OFF \ -DG2O_USE_CHOLMOD=OFF \ -DG2O_USE_CSPARSE=ON \ -DG2O_USE_OPENGL=OFF \ -DG2O_USE_OPENMP=ON

第一次编译时我用了多线程,结果报:

c++: fatal error: Killed signal terminated program cc1plus

这是内存不够导致的。解决方法是开启 swap,并使用单线程编译。

创建 16G swap:

cd /root/autodl-tmp fallocate -l 16G /root/autodl-tmp/swapfile chmod 600 /root/autodl-tmp/swapfile mkswap /root/autodl-tmp/swapfile swapon /root/autodl-tmp/swapfile free -h swapon --show

如果fallocate不可用,可用:

dd if=/dev/zero of=/root/autodl-tmp/swapfile bs=1G count=16 status=progress chmod 600 /root/autodl-tmp/swapfile mkswap /root/autodl-tmp/swapfile swapon /root/autodl-tmp/swapfile

重新编译 g2o:

cd /root/autodl-tmp/openrealm_ws/deps/g2o/build make -j1 2>&1 | tee make_g2o_j1.log

成功后安装:

sudo make install sudo ldconfig

验证:

ls /usr/local/include/g2o ls /usr/local/lib | grep g2o | head

正常可以看到:

apps config.h core examples solvers stuff types libg2o_core.so libg2o_solver_dense.so libg2o_solver_eigen.so ...

注意:我一开始误输入了:

~sudo make install

导致:

bash: ~sudo: command not found

正确命令是:

sudo make install

8. 解压 OpenVSLAM 和 FBoW

cd /root/autodl-tmp/openrealm_ws rm -rf deps/openvslam deps/openvslam-* unzip -q openvslam-master.zip -d deps/ mv deps/openvslam-master deps/openvslam rm -rf /tmp/fbow_unpack mkdir -p /tmp/fbow_unpack unzip -q FBoW-master.zip -d /tmp/fbow_unpack rm -rf deps/openvslam/3rd/FBoW mkdir -p deps/openvslam/3rd mv /tmp/fbow_unpack/FBoW-master deps/openvslam/3rd/FBoW test -f deps/openvslam/3rd/FBoW/CMakeLists.txt && echo "FBoW OK"

看到:

FBoW OK

说明 FBoW 已经放到了 OpenVSLAM 的子模块位置。


9. 安装 Pangolin Viewer(可选但推荐)

如果开启 OpenVSLAM 的 Pangolin viewer,需要先安装 Pangolin。

我使用的 Pangolin 压缩包是:

Pangolin-ad8b5f8.zip

上传到:

/root/autodl-tmp/openrealm_ws

安装依赖:

sudo apt update sudo apt install -y \ libglew-dev \ libgl1-mesa-dev \ libegl1-mesa-dev \ libwayland-dev \ libxkbcommon-dev \ wayland-protocols \ libjpeg-dev \ libpng-dev \ libtiff-dev \ libopenexr-dev

解压编译:

cd /root/autodl-tmp/openrealm_ws mkdir -p deps rm -rf deps/Pangolin deps/Pangolin-* unzip -q Pangolin-ad8b5f8.zip -d deps/ mv deps/Pangolin-* deps/Pangolin cd deps/Pangolin mkdir -p build cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DBUILD_EXAMPLES=OFF make -j1 sudo make install sudo ldconfig

验证:

ls /usr/local/include/pangolin find /usr/local -name "PangolinConfig.cmake" -o -name "pangolin-config.cmake"

如果不需要 Pangolin viewer,也可以在 OpenVSLAM 编译时关闭:

-DUSE_PANGOLIN_VIEWER=OFF -DINSTALL_PANGOLIN_VIEWER=OFF

10. 编译安装 OpenVSLAM

进入 OpenVSLAM:

cd /root/autodl-tmp/openrealm_ws/deps/openvslam rm -rf build mkdir build cd build

如果已经安装 Pangolin,可以开启 viewer:

cmake .. \ -DUSE_PANGOLIN_VIEWER=ON \ -DINSTALL_PANGOLIN_VIEWER=ON \ -DUSE_SOCKET_PUBLISHER=OFF \ -DUSE_STACK_TRACE_LOGGER=ON \ -DBUILD_TESTS=OFF \ -DBUILD_EXAMPLES=ON

如果没有安装 Pangolin,则关闭 viewer:

cmake .. \ -DUSE_PANGOLIN_VIEWER=OFF \ -DINSTALL_PANGOLIN_VIEWER=OFF \ -DUSE_SOCKET_PUBLISHER=OFF \ -DUSE_STACK_TRACE_LOGGER=ON \ -DBUILD_TESTS=OFF \ -DBUILD_EXAMPLES=OFF

编译安装:

make -j1 sudo make install sudo ldconfig

验证:

ls /usr/local/include/openvslam ls /usr/local/lib | grep openvslam

我的结果:

/usr/local/include/openvslam 下能看到 system.h、tracking_module.h 等 /usr/local/lib 下能看到 libopenvslam.so

说明 OpenVSLAM 安装成功。


11. 单独安装 FBoW

虽然 FBoW 已经作为 OpenVSLAM 的子模块参与编译,但 OpenREALM 后续 CMake 还需要能找到独立的fbowCMake package。

因此需要单独安装 FBoW:

cd /root/autodl-tmp/openrealm_ws/deps/openvslam/3rd/FBoW rm -rf build mkdir build cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local make -j1 sudo make install sudo ldconfig

验证:

find /usr/local -iname "*fbow*" find /usr/local -name "*fbow*Config.cmake" -o -name "*FBoW*Config.cmake"

正常输出包括:

/usr/local/lib/libfbow.so /usr/local/share/cmake/fbow/fbowConfig.cmake /usr/local/include/fbow

12. 第一次 CMake OpenREALM 遇到的问题

进入 OpenREALM:

cd /root/autodl-tmp/openrealm_ws/OpenREALM rm -rf build mkdir build cd build cmake ..

一开始主要报两个错误:

12.1 PSL 为空

The source directory /root/autodl-tmp/openrealm_ws/OpenREALM/modules/realm_densifier/realm_densifier_impl/psl does not contain a CMakeLists.txt file.

解决方法:补 PSL 子模块,见第 6 节。

12.2 找不到 OpenVSLAM

Could not find a package configuration file provided by "openvslam"

解决方法:编译安装 OpenVSLAM,见第 10 节。


13. OpenREALM 的 fbow::fbow 报错修复

安装 OpenVSLAM 和 FBoW 后,OpenREALM CMake 仍可能报:

Target "realm_stages" links to target "fbow::fbow" but the target was not found. Target "realm_vslam_base" links to target "fbow::fbow" but the target was not found.

原因是 FBoW 安装后导出的 target 叫fbow,但 OpenREALM 链接时需要fbow::fbow

先查看 FBoW 导出的 target:

grep -n "add_library" /usr/local/share/cmake/fbow/fbowTargets.cmake

如果看到的是:

add_library(fbow SHARED IMPORTED)

就需要给 OpenREALM 补 alias。

修改 OpenREALM 两个 CMakeLists:

cd /root/autodl-tmp/openrealm_ws/OpenREALM cp modules/realm_vslam/realm_vslam_base/CMakeLists.txt \ modules/realm_vslam/realm_vslam_base/CMakeLists.txt.bak_fbow cp modules/realm_stages/CMakeLists.txt \ modules/realm_stages/CMakeLists.txt.bak_fbow grep -q "find_package(fbow REQUIRED)" modules/realm_vslam/realm_vslam_base/CMakeLists.txt || \ sed -i '/find_package(openvslam REQUIRED)/a find_package(fbow REQUIRED)\nif(TARGET fbow AND NOT TARGET fbow::fbow)\n add_library(fbow::fbow ALIAS fbow)\nendif()' \ modules/realm_vslam/realm_vslam_base/CMakeLists.txt grep -q "find_package(fbow REQUIRED)" modules/realm_stages/CMakeLists.txt || \ sed -i '/find_package(openvslam REQUIRED)/a find_package(fbow REQUIRED)\nif(TARGET fbow AND NOT TARGET fbow::fbow)\n add_library(fbow::fbow ALIAS fbow)\nendif()' \ modules/realm_stages/CMakeLists.txt

重新 CMake:

cd /root/autodl-tmp/openrealm_ws/OpenREALM rm -rf build mkdir build cd build cmake ..

14. 编译安装 OpenREALM 主库

CMake 通过后,使用单线程编译:

cd /root/autodl-tmp/openrealm_ws/OpenREALM/build make -j1 2>&1 | tee make_openrealm.log

我的编译最终成功,最后看到:

[100%] Built target realm_stages

安装:

sudo make install sudo ldconfig

验证:

ls /usr/local/lib | grep -E "realm|open_realm" find /usr/local/include -maxdepth 2 -iname "*realm*" | head -n 30

15. 编译 ROS1 Bridge

进入 catkin workspace:

source /opt/ros/noetic/setup.bash cd /root/autodl-tmp/openrealm_ws/catkin_ws rm -rf build devel

第一次编译:

catkin_make \ -DCMAKE_BUILD_TYPE=Release \ -DPYTHON_EXECUTABLE=/usr/bin/python3 \ 2>&1 | tee make_bridge.log

16. Bridge 编译问题 1:conda Python 导致找不到 empy

报错:

Could NOT find PY_em Unable to find either executable 'empy' or Python module 'em' try installing the package 'python3-empy'

同时日志显示:

Using PYTHON_EXECUTABLE: /root/miniconda3/bin/python3

说明 catkin 用了 conda 的 Python,而不是系统 Python。

安装 empy:

sudo apt update sudo apt install -y python3-empy

检查系统 Python:

/usr/bin/python3 -c "import em; print(em.__file__)"

重新编译时显式指定