2011-04-05 198 views
11

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

Vertices

+1

第一步:您需要定义机器人的转弯半径。如果它可以有效地开启一角钱,为什么你会希望它走弯曲的道路? – 2011-04-05 18:33:53

+0

你说得对。我知道有人会问我。我的机器人将有一个完整的转弯半径,但我想知道它是如何完成的,即使如此。 “如何用曲线连接点”本来就是真正的问题。我道歉。 – nullpotent 2011-04-05 18:44:29

+2

我确实认为这个数字是回答这个问题的内在因素。但是我们可以使用一些变量,比如'TR'来表示转弯半径。在这种情况下,你已经为'TR = 0'的特殊情况回答了你自己的问题。 – 2011-04-05 18:50:37

回答

6

This paper可能是有用的。看起来这是一个不平凡的问题。摘要:

自动图形抽屉需要计算一个简单的多边形的版本之间的路径,除了留在内部需要显示某些美学特性。其中一些要求包含一些关于多边形形状的信息,而不要离实际的最短路径太远。我们提出一种算法来计算局部凸区域,该区域“包含”简单多边形的两个顶点之间的最短欧几里得路径。该区域具有“跟随”最短路径形状的边界形状。区域内部的三次贝塞尔样条曲线在两个给定顶点之间提供了“短而平滑”的无碰撞曲线。获得的结果似乎美观愉快,所使用的方法可能是独立的利益。它们是元素和可执行的。图7是我们当前实现产生的示例输出。

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案件)。


如果您是机器人技术人员,为什么不来加入Robotics Proposal

+0

谢谢,你的方法一见钟情,虽然我仍然需要实现和测试它。而且,哦,是的,我会支持该提议;) – nullpotent 2012-10-17 22:56:02

3

难道你不能只在路径的实际执行中使路径跟随算法吗?如果按照原样离开路径(即连接直线),实现约1米的前视距离(该值取决于机器人的速度以及填充配置空间以避开障碍物的数量)计算每个车轮速度的控制算法将自动消除路径,而无需进行预处理。

下面是我的意思是一个快速图像...红色虚线表示机器人在根据前视距离控制点时实际执行的路径。前视距离仅计算路径下方某点的任意距离。

enter image description here

同样,你不用担心的唯一的事情是多少你填充的障碍,以确保你避免撞上他们。通常情况下,我相信障碍物的面积会被机器人半径的一半填充,但如果您控制到前视距离,则可能需要稍微增大一点。

+0

最后,我选择了与此处介绍的解决方案相同的解决方案。它需要一点调整,但它的工作。谢谢你;) – nullpotent 2013-09-26 12:45:57

0

在机器人的情况下,我们无法预知未来。我们必须知道每个点只知道机器人的位置和障碍物。用于制作最小长度曲线路径的常用方法是用机器人建模一个圆,然后移动圆以保持与障碍物接触。只需保持一个半径,并且转弯将是曲线。

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

贝赛尔曲线的想法只能用于回顾弯曲的路径。它改变了机器人的位置。通常情况下,机器人改变过去称为“作弊”。避免必须改变已经走过的道路的一种方法是展望未来。但机器人能看到四周的角落吗?你必须更好地指定规则。