问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

回旋曲线的计算方法与MATLAB实现

创作时间:
作者:
@小白创作中心

回旋曲线的计算方法与MATLAB实现

引用
51CTO
1.
https://blog.51cto.com/u_16213663/13331904

回旋线(也称回旋曲线或放射螺旋线)是一种在工程设计中常用的缓和曲线,特别是在道路设计和车辆路径规划中。本文将详细介绍回旋线的计算方法,并提供具体的MATLAB代码实现,帮助读者理解和应用这一重要概念。

回旋曲线的计算

下午打算计算验证一下回旋曲线公式,想偷个懒从网上down个代码对比验证,但未检索到现成代码。关于回旋曲线离散点(x,y)的计算分析众多,但介绍并不详细,甚至公式和计算方法也都不同。为不枉费半天的查询、验证工作,也为方便同仁参考,本文介绍基础的回旋线计算过程及代码,本次计算未涉及坐标变换。

1、什么是回旋线

本部分可忽略不看,直接看第二部分‘’回旋线的计算‘’。

缓和曲线指的是平面线型中,在直线与圆曲线、圆曲线与圆曲线之间设置的曲率连续变化的曲线。缓和曲线的线型多种多样,如回旋线、三次抛物线、七次四项式型、半波正弦型、一波正弦型、双纽线、多心复曲线……

铁路上常用的缓和曲线是三次抛物线型。公路、匝道常用的缓和曲线是回旋线,也叫放射螺旋线。回旋线不仅线形美观,而且与驾驶员匀速转动方向盘由圆曲线驶入直线或者由直线驶入圆曲线的轨迹线相符合。

回旋线的本质特征是:

即曲率 k随弧长l 线性变化;

表示曲率随弧长的增大而增大或减小;

是回旋线参数。它是圆曲线半径 R 与缓和曲线全长 Ls的几何平均值,单位为米。对于一条缓和曲线而言,它是一个常数。A 越大,说明曲率变化越慢,曲线拐弯越缓;A越小,说明曲率变换越快,曲线拐弯越急。

有关回旋线的具体介绍可见百度百科——缓和曲线 与 基于回旋曲线的平行泊车路径规划的第二部分“2、平行泊车的路径规划”。

2、回旋线的计算

回旋线的计算主要依照以下公式进行,主要在于清晰公式中的变量定义。

2.1、计算公式:

回旋曲线上任意点坐标计算公式:

式中,a就是曲率变化率,它可能是正数,也可能是负数。a的定义为:

a与A的关系满足公式

为了说明a的符号,以及它与A的关系,请见下图

在数学坐标系下K0+000处的曲率为1/100(左转为正),K0+150处的曲率为-1/50(右转为负)。可知:

曲率变化率

参数

(注意a为曲率关于回旋线长度的变化率,及第一节中的dk/dl)。实际上,回旋线的线长l为设计值,在创建一条回旋线的时候手动设定。

2.2、计算过程

根据公式,假定我们现在需要一条回旋线,(1)起点位置的曲率为0,(2)终点位置的曲率为 1/Rmin,Rmin为终点位置的曲率半径,(3)回旋线的长度为2m。

则, a = (0 - (1/Rmin)) / 2;

此时将a,l带入公式得到是回旋线最后一个点的x,y值。如何得到整条回旋线的x,y值呢?根据计算任意点的公式,我们将回旋线长度l离散化。0~L之间均匀取若干个值,a不变,带入计算公式即可得近似整条回旋线的x,y值。

在MATLAB中实现的具体计算过程:

main.m

%% 调用 clothoid函数,并将终点位置的曲率半径设置为 0.1:0.2:3
for i = 0.1:0.2:3
    clothoid(i)
end  

clothoid.m

%%%% 计算回旋曲线,并绘图
function [] = clothoid(Rmin)
N = 100; %% 
sk = 2; %% 曲线长
c = 1 / Rmin / sk; %% 曲率变化率,即上文中的曲率变化率 a
x = zeros(1,N);
y = zeros(1,N);
for sk_i = sk / N : sk / N : sk
    result_x = 0; %% 初始化x坐标点的值
    result_y = 0; %% 初始化y坐标点的值
    
    for i = 0 : N %% 计算x
        result_x = result_x + ((-1) ^ i) * (c ^ (2 * i)) * (sk_i ^ (4 * i + 1)) / ((2 ^ (2 * i)) * (4 * i + 1) * fctorial(2 * i));
    end
    x(int32(sk_i / sk * N)) = result_x;
    
    for i = 0 : N %% 计算y
        result_y = result_y + ((-1) ^ i) * (c ^ (2 * i + 1)) * (sk_i ^ (4 * i + 3)) / ((2 ^ (2 * i + 1)) * (4 * i + 3) * fctorial(2 * i + 1));
    end
    y(int32(sk_i / sk * N)) = result_y;
    
end
hold on;
plot(-x,-y);
hold on;
plot(-x(end),-y(end),'*'); %%回旋曲线的最后一个点
axis equal;
end  

fctorial.m

%% 阶乘函数
function y = fctorial(x)
n = 1;
for i = 1 : x
    n = n * i;
end
y = n ;
end  

得到的结果为:

各螺旋线的线长相同(2m),曲率变化率不同。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号