我正在用Ubuntu的C/C++编写一个移动机器人应用程序,目前,我正在使用激光传感器扫描环境,并在机器人移动时检测到与物体的碰撞。
该激光器的扫描面积为270°,最大半径为4000 of。它能够检测到这个范围内的对象并报告它们与传感器之间的距离。
每个距离都在平面坐标中,因此为了获得更多可读取的数据,我将它们从平面坐标转换为笛卡尔坐标,然后将它们打印在文本文件中,然后在MatLab中绘制它们,以查看激光探测到了什么。
这张图显示了一个典型的笛卡尔坐标检测。

数值是以米为单位的,所以0.75是75厘米,2是2米。相邻的蓝色点是所有检测到的对象,而(0,0)附近的点是指激光位置,必须丢弃。当激光扫描面积为270°时,产生y<0以下的蓝色点;I增加红线平方(1.5x2米)来确定我要实现的碰撞检查区域。因此,I想检测在实时中,如果在该区域中有点(对象),如果是,调用一些函数。这有点棘手,因为这个检查还应该能够检测出是否存在连续点来确定对象是否是真实的(也就是说,如果它检测到一个点,那么它应该搜索最近的点来确定它们是组成一个对象还是仅仅是一个可能是检测错误的点)。
这是我用来执行一次扫描的函数:
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坐标下的所有检测点.
我想做这样的事情:
我想知道如何在前面定义的区域内部轻松检查对象(由多个点组成)。
你能帮帮我吗?这对我来说似乎很难。
发布于 2012-05-05 10:27:23
我不认为我能给出一个完整的答案,但一些想法,它可能会去哪里。
实时是什么意思?任何给定的算法运行可能需要多长时间?你的程序在哪个处理器上运行?
只需检查abs(x) < 0.75和y< 2 && y > 0,就可以很容易地过滤检测区域内的点。此外,您应该只考虑离0足够远的点,所以是x^2 + y^2 > d。但这应该是微不足道的部分。
更有趣的是,它可以检测出一组点。DBSCAN已被证明是一种比较好的聚类算法,用于检测二维点群.这里的关键问题是DBSCAN对于实时应用程序是否足够快。如果不是,您可能需要考虑优化算法(可以使用一些巧妙的索引结构将其复杂性按为n*log(n) )。
此外,可能值得考虑的是,如何将您从上一次迭代中获得的知识结合在一起(假设数据点频率较高,数据点不应发生太大变化)。
这可能是值得研究的其他机器人项目--我可以想象,解释传感器数据以构建环境信息的问题是一个相当普遍的问题。
更新
如果不知道您在哪里遇到了应用DBSCAN来解决您的问题,就很难给您提供好的建议。但是让我试着一步一步地给你一个算法如何工作的指南:
现在出现了更困难的部分。在该点上抛出DBSCAN,并尝试查找点数组。哪些参数适用于我不知道的算法--这是必须尝试的。在那之后,你应该有几个点。我不完全确定你们会对这些小组做什么-一个想法是检测每个小组在极坐标下的最小和最大度的点。这样你就可以决定你要把车转多远。如果两组之间的距离如此之近,将无法通过两者之间的差距,则必须特别小心。
对于DBSCAN的实现,您可以使用这里或向谷歌求助。这是一个相当常见的算法,已经被编码了数千次。为了进一步优化速度,创建自己的实现可能会有所帮助。但是,如果您发现的其中一个实现似乎是可用的,我会先尝试一下,然后再自己实现它。
如果你在执行算法时遇到了一些特定的问题,我建议你提出一个新的问题,因为它离这个问题很远,你可能会有更多的人愿意帮助你。
我希望现在的情况更清楚一些。如果没有,请给出你有疑问的确切点。
https://stackoverflow.com/questions/10460867
复制相似问题