Aruco标记定位

在上一篇文章中,我们讨论了如何在不击中任何东西的情况下从A点到达B点。 但是,为了解决问题,您需要了解我们在哪里,以及在哪里存在动态障碍(我们的对手不仅是对手)。

一个人的眼睛,耳朵和软件是自然界和个人经验所决定的,因此他可以轻松地在太空中移动和导航。 定位系统几乎是机器人的眼睛和耳朵。 需要使机器人能够在太空中导航,并根据环境调整在其中移动。

今天,我们将讨论如何解决确定机器人在Eurobot领域中的位置的问题,如何完成所有这些任务,自行启​​动和配置。



本地化系统的目标条件


Eurobot Open的原则之一就是自治。 在竞争环境中拥有一切自主权。 所有计算,决策和本地化都应在\机器人上或现场的特殊地点进行。

视场的大小为2x3米,视场之间的元素的大小和位置误差通常在3-5毫米之内。

下图是Eurobot 2019领域的示意图,其中带有标记的区域,我们可以在其中放置机器人以外的东西。



  • 6-实验区(其他任务之一)
  • 10-灯塔区
  • 11-用于安装中央跟踪设备(以下称为CCC)的专用塔。 位于田野上方1米的高度
  • 同样,我们可以在机器人本身上安装信标。

对于机器人的所有这些区域和尺寸,在重量和尺寸上都有严格的限制,因此不可能制造出一个可以容纳所有东西的大型生产超级模块。 发射准备也有3分钟的限制。 在这段时间内,团队中的一两个人必须拿出机器人以及与机器人相关的所有东西,安排,配置并准备发射。 显然,您需要设置和调整的垃圾越少,在战斗开始之前犯错或被罚款的可能性就越小。


还有第二个这样的盒子

我们分析选项


了解了我们的能力并渴望获得至少几毫米的定位精度后,让我们看看通常可以用来解决此问题的方法:

  • 使用直接位于驱动器上或附加测量轮上的编码器进行车轮测距,可以读取机器人行进的距离并确定其相对于起点的位置。 许多Eurobot团队都将其用作主要的本地化方法。 这是机器人最快的运动信息来源之一。 但是,在实践中,尤其是在全轮驱动时(比传统轮更小的接触面积,滚子的游隙和较大的制造误差),里程计容易出现累积误差的问题,需要以某种方式进行校正。 您可以使用已知坐标与曲面对齐,也可以使用其他系统进行复杂处理。 另外,如果在驱动轮上使用编码器,则在急速操纵和机器人碰撞时也会出现车轮打滑的问题。 测量轮可以解决这个问题,但是很难将其放置在小型机器人中。


    我们在2018年使用的带有独立悬架和磁编码器的自制全能测量车轮
  • 激光雷达具有显着的优势:我们可以看到几乎圆形的视图,并且可以到达障碍物。 在缺点中,值得注意的是高昂的价格,试图从垃圾中区分小的远处物体的难度以及相对复杂的定位算法。 廉价的激光雷达(例如rplidar)的刷新率和角分辨率较低,并且还会受到其他激光雷达,测距仪等的光线的照射。在机器人中,很难在侧面找到使用经典SLAM算法的激光雷达,但是在提供本地化系统的海拔规则几乎没有用于绑定的静态对象。 但是,Skoltech团队多年来使用hokuyo ust-10lx成功滑冰,去年在法国Eurobot竞赛的欧洲决赛中获得第二名。
  • 我们还考虑了惯性系统 ,但在我们的情况下,它们并不合适。 加速度计嘈杂,陀螺仪浮动,您可以忘记在室内使用指南针。 即使使用卡尔曼滤波器,也无法达到所需的精度。 事实证明,IMU只能在很短的时间内有效地用于校正。 pixhawk2能够获得的最大有用信息是急转弯时的角度(例如,由于碰撞)。
  • GPS无法在室内工作,没有RTK的精度为米。
  • 超声波定位 。 可以在这里找到一种实现方式: m.habr.com/en/post/451408 。 las,我们任务的准确性不是很高(+ -2cm),串扰会严重影响,或者,如果您使用具有此功能的传感器,则轮询频率会很低。 俄罗斯的一个团队使用此解决方案取得了不同程度的成功,而德国Turag团队则非常成功地采用了实验室内部开发的类似技术。
  • 视觉测距法不能提供有关对手位置的信息,这是因为在场地上没有很多点可以可靠地粘住。
  • \ Tof立体摄像机的角度很窄,当安装在中央跟踪设备上时,不能覆盖视野,或者在安装在机器人上时无法获得圆形或至少可以接受的视野。
  • 我们已经选择的信任标记 ,我们将对其进行更详细的研究。

基准标记


标记导航已经存在很长时间了。 从理论上讲,所谓的标记可以是任何对象。 但是使用时有很多问题:

  • 由于相机分辨率的限制;
  • 使用颜色作为主要信息来源时检测不可靠;
  • 需要确定标记的方向;
  • 低对比度标记只能在光线充足的情况下才能正常工作;
  • 需要设备的高处理能力(实时处理传入帧)。

为了避免上述问题,通常必须使用简单且明确的内容进行识别,例如彩色圆圈或正方形(我想要一只黄色的鸭子)。

图片
不同类型的标记

实际上,除了确定标记的位置之外,通常还需要确定其唯一性,例如以便一次检测多个对象。 为此,您可以更改颜色或形状,但是我们很快将面临检测可靠性的下降。
这个问题很普遍,并且有很多标记标准。 其中最著名的是qr码,但是由于冗余和对高分辨率的需求,它很少用于定位问题。 通常,所有标记都是两种颜色(最常见的是b / w),形式简单(最常见的是正方形),并以某种方式对标识符进行编码。 本地化最著名的标记是Aruco,April Tag,ARToolKit。

任何有兴趣了解更多有关它们的人都是一篇有趣的文章 ,还比较了它们检测的可靠性。

分形标记
有时我们需要从远处和近距离检测到一个物体。 使用几种大小不同的标记是一种方法,但是您可以更巧妙地使用“分形”标记,它的不同部分可以在图片的不同比例下工作。

docs.google.com/document/u/1/d/1SdsOTjGdu5o8gy2Ot2FDqYDS9ALgyhOBJcJHOZBR7B4/mobilebasic

就我们而言,使用标记有很多积极的方面:

  • 可以安装具有良好视角和标记的静态摄像机,这不需要难找的设备,并且可能实施起来也不难。
  • 远程摄像机可以评估我们可以在上面放置标记的所有对象的位置;
  • 计算不是在机器人的车载设备上进行,而是在单独的计算机上进行(但存在可靠性和数据传输延迟的问题);
  • 解决与视觉相关的任何其他问题的能力。

通过分析上述系统,我们确定了标记的检测方法。 这不仅使我们可以在机器人上释放机器人,而且还可以让他们从鸟瞰图上看到整个现场的情况。

开箱即用


标记物检测的“可靠性”是一个相对术语。 不同的任务需要不同级别的准确性和稳定性。 包括这些参数取决于视频传感器,镜头,照明条件等。


在我们的情况下,由于视野大小为2x3米,而摄像机仅在其上方一米处,因此必须使用视野至少为120-140度的超广角光学器件,以确保整个游戏空间的可见性,这不利地影响了远处小标记的检测(及其准确性)在运动场的一角,以及在任意光照条件下,这项任务变得更加困难。
如实践所示,即使在正常,完全自然的照明条件下,标记位置的定义也可能发生错误。



因此,下图显示了具有标记检测结果的两个连续帧:Z轴(蓝色)的方向改变了180度。




www.youtube.com/watch?v=xzG2jQfxLlY

进入竞争状态


更改算法


为了准确地确定机器人在场上的位置,您需要知道摄像机的角位置,坐标系的一般变换以及摄像机相对于场位置的位置。 为了进行这种转换,我们开发了自己的算法。 由于有人手动悬挂中央控制中心,而且各个字段之间略有不同,因此不可能始终获得相同的摄像机位置。 摄像机相对于视场的角位移对机器人位置的检测有非常不利的影响。 根本的解决方案是确定一些我们可以在匹配之前进行校准的静态标记。

opencv中的Aruco库提供确定相对于摄像机的6dof标记位置的功能。 最初,我们尝试使用它,但结果却非常不稳定和不准确。 在我们的例子中,当相机的位置已知,固定并且机器人(和相关的标记)在未通过相机附着点的平面上移动时,将自己限制在检测3dof位置(z-const,x-y,+旋转)的任务上是合理的一个轴z)以可见角度通过平面上的点的三角剖分。

期望解决问题的尺寸减小和三角剖分的底数增大(标记的大小与从标记的平面到照相机的距离)减少了检测结果的不确定性和噪声水平。
为此,而不是标准功能

cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs); 


根据找到的标记角,确定标记的6dof位置,我们编写了位置估算器,并根据以下原则进行工作:

  • 预先知道3D相机的位置;
  • 标记高度是事先已知的;
  • 作为检测的结果,已知4个标记角的像素(v,u);
  • 摄像机校准的结果是定义了一个4x4摄像机矩阵;
  • 知道``相机矩阵'',相机的位置和方向,标记的像素角的位置,您可以获取标记顶点所在的z平面上3D空间中角度位置的投影(标记高度由其数量确定);
  • 对所有四个标记角进行上一步骤并平均获得的数据,可以在相机坐标系中获得标记顶点的3D坐标;
  • 应用从SK摄像机到运动场的SK的变换,可以获得SK场中标记的坐标。

解决照明和性能问题


标记检测的稳定性和速度在很大程度上取决于环境照明条件和背景结构,框架中的物体越多,处理时间就越长。 由于对Eurobot照明和背景的规定没有任何规定,因此它们可能会不时地发生很大变化,可能还有其他领域,背景中的人们。 特别是,可能会出现敌方机器人,照相机闪光灯或聚光灯落入照相机视场的其他情况。

为了减少环境照明对标记物检测稳定性的影响,开发了一种特殊的“设计”,其中使用了倒置的阿鲁科标记物。 较暗的部分由反光膜代替,有源LED背光灯直接安装在相机上。 图像处理为负片,而背景的对比度远低于其自身标记的对比度。

增加标记的对比度可以使您有效地选择框架上感兴趣的区域,并仅在其中而非整个框架中搜索标记,从而大大提高了生产率。


比较标准标记和具有反射表面的标记之间的对比度差异

我们选择铁


由于没有定义光照条件,并且机器人的速度可能很大,因此从一开始我们就在寻找具有全局快门而不是滚动快门的相机。 不同之处在于,全局对象同时收集有关像素亮度的信息,并逐行滚动,因此,运动对象的几何形状可能会发生变形。
最便宜的相机是oCam-1mgn,我们使用了2年。 但是,它是黑白的,分辨率仅为1Mpx,位于可接受分辨率的下边界(图像中像素的数量,每1个“像素”)。
最初,检测器被认为与机器人本身在同一块板上,即odroid xu4,工作速度约为20 fps,但是,由于希望在中央控制中心挂起其他功能,并了解需要更好的摄像头,因此需要用功能更强大的Intel代替PC。 Nuc和相机...我们仍在为新季节选购相机。

我们开始这个项目


进一步假设您已经配置了ROS Kinetic或Melodic。

首先要做的是下载并安装OpenCV 3,Eigen3和项目https://bitbucket.org/eurobot1718/ocam_usb_cam (用于Ocam摄像机),或使用结构与主题数据发布类似的另一个项目。

我们使用粗略的检测器项目克隆存储库: https ://gitlab.com/eurobot2019/aruco_detector和gui为其https://github.com/alexpostnikov/aruco-gui
安装项目后,您需要校准摄像机并获得色散矩阵和摄像机失真矩阵,然后将所有内容包装在yaml文件“ camera_params.yml”中。 一个简单的例子是使用棋盘。 链接到C ++中的实现,您只需要在其中收集并指定电路板和相机参数以及输出文件的名称即可。

主要设置在aruco_detector_params.yml文件中:

  • len_of_cube_markerswidth_marker标记长度和宽度,以米为单位;
  • markers_height-标记及其高度的比较;
  • 标记 -描述特定标记是否属于特定机器人的数组。 它以顺时针方向指示标记。 对于对手来说,由于他们的方向对我们而言并不重要,因此config中标记的顺序也不重要。 您只需要指定标记代码。 顶盖上也有标记,它们的编号分别突出显示;
  • static_markers_ids-在校准过程中搜索的标记;
  • markers_position-具有每个标记相对于机器人中心的偏移和旋转的字典;
  • Brightness_threshold不能被触摸-用于初始的自动光校准;
  • 如果校准失败,请使用camera_position_yellow和类似的参数作为默认设置。

从摄像机坐标系到场坐标系的转换矩阵在transform_from_cam_to_map.xml文件中

完成所有设置后,您最终需要运行它。 带有参数的文件路径,默认边和视频设备的路径在aruco_detector_debug.launch中设置,我们将启动它。 但是,对于完整启动,最好使用bash脚本aruco.bash,该脚本除检测器外还会启动gui(127.0.0.1►000)。 在这里,我们可以选择侧面,开始校准并控制系统。 在第二个窗口中,可见感兴趣的区域和找到的标记。



现在,在以下主题中:“ /敌人_机器人1 / aruco”,“ /敌人_机器人2 / aruco”,“ / big_robot / aruco”,“ / small_robot / aruco”将公布找到的机器人的位置。

万岁! 我们能够获得机器人的坐标。 如您所见,这只是错误的。 这是因为在使用前必须校准摄像机相对于野外的位置。 为此,有必要

  • 将多维数据集设置在字段的角落,但重要的是它们必须由配置中指定的边旋转
  • 调整相机的倾斜度,使所有需要的空间都落入框架中
  • 调整背光亮度,直到可靠的标记检测
  • 在gui中,选择所需的一侧,然后单击“校准”
  • 那么状态应从“搜索静态多维数据集”更改为“搜索多维数据集”

我们制作标记和TsUS


根据规则,我们可以为机器人着色,也可以在我们的机器人和其他人的机器人上使用特殊的位置,在上面可以放置最大10x10x8cm的物体。 机器人的外盖上有一个特殊的位置,高度固定,中央控制中心的可见性更好,除非机器人在摄像机下方。


机器人上灯塔的高度和尺寸

因此,作为机器人的主要标记,我们使用胶合在aruco的4面的10x10x108cm平行六面体,以及在机器人上侧的附加标记,以定位在摄像机下方的复杂区域中。

由于我们无法将任何东西粘在敌人的眼皮上,因此我们决定以截棱锥的形式制作标记,以扩大可见范围。 如您所见-标记变得更好看了。



我们在3d打印机上打印多维数据集\金字塔的基础,以便它足够坚固并且安装方便可靠。



用于打印立方体,棱锥和配合底座的模型位于此处。

这个立方体粘有反射器(我们使用白色AVERY
DENNISON V6700B宽50毫米,虽然价格昂贵,但比便宜的中文好很多倍),而标记笔本身就粘在它上面。 最简单的方法是在绘图仪上剪下标记,尽管您可以在纸上或胶片上剪几个小时的安抚时间(一组由16个标记组成)。

这是我们去年的工具包。


我们标记的各种“世代”

它们也可用作校准的静态标记。 为此,请将其放置在字段的远处,然后单击-校准。

组装中央追踪装置


需要什么:


单板计算机。 这些图纸是针对Intel NUC的位置而制作的,但您可能会考虑将其放置在外壳中,例如odroid xu4或raspberry pi4。

oCam 。 实际上是相机,为此一切。 我们将标准镜头更改为2.5mm ,以获得更大的视角
显示器(waveshare 7英寸HDMI LCD(B))在其帮助下, 可执行校准和许多其他操作。

LED灯条。 用于照亮标记的反射表面。 最好使用最亮的。

电池16.8v LiPo。 我们使用4s5200mAh。 这些电池与机器人上的电池相同,因为它既方便又可以长时间使用。

降压DC-DC转换器。 为LED灯带供电。 Nuc和路由器由电池直接供电,因为所有电源线束都已装在它们上面。

印刷零件。 尤其是相机支架,显示器和用于组装机壳的角落: https//yadi.sk/d/swUJUwxTnTVYFw

房屋详细信息。 在我们的案例中,它是一个2毫米的碳板。 但这不是最佳选择,因为碳导电,难于处理且不如有机玻璃那样轻(也许是最简单的选择)。 虽然要强得多。 找到上面的链接。

路由器(Zyxel狂热的额外)。 为了适应尺寸和重量,我们不得不将其从机壳中取出。 但是在一般情况下,我们强烈建议您不要这样做。
很多小事情。 螺丝M3 * 8〜40个,印刷电路板机架3x10〜12个,电线,螺丝起子,wago等

组装方式


首先,您需要准备印刷的角,将螺母按入其中。 可能是压配合很少,需要稍微粘些或使用熔融螺母
接下来,您需要在基座中安装此部件。 它为中央控制中心提供了清晰的位置。



现在,我们组装好相机支架,将oCam插入那里,将LED灯带的背光灯尽可能地靠近镜头,然后将模块固定到底座。





之后,您可以安装所有侧壁,并将其固定到前面描述的角上。 最好事先解决它们的漏洞。



我们放置了一台单板计算机和一台路由器。 在我们的案例中,这是NUC和Zyxel的狂热特质。






我们得到了组装好的跟踪系统。 剩下的只是调整相机的倾斜度。


2018年本地化调试

结果如何


因此,我们告诉了所有使我们能够用自己的双手重现系统的秘密。 使用它,您可以快速且无任何更改地将您的系统定位到Eurobot字段上的机器人。 只需进行最小的改动,就可以形成相当通用且可靠的事物跟踪系统。 但是,值得考虑的是,当使用aruco 8x8、10x8cm的标记尺寸和1Mpx的相机时,并不是特别可能增大检测半径,但是,如果我们在尺寸和性能上有严格的限制,那么通常我们只会使用更有趣的设备。

今年,规则提到了aruco 4x4的用法,以及该领域每一侧的非相交范围。 在不久的将来,我们计划将其集成到我们的解决方案中,以便将来我们不担心标记号的交叉。 另一个必须具备但尚未完成的是现场手动校准。
在下一篇文章中,我们将讨论较低级别的机器人,如何考虑机器人的运动学,在使用freertos时如何控制服务器,引擎和圆锥体。

我想说谢谢:

Alexey Postnikov (可能值得为之发表所有文章)-通常,本文中的所有代码都可以直接用于撰写本文。
Egor Alexandrov-提供所有图纸和模型,并协助撰写本文和34个逗号。
Tamara Sinelnikova-为撰写本文提供帮助。

还有团队的其他成员!

比赛开始前还剩下不到4个月的时间,但Sberbank Eurobot团队仍对新参与者开放。 我们的电报: https : //t.me/SetUpSber

以前的文章:

左轮手枪,垫圈和自动机器人之间的共同点
自己的导航堆栈。 比ROS更好?

Source: https://habr.com/ru/post/zh-CN482220/


All Articles