平滑机器人的路径

时间:2011-04-05 18:26:06

标签: java robot

我正在计算机器人在具有多边形障碍物的平面上的最短路径。一切顺利,快速,没有问题。但是,如何使路径平滑,使其变得弯曲? 下面是连接顶点与直线的路径的图片。 P.S 机器人只是一个圆圈。

Vertices

4 个答案:

答案 0 :(得分:6)

This paper可能有用。看起来这是一个非常重要的问题。摘要:

  

自动图形抽屉需要计算简单多边形的数据之间的路径,除了保留在内部之外,还需要展现出某些美学特性。其中一些需要结合有关多边形的一些信息,而不是离实际的最短路径太远。我们提出了一种计算局部凸区域的算法,该区域“包含”简单多边形的两个顶点之间的最短欧几里德路径。该区域具有“跟随”最短路径形状的边界形状。区域内的三次贝塞尔样条曲线在两个给定顶点之间提供“短而平滑”的无碰撞曲线。获得的结果看起来在美学上令人愉悦,并且所使用的方法可能是独立的兴趣。它们是基本的和可实现的。图7是我们当前实现产生的示例输出。

答案 1 :(得分:5)

在尝试在Teragen中渲染逼真的飞行序列时,我常常使用路径计算技术。我最初尝试使用Bézier Curves

Curves

但发现(至少飞行)它们并没有那么有用。原因是曲线之间的曲率是不连续的,因此不能用于计算飞越的连续正确倾斜角度。此外,很难确定曲线不会与山相交。

我离题了。我最终选择的方式是一个简单的基于质量弹簧的路径,并将其放宽为提交。

将路径细分为许多小段,越多越好。对于每个点,将其向一个方向移动一点,以减小它与其邻居之间的角度,并从障碍物开始。重复多次,直到路径稳定下来。

k = 0.01    // Adjust the values of k and j to your liking.
j = 0.01    // Small values take longer to settle. Larger values are unstable.
For each point P
    normal_vector     = vector_to_previous_point + vector_to_next_point
    obstacle_vector   = vector_to_nearest_obstacle
    obstacle_distance = magnitude(obstacle_vector)
    obstacle_vector  *= obstacle_distance^2
    P                += (normal_vector * k) - (obstacle_vector * j)

这种有限元放松技术的好处在于,您可以将各种约束编程到其中,并且路径将依赖于它们之间的某些折衷,具体取决于权重(在这种情况下为j和k)。 / p>


如果您正在使用机器人技术,为什么不来加入Robotics Proposal

答案 2 :(得分:3)

难道你不能在实际执行下面的算法路径中使路径弯曲吗?如果您保持路径原样(即连接的直线),实现1米的前瞻距离(此值将取决于您的机器人的速度以及您填充配置空间以避开障碍物的量)计算每个车轮速度的控制算法将自动平滑路径而无需预处理。

这是我的意思的快速图像...红色虚线是当你基于超前距离控制到一个点时机器人实际执行的路径。超前距离只计算路径下一个任意距离的点。

enter image description here

同样,你唯一需要担心的是你有多少障碍,以确保你避免击中它们。通常情况下,我认为障碍物的面积是机器人半径的一半,但是如果你控制到超前距离,你可能需要稍微大一点。

答案 3 :(得分:0)

在机器人的情况下,我们无法知道未来。我们必须只知道机器人的位置和障碍物来绘制每个点。制作最小长度弯曲路径的常用方法是用圆形模拟机器人并移动圆圈使其保持与障碍物接触。只需保持一个半径,转弯就是曲线。

如果您想要曲线而不是最小距离,请尝试使上述半径与距离多边形顶点的距离成比例。

贝塞尔曲线理念只能使路径曲线回想起来。它会改变机器人的位置。通常机器人改变过去被称为“作弊”。避免不得不改变你已经走过的路径的一种方法是向前看。但机器人可以看到拐角处吗?你必须更好地指定规则。