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的中则没有这个问题;作为发布工业软件的核心库,在软件逐步迭代的过程中,底层库的能力也在不断增长。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

06C内存分配

C零碎语法 目录 文章目录 C零碎语法1.内存布局2. 内存对齐2.1结构体内存对齐2.1应用 1.内存布局 2. 内存对齐 2.1结构体内存对齐 三条原则: (1)结构体变量的 起始地址能够被其最宽的成员大小整除。 (2)结构体每个…

基于知识图谱分析贸易关系走向

基于知识图谱分析贸易关系走向 前言一、基础数据二、贸易规则三、知识图谱可视化四、完整代码 前言 知识图谱是一种用图模型来描述知识和建模世界万物之间的关联关系的技术方法。在贸易关系的分析中,知识图谱可以将各个国家、地区、商品、贸易政策等作为节点&#…

华为坤灵管理型交换机S300,S500,S310,S210,S220,S200 web端开局配置

一. 准备线缆 笔记本或没有COM口的电脑,需准备转接线,并安装好随线光盘的驱动,检查设备管理器中COM口是否正常 2.连接电脑与交换机的CONSOLE口 二,准备软件putty。 Download PuTTY: latest release (0.81) 配置步骤如下: 开启HTTP服务。设置https://1…

路由策略实验2

对R7,重发布直连路由 对R2,做双向 对R3同样 先不改优先级 查看,知道所有给R3的路由为151,全部为OSPF。 知道了是错误的,先把3,4之间的线路断掉 接着对R3,让优先级全部回到100(displa…

STL中vector动态二维数组理解(杨辉三角)

题目链接&#xff1a;118.杨辉三角 题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目指要&#xff1a; 本题的主要目的是理解vector<vector<int&…

【Modelground】个人AI产品MVP迭代平台(1)——平台简介

文章目录 背景什么是Modelground&#xff1f;什么是Mediapipe&#xff1f;目标读者总结 背景 这个时代是AI的时代。相信你也能感觉到&#xff0c;最近几年&#xff0c;AI大模型层出不穷&#xff0c; 且迭代速度极快。无论你是哪个行业&#xff0c;都有必要严肃认真地考虑AI会给…

小公司的软件开发IT工具箱

目录 工具链困境 难题的解决 达到的效果 资源要求低 工具箱一览 1、代码管理工具 2、自动化发版&#xff08;测试&#xff09;工具 3、依赖库&#xff08;制品包&#xff09;管理 4、镜像管理 5、授权管理&#xff08;可选&#xff09; 待讨论&#xff1a;为什么不是…

模糊小波神经网络(MATLAB 2018)

模糊系统是一种基于知识或规则的控制系统&#xff0c;从属于智能控制&#xff0c;通过简化系统的复杂性&#xff0c;利用控制法来描述系统变量之间的关系&#xff0c;采用语言式的模糊变量来描述系统&#xff0c;不必对被控对象建立完整的数学模型。相比较传统控制策略&#xf…

Django 注册应用

上一章Django 创建项目及应用-CSDN博客 创建的应用&#xff0c;需要在主项目的myshop.settings.py 文件下注册 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.sta…

集成算法:Bagging模型、AdaBoost模型和Stacking模型

概述 目的&#xff1a;让机器学习效果更好&#xff0c;单个不行&#xff0c;集成多个 集成算法 Bagging&#xff1a;训练多个分类器取平均 f ( x ) 1 / M ∑ m 1 M f m ( x ) f(x)1/M\sum^M_{m1}{f_m(x)} f(x)1/M∑m1M​fm​(x) Boosting&#xff1a;从弱学习器开始加强&am…

[激光原理与应用-95]:电控 - PCB布线常见降低信号干扰的手段

目录 一、降低信号干扰的PCB布线 二、常见规则与技巧 2.1. 布线规则 (1) 信号线和电源线分开布线 (2) 信号线和地线相邻布线 (3) 高频信号线短而直 (4) 电源线宽而短 (5)地线密集布线 2.2. 布线技巧 (1)使用层间连接 (2)使用电容和电感 (3)使用阻抗匹配 一、降低信…

一本企业画册怎么制作成二维码分享

​在这个数字化时代&#xff0c;二维码已经成为一种便捷的分享方式。企业画册&#xff0c;作为展示企业形象、宣传产品和服务的重要工具&#xff0c;也可以通过二维码进行分享。现在我来教你如何将一本企业画册制作成二维码分享。 1. 准备好制作工具&#xff1a;FLBOOK在线制作…

如何高效管理团队任务?强大的在线管理团队多任务的神器-YesDev

任务是最小的工作项&#xff0c;工时是可以对研发产能进行量化。 一员工工时 工作组工时登记配置 针对于工作组&#xff0c;你可以开启/关闭工时登记。关闭工作组的工时登记后&#xff0c;整个工作组将取消工时登记&#xff0c;重新开启后恢复。 在同一个工作组内&#xff0c…

如何在路由器上安装代理服务:详细教程

如何在路由器上安装代理服务&#xff1a;详细教程 步骤一&#xff1a;通过漏洞进入路由器系统开启Telnet服务使用Telnet登录路由器系统查看系统信息和CPU信息步骤二&#xff1a;交叉编译MIPS程序 Go对MIPS的支持 安装TFTP Server使用BusyBox tftp传输文件在路由器系统中下载编译…

Kubernetes——Pod控制器

目录 一、Pod控制器 1.定义 2.Pod与控制器的关系 3.作用 4.Pod控制器的类型组成及特点 4.1Pod控制器的类型 4.1.1ReplicaSet 4.1.2Deployment 4.1.3DaemonSet 4.1.4StateSet 4.1.5Job 4.1.6CronJob 4.2Pod与控制器的关系 二、Kubernetes中的服务发现 1.服务发现的…

【论文阅读】遥感大模型GeoChat : Grounded Large Vision-Language Model for Remote Sensing

论文概述 本文是遥感领域的大模型相关的一篇工作&#xff0c;发表在CVPR2024。 本文标题&#xff1a;GeoChat : Grounded Large Vision-Language Model for Remote Sensing 论文地址&#xff1a;https://arxiv.org/abs/2311.15826 开源代码&#xff1a;https://github.com/mbz…

网络编程TCP

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:Java网络编程(下)&#x1f649; &#x1f439;今日诗词: 壮士当唱大风哥, 宵小之徒能几何&#xff1f;&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微…

Liunx音频

一. echo -e "\a" echo 通过向控制台喇叭设备发送字符来发声&#xff1a; echo -e "\a"&#xff08;这里的 -e 选项允许解释反斜杠转义的字符&#xff0c;而 \a 是一个响铃(bell)字符&#xff09; 二. beep 下载对应的包 yum -y install beep 发声命令 be…

Linux shell编程学习笔记55:hostname命令——获取或设置主机名,显示IP地址和DNS、NIS

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。其中主机名也是我们要收集的信息之一。 1. hostname命令 的功能、格式和选项说明 我们可以使用命令 hostname --help 来查看hostname命令…

[vue2项目]vue2+supermap[mapboxgl]+天地图之地图的基础操作(画线+自定义打点)

二、地图的基础操作 1、画线 案例(1) this.map.on("load", () => {let geometryLine = {type: "Feature",geometry: {// 定义类型type: "LineString",coordinates: [[113.39793764, 34.05675322],[113.35187554, 32.4392251],[112.476851…