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