最近遇到一个需求,就是在 RISC-V 开发板:进迭时空 MUSE Pi Pro 上部署开源的 MSCKF 方案 open_vins
。
在一般民用平台上部署官方是有详细可靠的步骤的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)上部署时,会遇到依赖安装上的问题。
主要有:
libceres-dev
安装时,由于现在官方源里的 ceres 版本已经来到 v2.2.0,而 open_vins 适应的是 v2.0.0 及更早的版本。所以直接安装是不能成功编译的。故需要下载旧版本的 ceres 源码,手动编译安装。LocalParameterization
被替换为类 Manifold
了。libsuitesparse-dev
又因为版本太新而无法编译,经过查阅发布时间,此时需要 v 5.8.0 的 Suitesparse 库。仍然需要手动源码安装。如果已经通过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
手动下载正确版本的源码,并解压。
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 相关的文件。
已经完成上一步的安装后,就可以开始安装 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 相关的文件。
最后一步就是编译 open_vins 源码了,爆内存问题已通过下文笔记解决:
Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译ROS2程序卡死问题