哈Ha!
在本出版物中,我想谈一谈我如何为机器人构建本地越野地图。 这项任务对于提高传感器编程和掌握技能以及随后在诸如Robocross和Robofest之类的机器人测试中在实际机器人的操作中实现我们自己的算法都是必需的。
本文适用于刚进入机器人技术领域或试图弄清楚如何制作越野地图的人们。 我试图用大多数人都可以理解的最简单,最易理解的语言来解释一切。
什么是本地越野地图
因此,机器人在给定时刻看到的是
本地越野地图 。
这是来自机器人“眼睛”的信息,随后以对我们方便的形式进行处理和显示。
如果机器人静止不动,则其在恒定环境条件下的局部地图将保持不变。
如果机器人运动,那么在每个时刻其环境都会不同,本地地图也会发生变化。
本地地图通常具有恒定的大小。 根据测距仪发出的射线的最大长度来计算大小。 就我而言,这个长度是6米。
为了简化任务,决定使地图成正方形,并确定条件测距仪将恰好位于地图的中心(此位置将是x = y = 0的点)。 之所以选择中心,是因为我使用的测距仪在平面上发出的光线超过180°(它以240°的角度发出光线,但稍后会发出更多光线),也就是说,某些光线肯定会在扫描仪后面如果您选择了错误的中心,则可能会丢失它们。 正确选择中心,所有光线将正确显示。 基于此,我使地图尺寸比发出的射线的最大长度大2倍。
我的卡大小为12 * 12米。

我使用的传感器
实际上,要解决此类问题,您可以使用任何测距仪。
测距仪是一种用于确定到某物(在我的情况下,是到潜在障碍物)距离的设备。
在机器人技术中,主要使用两种类型的测距仪:超声波和激光。
超声波测距仪便宜得多,但超声波足够宽,不适合精确测量。
激光测距仪更昂贵,但是更精确,因为它们的光线聚焦很窄。
为了解决我的问题,我使用了Hokuyo URG-04LX-UG01激光扫描仪。 该传感器能够以240°的角度发射射线,并提供有关阻挡射线的障碍物的相当准确的信息。 最大范围是5-6米。 值得注意的是,该测距仪仅在2D平面中发出射线。 这一事实迫使您将传感器放置在机器人上的某个位置(通常位于机器人底部的前面),以获得更准确的图像。 同样,您可以使用3D扫描仪,该扫描仪提供有关环境的更准确和完整的信息,但它们的成本也更高。
我相信这款特殊的扫描仪非常适合进行价格质量比培训。
北洋URG-04LX-UG01简要介绍激光扫描仪的原理:测距仪沿平面发射射线。 在路径中遇到障碍物的光束会从中反射回来。 通过发送和接收信号之间的相位差,可以判断障碍物的位置。
因此,如果发射的光束没有返回,则在其发射直线的5-6米处没有障碍物,或者光束无法正确反射。
可以从激光扫描仪获取以下数据:对于发出的每条射线:
*每个参数都存储在单独的数组中,并且对应于其中一条射线的数据。关于地图制作
为了构建地图并绘制地图,我使用了ROS(机器人操作系统)工具,即:Rviz程序和nav_msgs :: OccupancyGrid数据类型。 我在相应的local_map主题下使用消息类型nav_msgs :: OccupancyGrid创建了本地地图的发布者。 在Rviz中,订阅该主题,可以接收有关地图的数据,并以Map类型的形式显示它们。
根据这种算法,有必要以编程方式配置来自激光扫描仪的数据处理,并以所需的格式记录它们以进行传输。 在OccupancyGrid中,地图以一维数组的形式存储和传输。
这是怎么回事对于那些首次面对此类ROS数据的人:这是不寻常的,因为按惯例,地图是用具有一定数量的列和行的二维数组表示的。
我也是。 我根据来自扫描仪的数据将地图存储在二维数组中,并在编写要发送给Rviz的消息时,将二维数组转换为OccupancyGrid所需的一维数组。
实际上,OccupancyGrid中的地图仅以一维数组存储和传输。 解密其数据时,它将自动变成方形的二维图。
但是要使此操作正确发生,您需要以某种方式编写此一维数组。
即:从二维存储一行一行地写入。
瞧! 这是整个秘密。
对这种一维数组的任何元素的吸引力如下所示:
mapSize-本地地图大小
j是列号
我-行号映射单元(再次根据OccupancyGrid的数据类型)必须具有从0到100的值。值越低,该单元可通过的可能性就越大,反之亦然。
为了简化任务,我
为单元格选择了
3种原色。- 白色-通过区域= 0
- 黑色-不通区域= 100
- 灰色-未知区域= 50
重要的一点!在来自扫描仪的数据到达之前,地图是完全未知的(所有单元格的值= 50),并且在绘制后每次都将其再次更新为未知状态。 这样做是为了使卡不会覆盖多余的先前值。 毕竟,本地地图仅在给定的时间点反映环境状态。
未知卡使用极坐标系(UCS)的变换构造光线
直角坐标系(DSC)。
$$显示$$ \左\ {\开始{聚集} x = r * cosφ\\ y = r * sinφ\结束{聚集} \右。
x,y-DSC中的新坐标
r是到障碍物的距离
φ是光束掉落的角度
r,φ-UCS中的旧坐标
传感器数据处理算法:
我们完全遍历光线的距离r和角度φ的数组(UCS数据)。 对于每个项目,请执行以下操作:
- 对于有限的r和φ,我们将坐标从UCS转换为DSC。 将生成的单元涂成黑色。 这是一个障碍。
- 我们以一定的步长从扫描仪的位置一直到有障碍物的小室,这是最简单的情况,它等于小室的大小。
- 再次,我们将数据从UCS转换为DSC,并将新单元格涂成白色。 这是一个步行区。
如何建立通往障碍物的步行路径的最简单示例但是,如果发射的光束不返回怎么办?如果发生这种情况,则可能意味着:
- 光线是“丢失的”,即没有完全反射或在其他方向上反射
- 光束的方向没有任何障碍,因此,光束根本无法反射
*射线可能会“迷失”,通常是因为障碍物可能垂直于射线,所以它没有以180°的角度反射(也就是说,在任何无法反射的角度下)。 从物理学上您知道:入射角等于反射角。

或者是因为障碍物太黑并且吸收了光束的大部分能量,而光束没有足够的能量后退。
因此,如果光束没有返回,就不可能完全确定会发生什么。
在这种情况下该怎么办?我们执行以下操作:
- 对于扫描仪,我们认为到此类光束的障碍物的距离尽可能大(在我们的情况下为6米)
- 我们将与障碍物成一直线的所有像元视为半通行,并为其分配25的中间数。这些是可通行的像元,但我们并不完全确定它们。
如果光线真的没有遇到障碍,我们就不会损失任何东西,但是如果某个障碍仍然逃脱了机器人的“眼睛”,那么肯定会很快发现它。
卡分辨率
最后,最后的感动!
每张卡都有许可。 简而言之,这是一个单元格可以容纳的单元格数。
举个例子如果1个像元中有1个像元(最简单的情况),则分辨率为1。
如果1个像元中有5个像元,则分辨率为0.2。
我的卡的分辨率为0.04。 即,每个单元中有25个单元。 因此,我的最小步长是4厘米,1个像元是1 m。
我的地图上的细胞和细胞差异结果如何?
制作本地越野地图的示例
*黄色表示单元格颜色我相信总的来说,我所做的工作是成功的,但是我知道算法是不完善的,需要完善和完善。