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

news/2024/5/19 16:24:39

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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.mrgr.cn/p/55241887

相关文章

WAF攻防-漏洞发现协议代理池GobyAwvsXray

知识点 1、Http/s&Sock5协议 2、Awvs&Xray&Goby代理 3、Proxifier进程代理使用 4、Safedog&BT&Aliyun防护在漏洞发现中&#xff0c;WAF会对三个方向进行过滤拦截&#xff1a; 1、速度频率问题&#xff08;代理池解决&#xff09; 2、工具的指纹被识别&am…

XMU《计算机网络与通信》第三次实验报告

一、个人信息 学号:************** 姓名:### 二、实验目的理解TCP和UDP协议主要特点掌握socket的基本概念和工作原理,编程实现socket通信三、实验任务与结果 任务 1 前置任务开启两个终端窗口,分别编译、运行 server_example.c 和 client_example.c,观察它们实现的功能。可…

vis.js样式3d图形

代码案例<!DOCTYPE html> <html><head><title>Graph 3D demo</title><style>body {font: 10pt arial;}</style><scripttype="text/javascript"src="https://unpkg.com/vis-graph3d@latest/dist/vis-graph3d.min.j…

Redis系列之Cluster集群搭建

在上一篇博客&#xff0c;我们学习Redis哨兵Sentinel集群的搭建&#xff0c;redis的哨兵模式提供了比如监控、自动故障转移等高可用方案&#xff0c;但是这种方案&#xff0c;容量相对固定&#xff0c;要进行持续扩容或者数据分片就不适合&#xff0c;所以有另外一种更复杂的集…

使用 ECharts 绘制咖啡店各年订单的可视化分析

使用 ECharts 绘制咖啡店各年订单的可视化分析 在这篇博客中&#xff0c;我将分享一段使用 ECharts 库创建可视化图表的代码。通过这段代码&#xff0c;我们可以直观地分析咖啡店各年订单的情况。 饼图 这段代码包含了两个 ECharts 图表&#xff0c;一个是饼图&#xff0c;用…

vis.js线条3d图形

代码案例<!DOCTYPE html> <html><head><title>Graph 3D demo</title><style>body {font: 10pt arial;}</style><scripttype="text/javascript"src="https://unpkg.com/vis-graph3d@latest/dist/vis-graph3d.min.j…

华为数通HCIA ——企业网络架构以及产品线

一.学习目标&#xff1a;精讲网络技术&#xff0c;可以独立搭建和维护中小企业网络&#xff01; 模拟器&#xff08;华为方向请安装ENSP&#xff0c;Ensp-Lite已有安装包&#xff0c;号称功能更加完善-这意味着要耗费更多的系统资源但是仅对华为内部伙伴申请后方可使用&#x…

Linux RTC驱动深入解析

目录标题 实时时钟&#xff08;RTC&#xff09;基础Linux内核中的RTC框架RTC设备类设备树&#xff08;Device Tree&#xff09; 编写Linux RTC驱动1. 初始化和注册2. RTC设备操作函数3. 清理函数 测试RTC驱动驱动开发的挑战总结 在许多嵌入式系统和服务器上&#xff0c;实时时钟…

一三云:教你小型企业如何选择云服务器

在数字化时代,云服务器已成为小型企业实现数字化转型的关键工具。对于小型企业而言,选择合适的云服务器不仅能够降低IT成本,提高运营效率,还能够确保数据的安全性和业务的连续性。然而,面对市面上众多云服务器提供商和复杂的产品选择,小型企业往往感到困惑和不知所措。本…

深入理解高级加密标准(Advanced Encryption Standard)

title: 深入理解高级加密标准&#xff08;Advanced Encryption Standard&#xff09; date: 2024/4/23 20:04:36 updated: 2024/4/23 20:04:36 tags: AES概述加密原理优势特点算法详解安全性应用实践案例分析 第一章&#xff1a;AES概述 AES的历史和背景 历史&#xff1a; 高…

YOLOV8训练问题

代码如上,效果如下:无限循环打印权重文件修改为如下即可,通过if __name__ == __main__使得代码不会被其余文件循环调用(具体为何被调用不知):

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时&#xff08;这里的改动可以指 INSERT 、 DELETE 、 UPDATE &#xff09;&#xff0c;都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;之后回滚的…

maven仓库下载不下来的包如何自己安装(本地宝导入到maven仓库)

1.下载jar包 https://mvnrepository.com/ 在官网上搜索jar包,点击下载2.将jar包放在一个没有中文的路径下(我放在了D盘根路径下) 打开CMD框执行下面的命令 mvn install:install-file -Dfile=D:\kingbase8-8.6.0.jar -DgroupId=com.kingbase -DartifactId=kingbase8 -Dversio…

在PostgreSQL中如何实现递归查询,例如使用WITH RECURSIVE构建层次结构数据?

文章目录 解决方案使用WITH RECURSIVE进行递归查询示例代码 总结 在PostgreSQL中&#xff0c;递归查询是一种非常强大的工具&#xff0c;它可以用来查询具有层次结构或树形结构的数据。例如&#xff0c;你可能会在员工-经理关系、目录结构或组织结构图中遇到这样的数据。为了处…

ZStack教育云计算解决方案入选高质量数字化转型技术解决方案集

近日&#xff0c;中国信通院“铸基计划”《高质量数字化转型技术解决方案&#xff08;2023年度&#xff09;》&#xff08;以下简称“方案集”&#xff09;发布&#xff0c;云轴科技ZStack智慧教育云计算解决方案入选《高质量数字化转型技术解决方案集》。 为促进数字化转型相…

HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置

本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。介绍 本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。 效果图预览使用说明:拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。 拖拽…

An Analysis of Sequential Recommendation Datasets

目录概统计角度论证实验论证代码Woolridge D., Wilner S. and Glick M. An analysis of sequential recommendation datasets. PERSPECTIVES, 2021.概 本文讨论了 MovieLens 系列数据集是否适用于序列推荐. 统计角度论证作者为了论证 MovieLens 不适合作为序列推荐数据集, 首先…

Docker(二十)-Docker容器CPU、memory资源限制

背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用…

Docker(十七)-修改Docker容器启动配置参数

有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动,现在要添加该参数怎么办呢,方法有二: 1、Docker 命令修改 docker container update --restart=always 容器名字 2、直接改配置文件 首先停止容器,不然无法修改配置文件 配置文件…

Docker(十四)-Docker四种网络模式

Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看:none模式,使用--net=none指定,该模式关闭了容器的网络功能。 host模式,使用--net=host指定,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 bridge模式,使用…