单目导航 - 第 I 部分






4.64/5 (8投票s)
如何为简单的运输机器人构建导航系统。
引言
我将介绍一系列关于机器人导航系统的文章:单目视觉。该系统仅使用一个输入信息来源:网络摄像头。有些人认为机器人应该有一个复杂的导航系统,配备声纳、激光测距仪等等。但我不这么认为。是的,这有助于简化软件,但也带来了一些问题。这种机器人太贵,而且很难升级它们的软件。在我的实验中,我使用了一个简单的 Labtec Notebook Webcam 摄像头(30 美元)、笔记本电脑、2 个伺服电机和一个 Arduino 用于将电机连接到它。就这些。它很便宜(总共约 400 美元)而且很容易实现。我也使用了 Vex 金属套件,因为它包含很多螺栓和金属部件。
背景
单目机器人导航的一些基础知识是在 2000 年由 Iwan Ulrich 提出的“基于外观的单目彩色视觉障碍物检测”(ABOD 方法)中介绍的。简而言之,他的算法是
- 在相机前取一个小梯形区域。
- 将颜色调色板从 RGB 更改为 HSL。
- 制作 H 和 L 频率的条形图。
- 检查图像中的每个像素,如果它的 H 和 L 低于条形图中的 H 和 L,则为障碍物,否则为地面。
复杂障碍物检测
我在几个图像上测试了 ABOD 方法。我还使用了不同的颜色方案:RGB、HSI、H 方法、Sobel 边缘检测和 CCC。这是方法有效性的表格
方法 | 纹理地面 | 单调地面 |
RGB | 30% | 40% |
HSI | 10% | 90% |
CCC | 30% | 90% |
Sobel | 5% | 70% |
H 方法 | 80% | 50% |
所以,你看到了 - 在不同的情况下,方法具有不同的效果。我想说更多 - 效果取决于地面的质量和类型。例如,对于混凝土背景,所有方法都是完美的,对于我房间里的地毯,只有 RGB 方法是正常的。此外,创建颜色条形图 (CBC) 耗时太多(320x240 图像大约 70 毫秒)。为了解决这两个问题,我决定创建特殊的数组,这些数组保存常见地面(混凝土、沙子、木材等)的 CBC。在机器人开始探索世界之前,我选择背景及其识别方法。这种创新有助于我节省图像处理时间。现在识别一个 320x240x32 位彩色图像需要 140-150 毫秒。
这是程序中的三个主要过程
- 制作颜色数组
procedure tNavigator.MakeColorArrays(Img:TBitmap32); Var i,j:integer; h,s,l,r,g,b,c1,c2,c3:byte; begin TrapWidth:=round(img.Width*0.75); TrapHeight:=round(img.Height*0.15); Threshold:=TrapWidth*TrapHeight div 400; for j:=1 to 9 do for i:=0 to 255 do ColorArrays[j,i]:=0; for i:=(img.Width-TrapWidth) div 2 to (img.Width+TrapWidth) div 2 do for j:=img.Height-1 downto img.Height-TrapHeight do begin Color32ToRGB(IMG.pixels[i,j],R,G,B); ColorArrays[1,r]:=ColorArrays[1,r]+1; ColorArrays[2,g]:=ColorArrays[2,g]+1; ColorArrays[3,b]:=ColorArrays[3,b]+1; RGBToHSI(r,g,b,h,s,l); ColorArrays[4,h]:=ColorArrays[4,h]+1; ColorArrays[5,s]:=ColorArrays[5,s]+1; ColorArrays[6,l]:=ColorArrays[6,l]+1; RGBToCCC(r,g,b,c1,c2,c3); ColorArrays[7,c1]:=ColorArrays[7,c1]+1; ColorArrays[8,c2]:=ColorArrays[8,c2]+1; ColorArrays[9,c3]:=ColorArrays[9,c3]+1; end; end;
- 使用 RGB、HSI 和 CCC 方法寻找障碍物
procedure tNavigator.FindObstacles(img:tBitmap32;method: integer); Var i,j,q:integer; h:array[1..9] of byte; bool:boolean; begin for i:=0 to img.Width-1 do begin for j:=0 to img.Height-1 do begin Color32ToRGB(img.Pixel[i,j],H[1],H[2],H[3]); rgbtohsi(H[1],H[2],H[3],H[4],H[5],H[6]); rgbtoccc(H[1],H[2],H[3],H[7],H[8],H[9]); bool:=false; if (ColorArrays[method*3+1,h[method*3+1]]>=Threshold)and (ColorArrays[method*3+3,h[method*3+3]]>=Threshold) then ObstacleView[i,j]:=0 else ObstacleView[i,j]:=1; end; end; end;
- 获取 CCC 图像
PROCEDURE RGBToCCC (R,G,B: Real; VAR C1,C2,C3: Byte); VAR Max,c11,c22,c33 : Real; BEGIN max:=maxValue([g,b]); if max<>0 then C11:=arctan(R/max) else C11:=0; max:=maxValue([r,b]); if max<>0 then C22:=arctan(G/max) else C22:=0; max:=maxValue([g,r]); if max<>0 then C33:=arctan(B/max) else C33:=0; C1:=round(255*abs(C11)/PI); C2:=round(255*abs(C22)/PI); C3:=round(255*abs(C33)/PI); END;
我的机器人 "MTR-1"
在 3 周内,我将完成我的机器人,并将在此处放置一些照片。现在,只有测试终端准备就绪。
在第一步中,我们制作图片的颜色直方图

然后我们使用其中一种方法找到障碍物

该程序现在运行非常慢(400-600 毫秒),因为我使用了 Delphi 的标准图像组件。在第二部分,你将看到它使用 FastGraph
组件可以有多快,我将展示局部地图创建的算法。
历史
- 2009 年 8 月 9 日:初始帖子