我正在Ubuntu用C/C++编写一款移动机器人应用程序,目前,我使用激光传感器扫描环境,在机器人运动时检测与物体的碰撞。
该激光具有270°的扫描区域和最大半径4000mm。它能够在此范围内检测物体并报告其与传感器的距离。
每个距离都是平面坐标,所以为了获得更易读的数据,我将它们从平面坐标转换为笛卡尔坐标,然后将它们打印到文本文件中,再在MatLab中绘制它们以查看激光检测到的内容。
这张图片展示了笛卡尔坐标下的一个典型检测结果。 数值以米为单位,所以0.75表示75厘米,2表示两米。相邻的蓝色点都是检测到的物体,而靠近(0,0)的点是激光位置,并且必须舍弃。 y < 0 下方的蓝色点是由于激光扫描区域为270°而产生的。我添加了红线方框(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应用碰撞检查
- 如果您在内部区域中找到一个点,则检查其他附近的点,如果是,则停止机器人;
- 如果没有或者没有找到其他附近的点,请开始另一次扫描。
我想知道如何轻松检查前面定义的区域内的对象(由多个单个点组成)。
可以帮帮我吗?对我来说看起来很困难:(