首页 > 解决方案 > 是否有一种算法可以找到异常值的平均值?将激光雷达数据转换为接触点

问题描述

我对编程比较陌生,尽管我了解它在中级水平上是如何工作的。

我有一个安装在墙上的 LiDAR 传感器 (YDLiDAR-G4),可以扫描墙上的所有东西。目标是当有人触摸墙壁时,激光雷达会检测到触摸,然后将极坐标数据转换为 x 和 y 坐标。传感器必须能够检测多个触摸点,例如传感器右侧的一个和左侧的一个。理论上,如果传感器足够好,接触点的数量应该是无限的,但这当然是不可能的,所以假设最多有 10 个接触点。

我已经弄清楚了以上所有内容,但是由于传感器扫描了许多不同的点,因此单个“接触点”看起来就像非常接近的多个点。

有没有办法将所有这些点变成一个单一的“接触点”?

起初我尝试运行一个嵌套的 for 循环来查看一个点是否在另一个点的一定距离内,如果是,它会将它们过滤掉,但这不是超级一致的,它也不能很好地工作。

在这段代码中,我有两个向量包含一个结构 Point2D(笛卡尔坐标),它检查是否有任何点在另一个点的一定距离内,它只将其中一个推到下一个列表中。列表 1 具有激光雷达拾取的所有 x 和 y 坐标,列表 2 为空。

static void filterPoints(const vector<Point2D>& list1, vector<Point2D>& list2, float distance) { //Modifying the two lists

    for (auto iter = list1.begin(); iter != list1.end(); iter++) {
        auto& inputPoint = *iter;
        bool merged = false;

        for (auto comparePointIter = list1.begin(); comparePointIter != list1.end(); comparePointIter++) {
            auto& comparePoint = *comparePointIter;

            if (pointDistance(inputPoint, comparePoint) < distance) {
                merged = true;
            }
            if (!merged) {
                list2.push_back(inputPoint);
            }
        }
    }
}

我已经知道这不起作用,因为我很确定这只会过滤掉许多点中的一个,但我不知道用这种方法还能如何做到这一点。

所以这就引出了我的问题,是否有一种算法只取异常值的平均值?例如,如果我的手指粗,传感器检测到 (.7,.7)、(.72,.71) 和 (.75,.73) 处的点,以及 (.3,.3)、(. 29,.29) 和 (.28,.28) 我可以取它们的平均值并将它们作为单独的点 (.723,.713) 和 (.29,.29) 输出吗?

标签: c++algorithmlidarlidar-data

解决方案


推荐阅读