c++程序员为什么要做自己的底层库

五一期间,在家里翻到之前上学时候用的电脑和工作日志,粗略浏览一番,感慨10年岁月蹉跎,仍然没有找到自己技术方向的“道”。遂有感而发,写下此文。

算起来,接触软件开发也有10年时间了,最开始是本科大二的时候,14年,在课堂上学习了c语言,开始对编程有了点兴趣。课外参加嵌入式的比赛,在stm32和飞思卡尔的芯片上做开发,刚开始是循迹和控制的算法。

后来也在PC上写一些配套的上位机工具,使用的是MFC和matlab,matlab是可以做界面的,估计很多人不知道。上位机主要功能是串口读写,SD卡读写(嵌入式做图像处理,当时还没有实时无线发送视频流的发放,先写到SD卡),曲线展示等功能。

第一个MFC工程

我的第一个MFC程序

第一个matlab工程

第一个Matlab程序
科技竞赛
大四期间,由于在做平衡车方面有点心得,在北京中国科学技术馆和自动化所做自平衡车,也是嵌入式相关的项目。当时中国科学技术馆还有我们一个展位,记得在4楼,通宵好几天在馆里面调试。现在应该换成别的展品了。

中国科学技术馆展台

在这里插入图片描述
本科的毕业设计是四旋翼的控制,在simulink中计算旋翼控制量,用于控制算法的仿真与开发,UI使用matlab构建。

四旋翼控制

在这里插入图片描述
不知道什么时候接触的qt,大概是有年国庆假期,学了两三天,发现比MFC好用多了,后面的开发就一直用qt了。

在硕士期间,开始系统的接触视觉算法,学了一些课程,做了几个视觉识别相关的项目,印象最深的是,端子识别QTCTD,线序的识别CSDPlus,板材的识别,视觉抓取VisionGrasp,satellite线缆弯折比例测量等。开发环境也各种各样,PC端的,Ubuntu的,最离谱的安卓的,手机相机拍照来测satellite线缆折弯比,现在来看,这根本是不可能测准的。还有一些非视觉的项目,有些是不用交付的,用于辅助实验室是设备的调试,比如调姿平台RAA,倍福PLC控制,麦克纳姆车控制,传送带控制,KUKA机器人控制。

线序识别

在这里插入图片描述

标题线序识别最终产品

从结构到电器,到软件,全是本人设计机械图纸,PCB:
在这里插入图片描述

端子插线识别,

采用模板匹配方法,找到端子线孔,yolo二分类识别好坏。在UBUNTU下的。
在这里插入图片描述

机械臂抓取坐标系调试

在这里插入图片描述

硕士论文中开发的软件,家具厂智能制造单元控制系统,也是使用的Qt,基本上是把上学期间做项目用的软件技术全部用上了。包括车间内设备的控制与调度,板材计数,瑕疵检测,MES系统的通信。

板材生产线检测系统

在这里插入图片描述

硕士期间选了一个课程,学的是java,现在看主要是面向就业的。那时候不懂,只觉得好玩就选了,课程作业是写一个信息系统,我大概做了这个一个,老师布置作业,学生完成作业,老师打分,学生查看自己成绩。

JAVA信息管理系统

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不得不说,java开发的这种框架还是比较多,稍微学习就可以上手。但工作以后会发现,熟悉业务,了解用户需求,才能又好用的软件。

其它的都是业余时间开发,主要和无人机,嵌入式开发有关。比如使用qt开发了无人机编队上位机 QT_ANO_POSITION, QFormation等。

无人机飞行控制上位机

在这里插入图片描述

嵌入式开发主要是实习公司做的,主要项目有压力检测设备,NRF干扰器,人体关节测量仪器,脉诊仪。NRF干扰器开起来,整个房间的无线鼠标都不能用了,用于一些科技比赛的防远程作弊,广场舞扰民制裁等。脉诊仪最有意思,使用三个传感器模拟三个手指,放到人手腕上采集信号,和中医诊断匹配,训练深度模型,我们叫它电子号脉。不知道现在有没有类似的产品,那时候还是1819年,思想还是比较超前的。

2020年学校毕业,进入视觉检测行业,在工作中,第一次见识到了具有工业强度的视觉软件。和之前在学校里面做的视觉检测项目完全是天上地下,也因此,在工作的前两年,我有空就研究这个工业强度的视觉软件和底层,尤其是在我独立负责一个新产品开发,拥有了全部代码权限之后。这段时间我软件算法技术成长最快的,对检测业务需求也有了一定的了解。
工作前两年主要在学习,如何构建一个高效的视觉检测系统。自己的专业技能,则都点在了视觉算法的设计,开发和优化上面,包括原理优化,指令集,多线程。优化算子都对标号称最强的视觉检测算法halcon,TUM德国慕尼黑工大开发。有些单算子的效率,甚至高过了halcon,而算子组合优化,halcon是无法完成的,在定制算法开发时,两步三步并一步,少了内存反复读写,效率是高过halcon的。虽然在CPU上优化了很多,但最后我们发现,CPU的性能已经快被我们榨干了,因此后来把整个检测系统的算法从CPU迁移到GPU上,使用的是cuda。

我一直喜欢称自己为算法工程师,但我又看不上只会写算法,对软件,业务一无所知的所谓算法工程师,因此我也经常开发一些软件,来印证自己所学。主要也是受行业内前辈的影响,产生了自己开发视觉检测系统底层的想法,有了底层,开发一些小的软件时候,就可以统一到一个框架中来,慢慢的就有了积累。

在开发一个自己的视觉检测系统底层的前期,做了很多调研,OpenCV,Dlib,VLFeat,Boofcv,Pillow,VTK,ITK,Halide,SIMD,Halcon,Separe,IPP,NPP,Duilib,Qt,wxWidgets等。Dlib是参考较多的库。

在21年的时候,就给这个底层库起好了名字,叫MetaFramework,包含了一些基础的几何库,数学库,图像,区域,轮廓等算法数据接口,也包括序列化,通信等软件组件,基础的数据结构,就用stl里面的。虽然很多大型的开源库,都喜欢自己写基础数据结构,比如UE,QT,GST等,自己用stl就够了,这个还是不要投入太多精力。UI框架没有自己写,之前研究了一段时间的UI框架,对于非软件科班出身的人来说还是有点吃力,使用的是Duilib,使用vs的解决方案管理项目。使用这个底层库,没有做什么实质上的应用,就写了些简单测试的demo,因为自己实际使用起来还是觉得不顺手。

随着对视觉检测系统的了解,对效率,开发友好,跨平台的需求,MetaFramework不能再满足需求了,于是推倒重来,重新设计了新的架构,Meta(元)。

元,使用c++搭建的大规模智能体仿真后端框架,支持底层的动力学(Dynamics)计算,控制器(Autopilot)作为插件配置;上层的高级指令(Commands),智能体行为逻辑(Rules)配置;框架允许模块间数据交换采用序列化容器的方式,因此,环境数据的加载模块,传感器模型,以及未来新的需求所需的模块可以通过脚本的方式,配置到仿真循环中

后来逐步进入boost,框架改名为MetaCore,UI使用的wxwidgets。使用boost库实现了一些底层功能,比如序列化,共享内存总线,模块插件加载等。使用cmake进行项目管理,可以在多个平台使用一套源码编译。逐步成为一个可用的底层库,做了一些项目和小工具。
使用这个底层库,开发了ImageViewer,Sim框架等软件。

ImageViewer

在这里插入图片描述

sim框架

在这里插入图片描述
在用这个框架做项目的时候,发现UI这块还是比较难用,于是又集成了Qt,但仅用于UI。
又开发了QViewer视觉跟踪控制软件。

视觉识别与跟踪

在这里插入图片描述

写到这里,其实已经隐约有点了悟。软件需求千差万别,业务场景复杂多变,虽然做了这么多软件,但我真正积累下来的只有软件算法设计的思想,也唯有底层技术万变不离其宗。已经从一开始的感慨逐渐平静,这就是未来的方向。要构建自己的核心能力,而核心能力就是底层库源码。

这也是现在正在做的事,想明白了这点,又开始思考,构建c++底层库的好处。总结了如下三点:自己平时写的一些模块,可以放到一个仓库里面,统一编译,统一管理,能在自己些demo的时候,有一个快速的参考;有些三方库源码很不好找或者不容易下载,预编译的也不适合自己的编译环境,统一到在自己的代码仓库中Thirdparty的中则没有这个问题;作为发布工业软件的核心库,在软件逐步迭代的过程中,底层库的能力也在不断增长。

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

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

相关文章

Java——异常

1.什么是异常 将程序执行过程中发生的不正常行为称为异常。 常见的异常有:算数异常,空指针异常,数组越界异常 每一种异常都有对应的类对齐描述 为了对每一种异常进行管理,Java内部实现了一个对异常的体系结构 1. Throwable&#x…

CS2游戏30万挂箱账号被封,饰品市场要变天

Steam游戏平台上CS2的玩家在线人数常年位于第一位,即便偶尔会被爆款游戏挤下来,但一切都是暂时的。饰品交易作为CS2的重要组成部分,早已成为了维系游戏热度的不二法门。可相对应的,各种挂箱子的工作室及个人也孕育而生。 但近来V社…

【Docker学习】docker pull详细说明

docker pull是我们经常用到的一个命令。我们使用一些官方镜像,如MySql、Nginx等都需要用docker pull下载。不过不用的话,也可以。比如使用docker run,要是找不到镜像,会自动下载。 命令: docker image pull 描述&am…

Uniapp写一个简单的商品瀑布流界面+商品详情

最终效果: 整体内容比较简单,参考了一篇瀑布流文章和一篇商品详情文章随便修改整了下,主要是给想做这方便面的新人一个简单逻辑的展示(其实我也是第一次写这个emmm) 一.组件下载: uni-icon uni-goods-nav…

什么是ACP?

前言 ACP指的是应用程序控制平面,是微服务架构中的一个关键组成部分。它负责管理微服务架构中的各个微服务,包括服务发现和注册、负载均衡、服务路由、熔断和降级、配置管理等方面的功能。 A:可用性 所有请求都有响应。C:强一致…

[DDR5 Jedec 3-4] 模式寄存器 Mode Register MRR/MRW

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 1. 概念 模式寄存器用于定义各种操作模式。在初始化过程中,可以通过重新执行MRS命令来更改模式寄存器的内容。即使用户只想修改模式寄存器变量的一个子集,在发出MRS命令时也必须编程所有变量。 只有当所有ban…

现实残酷!存款百万只是少数人的游戏,普通家庭能存多少?

近期,网络上掀起了一股关于普通家庭终身存款上限的热烈讨论。一位网友通过简单的算术方式提出了一个假设:如果一对夫妻每年收入15万,并成功将6万存入银行,那么从25岁步入社会至60岁退休,他们理论上能积累到210万的存款…

Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)

前言 本来是想着写多表关系的,不过写了一半发现重复的部分太多了,想了想与其做一些重复性工作,不如把一些当时觉得抽象的东西记录一下,就当用一篇杂记完成专栏的最后一篇文章吧。 预加载 简单示例 预加载主要用于在多表关系中…

谷歌浏览器的平替,内置开挂神器,我已爱不释手!

油猴浏览器正式版是一款基于谷歌Chromium源码开发的浏览器,它集成了集成了强大的油猴扩展(Tampermonkey),使得用户可以轻松安装各种脚本,从而增强网页浏览体验。提供了一个更加个性化和高效的浏览体验。 油猴扩展&…

git使用流程

1.下载git 搜索下载 2.注册github账号(打开爬墙工具) 创建一个仓库 3.配置邮箱和密码 4.所以找一个文件夹 鼠标右键 选择 open Git Bash here(当前文件夹下打开命令行) 输入命令 配置用户名和邮箱 5.将建的仓库克隆下来 …

【JS实战案例汇总——不定时更新版】

一:转换时间案例 1 需求: 用户输入秒数,系统会自动将秒数转变为小时、分钟、秒,并且不满10的要在前面补零 2 算法: 小时:hour parseInt(总秒数/60/60%24) 分钟:minute parseInt(总秒数/60%60) 秒数:second pa…

测试基础09:缺陷(bug)生命周期、定位方式和管理规范

课程大纲 1、缺陷(bug)生命周期 2、缺陷(bug)提交规范 2.1 宗旨 简洁、清晰、可视化,减少沟通成本。 2.2 bug格式和内容 ① 标题:一级功能-二级功能-三级功能_(一句话描述bug:&…

---初始Linux---

一、认识计算机 计算机 硬件 软件 硬件:就是计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称(CPU\GPU\...) 软件:是用户和计算机硬件之间及进行交流的工具 然而一个简单的计算机或者说基本的计算机就是有两大…

C++ A (1020) : 幂运算

文章目录 一、题目描述二、参考代码 一、题目描述 二、参考代码 #include<bits/stdc.h> using namespace std; typedef long long ll;void qq(ll a, ll b, ll m) {if (a 0) cout << 0 << endl;;ll out 1;a % m;while (b > 0){if (b & 1)//奇数的最…

lux和ffmpeg进行下载各大主流自媒体平台视频

1、lux下载&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1WjGbouL3KFTU6LeqZmACpA?pwdagpp 提取码&#xff1a;agpp 2、ffmpeg下载&#xff0c;跟lux放在同一个目录&#xff1b; 3、为lux、ffmpeg设置环境变量&#xff1b; 4、WINR&#xff0c;打开运行&#xff0…

带你自学大语言模型系列 —— 前言

今天开始&#xff0c;我计划开启一个系列 《带你自学大语言模型》&#xff0c;内容也已经准备了一段时间了。 该系列的落脚点是“自学”和“大语言模型”&#xff0c;二者不分伯仲&#xff0c;这也是本系列和其他技术文章不一样的地方。 至于原因&#xff0c;我不想只做大语言…

【C++】STL中vector常见功能的模拟实现

前言&#xff1a;在上一篇中我们讲到了Vector的一些常见功能的使用方式&#xff0c;今天为了进一步的去学习Vector和能够更深度的去理解Vector的一些底层的原理。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &…

鸿蒙ArkTS声明式开发:跨平台支持列表【禁用控制】 通用属性

禁用控制 组件是否可交互&#xff0c;可交互状态下响应[点击事件]、[触摸事件]、[拖拽事件]、[按键事件]、[焦点事件]和[鼠标事件]。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到…

【一刷《剑指Offer》】面试题 30:最小的 k 个数

牛客对应题目链接&#xff1a;最小的K个数_牛客题霸_牛客网 (nowcoder.com) 力扣对应题目链接&#xff1a;LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 核心考点 &#xff1a; topK 问题。 一、《剑指Offer》内容 二、分析题目 1、排序&#xff08;O(Nlo…

接口interfance的基本使用

一.为什么有接口&#xff1f; 接口:就是一种规则。 二.接口的定义和使用 1.接口用关键字interface来定义 public interface 接口名{} 2.接口不能实例化 3.接口和类之间是实现关系,通过implements关键字表示 4.接口的子类(实现类) 注意1&#xff1a; 接口和类的实现关系…