如何检查x-y轴上的碰撞

时间:2012-05-05 10:14:46

标签: c++ algorithm robotics

我正在Ubuntu中用C / C ++编写移动机器人应用程序,目前,我正在使用激光传感器扫描环境并在机器人移动时检测与物体的碰撞。

该激光器的扫描区域为270°,最大半径为4000mm。 它能够检测此范围内的物体并报告它们与传感器的距离。

每个距离都是平面坐标,所以为了获得更多可重复数据,我将它们从平面坐标转换为笛卡尔坐标,然后我将它们打印在文本文件中,然后我在MatLab中绘制它们以查看激光检测到了什么。

此图显示了笛卡尔坐标的典型检测。 enter image description here 值以米为单位,因此0.75为75厘米,2为2米。连续的蓝点是所有检测到的对象,而点附近(0,0)指的是激光位置,必须被丢弃。 y下的蓝点<&lt;由于激光扫描区域为270°,因此产生0; 我添加了红线方块(1.5 x 2米)以确定我想要实施碰撞检查的区域。 所以,我想实时检测 如果该区域内有点(对象),如果是,则调用一些函数。这有点棘手,因为这个检查应该能够检测是否有连续的点来确定如果对象是真的(即如果它检测到的话)一个点,然后它应该搜索最近的点,以确定它们是否构成一个对象,或者它是否只是一个可能是检测错误的点。)

这是我用来执行单次扫描的功能:

struct point pt[limit*URG_POINTS];
//..
 for(i = 0; i < limit; i++){
 for(j = 0; j < URG_POINTS; j++){
  ang2 = kDeg2Rad*((j*240/(double)URG_POINTS)-120);
  offset = 0.03;     //it depends on sensor module [m]

  dis = (double) dist[cnt] / 1000.0;
  //THRESHOLD of RANGE
  //      if(dis > MAX_RANGE) dis = 0;  //MAX RANGE = 4[m]
  //      if(dis < MIN_RANGE) dis = 0;
  pt[cnt].x = dis * cos(ang2) * cos(ang1) + (offset*sin(ang1)); // <-- X POINTS
  pt[cnt].y = dis * sin(ang2); // <-- Y POINTS
 // pt[cnt].z = dis * cos(ang2) * sin(ang1) - (offset*cos(ang1)); <- I disabled 3D mapping at the moment
  cnt++;
}
ang1 += diff;
}

每次扫描后, pt 包含x-y坐标中的所有检测点。

我想做这样的事情:

  
      
  • 执行单次扫描,最后执行
  •   
  • 对每个pt.x和pt.y
  • 应用碰撞检查   
  • 如果你在内部区域找到一个点,那么检查其他近点,如果是,则停止机器人;
  •   
  • 如果没有,或者没有找到其他近点,则开始另一次扫描
  •   

我想知道如何在先前定义的区域内轻松检查对象(由多个单点组成)。

你能帮助我吗? 对我来说似乎很难:(

1 个答案:

答案 0 :(得分:3)

我认为我不能给出完整的答案,但想一想可能的去处。

你对实时意味着什么?任何给定的算法运行需要多长时间?你的程序运行的处理器是什么?

只需检查abs(x) < 0.75y< 2 && y > 0,就可以轻松过滤检测范围内的点。此外,您应该只考虑远离0的点,所以x^2 + y^2 > d。 但这应该是微不足道的部分。

更有趣的是它将检测点组。 DBSCAN已被证明是一种用于检测二维点群的相当好的聚类算法。这里的关键问题是DBSCAN对于实时应用程序是否足够快。 如果没有,你可能不得不考虑优化算法(你可以使用一些聪明的索引结构将它的复杂性压缩到n * log(n))。

此外,可能值得考虑如何整合上一次迭代中的知识(假设频率很高,数据点不应该变化太多)。

可能值得一看其他机器人项目 - 我可以想象解释传感器数据以构建周围环境信息的问题是一个相当普遍的问题。

更新

如果不知道你在哪里偶然发现DBSCAN问题就很难给你很好的建议。但是,让我试着给你一个逐步指导算法如何工作:

  • 对于您收到的每个数据点,请检查它是否在您想要观察的区域内。 (我上面给出的条件应该有效)。
  • 如果数据点位于该区域内,则将其保存为某种列表
  • 读取所有数据点后,检查列表是否为空。如果是这样,一切都很好。否则,我们必须检查是否有更大的数据点组,您必须导航。

现在出现了更困难的部分。你在这些点上投掷DBSCAN并尝试找到点组。哪些参数适用于我不知道的算法 - 必须尝试。之后你应该有一些积分点。我不完全确定你将对这些小组做什么 - 一个想法是检测每个具有极坐标最小和最大程度的群的点。这样你就可以决定转动车辆的距离。如果两个团体如此接近以至于无法在两者之间找到差距,就必须特别小心。

对于DBSCAN的实施,您可以here或只是向谷歌寻求帮助。这是一种相当常见的算法,已编码数千次。为了进一步优化速度,创建自己的实现可能会有所帮助。但是,如果你发现的其中一个实现似乎可以使用,我会先尝试一下然后再一直实现它。

如果您在实施算法时遇到特定问题,我建议您创建一个新问题,因为它远离这个问题,您可能会有更多愿意帮助您的人。

我希望现在情况有点清楚。如果没有,请给出你怀疑的确切点。