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 还需要能找到独立的 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__)"
重新编译时显式指定
更多推荐
所有评论(0)