如何将多条线放入数据点

时间:2011-11-19 22:24:29

标签: algorithm matlab geometry computer-vision curve-fitting

我正在尝试将多行拟合到2D中的点列表。我的分数很低(16或32)。

这些要点来自于机器人的模拟环境,其侧面附有激光测距仪。如果点位于一条线上,则意味着它们检测到墙,如果不是,则表示它们检测到障碍物。我试图检测墙壁并计算它们的交点,为此我认为最好的想法是在数据集上拟合线条。

如果我们知道所有这些点在一条线上或周围线上,那么将一条线拟合到一组点不是问题。

我的问题是我不知道如何检测哪些点应该分类以适合同一行,哪些不应该为每一行。另外,我现在甚至都不知道一条线上的点数,而自然最好检测到最长的线段。

你会如何解决这个问题?如果我查看所有可能性,例如对于所有32个点的5个点的组,则它给出32个选择5 = 201376的可能性。我认为需要花费太多时间来尝试所有可能性并尝试在所有5元组中插入一行。

那么什么是更好的算法什么会运行得更快?我可以在极限内连接点并创建折线。但即使连接点也是一项艰巨的任务,因为边距甚至在一行内也会发生变化。

您是否认为可以使用如此少的条目对离散数据集进行某种 Hough变换

注意:如果这个问题太难解决,我正在考虑使用传感器的顺序并将其用于过滤。这样算法可以更容易,但如果墙前有一个小障碍物,它会分散线的连续性,从而将墙分成两半。

sensors

4 个答案:

答案 0 :(得分:4)

在这样的噪声点数据中查找线条的好方法是使用RANSAC。标准RANSAC用法是选择最佳假设(在这种情况下为行),但您可以轻松选择给定数据的最佳2或4行。看看这里的例子: http://www.janeriksolem.net/2009/06/ransac-using-python.html Python代码可在此处获得 http://www.scipy.org/Cookbook/RANSAC

答案 1 :(得分:2)

我要指出的第一件事是你似乎忽略了数据的一个重要方面,你知道哪些传感器(或读数)彼此相邻。如果您有N个激光传感器,您可以知道它们用螺栓固定在机器人的哪个位置,如果您正在旋转传感器,您就知道测量的顺序(和位置)。因此,将点连接在一起以形成分段线性拟合(折线)应该是微不足道的。一旦你有了这些对应关系,你可以采取每组四个点,并确定它们是否只能通过2行或其他方式有效建模。

其次,众所周知,找到一个全局最优拟合甚至两条线到任意一组点是NP-Hard,因为它可以简化为k均值聚类,所以我不希望找到一个有效的算法这个。当我使用霍夫变换时,它是基于像素强度寻找角点,理论上它可能适用于这类问题,但它只是一个近似值,它可能需要花费大量的工作才能找到并实现

我讨厌建议它,但看起来你可能会以稍微不同的方式看问题。当我使用激光测距仪进行自主导航时,我们通过将空间离散为occupancy grid来解决这个问题,这是默认方法。当然,这只是假设墙壁只是另一个对象,这不是一个特别离谱的想法IMO。除此之外,你能否假设你有一张墙的地图,你只是想找到障碍物并找到(找到机器人的姿势)?如果是这样,那么就会有大量关于这个问题的论文和技术报告。

答案 2 :(得分:1)

解决方案的一部分可能是(我将在哪里开始)调查机器人。问题如:

  1. 机器人转动/移动的速度有多快?
  2. 机器人在什么时间间隔拍摄激光?
  3. 当发现一个点时,机器人在哪里?它的方向是什么?
  4. 这些问题的答案可能比试图找到一些仅依赖于这些点的算法更有帮助。特别是当这么少时。

    这些问题的答案可为您提供更多信息/积分。例如,如果您知道机器人在检测到某个点时处于特定位置,则机器人的位置与检测到的点之间没有任何点。这非常有价值。

答案 3 :(得分:1)

对于所有三位一体,在它们之间插入一条直线,并计算线与这些点之间的偏差与偏差。

然后只使用好的(偏离小的)三元组并且如果它们有两个共同点则合并它们,并通过附加在集合中具有(至少)两个点的所有三元组来增长集合。

作为最后一步,您可以抛弃尚未与任何其他三合并但具有一些共同元素的三元组,其结果集至少包含4个元素(以避开交叉线)但保留那些未合并的三元组与任何人,但没有任何与集合相同的元素(这将在您的示例的右侧产生三个点作为其中一行)。

我认为这会在第二步中找到左边的行和底行,而右边的行则是第三步。