準(zhǔn)備工作
(1)旭日X3派
本攝像頭小車上位機(jī)采用旭日X3派開發(fā)板。開發(fā)環(huán)境為Ubuntu系統(tǒng)下的opencv-python環(huán)境。通過HDMI外接顯示器實(shí)現(xiàn)對兩個車載USB攝像頭的監(jiān)測與開發(fā),進(jìn)而感知周邊地圖環(huán)境,通過UART與下位機(jī)的通信實(shí)現(xiàn)對下位機(jī)的控制。
(2)Aduino Mega 2560 Pro 開發(fā)板+IO拓展板
搬運(yùn)小車的下位機(jī)使用的是以開源開發(fā)板Arduino ATmega2560 為原型改進(jìn)的YWRduino mega 2560 pro開發(fā)板,它可以滿足搬運(yùn)小車的基本設(shè)計需求。開發(fā)環(huán)境使用的是Arduino官方提供的IDE和基于VS CODE的Platform IDE。
(3)羅技C170網(wǎng)絡(luò)攝像頭
此攝像頭是用于車身位置引導(dǎo)和視覺循跡的攝像頭,對分辨率和視野范圍有較為特殊的需求。使用視頻流時分辨率可以達(dá)到640*480像素,每幀圖像的品質(zhì)最高可以達(dá)到500萬像素,在視頻流獲取過程中可以實(shí)現(xiàn)自動變焦。
(4)免驅(qū)動USB攝像頭
此攝像頭用于顏色識別,其鏡頭焦距為6.0MM,調(diào)焦范圍在20MM至極遠(yuǎn)之內(nèi),視像解析度為640*480。攝像頭長約3.8CM,寬1.5CM,高約3CM,配有可伸縮線圈,最長可以65CM。
(5)補(bǔ)光燈
補(bǔ)光燈使用的是自行設(shè)計的雙檔可調(diào)補(bǔ)光燈,由8個發(fā)光二極管并聯(lián)而成。通過GPIO口控制三極管的通斷及發(fā)光二極管的通斷,實(shí)現(xiàn)亮度調(diào)節(jié)的目的,以滿足在不同的環(huán)境條件下攝像頭對環(huán)境光的需求,進(jìn)而提高顏色識別的精準(zhǔn)程度。
軌道狀態(tài)
(導(dǎo)航地圖)搬運(yùn)機(jī)器人在地圖上是這樣一個狀態(tài)
由于拍實(shí)體機(jī)器人看起來不是很生動(主要是機(jī)器人做的太丑了),為了便于生動理解原理我使用以下圖片解釋。搬運(yùn)機(jī)器人在每次轉(zhuǎn)彎以后,攝像頭正對的地方都是一條長直線(生動一點(diǎn)解釋就是以下圖二)。
(模擬車身在導(dǎo)航線上)當(dāng)搬運(yùn)機(jī)器人中軸線跟導(dǎo)航線中軸線剛好重合,也就是搬運(yùn)機(jī)器人正居導(dǎo)航線正中的時候,這種狀況就是最良好的導(dǎo)航狀況——搬運(yùn)機(jī)器人正在路的正中,正上方攝像頭拍到的導(dǎo)航線狀況如下:
(導(dǎo)航線居于圖片正中)當(dāng)搬運(yùn)機(jī)器人左右發(fā)生偏移的時候,機(jī)器人與正上方攝像頭拍到的導(dǎo)航線狀況如下
(模擬車身在導(dǎo)航線偏右)(模擬車身在導(dǎo)航線偏左)由此可見,旭日X3派要做的事情就是,通過攝像頭實(shí)時拍攝導(dǎo)航線的圖片,并且經(jīng)過一系列算法處理,得出搬運(yùn)機(jī)器人相對導(dǎo)航線的偏離狀況,并且把狀況實(shí)時反饋給下位機(jī)。而下位機(jī)要做的就是接收到偏離信息,通過姿態(tài)調(diào)整算法,把搬運(yùn)機(jī)器人調(diào)整回到軌道正中。
實(shí)現(xiàn)原理
先把拍攝到的導(dǎo)航線圖片進(jìn)行中值濾波,去除噪點(diǎn)。接著轉(zhuǎn)化成灰度圖,再把灰度圖片進(jìn)行二值化處理,處理到這里的時候,二值化結(jié)果中就只有0——白色的地圖;255——導(dǎo)航線,從而使用數(shù)學(xué)方式找到導(dǎo)航線的中軸線。
由于攝像頭跟車身位置固定,所以攝像頭拍到圖片的中位線就是車身中軸線所在位置,把兩條中軸線的坐標(biāo)還有斜率進(jìn)行比對,就可以分析出搬運(yùn)機(jī)器人車身相對中軸線的姿態(tài),進(jìn)而可以把分析結(jié)果通過串口通信方式發(fā)送給下位機(jī)。
導(dǎo)入需要用的庫:
import cv2 as cv
設(shè)置串口各種參數(shù),波特率設(shè)置為115200,使用40PIN中的UART3:
os.system('ls /dev/tty[a-zA-Z]*')
選擇8號相機(jī)用作視頻獲取:
cap_follow = cv.VideoCapture(8)
設(shè)置兩個變量分別用作記錄兩個中軸線的坐標(biāo):
line_1 = 0
獲取一幀圖片并進(jìn)行中值濾波:
#第二個參數(shù)frame:表示截取到一幀的圖片
(此處要解釋一些為什么采用中值濾波:均值濾波、方框濾波、高斯濾波,都是線性濾波方式。由于線性濾波的結(jié)果是所有像素值的線性組合,因此含有噪聲的像素也會被考慮進(jìn)去,噪聲不會被消除,而是以更柔和的方式存在,這時使用非線性濾波效果可能會更好。中值濾波與前面介紹的濾波方式不同,不再采用加權(quán)求均值的方式計算濾波結(jié)果,它用鄰域內(nèi)所有像素值的中間值來替代當(dāng)前像素點(diǎn)的像素值。)
剪切獲取到的圖像,只顯示和處理一正中小塊(可參考下面圖片,由于處理整張圖片占用算力而結(jié)果跟局部處理一樣,所以先裁剪圖片到一小塊有用區(qū)域,然后進(jìn)行灰度、二值化處理):
ROI = blur[0:210, 345:605] # try to limit the ROI
找出搬運(yùn)機(jī)器人中軸線和導(dǎo)航線中軸線:
n = [len(dst[:, 0]), len(dst[0, :])]
把線標(biāo)注在處理后的圖片上,以便調(diào)試時觀察:
ROI = cv.line(ROI, (int(n[1] / 2), 0), (int(n[1] / 2), n[0]), (0, 0, 255), 2)
在電腦上顯示處理后的灰度圖片和標(biāo)注完中軸線的灰度圖便于調(diào)試時候觀察(旭日X3派上的代碼以刪除了顯示功能,因為用的是serve版本沒有桌面,使用HDMI顯示起來又挺麻煩而且占用算力):
cv.imshow("gray", gray)
在調(diào)試窗口輸出兩個中軸線坐標(biāo)差值和斜率差值:
print(int( (n[1] / 2 - p1(n[0]))/20 ))
把兩個差值處理成0-9十個梯度通過串口傳送給下位機(jī)
if line_1 < -5 and line_2 > 141:
運(yùn)行效果
為了方便展示使用電腦模擬搬運(yùn)機(jī)器人(自己寫了一個processing程序用作模擬),主要是搬運(yùn)機(jī)器人一打開電源,跑的速度很快,發(fā)生偏移和脫軌后的糾正幾乎都發(fā)生在一瞬間,為了方便展示,自己寫了一個模擬的小程序(搬運(yùn)機(jī)器人實(shí)跑視頻見文末)。
用于仿真的processing程序
此處不一一對processing的程序進(jìn)行講解,這個程序?qū)崿F(xiàn)的功能,仿真出導(dǎo)航線,并且仿真出下位機(jī)。這個仿真程序可以通過串口接收到來自旭日X3派反饋的姿態(tài)數(shù)據(jù),并且根據(jù)數(shù)據(jù)調(diào)整搬運(yùn)機(jī)器人的姿態(tài),使導(dǎo)航線重新回到攝像頭拍攝圖片正中間,即搬運(yùn)機(jī)器人中軸線跟導(dǎo)航線中軸線重合。
import processing.serial.*;
使用電腦運(yùn)行程序(因為電腦可以看到調(diào)試窗口)
右上角的兩個小窗口,不帶兩條直線的是截取后的原始灰度圖片,另外一個就是仿真出兩條中軸線的模擬圖。視頻主體模擬的是攝像頭右移,即模擬搬運(yùn)機(jī)器人右移,從帶有中軸線的調(diào)試窗口可看出導(dǎo)航線出現(xiàn)在了圖片左邊;下位機(jī)模擬程序調(diào)整搬運(yùn)機(jī)器人車身,可看到屏幕上的中軸線也跟著右移,證明數(shù)據(jù)反饋和姿態(tài)調(diào)整算法發(fā)生作用。
操作旭日X3派
連接usb攝像頭到旭日X3派、用usb轉(zhuǎn)ttl下載器把旭日X3派跟電腦連接在一起:
上電,使用ssh登錄,在線操作:
在app文件夾里面創(chuàng)建了一個user的文件夾,把自己寫的用于測試的代碼都放在這里:
在命令串口執(zhí)行代碼,并且打開電腦端寫的仿真軟件:
python3 /app/user/xunxian_pi.py
用手控制攝像頭先往右移動,即模擬機(jī)器人車身偏右;再往左移,即模擬偏左,可從視頻中看出,都可以很快調(diào)整回去,黑色的導(dǎo)航線緊跟著攝像頭移動。命令串口不斷反饋數(shù)值和指令,left表示向左調(diào)整,right表示向左調(diào)整,go stright表示不需要調(diào)整(指令下面兩行數(shù)字分別是坐標(biāo)調(diào)整值和角度值):
原作者:衣柜旁的小明
原鏈接:詳見地平線開發(fā)者社區(qū)
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634682 -
人工智能
+關(guān)注
關(guān)注
1791文章
47200瀏覽量
238268
發(fā)布評論請先 登錄
相關(guān)推薦
評論