c++程序员为什么要做自己的底层库
五一期间,在家里翻到之前上学时候用的电脑和工作日志,粗略浏览一番,感慨10年岁月蹉跎,仍然没有找到自己技术方向的“道”。遂有感而发,写下此文。
算起来,接触软件开发也有10年时间了,最开始是本科大二的时候,14年,在课堂上学习了c语言,开始对编程有了点兴趣。课外参加嵌入式的比赛,在stm32和飞思卡尔的芯片上做开发,刚开始是循迹和控制的算法。
后来也在PC上写一些配套的上位机工具,使用的是MFC和matlab,matlab是可以做界面的,估计很多人不知道。上位机主要功能是串口读写,SD卡读写(嵌入式做图像处理,当时还没有实时无线发送视频流的发放,先写到SD卡),曲线展示等功能。
第一个MFC工程
第一个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的中则没有这个问题;作为发布工业软件的核心库,在软件逐步迭代的过程中,底层库的能力也在不断增长。
相关文章:

c++程序员为什么要做自己的底层库
五一期间,在家里翻到之前上学时候用的电脑和工作日志,粗略浏览一番,感慨10年岁月蹉跎,仍然没有找到自己技术方向的“道”。遂有感而发,写下此文。 算起来,接触软件开发也有10年时间了,最开始是…...

堆排序-java
这次主要讲了堆排序和堆的基本构造,下一期会详细讲述堆的各种基本操作。 文章目录 前言 一、堆排序 1.题目描述 2.堆 二、算法思路 1.堆的存储 2. 结点下移down 3.结点上移up 4.堆的基本操作 5.堆的初始化 三、代码如下 1.代码如下: 2.读入数据ÿ…...
Android MIPI屏配置
参考资料:RockChip发布的DRM Display Driver Development Guide手册,以及网上大量相关博客资料 首先要拿到《屏幕硬件规格书》和《DataSheet》,软件配置主要依靠DataSheet提供数据支持。 查阅DataSheet里面on sequence和off sequence说明&a…...
C#面:.Net、ASP.Net、C#、VisualStudio之间的关系是什么
C#是一种编程语言,它是由微软开发的,用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序和移动应用程序等。C#是一种面向对象的语言,它具有强大的类型安全性和丰富的库支持。 .NET是一个软件开发框架,它由微软…...

OpenMV学习笔记3——画图函数汇总
画图,即在摄像头对应位置画出图形,对于需要反馈信息的程序来说很直观。就如上一篇文章颜色识别当中的例子一样,我们在识别出的色块上画出矩形方框,并在中间标出十字,可以直观的看到OpenMV现在识别出的色块。 目录 一…...
【大模型应用开发极简入门】构建新闻稿生成器:提示词的使用与基于事实的提示词
文章目录 一. 提示词怎么写二. 完整代码三. 基于事实的prompt GPT-4和ChatGPT等LLM专用于生成文本。我们可以使用GPT-4和ChatGPT在各种场景中生成文本,举例如下。 电子邮件合同或正式文档创意写作逐步行动计划头脑风暴广告职位描述 对于本项目,我们将创建…...

JAVA和爬虫,那个值得学习
如果你是初学者,建议先从基础的编程语言学起,比如Java,它能为你打下坚实的编程基础,并且在未来转学其他语言或技术时更加容易。随着编程基础的建立,你可以根据自己的兴趣或职业规划,学习爬虫技术作为补充技…...

Vue.js 与 TypeScript(1) :项目配置、props标注类型、emits标注类型
像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误。这减少了生产环境中的运行时错误,也让我们在重构大型项目的时候更有信心。通过 IDE 中基于类型的自动补全,TypeScript 还改善了开发体验和效率。 一、项目配置 在使用 npm cr…...

【考试100】安全员B证《建设工程安全生产技术》单选题
题库来源:考试100 【考试100】安全员B证《建设工程安全生产技术》单选题 1.在悬空部位作业时,操作人员应( ) A.遵守操作规定 B.进行安全技术交底 C.戴好安全帽 D.系好安全带 【考试100答案】:D…...

linux进阶的一些操作以及知识点------习题集(实践)
请创建以你姓名全拼的用户luwenhua,将其设置为免密登录,切换到luwenhua用户,打开终端,完成以下操作 (一)bash脚本基础练习 1)第一题:请在终端里定义两个用户变量num120,…...

提莫攻击 ---- 模拟算法
题目链接 题目: 分析: 如果两次攻击的时间差是>中毒的持续时间duration, 那么第一次攻击的中毒时间就是duration如果两次攻击的时间差是< 中毒的持续时间duration, 那么第一次攻击的持续时间就是这个时间差假设攻击了n次, 那么我们从第一次攻击开始计算时间差, 那么当我…...

SpringBootWeb 篇-深入了解 Spring 异常处理、事务管理和配置文件参数配置化、yml 配置文件
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 配置文件 1.1 yml 配置文件 1.2 参数配置化 1.2.1 使用 Value 注解注入单个配置参数 1.2.2 使用 ConfigurationProperties 注解将一组相关配置参数注入到一个类中…...

重学java 55. 集合 Set接口
我救自己万万次,铮铮劲草,绝不动摇 —— 24.6.2 一、Set集合介绍 Set和Map密切相关的 Map的遍历需要先变成单列集合,只能变成set集合 二、HashSet集合的介绍和使用 1.概述 HashSet是Set接口的实现类 2.特点 a、元素唯一 b、元素无序 c、无索引…...
spring项目修改时间格式
一、配置方式 在application.yml上添加 spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8 二、注解方式 1、添加依赖 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId&…...

每周统计-20240531
用于测试程序的稳定性: 龙虎榜: 成交额: 封成比: 收盘前放量: 开盘抢筹: 封单额:...

【工具】探索 DOU:每用户数据使用量
缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 🎵 邓紫棋《光年之外》 什么是 DOU…...

JVM之垃圾判断的详细解析
垃圾判断 垃圾介绍 垃圾:如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾 作用:释放没用的对象,清除内存里的记录碎片,碎片整理将所占用的堆内存移到堆的一端,以便 JVM 将整理出的内…...
07- Redis 中的 HyperLogLog 数据类型和应用场景
1. 介绍 Redis HyperLogLog 是 Redis 2.8.9 版本新增的数据类型,是一种用于【统计基数】的数据集合类型,基数统计就是指统计一个集合中不重复的元素个数。但要注意,HyperLogLog 的统计规则是基于概率完成的,不是非常准确…...

jenkins应用2-freestyle-job
1.jenkins应用 1.jenkins构建的流程 1.使用git参数化构建,用标签区分版本 2.git 拉取gitlab远程仓库代码 3.maven打包项目 4.sonarqube经行代码质量检测 5.自定义制作镜像发送到远程仓库harbor 6.在远程服务器上拉取代码启动容器 这个是构建的整个过程和步骤…...

K210视觉识别模块学习笔记1:第一个串口程序_程序烧录与开机启动
今日开始学习K210视觉识别模块:简单的认识与串口程序 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 既然K210作为一个视觉识别外设模块来使用,我认为第一个程序 就没必要学点灯之类的了,直接学习串口如何配置开始为妥&…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...