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 还需要能找到独立的 fbow CMake 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__)"

重新编译时显式指定

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐