堪比大腦!小小電路板竟讓機器人處理視覺信息效率翻數倍?
本文同步於微信公眾號RoboMaster。RoboMaster 技術智囊團,用簡單的方式帶你入門機器人知識,每周日準時更新。
概述
人類是有思想的。如果一個機器或機器人有智能的功能,那麼它身上一定有「思想」——程序(工程師一般稱之成為演算法)。
汽車要實現自動駕駛這種智能功能,也是根據「思想」,採集各種數據比如 GPS、雷達信息和圖像信息,然後對這些數據進行處理、學習和分析,才能控制汽車自動駕駛。這些都是通過人類編寫程序,讓汽車按照演算法程序運行來實現的。
你有沒有想過這麼多演算法,究竟是誰在算,在哪算,怎麼算?
以 RoboMaster 比賽中的一套視覺處理系統為例,我們首先需要讀取攝像頭的圖像,然後用演算法處理圖像,把處理好的數據發給主控,主控就可以控制機器人了。
那我們就需要有一個計算平台去讀數據、用演算法、發數據。最會計算的是什麼?算盤?計算器?別逗了,當然是計算機啦。就像我們可以把 U 盤插進電腦,處理文件,最後再拷出來。
機器人要時刻進行運算,總不能讓它背著電腦到處跑吧?這樣看起來一點都不智能。機智的人類發明了嵌入式超級計算機,這種計算機很小,專門用來處理數據,可以嵌入機器人里。
它相當於一台電腦的小主機,如果接上了顯示屏、鍵盤滑鼠等外設,就能像常見的電腦一樣打吃雞、上網和看視頻了。
嵌入式超級計算機比普通電腦小,而且用途不同,在性能上也有很大差別。
針對不同的功能,它特定的性能會被優化,比如加強了讀取照片速度、圖像處理的計算能力、語音識別能力等等。像打遊戲和上網這些在機器人身上幾乎不需要的功能就會被弱化。
今天就教大家利用嵌入式超級計算機做一套視覺處理系統,來簡單了解視覺的開發。在 RoboMaster 比賽中,如果機器人能夠檢測和識別目標,就相當於拿到了大 Buff。即使脫離了比賽,也可以用來做其他的識別應用。
計算設備選型
嵌入式超級計算機有很多種,不同的體積、性能和價格適用於不同的應用,我們要找到適合機器人處理圖像使用的一種,可以從分析需求入手:
- 讀取圖像
幾乎每個計算設備都能讀取單個攝像頭,但如果我們需要同時讀取多個攝像頭,一般的計算設備就無法滿足了。比如普通的 X86 平台,同時讀取三個攝像頭就會卡頓。
- 數據處理
做圖像處理的時候,可能需要使用深度學習,巨大的數據處理量在性能較低的平台上跑不動,但也不能直接上個 TITAN(一萬多元的圖形處理顯卡),就像打吃雞時,敵人就在眼前可你卻拿著八倍鏡去瞄準他。
- 機器人特性
機器人一般體積小,背著電池到處跑,而不是插在插座上隨時充電。如果帶著耗電量超高的設備,就要背著超多的電池,就像出門旅遊要背著很多充電寶一樣心累。所以計算設備要選擇功耗低、體積小的。
我們選擇一款有代表性的嵌入式超級計算機,Nvidia Jetson TX2(以下簡稱Jetson TX2)。機器人姿態估計,路徑規劃和自動檢測都可以用它進行計算數據採集和演算法解算。
我們簡單看下這個計算機的參數,分析它在機器人中是否適用:
- 功耗低
作為可移動設備,功耗越低,機器人持續工作的時間就越長。
- 256顆CUDA 核心的GPU
CUDA是一種並行計算架構,並行就是大家一起來計算,複雜的計算也可以完美解決。深度學習的網路一般有上萬個神經元,每個神經元的參數都是浮點型數據,CPU 在進行一次運算大概需要幾秒甚至十幾秒,而使用 GPU 大概只需要幾十毫秒。
CPU 就像跑車,雖然快,但是每次處理的內容極少,GPU 就像大卡車,雖然慢,但處理量特別大。所以用帶有 CUDA 的GPU 可以加速演算法的運行。
- 8G 內存
在運行深度學習網路之前,需要把網路的參數都載入到內存中,而網路的參數是非常巨大的,8G 內存足夠我們使用。
- 支持 PCIE 介面
如果硬碟空間不足,還可以外接一塊硬碟。
- 核心板小巧
Jetson TX2 的核心板(左圖)非常小,如果覺得 Jetson TX2 開發板(右圖)太大,可以不要開發板,直接給核心板換一個小的載板,使用起來更加輕便。
RoboMaster 參賽隊員在選擇視覺程序運行平台時,也會綜合各方面考慮。
華南理工大學的隊員說,選擇平台時他們主要考慮三方面:運行效率、底層嵌入式設備的連接、硬體安裝與拓展。Jetson TX2 有兩個好處,一是它專註於視覺識別,有配套的適於開發視覺功能的包,運行效率高;二是可拓展性好,它的核心板子可以連接其他設備,與機器人比賽需要的嵌入式設備的親和度高。
計算設備選型完畢,我們可以開始設計視覺處理軟體的架構。
軟體架構設計
我們以檢測機器人裝甲板和識別手寫字的功能為例,簡單分析一下需求:
- 裝甲板檢測和手寫字識別是兩套完全不同的演算法,需要做兩個框架。
- 裝甲板檢測有很多種演算法可以實現,我們要設計一個多種演算法都能使用的框架,提高框架代碼的利用率。就像做一個通用的輪子讓單車摩托車大卡車都能用。
- 數字識別需要使用機器學習技術,就一定要用 CUDA 去加速計算,不然有那麼多東西要學,等機器學成歸來,我們的頭也禿了。
- 俗話說眼觀四方,一台機器人需要用多個攝像頭檢測四周,所以框架也要包含多個攝像頭數據讀取。
分析完需求,我立馬變出了一個架構,但這絕對是我勤勤懇懇設計出來的軟體架構,不信我們分析一下。
它主要分為四層:
- 第一層:驅動層(讓外部硬體設備「動」起來)
我們用四個線程來讀取四個相機,分別獲得圖像。就像同時讓四個人去拍照,而不是一個人抓著四個相機輪流拍。
- 第二層:緩存層(放圖片的小口袋)
一般我們拍了照就會把內存放到硬碟里,要用的時候再拿出來。而緩存層就像隨身帶的一個小口袋,圖片讀取了就放進去,不用每次都慢慢地去硬碟里找。
我們把每個相機的圖像放到一個雙 buffer 容器(圖中顏色相同的方框,如 buffer10、buffer11 共同組成一個雙 buffer 容器),第一幀放到第一個buffer 中,第二幀放到第二個 buffer 中,往複循環,這樣可以降低演算法的延時。
不過這麼做也有缺點,因為是用空間換取了時間。但是我們有 8G 的內存呀,空間表示毫無壓力。
- 第三層:演算法層(圖像處理深度學習的部分)
演算法層這裡只需要聲明image_buffer 的一個對象,然後調用獲取圖像的函數,把camera_id(相機編號)傳遞進去就可以得到相應camera 的最新圖像了。之後我們就可以用該圖像做濾波、特徵提取等等處理。
整個流程就像,首先讓四個人去拍照,拍完放在他們的小口袋裡,要的時候就直接去他們的小口袋裡掏出來拿去處理。
如果是效率低的框架,就要一個人拍四張,然後放進整理箱,我們要用的時候再去打開整理箱,把照片搬過來,然後再處理,過程就很慢。
- 第四層:用戶層(使用服務的用戶)
用戶層可以通過".xml"或者".prototxt"等配置文件來選擇用什麼演算法,非常簡單方便。就像顧客直接通過菜單點菜就能得到要的演算法了,而不需要他再自己種菜買菜洗菜切菜做菜。
把檢測和識別的結果傳進Decision-Making 層,在這一層做出決策。然後將決策結果傳遞給
MCU(機器人的主控,用來控制機器人要逃跑還是要射擊)或者傳遞給操作手,以此完成整個流程。小試牛刀
思路當然是最重要的,思路有了,代碼實現就非常容易了,我們分兩個模塊:
- Jetson TX2 環境配置
框架中有很多模塊,比如說視覺處理和加速模塊等等,環境配置就是告訴大家這些模塊在哪,才能找到並使用它們。
有基礎的小夥伴們可以到[NVIDIA](https://developer.nvidia.com/embedded/jetpack-notes)官網參考 JetPack 的手冊,按照教程一步步配置環境。
不會配置環境的小夥伴不要方,我們已經幫大家把環境配置好了,你只需要將[系統鏡像](https://mega.nz/#!ekImlDCR!Rlv880sCb40ZbQjbaIFCodlp-Vd6nfF7MqteRPuijA4)克隆到你自己的 Jetson TX2 就可以了,克隆方法參考[官方教程](https://elinux.org/Jetson/TX2_Cloning)。
- 運行常式
環境配置好之後,我們需要寫個代碼運行常式。因為代碼太複雜了,我們已經將所有代碼工程上傳到 github 了,現在只需要在自己的 Jetson TX2 上按照如下步驟進行操作。
git clone https://github.com/RoboMaster/RoboRTS.gitcd RoboRTS/mkdir buildcd buildcmake ..make messages_generate_messagesmake
添加個環境變數
cd path/to/RoboRTSecho "export ROBORTS_PATH=${PWD}" >> ~/.bashrcsource ~/.bashrc
操作完成後就可以看到代碼了,我們來運行一下
cd path/to/RoboRTS#開啟roscoreroscore#打開攝像頭驅動(第一層)./build/modules/driver/camera/camera_driver#運行img_buffer(第二層)./build/modules/perception/detection/util/cv_toolbox#運行演算法層和node(第三、四層)./build/modules/perception/detection/armor_detection/armor_detection_node#運行控制的測試程序(第五層)./build/modules/perception/detection/armor_detection/armor_detection_node_client_test
這樣就可以在終端對程序進行控制了,輸入 1 啟動子程序進行裝甲板檢測,輸入 2 暫停,輸入 3 終止。
Jetson TX2 還可以應用於很多領域,比如無人機目標檢測、三維建圖,無人車行人車輛檢測、交通等識別,智能公交站實施顯示天氣、公交信息等都可以用 Jeton 作為計算平台。
手寫字識別怎麼做呢?這裡就給大家留個作業,大家可以參考往期同類文章:《機器人如何在複雜的環境下進行視覺識別?》
推薦閱讀:
※工業機器人密度提升,全球生產自動化加速
※波士頓動力新視頻發布,我藉此演繹了一部機器人越獄的科幻大片
※揭秘日本現代機器人教父石黑浩:20年專做美女機器人
※中國掀「機器人革命」對美國製造業的影響有多大?
TAG:RoboMaster | 機器人 | 計算機視覺 |