準(zhǔn)備工作
(1)旭日X3派
本攝像頭小車上位機(jī)采用旭日X3派開(kāi)發(fā)板。開(kāi)發(fā)環(huán)境為Ubuntu系統(tǒng)下的opencv-python環(huán)境。通過(guò)HDMI外接顯示器實(shí)現(xiàn)對(duì)兩個(gè)車載USB攝像頭的監(jiān)測(cè)與開(kāi)發(fā),進(jìn)而感知周邊地圖環(huán)境,通過(guò)UART與下位機(jī)的通信實(shí)現(xiàn)對(duì)下位機(jī)的控制。
(2)Aduino Mega 2560 Pro 開(kāi)發(fā)板+IO拓展板
搬運(yùn)小車的下位機(jī)使用的是以開(kāi)源開(kāi)發(fā)板Arduino ATmega2560 為原型改進(jìn)的YWRduino mega 2560 pro開(kāi)發(fā)板,它可以滿足搬運(yùn)小車的基本設(shè)計(jì)需求。開(kāi)發(fā)環(huán)境使用的是Arduino官方提供的IDE和基于VS CODE的Platform IDE。
(3)羅技C170網(wǎng)絡(luò)攝像頭
此攝像頭是用于車身位置引導(dǎo)和視覺(jué)循跡的攝像頭,對(duì)分辨率和視野范圍有較為特殊的需求。使用視頻流時(shí)分辨率可以達(dá)到640*480像素,每幀圖像的品質(zhì)最高可以達(dá)到500萬(wàn)像素,在視頻流獲取過(guò)程中可以實(shí)現(xiàn)自動(dòng)變焦。
(4)免驅(qū)動(dòng)USB攝像頭
此攝像頭用于顏色識(shí)別,其鏡頭焦距為6.0MM,調(diào)焦范圍在20MM至極遠(yuǎn)之內(nèi),視像解析度為640*480。攝像頭長(zhǎng)約3.8CM,寬1.5CM,高約3CM,配有可伸縮線圈,最長(zhǎng)可以65CM。
(5)補(bǔ)光燈
補(bǔ)光燈使用的是自行設(shè)計(jì)的雙檔可調(diào)補(bǔ)光燈,由8個(gè)發(fā)光二極管并聯(lián)而成。通過(guò)GPIO口控制三極管的通斷及發(fā)光二極管的通斷,實(shí)現(xiàn)亮度調(diào)節(jié)的目的,以滿足在不同的環(huán)境條件下攝像頭對(duì)環(huán)境光的需求,進(jìn)而提高顏色識(shí)別的精準(zhǔn)程度。
軌道狀態(tài)
(導(dǎo)航地圖)搬運(yùn)機(jī)器人在地圖上是這樣一個(gè)狀態(tài)

由于拍實(shí)體機(jī)器人看起來(lái)不是很生動(dòng)(主要是機(jī)器人做的太丑了),為了便于生動(dòng)理解原理我使用以下圖片解釋。搬運(yùn)機(jī)器人在每次轉(zhuǎn)彎以后,攝像頭正對(duì)的地方都是一條長(zhǎng)直線(生動(dòng)一點(diǎn)解釋就是以下圖二)。

(模擬車身在導(dǎo)航線上)當(dāng)搬運(yùn)機(jī)器人中軸線跟導(dǎo)航線中軸線剛好重合,也就是搬運(yùn)機(jī)器人正居導(dǎo)航線正中的時(shí)候,這種狀況就是最良好的導(dǎo)航狀況——搬運(yùn)機(jī)器人正在路的正中,正上方攝像頭拍到的導(dǎo)航線狀況如下:
(導(dǎo)航線居于圖片正中)當(dāng)搬運(yùn)機(jī)器人左右發(fā)生偏移的時(shí)候,機(jī)器人與正上方攝像頭拍到的導(dǎo)航線狀況如下
(模擬車身在導(dǎo)航線偏右)
(模擬車身在導(dǎo)航線偏左)由此可見(jiàn),旭日X3派要做的事情就是,通過(guò)攝像頭實(shí)時(shí)拍攝導(dǎo)航線的圖片,并且經(jīng)過(guò)一系列算法處理,得出搬運(yùn)機(jī)器人相對(duì)導(dǎo)航線的偏離狀況,并且把狀況實(shí)時(shí)反饋給下位機(jī)。而下位機(jī)要做的就是接收到偏離信息,通過(guò)姿態(tài)調(diào)整算法,把搬運(yùn)機(jī)器人調(diào)整回到軌道正中。
實(shí)現(xiàn)原理
先把拍攝到的導(dǎo)航線圖片進(jìn)行中值濾波,去除噪點(diǎn)。接著轉(zhuǎn)化成灰度圖,再把灰度圖片進(jìn)行二值化處理,處理到這里的時(shí)候,二值化結(jié)果中就只有0——白色的地圖;255——導(dǎo)航線,從而使用數(shù)學(xué)方式找到導(dǎo)航線的中軸線。
由于攝像頭跟車身位置固定,所以攝像頭拍到圖片的中位線就是車身中軸線所在位置,把兩條中軸線的坐標(biāo)還有斜率進(jìn)行比對(duì),就可以分析出搬運(yùn)機(jī)器人車身相對(duì)中軸線的姿態(tài),進(jìn)而可以把分析結(jié)果通過(guò)串口通信方式發(fā)送給下位機(jī)。
導(dǎo)入需要用的庫(kù):
import cv2 as cv
設(shè)置串口各種參數(shù),波特率設(shè)置為115200,使用40PIN中的UART3:
os.system('ls /dev/tty[a-zA-Z]*')
選擇8號(hào)相機(jī)用作視頻獲取:
cap_follow = cv.VideoCapture(8)
設(shè)置兩個(gè)變量分別用作記錄兩個(gè)中軸線的坐標(biāo):
line_1 = 0
獲取一幀圖片并進(jìn)行中值濾波:
#第二個(gè)參數(shù)frame:表示截取到一幀的圖片
(此處要解釋一些為什么采用中值濾波:均值濾波、方框?yàn)V波、高斯濾波,都是線性濾波方式。由于線性濾波的結(jié)果是所有像素值的線性組合,因此含有噪聲的像素也會(huì)被考慮進(jìn)去,噪聲不會(huì)被消除,而是以更柔和的方式存在,這時(shí)使用非線性濾波效果可能會(huì)更好。中值濾波與前面介紹的濾波方式不同,不再采用加權(quán)求均值的方式計(jì)算濾波結(jié)果,它用鄰域內(nèi)所有像素值的中間值來(lá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)試時(shí)觀察:
ROI = cv.line(ROI, (int(n[1] / 2), 0), (int(n[1] / 2), n[0]), (0, 0, 255), 2)
在電腦上顯示處理后的灰度圖片和標(biāo)注完中軸線的灰度圖便于調(diào)試時(shí)候觀察(旭日X3派上的代碼以刪除了顯示功能,因?yàn)橛玫氖莝erve版本沒(méi)有桌面,使用HDMI顯示起來(lái)又挺麻煩而且占用算力):
cv.imshow("gray", gray)
在調(diào)試窗口輸出兩個(gè)中軸線坐標(biāo)差值和斜率差值:
print(int( (n[1] / 2 - p1(n[0]))/20 ))
把兩個(gè)差值處理成0-9十個(gè)梯度通過(guò)串口傳送給下位機(jī)
if line_1 < -5 and line_2 > 141:
運(yùn)行效果
為了方便展示使用電腦模擬搬運(yùn)機(jī)器人(自己寫了一個(gè)processing程序用作模擬),主要是搬運(yùn)機(jī)器人一打開(kāi)電源,跑的速度很快,發(fā)生偏移和脫軌后的糾正幾乎都發(fā)生在一瞬間,為了方便展示,自己寫了一個(gè)模擬的小程序(搬運(yùn)機(jī)器人實(shí)跑視頻見(jiàn)文末)。
用于仿真的processing程序
此處不一一對(duì)processing的程序進(jìn)行講解,這個(gè)程序?qū)崿F(xiàn)的功能,仿真出導(dǎo)航線,并且仿真出下位機(jī)。這個(gè)仿真程序可以通過(guò)串口接收到來(lái)自旭日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)行程序(因?yàn)殡娔X可以看到調(diào)試窗口)
右上角的兩個(gè)小窗口,不帶兩條直線的是截取后的原始灰度圖片,另外一個(gè)就是仿真出兩條中軸線的模擬圖。視頻主體模擬的是攝像頭右移,即模擬搬運(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)建了一個(gè)user的文件夾,把自己寫的用于測(cè)試的代碼都放在這里:

在命令串口執(zhí)行代碼,并且打開(kāi)電腦端寫的仿真軟件:
python3 /app/user/xunxian_pi.py
用手控制攝像頭先往右移動(dòng),即模擬機(jī)器人車身偏右;再往左移,即模擬偏左,可從視頻中看出,都可以很快調(diào)整回去,黑色的導(dǎo)航線緊跟著攝像頭移動(dòng)。命令串口不斷反饋數(shù)值和指令,left表示向左調(diào)整,right表示向左調(diào)整,go stright表示不需要調(diào)整(指令下面兩行數(shù)字分別是坐標(biāo)調(diào)整值和角度值):
原作者:衣柜旁的小明
原鏈接:詳見(jiàn)地平線開(kāi)發(fā)者社區(qū)
-
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45495瀏覽量
670385 -
人工智能
+關(guān)注
關(guān)注
1817文章
50098瀏覽量
265393
發(fā)布評(píng)論請(qǐng)先 登錄
半年參與3萬(wàn)輛寶馬X3生產(chǎn),人形機(jī)器人“進(jìn)廠打工”真成了
智能復(fù)合機(jī)器人解決方案:優(yōu)化自動(dòng)化搬運(yùn)與提高物流效率
高精度機(jī)器人控制的核心——基于 MYD-LT536 開(kāi)發(fā)板的精密運(yùn)動(dòng)控制方案
復(fù)合機(jī)器人開(kāi)啟血漿包“零接觸”搬運(yùn)新時(shí)代
RK3576機(jī)器人核心:三屏異顯+八路攝像頭,重塑機(jī)器人交互與感知
小蘿卜機(jī)器人的故事
機(jī)器人競(jìng)技幕后:磁傳感器芯片激活 “精準(zhǔn)感知力”
工業(yè)機(jī)器人的特點(diǎn)
STM32+Android實(shí)現(xiàn)的智能家政機(jī)器人電路代碼論文及項(xiàng)目源碼
明遠(yuǎn)智睿SSD2351開(kāi)發(fā)板:語(yǔ)音機(jī)器人領(lǐng)域的變革力量
盤點(diǎn)#機(jī)器人開(kāi)發(fā)平臺(tái)
詳細(xì)介紹機(jī)場(chǎng)智能指路機(jī)器人的工作原理
【「# ROS 2智能機(jī)器人開(kāi)發(fā)實(shí)踐」閱讀體驗(yàn)】機(jī)器人入門的引路書
【「# ROS 2智能機(jī)器人開(kāi)發(fā)實(shí)踐」閱讀體驗(yàn)】+內(nèi)容初識(shí)
地瓜機(jī)器人RDK X5 規(guī)格書與地瓜機(jī)器人RDK X5原理圖
智能搬運(yùn)機(jī)器人系列之使用旭日X3派實(shí)現(xiàn)機(jī)器人防脫軌功能
評(píng)論