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