type
status
date
Oct 18, 2024 09:07 AM
slug
summary
tags
category
icon
password
项目地址
ipa_coverage_planning
AndyKong2020 • Updated Oct 31, 2024
参考文章
配置运行环境
ubuntu20.04, ros noetic
直接编译,然后会提示缺少依赖,缺哪个装哪个就行
不需要使用turtlebot也能运行
1.启动server
2.配置client
在配置环境时,会下载一些示例地图在软件包内,选择ipa-apartment
结果:
软件包分析
topic&msg流转
可以看到,server接收action_topics,发布coverage_path
action_topics包括:
GoalID似乎在代码里并没有用到
其中,action定义:
server的发布部分
可以看到,除了回传给client
coverage_path
和coverage_path_pose_stamped
两个消息外,还发布了一个nav_msgs::Path
类型的coverage_path
,这是我们要用到的两种牛耕法算法简述
概述
算法包提供了8种路径覆盖算法,其中牛耕法在扫地机器人中最为常见,在程序中分别是Boustrophedon 和 Boustrophedon Variant。下面是参考chatgpt的解释:
Boustrophedon 和 Boustrophedon Variant 是两种在机器人路径规划或覆盖算法中常见的策略,它们都涉及如何高效覆盖一个区域。它们之间的区别主要体现在覆盖路径的生成方式和应对复杂地形的能力上。1. Boustrophedon(牛耕式路径):
- 概念: 名称来自希腊语,意为“像牛在田地里来回耕作”,描述的是一种蛇形路径。机器人在区域中按平行直线前进,到边界后掉头再走相反方向的直线。每条路径和之前的一条平行,形成类似于“Z”字形的轨迹。
- 优点: 这种方法在规则的、没有障碍的矩形或规则形状区域中非常高效,覆盖路径最短。
- 缺点: 对复杂区域(如包含障碍物或非规则形状的空间)不太适合,因为需要考虑如何绕过障碍或不规则形状,这可能导致路径的复杂化或覆盖不全。
2. Boustrophedon Variant(变体牛耕式路径):
- 概念: 这是对传统Boustrophedon方法的改进,用于应对更复杂的环境。通过分解自由空间(如将区域分成多个子区域),然后在每个子区域内进行类似于牛耕的路径覆盖,能够更好地处理有障碍物或非规则形状的场景。
- 适用场景: 这种变体在包含障碍物、凹凸不平或者不规则形状的区域内非常有用。机器人可以在每个子区域内执行牛耕式覆盖,确保所有自由区域都能被完全覆盖。
- 优点: 适用于复杂的自由空间,通过分解问题,使路径规划更加灵活。
- 缺点: 对于简单规则的空间可能没有传统Boustrophedon高效,因为在分解子区域和路径连接时可能会增加额外的路径长度。
区别总结:
- Boustrophedon 是一种简单的蛇形路径算法,适合规则区域的高效覆盖。
- Boustrophedon Variant 是为了应对包含复杂地形和障碍物的区域,通过子区域分解来实现完整覆盖。
简单场景下,选择两种算法没有显著差异。
接下来看一下算法传入的参数
大部分很好理解,这几个参数可以注意:
- grid_spacing_in_pixel:
- 描述: 栅格的网格间距,以像素为单位。这个值决定了在规划路径时,机器人在地图上生成采样点的间隔。
- 作用: 控制路径生成时的密度,如果间距太大,路径可能较为粗糙;如果间距太小,计算开销会增大,路径会更密集。
- grid_obstacle_offset_:
- 描述: 障碍物偏移量,通常以栅格或像素为单位,表示机器人与障碍物之间需要保持的最小安全距离。规划路径时,系统会避开这个偏移量内的区域,确保机器人不会撞到障碍物。
- 作用: 增加安全性,确保路径不靠近障碍物过近,避免碰撞。
- path_eps_:
- 描述: 路径的精度或误差阈值,表示路径生成时的允许误差范围。在路径规划中,误差可以影响机器人对路径的执行精度和路线的光滑程度。
- 作用: 控制路径生成时的精度要求,如果误差较小,路径更为精确,但可能需要更多的计算。
- min_cell_area_:
- 描述: 最小栅格单元面积,表示路径生成时最小的覆盖区域。小于这个面积的区域可能会被忽略,或者特别处理。
- 作用: 用于过滤非常小的空间单元,减少不必要的路径计算。
其中,path_eps_可以控制路径的平滑程度
path_eps_ 作为路径规划中的误差阈值,通常表示路径允许的最大偏离或误差范围。
- path_eps_越大:
- 允许更大的误差,路径规划的计算会更宽松。
- 生成的路径可能不如更小的误差阈值那样精确,但路径会更加简化和平滑,可能会减少急转弯和路径的细节。
- 适合不需要严格精度的场景,优点是规划速度更快,但缺点是路径可能偏离预期位置较多。
- path_eps_越小:
- 允许的误差更小,路径生成时需要更加精确的计算。
- 路径的每一个细节都会更符合预期,因此更符合环境的实际情况。
- 但这可能会导致路径更加曲折,不够光滑,特别是在复杂的地形或有障碍物的环境中,路径可能包含更多的细节和急转。
- 如果path_eps_ 值较大,路径会更光滑,因为它忽略了一些小的细节,生成较为简化的路径。
- 如果path_eps_ 值较小,路径会更精确,但有时会导致不太光滑的路径,包含更多的弯曲和调整。
参数读取处,我将其从2.0修改为3.0,路径略微变得平滑。
但在另一个配置文件中,发现这个参数与步长有关
实验后发现,确实代表了生成的最大步长
存在问题
I need your help
Updated Jul 25, 2024
Some problems of covering paths on obstacle maps
Updated Aug 31, 2023
以上issue描述了相同的问题,即规划的路径会穿过不可达的位置,维护者在issue中解释了原因。
后面代码分析会提到如何解决
代码分析
参考文章
这篇文章详解了算法的原理和流程。
论文pdf:
两步走
可以从源码中发现,可以分为两大步骤,第一布是将图片分区,称为cell,第二部是画线。
实验多种参数发现,边缘粗糙复杂的地图cell会非常多,这时会运行一个cell合并函数,将cell的数量减小。相关参数是
min_cell_area
。接下来会对每个cell内部生成覆盖路径,前一个的尾和后一个的首相连得到最终路径。单个cell内首尾位置是没有约束的。
路径穿过障碍或墙体的两种情况
- 第一种是上面说到的两个cell之间尾首相连,只有两点一线,中间有可能穿过障碍或墙体
- 第二种即当步长设置过大,两点之间的路径可能会距离墙体太近或直接穿过。这是因为机器人投影面积的约束只对点有效,线经过哪里无法控制。
解决办法
第一种问题的解决方法
对于cell之间尾首相连的路径问题,可以在这两点之间使用A*算法规划一条路线。
实现的代码需要添加到里:
src/ipa_coverage_planning/ipa_room_exploration/common/src/boustrophedon_explorator.cpp
这段代码在一个对cell的迭代器中,对每个cell,把cell内生成的路径推入总路径。
我们可以在
fov_middlepoint_path.insert(fov_middlepoint_path.end(), fov_middlepoint_path_part.begin(), fov_middlepoint_path_part.end());
前规划一段连接上一个cell内路径末尾的路径,在这行之前推入总路径。这里使用A*算法来规划路径,在这个软件包中,作者在
src/ipa_coverage_planning/ipa_building_navigation/common
中已经完成了一个A*算法的实现,我们直接调用。需要注意传入的地图,地图在程序中有多个旋转过的版本,需要转入原始地图。别忘了先判断存不存在上一段路径。
结果如下,粗线即使用A*规划的路径,成功绕开了墙体。
第二种情况
对于第二种情况,同样可以使用A*规划每两个点之间的路径,也可以减小
path_eps
参数。- Author:NotionNext
- URL:https://tangly1024.com/article/1239b391-226a-8020-aeaf-d9d2d58aad00
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts