DIY基于攝像頭的激光測(cè)距儀
有很多現(xiàn)成的測(cè)距組件包括超聲波、紅外線、甚至是激光測(cè)距儀。這些設(shè)備運(yùn)行的很好,但是對(duì)于飛行機(jī)器人來(lái)說(shuō),重量是一個(gè)主要考慮因素。一個(gè)可行的辦法是增加現(xiàn)有組件的功能,并安裝在機(jī)身上。例如微型空中機(jī)器人的有效載荷是100g。它能利用USB連接的攝像頭(或mini無(wú)線攝像頭)執(zhí)行視覺(jué)任務(wù),例如避障等。更好的是,如采用兩個(gè)攝像頭,能提供立體的機(jī)器視覺(jué),這樣能增強(qiáng)避障性能,因?yàn)殡p鏡頭提供了視覺(jué)深度。但缺點(diǎn)是需要增加另外一個(gè)攝像頭的重量。這篇文章就是討論如何利用一個(gè)激光筆和一個(gè)攝像頭來(lái)提供一個(gè)單鏡頭機(jī)器視覺(jué)和測(cè)距的。
這個(gè)項(xiàng)目很大一部分是基于下面這個(gè)教程的
工作原理
下圖顯示了如何將激光點(diǎn)投射到目標(biāo)物上,并在攝像頭上顯示。攝像頭和激光點(diǎn)的距離是可以通過(guò)計(jì)算而得出的。公式很簡(jiǎn)單,因此這個(gè)技術(shù)在需要很快運(yùn)行的機(jī)器視覺(jué)應(yīng)用上是適合的。
介紹一下工作原理。一束激光被投射到目標(biāo)物上,并在攝像頭上被顯示。激光束被認(rèn)為是理想的平行于攝像頭的中心光軸。激光點(diǎn)由攝像頭的其余部分所捕獲。一個(gè)簡(jiǎn)單的計(jì)算就是尋找亮點(diǎn)。如果設(shè)激光點(diǎn)就是這個(gè)場(chǎng)景的亮點(diǎn)(似乎在室內(nèi)我的激光發(fā)射器確實(shí)是亮的),那么這個(gè)點(diǎn)的位置在圖幀中的位置是確定的。然后我們只需要計(jì)算這個(gè)點(diǎn)在沿著y軸的距離,就能計(jì)算出目標(biāo)物離攝像頭的距離,激光點(diǎn)距離中心越近,離目標(biāo)物越遠(yuǎn)。
如同公式所示,距離D是可以被計(jì)算出來(lái)的。
為了計(jì)算這個(gè)等式,我們需要知道激光器和攝像頭之間的距離h,這是個(gè)常數(shù),還有角度,角度可以計(jì)算。
其中:
pfc=從焦平面到中心的像素?cái)?shù)量
rpc=單個(gè)像素的弧度
ro=弧度補(bǔ)償(彌補(bǔ)對(duì)齊錯(cuò)誤)
代入上式,我們得到:
這樣,從圖像中就能將焦平面到激光點(diǎn)像素?cái)?shù)計(jì)算出來(lái)。那其他的常數(shù)怎么辦呢?我們需要執(zhí)行一個(gè)校準(zhǔn)來(lái)得到這些數(shù)據(jù)。
為了校準(zhǔn)這個(gè)系統(tǒng),我們需要收集一系列測(cè)量的數(shù)據(jù),每次測(cè)得的目標(biāo)物的距離和這個(gè)激光點(diǎn)離中心點(diǎn)的像素?cái)?shù)。數(shù)據(jù)如下
校正數(shù)據(jù)
pixels from center actual D (cm)
103 29
81 45
65 58
55 71
49 90
45 109
41 127
39 159
37 189
35 218
使用下面的公式,我們能夠利用激光器和攝像頭之間的距離h和真實(shí)距離計(jì)算出真實(shí)的角度:
θactual=真實(shí)角度
Dactual=真實(shí)距離(測(cè)量得出)
現(xiàn)在我們有了公式中的每個(gè)數(shù)值,我們可以利用一個(gè)關(guān)系式來(lái)計(jì)算點(diǎn)離中點(diǎn)的像素?cái)?shù)。我用了一個(gè)線性關(guān)系式。這個(gè)公式看起來(lái)很有用,……
從我的校正數(shù)據(jù)中,我計(jì)算出:
Offset (ro) = -0.056514344 radians
Gain (rpc) = 0.0024259348 radians/pixel
使用:
下表是列舉了根據(jù)上面ro和rpc值計(jì)算出的距離值,實(shí)際距離值和誤差:
實(shí)際和計(jì)算的測(cè)量數(shù)據(jù)
pixels from center calc D (cm) actual D (cm) % error
103 29.84 29 2.88
81 41.46 45 -7.87
65 57.55 58 -0.78
55 75.81 71 6.77
49 93.57 90 3.96
45 110.85 109 1.70
41 135.94 127 7.04
39 153.27 159 -3.60
37 175.66 189 -7.06
35 205.70 218 -5.64
所需零部件
我的測(cè)距儀沒(méi)有多少部件。我使用一塊硬紙板來(lái)固定激光發(fā)射器和攝像頭。攝像頭和激光發(fā)射器被平行的布置在一起。
我組裝的測(cè)距儀是這樣的
軟件
我通過(guò)兩個(gè)方式編寫(xiě)了這個(gè)軟件,一個(gè)是vc++,一個(gè)是VB。你能發(fā)現(xiàn)VB版本的軟件會(huì)比VC++的軟件更容易一些,但是各有取舍。VC++版本能夠自由的加入其他軟件中?VB版本需要第三方軟件支持(在Visual Studio中)
Visual Basic
vb_laser_ranger.zip
這里可以下載到我的VB版本軟件。
要使用上面的程序,你必須要安裝VideoOCX ActiveX 控件