ipa 覆盖算法分析(一)

参考

Indoor coverage path planning: Survey, implementation, analysis. 多种覆盖算法的实现和对比

相关论文

  • 覆盖路径算法

Coverage path planning: The boustrophedon cellular decomposition 牛耕覆盖路径算法

Exact Cellular Decomp ositions in Terms of Critical Points of Morse Functions 莫尔斯精确细胞分裂算法

Concorde TSP Solver 基于栅格的旅行商覆盖算法使用的 TSP 求解器,这是 TSP 求解器,该算法没有对应论文

A neural network approach to complete coverage path planning 基于神经网络的覆盖路径算法

New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 基于栅格的局部能量最小覆盖路径算法

Learning metric-topological maps for indoor mobile robot navigation 基于轮廓线的覆盖路径算法

Efficient Measurement Planning for Remote Gas Sensing with Mobile Robots 凸感知放置覆盖路径算法

Enhancing Sparsity by Reweighted l1 Minimization 凸感知放置覆盖算法中放置优化问题的数学理论,太抽象了

神经动力学简介

线性阈值模型

相关文章

ipa 功能包分区算法,覆盖算法调试,本地运行测试

ipa 分区算法分析

ipa 覆盖算法分析(二)

预处理步骤

地图分割

分区算法,参考 ipa 分区算法分析文章。

房间方向标准化

除了基于轮廓线的覆盖规划之外,所有实现的算法都在房间区域或单元分解上的某种姿态网格上运行。

  1. 将栅格地图转换为图像,其中白色区域代表可进入的房间区域,而深色区域代表墙壁和障碍物。
  2. 使用 Canny 边缘检测算法提取房间轮廓。
  3. 使用 OpenCV 的 Hough 检测直线。从长度 1 m 的直线开始检测,如果发现的直线太少,则减小直线检测长度。所有 Hough 直线方向都收集在具有 10° 分辨率的直方图中,也就是检测到的直线按照朝向角度分类,房间对齐的方向取自直方图最大项提供的平均朝向。

覆盖区域(静止时候机器覆盖区域或传感器的 FOV)

fig.1 footprint 覆盖区域或传感器覆盖区域

如图 fig.1 中,左上角展示圆形机器的正方形覆盖区域。右侧展示传感器的感知区域内接圆,再用圆内的正方形作为覆盖区域。左下角展示四边形的最大内接圆计算方法。

Boustrophedon Coverage Path Planning 牛耕覆盖路径算法

Boustropedon 使用扫描线将房间区域划分为更小的单元(cell)来处理。有些资料翻译为细胞分解,我认为叫单元分解更合适。

  1. 假设房间(空闲区域)方向已经归一化,房间的最长边与 x 轴对齐,也就是上面说的预处理步骤。

  2. 扫描线在房间地图从上到下扫描。每当扫描线被障碍物分成两部分,或当两条分离的扫描线再次连接时候,区域被相应地划分和合并,产生一组区域单元。如图 fig.2 所示。

    fig.2 单元分解
  3. 分析每个单元的主要方向,然后用最大化单圈长度和最小化轮流时间的策略,设置单元内的往返覆盖运动。

    fig.3 覆盖运动

原文的描述过于简单,下面插入《Coverage path planning: The boustrophedon cellular decomposition》论文内容。

牛耕单元分解

论文将地图转为多边形地图,地图边缘以及地图中的障碍物都是用多边形来描述的。这样的地图可以用带洞多边形 Polygen with holes 来描述。

梯形分解

扫描线经过每个多边形顶点都会产生一个区域单元。如图 fig.4 所示。

fig.4 梯形分解

多边形顶点按照逆时针排序,最高点作为起点。如果有多个高点,可以再按左右顺序排。

fig.5 多边形顶点逆时针排序

事件 event

扫描线扫描地图分解单元时候,把产生单元的动作称作事件 Event。

事件 Event 信息(数据结构)包含了事件类型,事件发生的位置(顶点),事件的边指针(pointer to the edge)。边指针指的单元的边。最多有两种边指针,分别是单元的下边界 floor 边和单元的上边界 ceiling 边。

  • IN 事件:当前单元关闭,并产生两个新单元。

如图 fig.6,IN 事件类型为 IN,位置在顶点 B,边指针有 floor 边 A->B 和 ceiling 边 B->C。

由于边指针指的是单元的边。所以 floor 边在多边形障碍物的上面,ceiling 边在多边形下面。

fig.6 IN 事件
  • OUT 事件:两个单元被关闭,并产生一个新单元。

如图 fig.7,OUT 事件类型为 OUT,位置在顶点 E,边指针有 floor 边 E->A 和 ceiling 边 D->E。

fig.7 OUT 事件

MIDDLE 事件:当前单元被关闭,并产生一个新单元。

MIDDLE 事件被进一步分解为 FLOOR 事件和 CEILING 事件。

fig.8 MIDDLE 事件
fig.8 MIDDLE 事件

FLOOR 事件:新单元位于顶点上方。

如图 fig.9,FLOOR 事件类型为 FLOOR,位置在顶点 A,边指针有 floor 边 A->B 和 floor 边 E->A。

fig.9 FLOOR 事件

CEILING 事件:新单元位于顶点下方。

如图 fig.10,CEILING 事件类型为 CEILING,位置在顶点 D,边指针有 ceiling 边 C->D 和 ceiling 边 D->E。

fig.10 CEILING 事件

算法需要遍历所有的多边形顶点,将事件信息全部记录下来。

单元 Cell

单元可以用 floor 边列表和 ceiling 边列表表示。

单元数据结构中,除了包含围成单元的两种边 floor 和 ceiling 列表外,还需要指向相邻单元的指针,以及标记位 visited 和 cleaned。

要记录 floor 边和 ceiling 边,只有多边形顶点是不够。因为 floor 边和 ceiling 边的顶点很难对齐。当扫描线经过一个顶点时候,扫描线在当前单元的 floor 边的交点记为 f,扫描线在当前单元的 ceiling 边的交点记为 c。如图 fig. 11。

fig.11 边界交点 f,c

遍历事件列表中,FLOOR 事件和 CEILING 事件不会增加单元数量!FLOOR 事件和 CEILING 事件只增加当前单元的边指针 floor 和边指针 ceiling。

相邻单元在 IN 事件和 OUT 事件记录,只有这两个事件会结束一个单元和产生一个新单元。相邻单元列表按逆时针顺序记录。

在 OUT 事件中,顶部单元先插入在新单元的相邻单元指针列表的后面,然后再把底部单元指针插入在列表后面。

new\ cell\ neightborlist = new\ cell\ neightborlist \rightarrow top \rightarrow bottom

如图 fig.12,在 A4 位置触发了 OUT 事件,需要更新相邻单元列表。这里的 new cell neightborlist 指 CELL3 的相邻单元列表,因为是新单元,所以列表还是空的。CELL3 neightborlist 后面插入 top 单元 CELL1 的指针,然后 CELL3 neightborlist 后面插入 bottom 单元 CELL2 的指针。

fig.12 OUT 事件相邻单元列表排序

在 IN 事件中,顶部单元先插入在当前单元的相邻单元指针列表的前面,然后再把底部单元指针插入在列表前面。

current\ cell\ neightborlist = bottom \rightarrow top \rightarrow cur\ cell\ neightborlist

如图 fig.13,在 B1 位置触发了 OUT 事件,需要更新相邻单元列表。这里的 current cell neightborlist 指 CELL3 的相邻单元列表,CELL3 不是新单元,相邻列表非空。CELL3 neightborlist 前面插入新的 top 单元 CELL3 的指针,然后 CELL3 neightborlist 前面插入新的 bottom 单元 CELL4 的指针。

fig.13 IN 事件相邻单元列表排序

经过前面的 OUT 和 IN 事件处理,CELL3 neightborlist 内容是:CELL4 -> CELL3 -> CELL1 -> CELL2。

完成单元的相邻单元列表,即完成了单元的邻接图 adjacency graph,方便后续遍历单元。

覆盖

通过单元的邻接图遍历地图的所有单元。

实际上单元的最优访问路径就是经典的旅行商问题。邻接图遍历类似深度优先算法。这部分可以抽离出来另外实现。

单元内的覆盖路径通过牛耕法来规划。按照“左、下、上、右”4个固定的顺序,使机器人在室内进行全覆盖的移动。

fig.14 牛耕法路径

覆盖算法步骤

  1. 地图预处理,对齐房间方向(,滤过噪点),处理成多边形地图。

  2. 扫描地图,记录事件 Event。

  3. 遍历事件列表,产生单元和邻接图。

  4. 从任意单元开始覆盖访问,将单元插入一个访问链表,该列表是双端链表。

  5. 每当完成单元内的覆盖路径后标记为已经访问,然后按顺序转到其未被访问的相邻单元。

  6. 重复步骤 5,直到遇到所有相邻单元都已经访问为止。

  7. 通过双端访问链表来回溯寻找最近的未访问单元。然后重复步骤 5。

  8. 若步骤 7 也没有找到未访问单元,说明地图所有单元遍历结束。

牛耕覆盖路径算法效果很大程度上取决于单元分解效果。论文的 FLOOR 事件和 CEILING 事件处理得到的单元很可能是凹多边形,这样的图形对牛耕法覆盖不太友好。合并单元可以找找其他的一些技巧,方法。

另一种单元分割方法叫边界内部延伸法 Interior Extension of Edges。

首先筛选内部障碍物多边形两条边之间的内角小于 180 度的边,延伸这些的角度的边,直到它们碰到地图的边界。

fig.15 边界内部延伸法,分割单元

之后,合并相邻的子多边形以减少子区域。 原则是合并后的多边形必须是凸的。最好的选择是总宽度最小的那个。

fig.16 边界内部延伸法,合并单元

下篇文章

ipa 覆盖算法分析(二)

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ipa_coverage_planning 是一种全覆盖算法,用于规划无人机的航线,以实现对一个区域的全面覆盖。下面对其代码进行详解。 首先,算法需要一个网格来表示待覆盖的区域。算法中定义了一个 Grid 类来表示网格,并在其构造函数中初始化了网格的大小和分辨率。网格中的每个单元格都用一个数字表示其状态,0 表示未覆盖的区域,1 表示已覆盖的区域。 算法的入口函数是 coverage_planning 函数。在这个函数中,首先创建一个无人机对象,通过传递网格和无人机的相关参数进行初始化。然后进入循环,直到整个区域被完全覆盖为止。 循环中的每一步都遵循以下步骤: 1. 首先,从当前无人机位置开始,计算未覆盖区域中离无人机最近的点,作为下一个目标点。 2. 然后,使用某种路径规划算法(例如 A* 算法)计算从当前位置到目标点的最短路径。 3. 接下来,通过无人机以固定速度沿着路径移动到目标点,并在移动过程中更新每个单元格的覆盖状态。 4. 当无人机到达目标点后,它将停留一段时间,以达到完全覆盖该点的效果。 5. 最后,重新计算下一个目标点,并重复以上步骤。 在算法的实现中,还需要考虑以下几个方面: 1. 无人机的速度和停留时间的设定,以确保完全覆盖每个点的要求。 2. 路径规划算法的选择和实现,以确保无人机能够找到最短路径。 3. 网格的边界条件处理,防止无人机越界。 通过以上详细的代码解释,我们可以更好地理解并实现 ipa_coverage_planning 算法,以实现全覆盖航线的规划。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值