首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查x-y轴上的碰撞

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

Stack Overflow用户
提问于 2012-05-05 10:14:45
回答 1查看 1K关注 0票数 4

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

该激光器的扫描面积为270°,最大半径为4000 of。它能够检测到这个范围内的对象并报告它们与传感器之间的距离。

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

这张图显示了一个典型的笛卡尔坐标检测。

数值是以米为单位的,所以0.75是75厘米,2是2米。相邻的蓝色点是所有检测到的对象,而(0,0)附近的点是指激光位置,必须丢弃。当激光扫描面积为270°时,产生y<0以下的蓝色点;I增加红线平方(1.5x2米)来确定我要实现的碰撞检查区域。因此,I想检测在实时中,如果在该区域中有点(对象),如果是,调用一些函数。这有点棘手,因为这个检查还应该能够检测出是否存在连续点来确定对象是否是真实的(也就是说,如果它检测到一个点,那么它应该搜索最近的点来确定它们是组成一个对象还是仅仅是一个可能是检测错误的点)。

这是我用来执行一次扫描的函数:

代码语言:javascript
运行
复制
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进行碰撞检查
  • 如果你发现一个点在内部区域,然后检查其他近点,如果是,停止机器人;
  • 如果没有或没有找到其他近点,则启动另一次扫描。

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

你能帮帮我吗?这对我来说似乎很难。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-05 10:27:23

我不认为我能给出一个完整的答案,但一些想法,它可能会去哪里。

实时是什么意思?任何给定的算法运行可能需要多长时间?你的程序在哪个处理器上运行?

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

更有趣的是,它可以检测出一组点。DBSCAN已被证明是一种比较好的聚类算法,用于检测二维点群.这里的关键问题是DBSCAN对于实时应用程序是否足够快。如果不是,您可能需要考虑优化算法(可以使用一些巧妙的索引结构将其复杂性按为n*log(n) )。

此外,可能值得考虑的是,如何将您从上一次迭代中获得的知识结合在一起(假设数据点频率较高,数据点不应发生太大变化)。

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

更新

如果不知道您在哪里遇到了应用DBSCAN来解决您的问题,就很难给您提供好的建议。但是让我试着一步一步地给你一个算法如何工作的指南:

  • 对于接收到的每一个数据点,您都要检查它是否位于要观察的区域。(我所提供的条件应该是可行的)。
  • 如果数据池位于区域内,则将其保存到某种列表中。
  • 读取所有数据点后,检查列表是否为空。如果是这样的话,一切都很好。否则,我们必须检查是否有较大的数据点组,您必须在周围导航。

现在出现了更困难的部分。在该点上抛出DBSCAN,并尝试查找点数组。哪些参数适用于我不知道的算法--这是必须尝试的。在那之后,你应该有几个点。我不完全确定你们会对这些小组做什么-一个想法是检测每个小组在极坐标下的最小和最大度的点。这样你就可以决定你要把车转多远。如果两组之间的距离如此之近,将无法通过两者之间的差距,则必须特别小心。

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

如果你在执行算法时遇到了一些特定的问题,我建议你提出一个新的问题,因为它离这个问题很远,你可能会有更多的人愿意帮助你。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10460867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档