当前位置: 首页 > article >正文

RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程

RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程

  • 1. 背景介绍
  • 2. 问题描述
  • 3. 解决过程
    • 3.1 卸载旧版本
    • 3.2 安装 Suitesparse v5.8.0
    • 3.3 安装 Ceres Solver v2.0.0
    • 3.4 解决编译爆内存问题

同步发布在个人笔记RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程

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)上部署时,会遇到依赖安装上的问题。
主要有:

  1. Ceres Solver 最小二乘问题非线性优化库
    使用 libceres-dev 安装时,由于现在官方源里的 ceres 版本已经来到 v2.2.0,而 open_vins 适应的是 v2.0.0 及更早的版本。所以直接安装是不能成功编译的。故需要下载旧版本的 ceres 源码,手动编译安装。
    open_vins 不适配最新的 ceres 库是因为,自 v2.1.0 版本之后,类 LocalParameterization 被替换为类 Manifold了。
  2. Suitesparse 稀疏矩阵计算库
    在通过源码编译 ceres v2.0.0 时,通过官方源安装的 libsuitesparse-dev 又因为版本太新而无法编译,经过查阅发布时间,此时需要 v 5.8.0 的 Suitesparse 库。仍然需要手动源码安装。
  3. 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-devsudo 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 下的 includelib 文件夹查看是否有 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 下的 includelib 文件夹查看是否有 Ceres 相关的文件。

3.4 解决编译爆内存问题

最后一步就是编译 open_vins 源码了,爆内存问题已通过下文笔记解决:
Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译ROS2程序卡死问题

相关文章:

RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程

RISC-V 开发板 Ubuntu 23.04 部署 open_vins 过程 1. 背景介绍2. 问题描述3. 解决过程3.1 卸载旧版本3.2 安装 Suitesparse v5.8.03.3 安装 Ceres Solver v2.0.03.4 解决编译爆内存问题 同步发布在个人笔记RISC-V 开发板 Ubuntu 23.04 部署 open_vins 过程 1. 背景介绍 最近…...

量子计算突破:新型超导芯片重构计算范式

​​2024年IBM 1281量子比特超导芯片实现0.001%量子错误率,计算速度达经典超算2.5亿倍​​。本文解析: ​​物理突破​​:钽基超导材料使量子相干时间突破​​800μs​​(提升15倍)​​架构革命​​:十字形…...

Spring Cloud 多机部署与负载均衡实战详解

🧱 一、引言 为什么需要多机部署? 解决单节点性能瓶颈,提升系统可用性和吞吐量 在传统单机部署模式下,系统的所有服务或应用都运行在单一服务器上。这种模式在小型项目或低并发场景中可能足够,但随着业务规模扩大、用…...

基于定制开发开源AI智能名片S2B2C商城小程序的首屏组件优化策略研究

摘要:在数字化转型背景下,用户对首屏交互效率的诉求日益提升。本文以"定制开发开源AI智能名片S2B2C商城小程序"为技术载体,结合用户行为数据与认知心理学原理,提出首屏组件动态布局模型。通过分析搜索栏、扫码入口、个人…...

EasyRTC嵌入式音视频通信SDK音视频功能驱动视频业务多场景应用

一、方案背景​ 随着互联网技术快速发展,视频应用成为主流内容消费方式。用户需求已从高清流畅升级为实时互动,EasyRTC作为高性能实时音视频框架,凭借低延迟、跨平台等特性,有效满足市场对多元化视频服务的需求。 二、EasyRTC技术…...

Flink 失败重试策略 :restart-strategy.type

在 Apache Flink 中,restart-strategy.type 用于指定作业的重启策略(Restart Strategy),它决定了作业在失败后如何恢复。 Flink 提供了 4 种内置重启策略,可以通过 flink-conf.yaml 或代码动态配置。 1. 可配置的 rest…...

linux下gpio控制

linux下gpio控制 文章目录 linux下gpio控制1.中断命令控制/sys/class/gpio/export终端命令控制led 2.应用程序控制 3.驱动代码控制 1.中断命令控制 通用GPIO主要用于产生输出信号和捕捉输入信号。每组GPIO均可以配置为输出输入以及特定的复用功能。 当作为输入时,内…...

Spring Boot 从Socket 到Netty网络编程(下):Netty基本开发与改进【心跳、粘包与拆包、闲置连接】

上一篇:《Spring Boot 从Socket 到Netty网络编程(上):SOCKET 基本开发(BIO)与改进(NIO)》 前言 前文中我们简单介绍了基于Socket的BIO(阻塞式)与NIO(非阻塞式&#xff0…...

Orthanc:轻量级PACS服务器与DICOMweb支持的技术详解

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

量子计算导论课程设计 之 PennyLane环境搭建

文章目录 具体配置conda 虚拟环境配置Pennylane 正所谓,磨刀不误砍柴工,想要进行量子计算导论的课程设计,首先就是搭建好平台,推荐大家就是本地搭建,那么下面有三种选择 QiskitTensorFlow QuantumPennylane 具体配置…...

GAN优化与改进:从条件生成到训练稳定性

摘要 本文聚焦生成对抗网络(GAN)的核心优化技术与改进模型。系统解析 条件生成对抗网络(CGAN) 的可控生成机制、深度卷积GAN(DCGAN) 的架构创新,揭示GAN训练崩溃的本质原因,并介绍W…...

【Dv3Admin】系统视图下载中心API文件解析

大文件导出与批量数据下载常常成为后台系统性能瓶颈,合理管理下载任务是保障系统稳定运行的关键。任务化下载机制通过异步处理,避免前端等待阻塞,提升整体交互体验。 围绕 download_center.py 模块,剖析其在下载任务创建、查询、…...

linux库(AI回答)

STL POSIX关系 DeepSeek-R1 回答完成 搜索全网22篇资料 STL(标准模板库)和 POSIX(可移植操作系统接口)是两种不同领域的技术标准,它们在 C/C 开发中各有侧重,但可以协同使用。以下是它们的关系和区别&…...

CoordConv: CNN坐标感知特征适应

传统卷积 vs CoordConv 详细对比 传统卷积对空间位置不敏感,CoordConv通过显式添加坐标信息解决这个问题在特征图中嵌入(x, y)坐标和可选的径向距离r使模型能够感知空间位置关系 1. 传统卷积的"空间位置不敏感"问题 传统卷积的特点: 输入: …...

Kafka 快速上手:安装部署与 HelloWorld 实践(二)

四、Kafka 的 HelloWorld 实践 完成 Kafka 的安装部署后,我们就可以进行一些简单的操作来体验 Kafka 的功能了。下面通过一个 HelloWorld 示例,展示如何在 Kafka 中创建主题、发送消息和消费消息。 (一)创建主题(Top…...

opencv学习笔记2:卷积、均值滤波、中值滤波

目录 一、卷积概念 1.定义 2.数学原理 3.实例计算 (1) 输入与卷积核 (2)计算输出 g(2,2) 4.作用 二、针对图像噪声的滤波技术——均值滤波 1.均值滤波概念 (1)均值滤波作用 (2&#…...

在 Android Studio 中使用 GitLab 添加图片到 README.md

1. 将图片文件添加到项目中 在项目根目录下创建一个 images 或 assets 文件夹 将你的图片文件(如 screenshot.png)复制到这个文件夹中 2. 跟提交项目一样,提交图片到 GitLab 在 Android Studio 的 Git 工具窗口中: 右键点击图片…...

HarmonyOS:如何在启动框架中初始化HMRouter

应用启动时通常需要执行一系列初始化启动任务,如果将启动任务都放在应用主模块(即entry类型的Module)的UIAbility组件的onCreate生命周期中,那么只能在主线程中依次执行,不但影响应用的启动速度,而且当启动…...

Ubuntu下有关UDP网络通信的指令

1、查看防火墙状态: sudo ufw status # Ubuntu 2、 检查系统全局广播设置 # 查看是否忽略广播包(0表示接收,1表示忽略) sysctl net.ipv4.icmp_echo_ignore_broadcasts# 查看是否允许广播转发(1表示允许&#xff09…...

JavaWeb预习(jdbc)

基础 1.驱动程序接口Driver 每种数据库都提供了数据库驱动程序,并且都提供了一个实现java.sql.Driver接口的类,称为Driver 对于MySql,其Driver类为com.mysql.jdbc.Driver,加载该类的语句为: Class.forName("c…...

Web3 借贷与清算机制全解析:链上金融的运行逻辑

Web3 借贷与清算机制全解析:链上金融的运行逻辑 超额抵押借款 例如,借款人用ETH为抵押借入DAI;借款人的ETH的价值一定是要超过DAI的价值;借款人可以任意自由的使用自己借出的DAI 稳定币 第一步:借款人需要去提供一定…...

【Vue3】(三)vue3中的pinia状态管理、组件通信

目录 一、vue3的pinia 二、【props】传参 三、【自定义事件】传参 四、【mitt】传参 五、【v-model】传参(平常基本不写) 六、【$attrs】传参 七、【$refs和$parent】传参 八、provide和inject 一、vue3的pinia 1、什么是pinia? pinia …...

ingress-nginx 开启 Prometheus 监控 + Grafana 查看指标

环境已经部署了 ingress-nginx(DaemonSet 方式),并且 Prometheus Grafana 也已经运行。但之前 /metrics 端点没有暴露 Nginx 核心指标(如 nginx_ingress_controller_requests_total),经过调整后现在可以正…...

SQL进阶之旅 Day 21:临时表与内存表应用

【SQL进阶之旅 Day 21】临时表与内存表应用 文章简述 在SQL开发过程中,面对复杂查询、数据预处理和性能优化时,临时表和内存表是不可或缺的工具。本文深入讲解了临时表(Temporary Table)和内存表(Memory Table&#x…...

Jenkins自动化部署Maven项目

Jenkins自动化部署Maven项目 一、环境准备(Prerequisites) SpringBoot项目 确保项目根目录有标准Maven结构(pom.xml)且包含Dockerfile: # Dockerfile 示例 FROM openjdk:11-jre-slim VOLUME /tmp ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["j…...

LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上

题目:1667. 修复表中的名字 题解: select user_id, concat(upper(left(name,1)),lower(right(name,length(name)-1))) name from Users order by user_id题目:1527. 患某种疾病的患者 题解: select * from Patients where con…...

Python 中 Django 中间件:原理、方法与实战应用

在 Python 的 Web 开发领域,Django 框架凭借其高效、便捷和功能丰富的特点备受开发者青睐。而 Django 中间件作为 Django 框架的重要组成部分,犹如 Web 应用的 “交通枢纽”,能够在请求与响应的处理流程中,实现对请求和响应的拦截…...

深入浅出玩转物联网时间同步:基于BC260Y的NTP实验与嵌入式仿真教学革命

在万物互联的时代,精准的时间戳是物联网系统的神经节拍器,而NTP协议正是维持这一节律的核心技术。 一、时间同步:物联网世界的隐形基石 在智慧城市、工业4.0等场景中,分散的设备需要毫秒级的时间协同。网络时间协议(N…...

数学建模期末速成 主成分分析的基本步骤

设有 n n n个研究对象, m m m个指标变量 x 1 , x 2 , ⋯ , x m x_1,x_2,\cdots,x_m x1​,x2​,⋯,xm​,第 i i i个对象关于第 j j j个指标取值为 a i j a_{ij} aij​,构造数据矩阵 A ( a i j ) n m A\left(\begin{array}{c}a_{ij}\end{array}\right)_{…...

视频音频去掉开头结尾 视频去掉前n秒后n秒 电视剧去掉开头歌曲

视频音频去掉开头结尾 视频去掉前n秒后n秒 视频音频去掉开头结尾 视频去掉前n秒后n秒 电视剧去掉开头歌曲 如果你有一些视频或者音频,你想去掉开头或结尾的几秒钟,那么你可以尝试一下这个工具,首先,我们来看一下,我们以…...