> 文章列表 > Clothoid Curve计算

Clothoid Curve计算

Clothoid Curve计算

根据Clothoid Curve的数学模型,将其分为若干段直线和曲线段来绘制。具体计算过程如下:

  1. 计算起点与终点的距离和方向

S=(x2−x1)2+(y2−y1)2S = \\sqrt{(x2-x1)^2 + (y2-y1)^2}S=(x2x1)2+(y2y1)2

α=atan2(y2−y1,x2−x1)\\alpha = atan2(y2-y1, x2-x1)α=atan2(y2y1,x2x1)

  1. 计算起点和终点对应的曲率半径

r1=1/κ1=1/(2Sθ)r1 = 1/\\kappa1 = 1/(2S \\theta)r1=1/κ1=1/(2)

r2=1/κ2=1/(2S(1−θ))r2 = 1/\\kappa2 = 1/(2S (1-\\theta))r2=1/κ2=1/(2S(1θ))

其中,θ\\thetaθ是布雷卡-菲德勒公式中的参数,θ=κ1/(κ1+κ2)\\theta = \\kappa1 / (\\kappa1 + \\kappa2)θ=κ1/(κ1+κ2)

  1. 将曲线段分成若干个点,并计算每个点的坐标和方向角

对于一段长度为LLL的曲线段,将其等分为NNN个点。对于每个点iii,计算出对应的曲率半径rir_iri和弧长si=L∗i/Ns_i = L * i/Nsi=Li/N。根据布雷卡-菲德勒公式,可以求出对应的曲线端点的坐标(xi,yi)(x_i, y_i)(xi,yi)和方向角ϕi\\phi_iϕi

xi=x0+risin⁡(ϕ0+∫0siκ(τ)dτ)x_i = x_0 + r_i\\sin(\\phi_0 + \\int_0^{s_i}\\kappa(\\tau)d\\tau)xi=x0+risin(ϕ0+0siκ(τ)dτ)

yi=y0+ricos⁡(ϕ0+∫0siκ(τ)dτ)y_i = y_0 + r_i\\cos(\\phi_0 + \\int_0^{s_i}\\kappa(\\tau)d\\tau)yi=y0+ricos(ϕ0+0siκ(τ)dτ)

ϕi=ϕ0+∫0siκ(τ)dτ\\phi_i = \\phi_0 + \\int_0^{s_i}\\kappa(\\tau)d\\tauϕi=ϕ0+0siκ(τ)dτ

其中,x0,y0,ϕ0x_0, y_0, \\phi_0x0,y0,ϕ0是起点的坐标和方向角,κ(τ)\\kappa(\\tau)κ(τ)是在该段曲线上某一点的曲率,可以使用布雷卡-菲德勒公式进行计算。

  1. 将分段计算得到的点依次连接起来,得到Clothoid Curve的完整曲线。

根据上述原理,可以使用以下matlab代码实现Clothoid Curve的绘制:


% 参数设定x1 = 1;y1 = 1;x2 = 5;y2 = 5;kappa1 = 0.4;kappa2 = 0.8;% 计算距离和方向角S = sqrt((x2-x1)^2 + (y2-y1)^2);alpha = atan2(y2-y1, x2-x1);% 计算曲率半径theta = kappa1 / (kappa1 + kappa2);r1 = 1 / (2*S*theta);r2 = 1 / (2*S*(1-theta));% 分段计算L1 = pi * r1;L2 = pi * r2;N1 = ceil(L1);N2 = ceil(L2);L1 = L1 / N1;L2 = L2 / N2;x0 = x1;y0 = y1;phi0 = alpha;X = [];Y = [];for i = 1:N1si = i*L1;kappa = kappa1 + (kappa2-kappa1) * si/L1;ri = 1/kappa;xi = x0 + ri*sin(phi0 + integrate(kappa, 0, si));yi = y0 + ri*cos(phi0 + integrate(kappa, 0, si));phi = phi0 + integrate(kappa, 0, si);X = [X, xi];Y = [Y, yi];endx0 = X(end);y0 = Y(end);phi0 = alpha;for i = 1:N2si = i*L2;kappa = kappa1 + (kappa2-kappa1) / theta * si/L2;ri = 1/kappa;xi = x0 + ri*sin(phi0 + integrate(kappa, 0, si));yi = y0 + ri*cos(phi0 + integrate(kappa, 0, si));phi = phi0 + integrate(kappa, 0, si);X = [X, xi];Y = [Y, yi];end% 绘图plot(X, Y);axis equal;% 积分函数function y = integrate(f, a, b)% 梯形公式y = (f(a) + f(b)) * (b-a) / 2;endhttps://blog.csdn.net/qq_30816923/article/details/100768654