如何有效地评估或近似道路Clothoid?

时间:2015-04-15 14:20:09

标签: c geometry real-time approximation curves

我正面临着实时计算C中回旋曲线值的问题。

首先,我尝试使用Matlab编码器为菲涅耳公式的quadgk-integrator获取自动生成的C代码。这在我的测试scnearios中基本上很好用。唯一的问题是它运行得非常慢(在Matlab以及自动生成的代码中)。

另一种选择是插入通过直线连接采样点的单位回旋曲线的数据表(线性插值)。在我发现曲率的微小变化(沿着回旋曲线的微小台阶)之后,我放弃了,结果显然是线条退化。多么令人惊讶......

我知道可以使用不同的公式绘制圆圈,但在真实场景中经常会遇到低曲率变化,0°和360°标题之间的30k采样点无法为我提供足够的角度分辨率问题。

然后我在R = inf点周围尝试了一个泰勒近似,希望在我希望它们到处存在明显的曲率。我很快意识到我不能使用超过4个项(15的幂)作为多项式,否则很快变得不稳定(可能是由于双精度fp计算中的数值不准确)。因此,对于大的t值,显然精度会迅速降低。并且通过“大t值”,我在谈论在回旋曲线上的每个点,代表超过90°w.r.t的曲线。零曲率点。

例如,当评估从R = 150m到R = 125m的道路同时进行90°转弯时,我会超出有效近似区域。相反,我在204.5° - 294.5°的范围内,而我的泰勒限制将在单位回旋线的90°左右。

我现在有点随意尝试。我的意思是我可以尝试花时间在关于该主题的数十篇论文上。或者我可以尝试改进或组合上述一些方法。也许在Matlab中甚至存在一个与编码器兼容并且足够快的集成功能。

这个问题是如此根本,我觉得解决它不会有太多麻烦。任何建议?

2 个答案:

答案 0 :(得分:1)

关于泰勒系列中的4个术语 - 你应该能够使用更多。总比分为2pi肯定是可行的,有双打。

你可能会根据完整的公式计算每个术语,计算全因子和幂值。这就是极快失去精度的原因。

而是逐步计算术语,即前一个术语。找到下一个术语的比率的公式,而不是系列中的前一个术语,并使用它。

为了提高精确度,请不要在theta中计算距离s(不要失去缩放精度)。

你的例子是一个非常平坦的回旋曲线。如果我没有弄错,它会从(25/22) pi =~ 204.545°变为(36/22) pi =~ 294.545° (为什么不在你的问题中包含这些细节?)。不过应该没问题。即使是2 pi = 360°,整圆(以及两倍)也不会造成任何问题。

given: r = 150 -> 125,  90 degrees turn :

  r s = A^2 = 150 s = 125 (s+x)  

  =>  1+(x/s) = 150/125 = 1 + 25/125       x/s = 1/5  

  theta = s^2/2A^2 = s^2 / (300 s) = s / 300  ;   = (pi/2) * (25/11)  = 204.545°
  theta2 = (s+x)^2/(300 s) = (6/5)^2 s / 300  ;   = (pi/2) * (36/11)  = 294.545°
  theta2 - theta = ( 36/25 - 1 ) s / 300 == pi/2

  =>  s = 300 * (pi/2) * (25/11) = 1070.99749554    x = s/5 = 214.1994991

      A^2 = 150 s = 150 * 300 * (pi/2) * (25/11) 

      a = sqrt (2 A^2) = 300 sqrt ( (pi/2) * (25/11) ) = 566.83264608

参考点位于r =无穷大,其中theta = 0.

我们x = a INT[u=0..(s/a)] cos(u^2) d(u)位于a = sqrt(2 r s)theta = (s/a)^2。写出cos的泰勒级数,然后逐项对它进行积分,得到x的{​​{1}}的泰勒近似值作为距离的函数s,沿着曲线,从0点。就是这样。

接下来你必须决定用什么密度来计算沿着回旋曲线的点数。您可以从和弦以上的所需公差值中找到它,因为您的最小半径为125.这些点因此将定义在连续点之间绘制的线段的曲线近似值。

答案 1 :(得分:0)

我现在正在同一领域做论文。

我的方法如下。

  1. 在回旋线的每个点上计算以下内容(航向的变化/沿回旋线的行进距离),通过此公式,您可以通过此简单方程式计算每个点的曲率。

  2. 您将绘制每个曲率值,x轴为沿着回旋曲线的距离,y轴为曲率。通过绘制并应用非常简单的线性回归算法(以您选择的语言搜索Peuker算法实现)

  3. 您可以轻松地识别出哪些曲线段的值为零(直线无曲率),线性增加或减小(欧拉螺旋CCW / CW)或常数值== 0(弧具有恒定曲率)跨越它的所有点)。

我希望这会对您有所帮助。

您可以找到我的代码on github。我针对Peuker算法之类的问题实现了一些算法。