65.9K
CodeProject 正在变化。 阅读更多。
Home

单目导航 - 第 I 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (8投票s)

2009年8月9日

CPOL

2分钟阅读

viewsIcon

23581

如何为简单的运输机器人构建导航系统。

引言

我将介绍一系列关于机器人导航系统的文章:单目视觉。该系统仅使用一个输入信息来源:网络摄像头。有些人认为机器人应该有一个复杂的导航系统,配备声纳、激光测距仪等等。但我不这么认为。是的,这有助于简化软件,但也带来了一些问题。这种机器人太贵,而且很难升级它们的软件。在我的实验中,我使用了一个简单的 Labtec Notebook Webcam 摄像头(30 美元)、笔记本电脑、2 个伺服电机和一个 Arduino 用于将电机连接到它。就这些。它很便宜(总共约 400 美元)而且很容易实现。我也使用了 Vex 金属套件,因为它包含很多螺栓和金属部件。

背景

单目机器人导航的一些基础知识是在 2000 年由 Iwan Ulrich 提出的“基于外观的单目彩色视觉障碍物检测”(ABOD 方法)中介绍的。简而言之,他的算法是

  1. 在相机前取一个小梯形区域。
  2. 将颜色调色板从 RGB 更改为 HSL。
  3. 制作 H 和 L 频率的条形图。
  4. 检查图像中的每个像素,如果它的 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 毫秒。

这是程序中的三个主要过程

  1. 制作颜色数组
    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;
  2. 使用 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;
  3. 获取 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 日:初始帖子
© . All rights reserved.