Parameterized function for clothoid

后端 未结 2 1599
再見小時候
再見小時候 2021-01-03 08:38

I\'m coding renderer for road network, which based on the RoadXML format.

Road curves from this format has four types:

  • segment,
  • circle arc, <
相关标签:
2条回答
  • 2021-01-03 08:53

    Let's see. Your data is:

    start curvature = 0,                straight line, R=INF
    end curvature = -0.0165407,         circular arc, R_c = 1/k_c = 60.4569335
    length = 45.185.                    distance along clothoid, s_c = 45.185
    

    according to Wikipedia article,

    R s = const = R_c s_c                   ( s ~ k = 1/R by definition of clothoid )
    d(s) = R d(theta)
    d(theta) = k d(s)
    d(theta) / d(s) = 1 / R = k = s / R_c s_c  
    
    theta = s^2 / 2 R_c s_c = (s/a)^2 = s / 2 R = k s / 2 
                                   where ___________________
                                         a = sqrt(2 R_c s_c)       (... = 73.915445 )
                                         ~~~~~~~~~~~~~~~~~~~
        and so  theta_c = k_c s_c / 2      (... = 0.37369576475 = 21.411190 degrees )
                                                         ( not so flat after all !! )
    

    (note: I call a here a reciprocal of what WP article calls a). Then,

    d(x) = d(s) cos(theta)
    d(y) = d(s) sin(theta)
    
    x = INT[s=0..s] cos(theta) d(s) 
      = INT[s=0..s] cos((s/a)^2) a d(s/a) 
      = a INT[u=0..(s/a)] cos(u^2) d(u)   = a C( s/a )
    
    y = a INT[u=0..(s/a)] sin(u^2) d(u)   = a S( s/a )
    

    where C(t) and S(t) are Fresnel integrals.

    So that's how you do the scaling. Not just t = s, but t = s/a = sqrt(theta). Here, for the end point, t_c = sqrt( k_c s_c / 2) = sqrt( 0.0165407 * 45.185 / 2) = 0.6113066.

    Now, WolframAlpha says, {73.915445 Sqrt[pi/2] FresnelC[0.6113066/Sqrt[pi/2]], 73.915445 Sqrt[pi/2] FresnelS[0.6113066/Sqrt[pi/2]]} = {44.5581, 5.57259}. (Apparently Mathematica uses a definition scaled with the additional Sqrt[pi/2] factor.)

    Testing it with your functions, x ~= t --> a*(s/a) = 45.185, y ~= t^3/3 --> a*(s/a)^3/3 = 73.915445 * 0.6113066^3 / 3 = 5.628481 (sic! /3 not /6, you have an error there).

    So you see, using just the first term from the Taylor series representation of Fresnel integrals is not enough - by far. You have to use more, and stop only when desired precision is reached (i.e. when the last calculated term is less than your pre-set precision value in magnitude).

    Note, that if you'll just implement general Fresnel integral functions for one-off scaled clothoid calculation, you'll lose additional precision when you'll multiply the results back by a (which is on the order of 102 ... 103 normally, for roads and railways).

    0 讨论(0)
  • 2021-01-03 09:00

    See the paper The Clothoid, by Ryan Seng and Molly Severdia. Generally, clothoids are defined by Fresnel integrals. It turns out that a clothoid C(t) has arclength t. So right off the bat the formula for the general curve is expressed in terms of arclength. A particular curve is just a subsection of the general spiral, going from start curvature to end curvature. You would have to do a rotation and translation for the general case.

    0 讨论(0)
提交回复
热议问题