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.pswp.cn/bicheng/21118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21118.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java——異常

1.什么是異常 將程序執行過程中發生的不正常行為稱為異常。 常見的異常有:算數異常,空指針異常,數組越界異常 每一種異常都有對應的類對齊描述 為了對每一種異常進行管理,Java內部實現了一個對異常的體系結構 1. Throwable&#x…

CS2游戲30萬掛箱賬號被封,飾品市場要變天

Steam游戲平臺上CS2的玩家在線人數常年位于第一位,即便偶爾會被爆款游戲擠下來,但一切都是暫時的。飾品交易作為CS2的重要組成部分,早已成為了維系游戲熱度的不二法門。可相對應的,各種掛箱子的工作室及個人也孕育而生。 但近來V社…

mysql多啟動

binary安裝: 1、redhat rpm 2、mysql rpm 3、mysql glibc source安裝: 1、5.1mysql(./configure && make && make install) 2、5.5mysql(cmake && make && make install) 單啟動: 1、安裝 tar xf xxx.tar…

【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…

C語言案例-輸入任意三個數,按從大到小的順序輸出.

目錄 問題待續、更新中 問題 輸入任意三個數,按從大到小的順序輸出. 最大值 3數&#xff0c;重新排序輸出 輸出數據if來&#xff0c;ab ac bc比&#xff0c;比中里面交換值&#xff0c;輸出abc時為降序 代碼如下: #include <stdio.h> void main() {int a,b,c,t;printf(&…

現實殘酷!存款百萬只是少數人的游戲,普通家庭能存多少?

近期&#xff0c;網絡上掀起了一股關于普通家庭終身存款上限的熱烈討論。一位網友通過簡單的算術方式提出了一個假設&#xff1a;如果一對夫妻每年收入15萬&#xff0c;并成功將6萬存入銀行&#xff0c;那么從25歲步入社會至60歲退休&#xff0c;他們理論上能積累到210萬的存款…

從0開發一個Chrome插件:Manifest 文件詳解

前言 這是《從0開發一個Chrome插件》系列的第六篇文章,本系列教你如何從0去開發一個Chrome插件,每篇文章都會好好打磨,寫清楚我在開發過程遇到的問題,還有開發經驗和技巧。 專欄: 從0開發一個Chrome插件:什么是Chrome插件?從0開發一個Chrome插件:開發Chrome插件的必要…

C++知識點總結(36):二分進階練習

二分答案練習 一、憤怒的羊駝題目描述輸入描述輸出描述樣例1提示參考答案 二、偷吃西瓜題目描述輸入描述輸出描述樣例1提示參考答案 三、丟沙包題目描述輸入描述輸出描述樣例1提示參考答案 四、木材加工題目描述輸入描述輸出描述樣例1提示參考答案 五、路標設置題目描述輸入描述…

Go語言之GORM框架(四)——預加載,關聯標簽與多態關聯,自定義數據類型與事務(完結篇)

前言 本來是想著寫多表關系的&#xff0c;不過寫了一半發現重復的部分太多了&#xff0c;想了想與其做一些重復性工作&#xff0c;不如把一些當時覺得抽象的東西記錄一下&#xff0c;就當用一篇雜記完成專欄的最后一篇文章吧。 預加載 簡單示例 預加載主要用于在多表關系中…

谷歌瀏覽器的平替,內置開掛神器,我已愛不釋手!

油猴瀏覽器正式版是一款基于谷歌Chromium源碼開發的瀏覽器&#xff0c;它集成了集成了強大的油猴擴展&#xff08;Tampermonkey&#xff09;&#xff0c;使得用戶可以輕松安裝各種腳本&#xff0c;從而增強網頁瀏覽體驗。提供了一個更加個性化和高效的瀏覽體驗。 油猴擴展&…

git使用流程

1.下載git 搜索下載 2.注冊github賬號&#xff08;打開爬墻工具&#xff09; 創建一個倉庫 3.配置郵箱和密碼 4.所以找一個文件夾 鼠標右鍵 選擇 open Git Bash here&#xff08;當前文件夾下打開命令行&#xff09; 輸入命令 配置用戶名和郵箱 5.將建的倉庫克隆下來 …

【JS實戰案例匯總——不定時更新版】

一&#xff1a;轉換時間案例 1 需求&#xff1a; 用戶輸入秒數&#xff0c;系統會自動將秒數轉變為小時、分鐘、秒&#xff0c;并且不滿10的要在前面補零 2 算法&#xff1a; 小時:hour parseInt(總秒數/60/60%24) 分鐘:minute parseInt(總秒數/60%60) 秒數:second pa…

測試基礎09:缺陷(bug)生命周期、定位方式和管理規范

課程大綱 1、缺陷&#xff08;bug&#xff09;生命周期 2、缺陷&#xff08;bug&#xff09;提交規范 2.1 宗旨 簡潔、清晰、可視化&#xff0c;減少溝通成本。 2.2 bug格式和內容 ① 標題&#xff1a;一級功能-二級功能-三級功能_&#xff08;一句話描述bug&#xff1a;&…

---初始Linux---

一、認識計算機 計算機 硬件 軟件 硬件&#xff1a;就是計算機系統中由電子、機械和光電元件等組成的各種物理裝置的總稱&#xff08;CPU\GPU\...&#xff09; 軟件&#xff1a;是用戶和計算機硬件之間及進行交流的工具 然而一個簡單的計算機或者說基本的計算機就是有兩大…

浙江大學數據結構MOOC-課后習題-第十講-排序5 PAT Judge【未完成】

題目匯總 浙江大學數據結構MOOC-課后習題-拼題A-代碼分享-2024 題目描述 這段文字是關于如何生成PAT&#xff08;一種編程能力測試&#xff09;的排行榜的說明。下面是這段文字的中文翻譯&#xff1a; 輸入說明&#xff1a; 每個輸入文件包含一個測試案例。對于每個案例&…

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)//奇數的最…

[AIGC] Vue2與Vue3的主要區別和示例代碼

Vue3是Vue框架的最新版本&#xff0c;它在性能、開發體驗和代碼體積等方面都有很大的改進。接下來我們將通過比較Vue2和Vue3的主要區別&#xff0c;進一步理解這些改變是如何影響我們的。 文章目錄 一、性能提升二、Composition API三、更好的類型支持四、生命周期鉤子函數變化…