【问题标题】:How to efficiently evaluate or approximate a road Clothoid?如何有效地评估或近似道路 Clothoid?
【发布时间】:2015-04-15 14:20:08
【问题描述】:

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

首先,我尝试使用 Matlab 编码器为菲涅耳公式的 quadgk 积分器获取自动生成的 C 代码。这在我的测试场景中基本上很有效。唯一的问题是它运行得非常慢(在 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中还有一个集成功能,兼容Coder,速度够快。

这个问题是如此根本,我觉得解决它不应该有那么大的麻烦。有什么建议吗?

【问题讨论】:

    标签: c geometry real-time approximation curves


    【解决方案1】:

    关于泰勒级数中的 4 个术语 - 你应该可以使用更多。 2pi 的总 theta 肯定是可行的,双打。

    您可能正在根据完整公式单独计算每个项,计算完整的阶乘和幂值。这就是精度损失极快的原因。

    相反,逐步计算术语,从前一个计算下一个。找到系列中下一项与上一项的 ratio 的公式,并使用它。

    为了提高精度,不要在 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 = Infinity,其中 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 的泰勒近似值作为距离函数s,沿着曲线,从0 点开始。就是这样。

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

    【讨论】:

    • 好的,我编辑了我的示例并添加了您的号码。它们是正确的。我将再看看系数的计算(目前它们是离线预先计算的)。因此,您是说即使对于大θ,近似 s=0 也足够好?注意:目前我的积分由数字 t = k * s 参数化,其中 k 取决于清晰度。角度只是让我的例子更容易。
    • 好的,这就是我的意思。在 0|0 处,单位回旋曲线具有零航向和零曲率(即 R=inf)。您是否建议我应该为泰勒评估选择不同的参考点?这将使精确度变得非常容易 - 而且它会使数学变得非常困难,因为我必须知道那时菲涅耳积分的确切解,对吧?
    • 好的,我能够在 Matlab 中获得精确的泰勒近似值。你是对的。最多可以轻松完成 50 个术语。但是对系数进行迭代近似并没有帮助。我检查了 5 次的公式有错误,或者结果更糟。无论如何,使用系数表对我来说很好。不,让我们尝试将其放入 C 中。
    【解决方案2】:

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

    我的方法如下。

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

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

    3. 您可以轻松识别曲线部分的位置为零(直线没有曲率),或线性增加或减少(欧拉螺旋 CCW/CW),或恒定值!= 0(弧具有恒定曲率在它的所有点上)。

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

    您可以找到我的代码on github。我为此类问题实现了一些算法,例如 Peuker 算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 2012-08-30
      • 2011-08-07
      • 2019-03-15
      • 1970-01-01
      相关资源
      最近更新 更多