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.zip3. 解压 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.xml4. 检查 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-plugin6. 补 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 install8. 解压 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=OFF10. 编译安装 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/fbow12. 第一次 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 3015. 编译 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.log16. 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__)"重新编译时显式指定