五一期間,在家里翻到之前上學時候用的電腦和工作日志,粗略瀏覽一番,感慨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的中則沒有這個問題;作為發布工業軟件的核心庫,在軟件逐步迭代的過程中,底層庫的能力也在不斷增長。