上位机图像处理和嵌入式模块部署(树莓派4b与视觉slam十四讲)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        实际使用中,树莓派4b是非常好的一个基础平台。本身板子价格也不是很贵,建议大家多多使用。之前关于vslam,也就是视觉slam,有一本书很火,叫《视觉slam十四讲》。它里面就谈到了很多第三方库的安装,这些库其实都是可以在树莓派4b上面运行的。这样有了4b这样的开发板,大家就不需要反复打开和关闭虚拟机来运行linux了。

1、安装cmake

        cmake本身树莓派4b是不带的,但是slam的一些第三方库编译需要它,所以直接sudo安装,

sudo apt-get install cmake

2、《视觉slam十四讲》github代码

        很多同学只看书不实操,这是不对的。针对书中代码部分,是要反复研习的。好在作者提供了相应的github地址,

https://github.com/gaoxiang12/slambook

3、安装eigen库

        eigen是很基础的矩阵库,里面的加、减、乘、除、求逆、转置,我们都会用到。这里也是同样的直接用sudo安装的,

sudo apt-get install libeigen3-dev

        安装好之后,就可以用一个十四讲里面的demo代码验证一下,

g++ eigenMatrix.cpp -I/usr/include/eigen3 -g -o eigenMatrix

4、安装sophus库

        十四讲里面的sophus库是非模板类,我们使用的sophus库是基于模板类的,就是这一点小小的区别。代码下载的地址如下所示,选择默认分支即可,

https://github.com/strasdat/Sophus

        有了代码,下面就可以准备编译了,

(a) 删除CMakeLists.txt中的-Werror
(b) sudo apt-get install libfmt-dev
(b) make build, cd build, cmake ..
(c) make
(d) sudo make install

        编译过程不算复杂,就是在4b上面编译的时间比较长一点。最后,因为我们安装的sophus库是基于模板类的,所以只能从其他地方找demo代码编译,比如这里,

https://www.cnblogs.com/xkbl-blogs/p/14458669.html

        编译的话,可以直接用g++编译,

g++ demo.cpp -I/usr/include/eigen3 -I/usr/local/include -g -o demo -lfmt

        本身sophus库是用来解决李群、李代数的问题。而李群、李代数又是为了解决矩阵求导的问题,大家把它当成一个数学工具,记住结论并且会解决问题就好。至于推导的过程,暂时看不懂,也没有关系。

        当然,如果大家还是想使用之前十四讲sophus的demo测试代码,其实修改下就好了,

#include <iostream>
#include <cmath>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include "sophus/se3.hpp"using namespace std;
using namespace Eigen;/// 本程序演示sophus的基本用法int main(int argc, char **argv) {// 沿Z轴转90度的旋转矩阵Matrix3d R = AngleAxisd(M_PI / 2, Vector3d(0, 0, 1)).toRotationMatrix();// 或者四元数Quaterniond q(R);Sophus::SO3d SO3_R(R);              // Sophus::SO3d可以直接从旋转矩阵构造Sophus::SO3d SO3_q(q);              // 也可以通过四元数构造// 二者是等价的cout << "SO(3) from matrix:\n" << SO3_R.matrix() << endl;cout << "SO(3) from quaternion:\n" << SO3_q.matrix() << endl;cout << "they are equal" << endl;// 使用对数映射获得它的李代数Vector3d so3 = SO3_R.log();cout << "so3 = " << so3.transpose() << endl;// hat 为向量到反对称矩阵cout << "so3 hat=\n" << Sophus::SO3d::hat(so3) << endl;// 相对的,vee为反对称到向量cout << "so3 hat vee= " << Sophus::SO3d::vee(Sophus::SO3d::hat(so3)).transpose() << endl;// 增量扰动模型的更新Vector3d update_so3(1e-4, 0, 0); //假设更新量为这么多Sophus::SO3d SO3_updated = Sophus::SO3d::exp(update_so3) * SO3_R;cout << "SO3 updated = \n" << SO3_updated.matrix() << endl;cout << "*******************************" << endl;// 对SE(3)操作大同小异Vector3d t(1, 0, 0);           // 沿X轴平移1Sophus::SE3d SE3_Rt(R, t);           // 从R,t构造SE(3)Sophus::SE3d SE3_qt(q, t);            // 从q,t构造SE(3)cout << "SE3 from R,t= \n" << SE3_Rt.matrix() << endl;cout << "SE3 from q,t= \n" << SE3_qt.matrix() << endl;// 李代数se(3) 是一个六维向量,方便起见先typedef一下typedef Eigen::Matrix<double, 6, 1> Vector6d;Vector6d se3 = SE3_Rt.log();cout << "se3 = " << se3.transpose() << endl;// 观察输出,会发现在Sophus中,se(3)的平移在前,旋转在后.// 同样的,有hat和vee两个算符cout << "se3 hat = \n" << Sophus::SE3d::hat(se3) << endl;cout << "se3 hat vee = " << Sophus::SE3d::vee(Sophus::SE3d::hat(se3)).transpose() << endl;// 最后,演示一下更新Vector6d update_se3; //更新量update_se3.setZero();update_se3(0, 0) = 1e-4;Sophus::SE3d SE3_updated = Sophus::SE3d::exp(update_se3) * SE3_Rt;cout << "SE3 updated = " << endl << SE3_updated.matrix() << endl;return 0;
}

5、安装opencv

        这部分虽然前面的文章提供了相应的步骤,这里不妨重新温习一下。安装方法就是直接sudo安装,

sudo apt-get install libopencv-dev

        编译方法就是用g++编译,不过要添加上头文件和lib文件,

g++ imageBasics.cpp -o imagesBasics -I /usr/include/opencv4/ -L /usr/lib/ -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc

6、ceres库

        ceres和下面要讲的g2o都是一种数据优化方法。一般来说,我们构建好一个损失函数之后,都不是通过数学方法直接计算的,大部分情况都是通过优化方法步步逼近解决的。如果不使用优化方法,指望穷举来找到最优值,花费的时间就太多了,无法满足实时处理的要求。

        好在ceres可以直接用sudo安装,这样方便一点,

sudo apt-get install libceres-dev

        安装后,就可以在/usr/include和/lib/aarch64-linux-gnu下面看到相应的头文件、lib文件了。这个时候就可以用g++直接编译了,

g++ main.cpp -o main -I/usr/include/opencv4/ -I/usr/include/eigen3  -I/usr/local/include -L/usr/lib/ -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc -lceres -lglog

7、g2o库的编译和使用

        g2o,也就是图优化,是目前用的比较多的一种优化方法。因为没有通过sudo apt-cache search找到对应的安装库,所以就自己下载代码来处理了。代码可以从这个地方下载,

https://github.com/RainerKuemmerle/g2o

        编译也没有什么复杂的,整个过程除了时间长一点,没有遇到什么困难,

(a) 解压文件
(b) mkdir build
(c) cd build 
(d) cmake ..
(e) make
(f) make install

        安装好了库之后,接下来就可以编译、运行示例程序了。编译时,就是选项多了一点,其他都还好,

g++ main.cpp -o main -I/usr/include/opencv4/ -I/usr/include/eigen3  -I/usr/local/include -L/usr/lib/ -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc -lg2o_core -lg2o_stuff

        最后运行的时候,我们发现找不到动态库,这个时候就要重新配置一下LD_LIBRARY_PATH,

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

        至此,g2o也算是用起来了。

8、总结

        当然,不光上面这些内容,树莓派4b还有可能安装一些其他的内容,比如说qt、ros、pcd点云库等等。不管是什么需求,我们努力去安装就好了,逢山开路、遇水搭桥,只有用树莓派4b解决越来越多的专业问题,才能体现我们软件的价值所在,而不是在低端的领域反复做一些造轮子的事情。

        十四讲的1-6章非常重要,在作者的另外一本书《自动驾驶与机器人的slam技术》中也大量使用,有兴趣的同学可以去看看,会有不少的收获。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker基本操作学习

基本指令 docker服务启动&#xff1a; service docker start service docker restart service docker stop# 重启服务器自动运行docker systemctl enable docker镜像生成方式&#xff1a; 通过docker build DockerFile… 生成镜像 镜像相关指令&#xff1a; docker push 仓…

【Python】MongoDB中的批量写入案例,避免单条插入失败导致整体失败

当看尽潮起潮落 只要你记得我 你曾说过 会永远爱我 也许承诺 不过证明没把握 不用难过 不用掩饰什么 当结果是那么赤裸裸 其实不必说什么 才能离开我 起码那些经过属于我 &#x1f3b5; 莫文蔚《盛夏的果实》 MongoDB是一个功能强大的NoSQL数据库&#xf…

【黑马点评Redis——003优惠券秒杀4——消息队列Stream】

1. 目前还存在的问题 设置的阻塞队列可能会超出最大长度系统重启会导致阻塞队列中的信息消失&#xff0c;可能会出现问题 2. 消息队列 消息队列 (Message Queue)。 字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色消息队列:存储和管理消息&#xff0c;也被称为…

甲醛传感器ETO-A1在建筑装修过程中甲醛监测的重要作用

随着建筑装修行业的快速发展&#xff0c;甲醛污染问题逐渐受到人们的关注。甲醛是一种常见的室内空气污染物&#xff0c;主要来源于建筑装修过程中使用的各种材料。为了保障人们的健康和安全&#xff0c;甲醛传感器在装修过程中的监测作用显得尤为重要。英国Alphasense公司推出…

vue3 -- 基于maptalks和threejs实现3D地图板块效果

文章目录 🍉开发环境🍉实现效果🍉准备地图json文件🍉文件结构🍉代码🍉side_mode (纹理图片)🍉开发环境 vue“3.3.4”maptalks“1.0.0-rc.23”maptalks.three“^0.38.3”three“~0.143.0”maptalks/gl-layers“^0.34.1”node“v16.20.0”pnpm“8.6.2”🍉实现效

矽塔SA6288Q栅极驱动器,可替代峰绍FD6288Q

SA6288 是一款集成了三个独立半桥栅极驱动器&#xff0c;特别适合于三相电机应用中高速功率MOSFET 和 IGBT 的栅极驱动。可在高达250V 电压下工作。 SA6288内置 VCC 和 VBS 欠压&#xff08; UVLO &#xff09;保护功能&#xff0c;防止功率管在过低的电压下工作&#xff0c;…

记一次 Java 应用内存泄漏的定位过程

问题现象 最近&#xff0c;笔者负责测试的某个算法模块机器出现大量报警&#xff0c;报警表现为机器CPU持续高占用。该算法模块是一个优化算法&#xff0c;本身就是CPU密集型应用&#xff0c;一开始怀疑可能是算法在正常运算&#xff0c;但很快这种猜测就被推翻&#xff1a;同…

vue 的 diff 算法

vue的diff算法&#xff0c;是其虚拟DOM实现中的核心部分&#xff0c;用于高效地比较新旧虚拟节点&#xff0c;并据此更新实际的DOM&#xff0c; vue的diff算法&#xff0c;基于以下策略来优化性能&#xff1a; 1、同层比较&#xff1a; Vue 的 diff 不会跨层级比较节点&…

springboot基于点餐码 二维码在线点餐系统vue.js+java

Maven: 项目管理和构建自动化工具&#xff0c;用于java项目。 java: 广泛使用的编程语言&#xff0c;适用于构建跨平台应用。 Springmvc:从而在使用Spring进行WEB开发时&#xff0c;可以选择使用Spring的Spring MVC框架。 MyBatis: java持久层框架&#xff0c;支持定制化SQL、存…

DirectX12(D3D12)基础教程(二十三) ——DirectShaderCompiler 头文件接口 ID3DInclude 的应用

目录 1、前言2、ID3DInclude 回调接口介绍3、基本使用方法4、示例代码中的实现 1、前言 本章教程较短小&#xff0c;但内容十分重要&#xff0c;是后续更灵活使用 Shader 编程的重要基础之一。也就是对 Shader 代码进行头文件分离复用设计进行全面支持。或者直白的说&#xff0…

第68天:APP攻防-XposedFridaHook证书校验反代理代理转发

目录 思维导图 案例一&#xff1a;某牛防抓包-xposed&frida&r0capture 如何检测是否启动了反代理 xp框架 方案二&#xff1a;某社交防抓包-Proxifier&frida&r0capture 思维导图 案例一&#xff1a;某牛防抓包-xposed&frida&r0capture 这里某牛软…

C语言-结构体基本概念

在C语言中&#xff0c;结构体提供了一种将多种不同数据类型组装起来形成自定义变量类型的方式&#xff0c;使得我们可以更好地表示现实生活中的复杂对象。比如&#xff0c;一个学生可以有学号&#xff08;整型&#xff09;、姓名&#xff08;字符串&#xff09;、分数&#xff…

Python | Leetcode Python题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution:def permute(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""def backtrack(first 0):# 所有数都填完了if first n: res.append(nums[:])for i in range(first, n):# 动…

WebSocket的原理、作用、API、常见注解和生命周期的简单介绍,附带SpringBoot示例

文章目录 原理作用客户端 API服务端 API生命周期常见注解SpringBoot示例 WebSocket是一种 通信协议 &#xff0c;它在 客户端和服务器之间建立了一个双向通信的网络连接 。WebSocket是一种基于TCP连接上进行 全双工通信 的 协议 。 WebSocket允许客户端和服务器在 单个TCP连接上…

Java Spring 的 ApplicationContext - 核心接口

ApplicationContext 是 Spring 框架中一个核心的接口&#xff0c;它代表了 Spring IoC 容器的配置&#xff0c;用于实例化、配置和组装应用中的对象。通过 ApplicationContext&#xff0c;我们可以方便地获取 Spring 容器中管理的 Bean&#xff0c;同时它还提供了一些额外的功能…

spring提高并发能力

小型系统一般都是在controller直接处理接口逻辑&#xff0c;这样占用的是tomcat的工作线程 &#xff08;1&#xff09;这个线程是有数的&#xff0c;不能无限大 &#xff08;2&#xff09;这个线程同时负责接收处理请求&#xff0c;如果被占满&#xff0c;这无法接收新来的请…

2024深圳杯东三省数学建模ABC选题建议详细思路分析

2024东三省/深圳杯ABC题详细思路分析和选题建议 ABC三题难度分析 A<C<B 我们将同时做ABC中的两题&#xff0c;今天可以给全部的代码&#xff0c;明天凌晨给全部的文章 B难点&#xff1a;工件要怎么处理 pdf文件的处理 C难点&#xff1a;你需要自行找到不同编译结果的主…

基于FPGA轻松玩转AI

启动人工智能应用从来没有像现在这样容易&#xff01;受益于像Xilinx Zynq UltraScale MPSoC 这样的FPGA&#xff0c;AI现在也可以离线使用或在边缘部署、使用.可用于开发和部署用于实时推理的机器学习应用&#xff0c;因此将AI集成到应用中变得轻而易举。图像检测或分类、模式…

Python写个二维码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、进入官网下载二、下载一下三.输入代码 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、进入官网下载 官网 pip insta…

word删除单页的页眉

在Microsoft Word中&#xff0c;如果您想删除单页的页眉而不是整个文档的页眉&#xff0c;您需要确保该页位于一个独立的节中&#xff0c;或者调整其页眉设置以使其不同于其他页面。以下是如何删除单页页眉的步骤&#xff1a; 打开Word文档&#xff1a;首先&#xff0c;打开包含…