上位机图像处理和嵌入式模块部署(树莓派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://xiahunao.cn/news/2981909.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT实战100例 - (18) 用事件风暴玩转DDD

文章目录 ChatGPT实战100例 - (18) 用事件风暴玩转DDD一、标准流程二、定义目标和范围三、准备工具和环境四、列举业务事件五、 组织和排序事件六、确定聚合并引入命令七、明确界限上下文八、识别领域事件和领域服务九、验证和修正模型十、生成并验证软件设计十一、总结 ChatGP…

力扣HOT100 - 108. 将有序数组转换为二叉搜索树

解题思路&#xff1a; 二叉搜索树一般使用中序遍历 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return helper(nums,0,nums.length-1);}public TreeNode helper(int[] nums,int left,int right){if(left>right) return null;//确定根节点//总是选择中…

2024年阿里云域名注册活动,com域名1元起,cn域名33元起

随着互联网的飞速发展&#xff0c;一个好的域名已经成为了企业或个人在线身份的重要标志。注册域名是很多用户开启互联网业务的第一步&#xff0c;2024年很多注册商现在com域名注册都快逼近80元了。作为国内最大的域名注册商与云服务商&#xff0c;近日&#xff0c;阿里云推出了…

提升你的C编程技能:使用cURL下载Kwai视频

概述 本文将介绍如何利用C语言以及cURL库来实现Kwai视频的下载。cURL作为一个功能强大的网络传输工具&#xff0c;能够在C语言环境下轻松地实现数据的传输。我们还将探讨如何运用代理IP技术&#xff0c;提升爬虫的匿名性和效率&#xff0c;以适应Kwai视频平台的发展趋势。 正…

Java web应用性能分析之【Linux服务器性能监控分析概叙】

大多数场景&#xff0c;我们的Java web应用都是部署在linux环境&#xff0c;所以对linux服务器的性能指标需要有一个比较清晰的认识。Linux服务器的性能指标无非就5个方面&#xff1a;CPU、内存、磁盘、网络、文件系统。不同的性能指标都有对应的命令进行监控和查看&#xff08…

【前端面试常问】什么是前端工程化

&#x1f31f;【前端面试常问】前端工程化&#x1f31f; &#x1f4da; 什么是前端工程化&#xff1f; &#x1f389; 前端工程化&#xff0c;简而言之&#xff0c;是通过整合先进的工具链和最佳实践&#xff0c;将前端开发过程实现标准化、自动化和高效化的过程&#xff0c;…

美森快船和以星快船有什么区别?美线海运都有哪些快船?

在繁忙的国际海运市场中&#xff0c;快船服务以其高效、快捷的特点受到广大货主的青睐。其中&#xff0c;美森快船和以星快船作为知名的海运服务提供商&#xff0c;凭借着卓越的服务品质&#xff0c;在航运界树立了良好的口碑。那么&#xff0c;美森快船和以星快船究竟有何不同…

探讨自回归模型和扩散模型的发展应用

在当前大模型驱动的内容创新浪潮中&#xff0c;人工智能产业正以前所未有的力度拥抱一场由大模型技术策动的科技革新运动。这场革命不仅重塑了人机交互的边界&#xff0c;使其跃升至更高层次的认知协作&#xff0c;而且正在颠覆传统的计算思维与执行模式&#xff0c;催生出全新…

SpringCloud引入SpringBoot Admin

Spring Boot Admin可以监控和管理Spring Boot&#xff0c;能够将 Actuator 中的信息进行界面化的展示&#xff0c;也可以监控所有 Spring Boot 应用的健康状况&#xff0c;提供警报功能。 1. 创建SpringBoot工程 2. 引入相关依赖 <dependency><groupId>com.alib…

安全小课堂丨什么是暴力破解?如何防止暴力破解

什么是暴力破解&#xff1f; 暴力破解也可称为穷举法、枚举法&#xff0c;是一种比较流行的密码破译方法&#xff0c;也就是将密码进行一一推算直到找出正确的密码为止。比如一个6位并且全部由数字组成的密码&#xff0c;可能有100万种组合&#xff0c;也就是说最多需要尝试10…

Python-VBA函数之旅-isinstance函数

目录 一、isinstance函数的常见应用场景&#xff1a; 二、isinstance函数使用注意事项&#xff1a; 三、如何用好isinstance函数&#xff1f; 1、isinstance函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff…

网络安全之SQL注入及防御(下篇)

目录 什么是SQL注入&#xff1f; 一&#xff0c;SQL注入会导致什么呢&#xff1f; 二&#xff0c;SQL注入思想与步骤 三&#xff0c;SQL注入的绕过 四&#xff0c;sqlmap工具的使用 五&#xff0c;sql注入的防御方法 总结 什么是SQL注入&#xff1f; SQL注入&#xff08;…

C++|模板进阶(非类型模板参数+特化)

目录 一、非类型模板参数 二、模板特化 2.1函数模板特化 2.2类模板特化 2.2.1全特化 2.2.2偏特化 三、模板不支持分离编译 四、模板优缺点 一、非类型模板参数 在模板初阶中&#xff0c;所学习的模板的参数是类型形参&#xff0c;但其实还有非类型形参。 类型形参&am…

gcc make makefile cmake之间的关系梳理

gcc是GNU Compiler Collection&#xff08;GNU编译器套件&#xff09;&#xff0c;也可以简单认为是编译器&#xff0c;它可以编译很多编程语言&#xff08;包括C、C、Object-C、Fortran、Java等&#xff09;当你的程序只有一个源文件&#xff0c;直接用gcc命令编译它。但是当你…

系统思考—啤酒游戏

最近有不少的合作伙伴来询问我啤酒游戏这个来自于MIT&#xff08;麻省理工学院&#xff09;经典的沙盘&#xff0c;上周刚刚结束Midea旗下的一家公司市场运营部《啤酒游戏沙盘-应对动态性复杂的系统思考智慧》的课程。 参与这次沙盘体验的团队成员深刻体会到了全局思考的重要性…

GDPU unity游戏开发 碰撞体与关节

让你设计的角色跑起来吧&#xff0c;可以是动画&#xff0c;也可以是碰撞器的运动。 运动小车 找到小车素材&#xff0c;导入到层级面板。然后可以新建一个地面让小车在上面运动&#xff0c;新建一个方块当障碍物。 摆放好后&#xff0c;要加组件。记住&#xff0c;在unity中运…

02 VMware下载安装银河麒麟(Kylin)系统

02 VMware下载&安装银河麒麟&#xff08;Kylin&#xff09;系统 一、官网1、官网地址 二、下载1、官网下载&#xff08;1&#xff09;服务器操作系统&#xff08;2&#xff09;申请试用&#xff08;3&#xff09;产品试用申请&#xff08;4&#xff09;点击下载连接即可 2、…

SQL基础(关系模型)

目录 SQL及定义域概念 SQL是什么 定义域 关系简介 关系的定义 关系的封闭性 关系模型简介 关系模型 谓词逻辑 运算基础 SQL的加减乘除 SQL的除法1 SQL的除法2 SQL的除法3 三值逻辑 NULL的危害 消除NULL SQL及定义域概念 SQL是什么 Structured Query Languag…

泽众RPA1.1.2产品升级,新增团队管理、用户管理、工作空间及自动化任务等功能,大幅提升工作效率

泽众RPA1.1.2产品升级&#xff0c;通过新增团队管理模块、用户管理模块、工作空间功能、定时任务功能以及Excel和网络指令&#xff0c;解决了团队协作与权限管理不精细、任务自动化水平有限以及数据处理和网络操作功能局限等问题。升级后的产品不仅提升了工作效率和团队协作能力…

【Qt常用控件】—— 显示类控件

目录 1.1 Label 1.2 LCD Number 1.3 ProgressBar 1.4 Calendar Widget 1.5 小结 1.1 Label QLabel 控件是 Qt 中用于显示文本或图像的部件&#xff0c;是用户界面开发中常用的组件之一。 核⼼属性如下&#xff1a; 属性 说明 text QLabel 中的⽂本 textFormat ⽂本的格…