RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
Contents
1. 背景介绍
最近遇到一个需求,就是在 RISC-V 开发板:进迭时空 MUSE Pi Pro 上部署开源的 MSCKF 方案 open_vins
。
- 进迭时空 MUSE Pi Pro
MUSE Pi Pro 单板计算机将 RISC-V 八核处理器、存储硬盘、通用接口部件和扩展接口布置在同一块电路板上,支持 UEFI 启动以及多种操作系统和应用的运行,是一款完整的计算机系统产品。MUSE Pi Pro 为 1.8 寸单板,能够满足大语言模型应用、机器人、教育科研和物联网等场景中低功耗、空间紧凑情况下的算力需求,为 AI 新时代提供计算能力和丰富的接口扩展。 - open_vins
OpenVINS 项目包含一些核心计算机视觉代码以及最先进的基于滤波器的视觉惯性估计器。核心滤波器是一个扩展的卡尔曼滤波器,它将惯性信息与稀疏的视觉特征轨迹融合在一起。这些视觉特征轨迹利用多态约束卡尔曼滤波器 (MSCKF) 滑动窗口公式进行融合,该公式允许 3D 特征更新状态估计,而无需直接估计滤波器中的特征状态。受基于图的优化系统的启发,包含的过滤器具有模块化,允许使用适当的基于类型的状态系统方便地进行协方差管理。
2. 问题描述
在一般民用平台上部署官方是有详细可靠的步骤的Open_vins Getting Started » Installation Guide。
# ROS2 安装过程略去
# 安装相关依赖
sudo apt-get install ros-$ROS2_DISTRO-ros2bag ros-$ROS2_DISTRO-rosbag2* # rosbag utilities (seems to be separate)
sudo apt-get install libeigen3-dev libboost-all-dev libceres-dev
# 下载 open_vins 源码并编译
mkdir -p ~/workspace/catkin_ws_ov/src/
cd ~/workspace/catkin_ws_ov/src/
git clone https://github.com/rpng/open_vins/
cd ..
catkin build # ROS1
colcon build # ROS2
colcon build --event-handlers console_cohesion+ --packages-select ov_core ov_init ov_msckf ov_eval # ROS2 with verbose output
但是当在 RISC-V 平台(MUSE Pi Pro)上部署时,会遇到依赖安装上的问题。
主要有:
- Ceres Solver 最小二乘问题非线性优化库
使用libceres-dev
安装时,由于现在官方源里的 ceres 版本已经来到 v2.2.0,而 open_vins 适应的是 v2.0.0 及更早的版本。所以直接安装是不能成功编译的。故需要下载旧版本的 ceres 源码,手动编译安装。
open_vins 不适配最新的 ceres 库是因为,自 v2.1.0 版本之后,类LocalParameterization
被替换为类Manifold
了。 - Suitesparse 稀疏矩阵计算库
在通过源码编译 ceres v2.0.0 时,通过官方源安装的libsuitesparse-dev
又因为版本太新而无法编译,经过查阅发布时间,此时需要 v 5.8.0 的 Suitesparse 库。仍然需要手动源码安装。 - open_vins 编译卡死开发板
依赖全部安装成功后,编译时会屡次卡死开发板。原因是内存不足导致的系统死机。
3. 解决过程
3.1 卸载旧版本
如果已经通过apt-get install
方式安装了错误版本的库,可以通过下述命令卸载错误的库以及相关的依赖。
### 相关命令
sudo apt remove example-package # 删除软件包
sudo apt purge example-package # 删除软件包,并且删除与该软件包相关的所有配置文件
sudo apt autoremove -s # 查看卸载完成后不再需要的依赖包,并未直接卸载
sudo apt autoremove # 卸载相关无用依赖包
### 本文相关
sudo apt remove libceres-dev libsuitesparse-dev
sudo apt purge libceres-dev libsuitesparse-dev
sudo apt autoremove -s
sudo apt autoremove
3.2 安装 Suitesparse v5.8.0
手动下载正确版本的源码,并解压。
Suitesparse 下载地址
安装相关依赖
sudo apt-get install libopenblas-dev
sudo apt-get install libgmp-dev
sudo apt-get install libmpfr-dev
由于 v5.8.0 的源码没有适配 Cmake 工具,所以仍然需要使用 make 命令进行编译安装
# 编译,可以指定使用几个 cpu 核
make -j4
# 安装,注意此版本必须指定安装位置为 /usr/local !!!
# 否则会安装在当前位置,无法被别的库默认搜索到
sudo make install INSTALL=/usr/local
# 卸载操作
sudo make uninstall DESTDIR=/path/to/installation
sudo make uninstall PREFIX=/path/to/installation
运行结束后,可以去路径 /usr/local
下的 include
和 lib
文件夹查看是否有 Suitesparse 相关的文件。
3.3 安装 Ceres Solver v2.0.0
已经完成上一步的安装后,就可以开始安装 ceres 库了。
手动下载正确版本的源码,并解压。
Ceres Solver 下载地址
安装相关依赖
# google-glog + gflags
sudo apt-get install libgoogle-glog-dev
# BLAS & LAPACK
sudo apt-get install libatlas-base-dev
# Eigen3 一般已经在安装 ROS 时安装过了
sudo apt-get install libeigen3-dev
# SuiteSparse and CXSparse 已经通过上一步手动安装过了,故不需要再运行
sudo apt-get install libsuitesparse-dev
在 Ceres 源码文件夹内进行安装
mkdir build
cd build
cmake ..
make -j4
make test
# 默认安装在 /usr/local,无需指定
sudo make install
注意: 查看 cmake 的返回信息,是否包含成功找到 Suitesparse 库的字段,一般为如下形式:
-- Found LAPACK library: /usr/lib/riscv64-linux-gnu/libopenblas.so;-lm;-ldl
-- Found AMD headers in: /usr/local/include
-- Found AMD library: /usr/local/lib/libamd.so
-- Found CAMD headers in: /usr/local/include
-- Found CAMD library: /usr/local/lib/libcamd.so
-- Found COLAMD headers in: /usr/local/include
-- Found COLAMD library: /usr/local/lib/libcolamd.so
-- Found CCOLAMD headers in: /usr/local/include
-- Found CCOLAMD library: /usr/local/lib/libccolamd.so
-- Found CHOLMOD headers in: /usr/local/include
-- Found CHOLMOD library: /usr/local/lib/libcholmod.so
-- Found SUITESPARSEQR headers in: /usr/local/include
-- Found SUITESPARSEQR library: /usr/local/lib/libspqr.so
-- Found Intel Thread Building Blocks (TBB) library (2020.2 / 11102) include location: /usr/include. Assuming SuiteSparseQR was compiled with TBB.
-- Found SUITESPARSE_CONFIG headers in: /usr/local/include
-- Found SUITESPARSE_CONFIG library: /usr/local/lib/libsuitesparseconfig.so
-- Found LIBRT library: /usr/lib/riscv64-linux-gnu/librt.a
-- Adding librt: /usr/lib/riscv64-linux-gnu/librt.a to SuiteSparse_config libraries (required on Linux & Unix [not OSX] if SuiteSparse is compiled with timing).
-- Found METIS library: /usr/local/lib/libmetis.so
-- Found SuiteSparse: TRUE (found version "5.8.0")
-- Found SuiteSparse 5.8.0, building with SuiteSparse.
-- Found CXSparse: /usr/local/include (found version "3.2.0")
-- Found CXSparse version: 3.2.0, building with CXSparse.
-- Building without Apple's Accelerate sparse support.
-- Found Google Flags (gflags) version 2.2.2: /usr/lib/riscv64-linux-gnu/cmake/gflags
-- No preference for use of exported glog CMake configuration set, and no hints for include/library directories provided. Defaulting to preferring an installed/exported glog CMake configuration if available.
-- Found installed version of glog: /usr/lib/riscv64-linux-gnu/cmake/glog
-- Detected glog version: 0.6.0
-- Found Glog: glog::glog
-- Found Google Log (glog). Assuming glog was built with gflags support as gflags was found. This will make gflags a public dependency of Ceres.
运行结束后,可以去路径 /usr/local
下的 include
和 lib
文件夹查看是否有 Ceres 相关的文件。
3.4 解决编译爆内存问题
最后一步就是编译 open_vins 源码了,爆内存问题已通过下文笔记解决:
Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译ROS2程序卡死问题