我正面临着实时计算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中甚至存在一个与编码器兼容并且足够快的集成功能。
这个问题是如此根本,我觉得解决它不会有太多麻烦。任何建议?
答案 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)
我现在正在同一领域做论文。
我的方法如下。
在回旋线的每个点上计算以下内容(航向的变化/沿回旋线的行进距离),通过此公式,您可以通过此简单方程式计算每个点的曲率。
您将绘制每个曲率值,x轴为沿着回旋曲线的距离,y轴为曲率。通过绘制并应用非常简单的线性回归算法(以您选择的语言搜索Peuker算法实现)
您可以轻松地识别出哪些曲线段的值为零(直线无曲率),线性增加或减小(欧拉螺旋CCW / CW)或常数值== 0(弧具有恒定曲率)跨越它的所有点)。
我希望这会对您有所帮助。
您可以找到我的代码on github。我针对Peuker算法之类的问题实现了一些算法。