摘要
随着自动驾驶技术的发展,车辆转弯问题成为关键挑战。本文针对自动驾驶车辆在转弯过程中的数学建模、路径规划及避障策略进行了深入研究,旨在提升自动驾驶车辆的行驶安全性与效率。
针对问题1,对于四轮前轮驱动车辆的转弯问题,首先建立坐标系:选取车辆中心为原点,车头方向为y轴正方向,垂直于车头方向为x轴正方。接着选取车辆的位置(x,y)、车头朝向角θ(或前轮偏转角δ)、车速v作为状态变量。接下来建立描述车辆运动的数学模型。考虑到车辆转弯时的运动学特性,本文采用了阿克曼转向几何原理,该原理通过车辆的转弯半径、轴距及前轮转角之间的关系来描述车辆的转弯运动。基于阿克曼转向几何模型,推导出车辆的运动方程及位置更新方程,由此构建了车辆运动学转弯模型,该模型包括车辆的行驶速度、前轮转角与转弯半径、车辆中心、前内轮中心、前外轮中心、后内轮中心、后外轮中心之间的关系式。通过该模型,可以预测和计算车辆在给定前轮转角下的转弯轨迹。
针对问题2,在问题1建立的车辆运动学转弯模型的基础上,根据车辆的具体参数(长度、宽度、车轮直径等)以及转弯条件(转弯速度、前轮转角等),利用数值计算方法,推导车辆中心 前内轮中心 前外轮中心 后内轮中心 后外轮中心随时间变化的更新位置,每隔0.1秒计算一次车辆的车辆中心 前内轮中心 前外轮中心 后内轮中心 后外轮中心。最终,将计算得到的车辆位置数据保存至指定的Excel文件中,以便后续分析。
针对问题3,在解决车辆出库问题时,首先进行几何分析法,由此建立车辆出库模型:直线出库阶段,车辆从初始位置(x0,y0)开始,沿直线方向行驶到转弯点(xturn,yturn),然后是圆弧转弯阶段:车辆以转弯半径Rturn进行圆弧转弯,直到车辆中心与车道中心线对齐,由此确定车辆A运动情景。接着确定车辆的最大和最小转弯角度。这需要考虑车辆的尺寸、停车位的尺寸以及周围车辆的分布情况。通过计算,得到车辆前内轮的最大和最小转弯角度。最后,根据车辆的转弯轨迹和避障要求,确定车辆开始转弯的位置。
本文利用阿克曼转向几何模型建立车辆运动学转弯模型,并基于此模型计算出转弯轨迹和确定特定情境下的最佳转弯角度及位置。通过对自动驾驶车辆在转弯过程中的数学建模、路径规划及避障策略的研究,提升了自动驾驶车辆的行驶安全性与效率。
关键词:阿克曼几何原理、前轮偏转角、几何分析法、车辆运动学转弯模型
目录
6.2 基于时间步长的车辆运动学转弯模型的建立.................................................................. 9
6.3 基于时间步长的车辆运动学转弯模型的求解............................................................... 10
9.1.1 车辆运动学转弯模型关于速度的灵敏度分析.................................................. 15
9.1.2 车辆运动学转弯模型关于前轮偏转角的灵敏度分析.................................... 16
一、问题重述
1.1 问题背景
在科技飞速发展的今天,自动驾驶技术已成为引领未来交通方式变革的关键力量。其中,车辆转弯问题便是自动驾驶系统在实际应用中必须精细处理的关键环节之一。在自动驾驶系统中,车辆需要具备精确、实时的环境感知和理解能力,以便在各种路况和天气条件下做出高效的驾驶决策。
图1-1车辆简化示意图
以图1-1的前轮驱动的四轮车辆为例,车辆转弯时,前轮作为转向轮,其转角的变化会直接影响到车辆的行驶轨迹。在建立车辆转弯的数学模型时,需要综合考虑车辆的尺寸、车轮的参数以及转弯速度等因素,以确保模型能够准确地反映车辆转弯时的动态特性
因此,研究自动驾驶中车辆转弯问题具有重要的现实意义和理论价值。通过深入探究车辆转弯的数学模型、运动学特性以及环境交互机制,推动自动驾驶技术不断向前发展,最终实现智能交通的愿景。
1.2 问题重述
问题1:在自动驾驶技术中,针对一辆前轮驱动的四轮车辆(如图B-1所示),我们需要构建一个数学模型来准确描述车辆的转弯行为。该模型需要考虑到车辆的运动学特性,包括车辆尺寸、车轮尺寸、以及前轮转向角度对车辆转弯轨迹的影响。通过建立这一数学模型,我们可以更好地理解车辆在转弯过程中如何响应驾驶员或自动驾驶系统的输入,并预测车辆的行驶路径。
问题2:给定一辆具体的四轮车辆(如图B-2所示),其车辆长4m、宽2m,车轮直径60cm、宽度16cm,前轮到车头、后轮到车尾的距离均为0.5m。当车辆以20km/h的速度向左转弯,并且前内轮的转弯角度为30◦时,我们需要根据问题1中建立的数学模型,每隔0.1秒计算并记录车辆各个关键点(如车辆中心、前后内外轮中心等)的位置。这些位置数据需要按照指定的格式(如表B-1所示)保存到一个名为result2.xlsx的Excel文件中。
问题3:考虑一辆车辆A(与问题2中的车辆具有相同的规格)停在一个垂直停车位中,该停车位的长为5.3m、宽为2.4m(如图B-3所示)。在车辆A的左侧和右侧以及前方均有其他停放的车辆,限制了车辆A的出库路径。当车辆A需要左转出库时,且出库过程中不允许倒车,我们需要确定车辆A前内轮的最大和最小转弯角度,以及车辆开始转弯的初始位置。这一问题的解决不仅需要考虑车辆的运动学特性,还需要考虑到周围车辆的布局和道路宽度(5.5m)的限制,以确保车辆A能够成功地出库。
二、模型假设
假设一:车辆在转弯过程中保持为一个刚体,即车辆的各部分在转弯时不会发生相对变形, 车轮与地面之间为纯滚动无滑动。
假设二:车轮与地面之间的接触点在转弯过程中不发生滑移,即车轮的滚动和车辆的转向完全由车轮的转向角决定。
假设三:在问题2和问题3中,假设车辆在转弯过程中保持恒定的车速。
假设四:在建模过程中,可以将车辆简化为一个具有长度、宽度和轴距的矩形形状。
假设五:轮胎在转弯过程中具有恒定的摩擦系数、滚动半等参数。
假设六:在低速或中等速度的转弯过程中,可以忽略空气运动学效应(如风阻、升力等)对车辆的影响。
假设七:车辆在转弯过程中遇到的路面条件(如摩擦系数、坡度、曲率等)是固定的或可预测的。
假设八:车辆在平坦的路面上行驶,车辆中心的运动遵循牛顿第二定律。
假设九:车辆完全进入车道时,车辆中心与车道中心线对齐。
三、符号说明
符号 | 说明 |
θ | 车辆朝向角 |
δ | 前轮偏转角 |
v | 车速 |
R ω A L W w (x0,y0) (,) (,) | 转弯半径 车辆角速度 车辆加速度 前后轮中心距离 左右轮中心距离 左右轮中心距离的一半 停车位长度 停车位宽度 车道宽度 转弯后沿车道方向行驶的距离 车辆长度 车辆宽度 车辆初始位置(停车位内) 出库过程结束位置(车道上) 转弯点 |
四、问题分析
4.1 问题1分析
在解决四轮前轮驱动车辆的转弯问题时,首要任务是建立一个精确的数学模型来描述车辆的运动。考虑到车辆是一个复杂的系统,本文在建模过程中需要做出合理的假设以简化问题。选取车辆中心为原点,车头方向为y轴正方向,垂直于车头方向为x轴正方向,这样的坐标系设定便于描述车辆的运动状态。接着,本文选取车辆的位置(x,y)、车头朝向角θ、或前轮偏转角δ、车速v作为状态变量,这些变量能够全面地反映车辆的运动状态。在建立车辆运动模型时,采用了阿克曼转向几何原理。这一原理充分考虑了车辆转弯时的运动学特性,通过车辆的转弯半径、轴距及前轮转角之间的关系来描述车辆的转弯运动。由此构建了车辆运动学转弯模型,推导出车辆的运动方程及位置更新方程,这些方程不仅描述了车辆的运动轨迹,还反映了车辆在不同状态下的动态特性。通过这一模型,可以预测和计算车辆在给定前轮转角下的转弯轨迹,为后续的问题分析奠定了基础。
4.2 问题2分析
在问题2中,需要在问题1建立的车辆运动学转弯模型的基础上,进一步计算车辆转弯时各个关键点的位置。这要求将模型从理论层面转化为实际应用层面,利用数值计算方法求解模型中的方程。根据车辆的具体参数(长度、宽度、车轮直径等)以及转弯条件(转弯速度、前轮转角等),可以计算出车辆在不同时刻的位置。在求解过程中,采用了时间步长法,每隔0.1秒计算一次车辆的位置,以保证数据的连续性和准确性。通过这种方法,可以得到车辆中心、前内轮中心、前外轮中心、后内轮中心、后外轮中心随时间变化的更新位置。将计算得到的车辆位置数据保存至指定的Excel文件中。
4.3 问题3分析
在解决车辆出库问题时,需要综合考虑车辆的尺寸、停车位的尺寸以及周围车辆的分布情况。首先,采用几何分析法建立车辆出库模型,将出库过程分为直线出库阶段和圆弧转弯阶段。在直线出库阶段,车辆从初始位置沿直线方向行驶到转弯点;在圆弧转弯阶段,车辆以一定的转弯半径进行圆弧转弯,直到车辆中心与车道中心线对齐。为了确定车辆的最大和最小转弯角度,需要考虑车辆的尺寸、停车位的尺寸以及周围车辆的分布情况。通过计算,我们可以得到车辆前内轮的最大和最小转弯角度,这些角度限制了车辆出库时的转弯范围。最后,根据车辆的转弯轨迹和避障要求,可以确定车辆开始转弯的位置。这一位置的选择需要确保车辆能够安全、顺利地出库,并且避免与周围车辆发生碰撞。
五、问题一的模型建立与求解
5.1 车辆运动学转弯模型的建立
本文选取车辆中心为原点,车头方向为y轴正方向,垂直于车头方向为x轴正方向建立坐标系,选取车辆的位置(x,y)、车头朝向角θ(或前轮偏转角δ)、车速v作为状态变量,使用阿克曼转向几何原理来描述车辆转弯时的运动学模型,然后推导运动方程,由此构建了车辆运动学转弯模型。
5.1.1 阿克曼转向几何原理
阿克曼转向几何原理,作为描述车辆转弯行为的重要工具,其核心理念在于解决内外转向轮在转弯时路径指向圆心不同的问题。该模型主要依据车辆的前轮转角、车轴距以及车辆轮距等参数,来精确预测和控制车辆的转弯轨。
阿克曼转向几何模型的核心公式为:
其中,δ表示前轮转角,L代表车轴距(即前后轮轴之间的距离),W代表车辆轮距(即左右前轮之间的距离),而R则是车辆的转向半径。这一公式揭示了前轮转角与转向半径、车轴距和车辆轮距之间的数学关系。
图5-1阿克曼转向几何原理示意图
如图5-1所示,在车辆转弯过程中,四个轮子路径的圆心大致上会交会于后轴的延长线上的瞬时转向中心,从而确保车辆能够顺畅地完成转弯动作。
图5-2阿克曼转向中的内轮与外轮路径
如图5-2所示,阿克曼转向几何模型通过四连杆的相等曲柄设计,使内侧轮的转向角比外侧轮大约大2~4度。
综合考虑,选择采用阿克曼转向几何原理描述车辆转弯运动学模型。
5.1.2 运动方程
Step1状态变量
综合考量,本文选取车辆的位置xc,yc、车头朝向角θ、前轮偏转角δ、车速v作为状态变量。其中对于前轮偏转角δ,由于数值较小,所以近似计算为:
Step2过程描述
车辆质心的运动可以分解为沿车辆前进方向的直线运动和垂直于前进方向的圆周运动。在转弯过程中,质心的运动轨迹是一个圆弧。
直线运动:由于车辆速度v保持不变,直线运动部分较为简单。
圆周运动:质心以转弯半径R进行圆周运动,其角速度ω为:
Step3更新方程
- 位置更新方程(车辆中心)
2.朝向角更新方程
3.速度更新方程(如果速度变化)
各轮子中心位置更新方程
前内轮中心
前外轮中心
后内轮中心
外轮中心
通过阿克曼转向几何原理结合运动方程建立的车辆运动学转弯模型,可以预测和计算车辆在给定前轮转角下的转弯轨迹,反映了车辆在不同状态下的动态特性。
5.2 车辆运动学转弯模型的求解
基于以上建立的车辆运动学转弯模型,为后面的轨迹规划及避障策略提供基础。如图5-3即为车辆运动学转弯模型的示意图:
图5-3车辆运动学转弯模型示意图
本文基于step3的更新方程,假设车辆再转弯过程中速度恒定,由此对车辆转弯过程进行仿真,如图5-4与图5-5即为车辆的转弯过程与转弯过程中车辆中心、前内轮中心、前外轮中心、后内轮中心、后外轮中心位置的仿真。
图5-4车辆转向示意图
图5-5车辆转弯过程中的各轮胎轨迹
经过对图5-4和图5-5的细致分析,可以清晰地看到,本文建立的描述车辆转弯的数学模型符合自动驾驶的转弯要求。。这两幅图不仅直观地展示了车辆转弯过程中的动态特性,而且通过数学模型准确地捕捉了车辆转弯时的各种物理参数和几何关系。
六、问题二的模型建立与求解
6.1 模型准备
在建立模型之前需要对各项参数进行设定及数值确定。
1.时间步长设定
在进行车辆转弯过程的模拟时,为了精确地捕捉车辆的动态变化,本文将整个转弯过程划分为多个小的时间段,每个时间段我们称之为一个时间步长。在这里,我们设定时间步长为dt=0.1秒。这个时间步长的选择需要权衡模拟的精确度和计算成本。较小的dt值能够提供更精确的模拟结果,但会增加计算量;较大的dt值则可能导致模拟结果不够精确。根据车辆的速度和转弯半径,0.1秒的时间步长通常能够提供足够精确的模拟结果。
2.车辆速度转换
给定的车辆速度是v=20 km/h,我们需要将这个速度转换为更常用的单位米每秒(m/s)。转换公式为:
代入给定的速度值,我们得到:v=20/3.6km/h≈5.5556 m/s。这意味着在每个时间步长dt=0.1秒内,车辆将行驶约0.5556米的距离。
3.前内轮转角转换
给定的前内轮转角是δ=30度,这是一个角度值,但在许多计算中,我们可能需要使用弧度(rad)作为单位。角度和弧度之间的转换公式为:
给定的角度值,我们得到:δ=180π×30=6π rad。这个值将用于计算车辆的转弯半径和后续的位置更新。
4.轴距和车轮参数
轴距L是车辆前后轮轴之间的距离,这里给定为L=4 m。。车轮半径rwheel是车轮从中心到边缘的距离,这里给定为=0.6 m(注意这里已经修正了单位)。车轮到轴线的距离wheel_to_axle是车轮中心到其所在轮轴的距离,这里给定为wheel_to_axle=0.5 m。这个参数在计算车辆各个轮子的位置时非常重要。
5.车辆尺寸
车辆半长half_length是车辆长度的一半,这里给定为half_length=2m。车辆半宽half_width是车辆宽度的一半,这里给定为half_width=1m,车轮到轴线的距离:wheel_to_axle=0.5m这两个参数用于确定车辆在地面上的占用面积,对于防止车辆与障碍物碰撞或超出道路边界等场景非常重要。
综上所述,这些参数为我们提供了进行车辆转弯模拟所需的基本信息,接下来我们可以使用这些信息来建立车辆的转弯模型,并计算车辆在各个时间步长上的位置变化。
6.2 基于时间步长的车辆运动学转弯模型的建立
Part1运动方程。
在问题1建立的车辆运动学转弯模型基础上进行变动,运动方程如下:
1.转弯半径
转弯半径 R 由轴距 L 和前内轮偏转角 δ 得到:
其中 ω是角速度。
3.位置更新:
4.车轮位置计算
根据车辆的中心位置和朝向角,可以计算出四个车轮的位置。
前内轮:
前外轮:
后内轮:
后外轮:
Part2结果保存
将每隔 dt 秒计算出的车辆和车轮位置保存到 result.xlsx 文件中,文件格式可以包含以下列:时间、车辆中心位置 x、车辆中心位置 y、车辆朝向角 θ、前内轮位置 x、前内轮位置 y、前外轮位置 x、前外轮位置 y、后内轮位置 x、后内轮位置 y、后外轮位置 x、后外轮位置 y。
6.3 基于时间步长的车辆运动学转弯模型的求解
6.3.1 仿真模拟
本文通过时间步长dt对车辆运动学转弯模型中的时间、车辆中心位置 x、车辆中心位置 y、车辆朝向角 θ、前内轮位置 x、前内轮位置 y、前外轮位置 x、前外轮位置 y、后内轮位置 x、后内轮位置 y、后外轮位置 x、后外轮位置 y进行更新。如图6-1即为每隔dt=0.1s的各轮胎轨迹:
图6-1车辆转弯更新
6.3.2 求解结果
表1仅展示迭代10次的计算结果,由于选择车头方向为y轴正方向,y坐标的更新方向相反.
表1问题2求解结果
时间/s | 车辆中心 | 前内轮中心 | 前外轮中心 | 后内轮中心 | 后外轮中心 | |||||
x/m | y/m | x/m | y/m | x/m | y/m | x/m | y/m | x/m | y/m | |
0.1 | 0.06 | -0.55 | -0.05 | 0.14 | -0.15 | 1.44 | 0.17 | -1.85 | 0.27 | -2.54 |
0.2 | 0.18 | -1.1 | -0.04 | -0.42 | -0.25 | 0.86 | 0.39 | -2.37 | 0.6 | -3.05 |
0.3 | 0.35 | -1.62 | 0.04 | -0.97 | -0.28 | 0.28 | 0.67 | -2.87 | 0.98 | -3.52 |
0.4 | 0.58 | -2.13 | 0.17 | -1.52 | -0.25 | -0.31 | 1 | -3.34 | 1.41 | -3.95 |
0.5 | 0.87 | -2.61 | 0.36 | -2.05 | -0.15 | -0.89 | 1.38 | -3.77 | 1.88 | -4.33 |
0.6 | 1.2 | -3.05 | 0.6 | -2.55 | 0 | -1.45 | 1.8 | -4.15 | 2.4 | -4.65 |
0.7 | 1.58 | -3.46 | 0.9 | -3.03 | 0.22 | -1.99 | 2.26 | -4.49 | 2.94 | -4.92 |
0.8 | 2 | -3.82 | 1.24 | -3.47 | 0.49 | -2.51 | 2.75 | -4.78 | 3.51 | -5.13 |
0.9 | 2.45 | -4.14 | 1.63 | -3.87 | 0.81 | -3 | 3.27 | -5.01 | 4.09 | -5.28 |
1.0 | 2.94 | -4.41 | 2.06 | -4.23 | 1.18 | -3.45 | 3.82 | -5.19 | 4.69 | -5.37 |
图6-2验证结果
从表1与图6-2可以得出,本文建立的基于时间步长的车辆运动学转弯模型求解准确性较高。
七、问题三的模型建立与求解
7.1 几何分析
图7-1 停车位布局
1.最小转弯半径
车辆A在出库时,其前内轮的最小转弯半径受到两侧停放车辆的限制。为了确保车辆不会刮擦到旁边的车辆,前内轮的最小转弯半径r_min应满足以下条件:
这里, 是车辆A与旁边车辆之间的最小间距的一半,Lvehicle/2 是车辆A长度的一半。因此最小转弯半径≥ 2.4 m-2.0m2 +4.0m2 =0.2 m+2.0m=2.2 m
2.最大转弯半径
车辆A的最大转弯半径受到前方道路宽度的限制。为了确保车辆能够完全驶出停车位而不碰到前方的车辆,前内轮的最大转弯半径r_max应满足以下条件:
这里,是车辆A与前方车辆之间的最大间距的一半。最大转弯半径 ≤ 5.5 m-2.0 m 2=1.75 m
3.车辆开始转弯的位置
车辆开始转弯的位置取决于所选的转弯半径。
4.转弯角度
转弯角度θ与前内轮转弯半径r之间的关系取决于车辆的转向系统。本文使用以下公式来估算转弯角度(这里假设车辆使用阿克曼转向几何):
以弧度为单位,是车辆长度,r是前内轮转弯半径。
7.2 车辆出库模型的建立
车辆出库过程经历两个阶段
1.直线出库阶段
直线行驶距离:
转弯点位置(假设车辆中心到达车道中心线时开始转弯):
此处假设车辆尾部与停车位后壁对齐开始出库
在直线阶段,y坐标不变。
2.圆弧转弯阶段
圆心角θ的推导较为复杂,因为需要考虑车辆的实际长度和宽度。但为简化起见,可以假设车辆前内轮到达转弯点开始转弯,此时θ的推导简化为:
理想情况下,即不考虑车辆长度和宽度的影响,转弯后沿车道方向行驶的距离(假设为): 取决于车辆完全进入车道所需的距离,这里简化为一个常数或根据具体情况确定。
3.最终位置:
(这里假设车道与停车位在同一水平线上)
7.3 车辆出库模型的求解
本文通过上述的几何分析及建立车辆出库模型,计算得到最大及最小转弯角度为66.37°和61.19°,及车辆开始转弯的位置为(0.20m, 0.65m).仿真结果如图7-2所示(横向展示):
图7-2车辆出库仿真
九、灵敏度分析及模型检验
9.1 灵敏度分析
9.1.1 车辆运动学转弯模型关于速度的灵敏度分析
速度作为一个关键的参数,对于模型的结果往往有着直接而显著的影响。进行灵敏度分析可以帮助我们了解速度参数的影响程度,可以做出更加科学合理的决策。对于速度这一参数进行灵敏度分析,就是为了确保本文的决策在速度参数变化时仍然保持有效和可靠。
这里本文将速度v设置为一元线性变量(即vt=v0+at),记录车辆运动学转弯模型中的车辆中心、前内轮中心、前外轮中心、后内轮中心、后外轮中心轨迹的波动情况。如图8-1所示:
图8-1速度灵敏度分析
从图8-1反映的情况可以得出:车速增加时,车辆将更快地完成转弯,轨迹的曲率将减小(转弯半径增大);车速减小时,车辆将更慢地完成转弯,轨迹的曲率将增大(转弯半径减小)。对于速度变化,车辆运动学转弯模型中的车辆中心、前内轮中心、前外轮中心、后内轮中心、后外轮中心轨迹并没有产生剧烈波动,即车辆运动学转弯模型趋于稳定。
9.1.2 车辆运动学转弯模型关于前轮偏转角的灵敏度分析
车辆的前轮偏转角在车辆运动学模型中扮演着关键的角色,本文选取不同数值的前轮偏转角δ=[10, 20, 30, 40],观察车辆中心以及各个车轮中心位置随时间的变化,以探究对车辆运动学转弯模型灵敏度影响。该仿真结果如图8-2所示:
图8-2前轮偏转角灵敏度分析仿真
分析图8-2的仿真结果可以得出:偏转角δ增加时,车辆的转弯半径将减小,车辆将更紧凑地完成转弯;偏转角δ减小时,车辆的转弯半径将增大,车辆将更平缓地完成转弯。总体来看,观察车辆中心以及各个车轮中心位置的变化是线性规律的,说明该模型受前轮偏转角的影响极小。
9.2 模型检验
本文对问题2的模型的求解结果进行多项式拟合以达到对基于时间步长的车辆运动学转弯模型进行误差分析的目的。
为查看数据准确性,本文将车辆中心位置 x、车辆中心位置 y、前内轮位置 x、前内轮位置 y、前外轮位置 x、前外轮位置 y、后内轮位置 x、后内轮位置 y、后外轮位置 x、后外轮位置 y分别对时间t进行拟合。拟合结果如图6-2所示:
图8-3各特征拟合曲线及残差图
从以上可以看出问题2的求解结果接近理论值,准确性高,在自动驾驶中的转弯问题中具备参考价值,应用性强。
十、模型评价与改进
10.1 模型优点
1.准确性:模型在特定条件下(如假设车辆为刚体、车轮与地面纯滚动无滑动等)能够较为准确地模拟车辆的转弯过程,包括车辆各部分的动态变化和轨迹。
2.可解释性:模型基于一系列明确的假设和物理原理(如牛顿第二定律),使得模拟结果具有可解释性,便于分析和理解。
3.参数化:模型允许通过调整参数(如速度、转向角等)来模拟不同条件下的转弯过程,具有一定的灵活性。
4.稳定性:经过灵敏度分析,模型在不同速度下表现稳定,没有出现剧烈波动,保证了模拟结果的可靠性。
10.2 模型缺点
1.假设限制:模型的准确性受到一系列假设的限制,这些假设在实际情况中可能不完全成立,如车辆并非完全刚体、车轮与地面可能存在滑动等。
2.简化处理:模型在建模过程中对车辆和道路条件进行了简化处理,如将车辆简化为矩形形状、忽略空气运动学效应等,这可能影响模拟结果的准确性。
3.未考虑复杂因素:模型未考虑一些复杂因素,如车辆悬挂系统、轮胎磨损、道路不平整等,这些因素在实际车辆转弯过程中可能对结果产生重要影响。
10.3 模型改进
1.放松假设限制:针对模型的假设限制,可以逐步放松某些假设,使模型更加接近实际情况。例如,可以考虑车辆的非刚体特性、车轮与地面的滑动等。
2.增加复杂性:在模型中增加更多的复杂性,以考虑更多实际因素。例如,可以引入车辆悬挂系统、轮胎磨损等模型,以更准确地模拟车辆的实际行为。
3.引入先进技术:利用现代仿真技术和计算方法,如有限元分析、多体运动学等,来提高模型的准确性和可靠性。
4.实验验证:通过实验验证模型的有效性。通过在实际道路或实验场地进行车辆转弯实验,收集实验数据并与模型模拟结果进行对比分析,以评估模型的准确性并进行改进。
5.考虑更多变量:在模型中考虑更多变量,如风速、风向、路面湿度等,以更全面地模拟车辆转弯过程中的各种影响因素。这将有助于提高模型在实际应用中的适用性和准确性。
十、参考文献
- 白明.复杂路面条件下无人车位姿估计研究[D].吉林大学,2022.DOI:10.27162/d.cnki.gjlin.2022.002321.
- 张飞铁,奉山森,黄晶.无人驾驶汽车路径跟踪控制研究[J].计算机仿真,2019,36(06):175-178+407.
- 曲卓.考虑输入受约束的车辆稳定性控制研究[D].吉林大学,2018.
- 杜亚坤.基于毫米波雷达的乘用车侧后方驾驶辅助系统策略与优化[D].河北工业大学,2020.DOI:10.27105/d.cnki.ghbgu.2020.000705.
- 林生地.自动泊车系统路径规划与跟踪控制方法研究[J].电子元器件与信息技术,2023,7(10):146-149.DOI:10.19772/j.cnki.2096-4455.2023.10.038.
- 杨钰超.汽车全景图像主动安全系统的设计与实现[D].重庆大学,2015.
- 屈晓飞.轮毂电机驱动电动车转向策略研究[D].内蒙古工业大学,2015.
- 周培义.单目视觉自动泊车控制系统研究[D].湖南大学,2014.
十一、附录
问题一(1)代码 |
Python语言 |
import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Rectangle # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 # 参数设置 L = 2.8 # 轴距,单位:米 W = 1.6 # 车辆宽度,单位:米 v = 5.0 # 车速,单位:米/秒 delta = np.deg2rad(30) # 前轮偏转角,单位:弧度(这里假设为30度) dt = 0.1 # 时间步长,单位:秒 t_max = 20 # 仿真时间,单位:秒
# 初始化变量 t = np.arange(0, t_max, dt) x = np.zeros_like(t) y = np.zeros_like(t) theta = np.zeros_like(t) theta[0] = 0 # 假设初始朝向角为0(车头朝向x轴正方向)
# 阿克曼转向几何的转弯半径 R = L / np.tan(delta)
# 轮胎位置列表(用于绘制轨迹) front_left_trajectory = [] front_right_trajectory = [] rear_left_trajectory = [] rear_right_trajectory = []
# 仿真循环 for i in range(len(t) - 1): # 位置更新 x[i + 1] = x[i] + v * dt * np.cos(theta[i]) y[i + 1] = y[i] + v * dt * np.sin(theta[i])
# 朝向角更新 omega = v / R theta[i + 1] = theta[i] + omega * dt
# 计算轮胎位置(全局坐标系) front_left_x = x[i] + np.cos(theta[i]) * (W / 2) - np.sin(theta[i]) * (L - (W / 2)) front_left_y = y[i] + np.sin(theta[i]) * (W / 2) + np.cos(theta[i]) * (L - (W / 2)) front_right_x = x[i] - np.cos(theta[i]) * (W / 2) - np.sin(theta[i]) * (L - (W / 2)) front_right_y = y[i] + np.sin(theta[i]) * (W / 2) - np.cos(theta[i]) * (L - (W / 2)) rear_left_x = x[i] + np.cos(theta[i]) * (W / 2) - np.sin(theta[i]) * (W / 2) rear_left_y = y[i] + np.sin(theta[i]) * (W / 2) + np.cos(theta[i]) * (W / 2) rear_right_x = x[i] - np.cos(theta[i]) * (W / 2) - np.sin(theta[i]) * (W / 2) rear_right_y = y[i] + np.sin(theta[i]) * (W / 2) - np.cos(theta[i]) * (W / 2)
# 保存轮胎轨迹 front_left_trajectory.append((front_left_x, front_left_y)) front_right_trajectory.append((front_right_x, front_right_y)) rear_left_trajectory.append((rear_left_x, rear_left_y)) rear_right_trajectory.append((rear_right_x, rear_right_y))
# 初始化绘图 plt.figure(figsize=(12, 12)) plt.gca().set_aspect('equal', adjustable='box')
# 绘制车辆路径(这里我们用一个点代表车辆的中心) plt.plot(x, y, label='车辆中心路径', color='black')
# 绘制车辆(矩形)在最后一个时间步的位置 vehicle = Rectangle((x[-1] - W/2, y[-1] - L/2), W, L, fill=False, edgecolor='black') plt.gca().add_patch(vehicle)
# 绘制起始朝向和最终朝向 plt.quiver(x[0], y[0], np.cos(theta[0]), np.sin(theta[0]), angles='xy', scale_units='xy', scale=0.85, color='dodgerblue', label='起始朝向') plt.quiver(x[-1], y[-1], np.cos(theta[-1]), np.sin(theta[-1]), angles='xy', scale_units='xy', scale=0.85, color='red', label='最终朝向') # 绘制轮胎轨迹 plt.plot(*zip(*front_left_trajectory), label='前内轮', color='green',linestyle='--',linewidth=1,alpha=0.75) plt.plot(*zip(*front_right_trajectory), label='前外轮', color='palegreen',linestyle='--',linewidth=1,alpha=1) plt.plot(*zip(*rear_left_trajectory), label='后内轮', color='lightskyblue',linestyle='--',linewidth=1,alpha=1) plt.plot(*zip(*rear_right_trajectory), label='后外轮', color='lightskyblue',linestyle='--',linewidth=1,alpha=1) # 添加标签和标题 plt.xlabel('X位置(m)') plt.ylabel('Y位置(m)') plt.title('车辆转弯过程中各轮胎轨迹') plt.legend() # 显示图像 plt.grid(True) plt.show() |
问题一(2)代码 |
Python语言 |
import numpy as np import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 # 假设参数 vehicle_length = 4.0 # 车辆长度 vehicle_width = 2.0 # 车辆宽度 tire_radius = 0.5 # 轮胎半径 track_width = 1.8 # 轨距(两轮胎之间的距离) steering_radius = 8.0 # 阿克曼转向圆的半径
# 创建一个图形和坐标轴 fig, ax = plt.subplots()
# 绘制阿克曼转向圆 theta = np.linspace(0, 2 * np.pi, 100) circle_x = steering_radius * np.cos(theta) circle_y = steering_radius * np.sin(theta) ax.plot(circle_x, circle_y, 'r--', label='转向')
# 计算车辆中心线上的点 vehicle_center_x = steering_radius # 假设车辆中心在转向圆上 vehicle_center_y = 0 ax.plot([vehicle_center_x, vehicle_center_x - vehicle_length / 2], [vehicle_center_y, vehicle_center_y], 'k-', label='车辆中心轨迹')
# 绘制车辆形状 # 前轮胎 front_tire_x = [vehicle_center_x - track_width / 2, vehicle_center_x - track_width / 2] front_tire_y = [vehicle_center_y - tire_radius, vehicle_center_y + tire_radius] ax.plot(front_tire_x, front_tire_y, 'b-',label='前轮胎' ,lw=2) ax.fill(front_tire_x, front_tire_y, color='b', alpha=0.3)
# 后轮胎 rear_tire_x = [vehicle_center_x - vehicle_length / 2 - track_width / 2, vehicle_center_x - vehicle_length / 2 - track_width / 2] rear_tire_y = [vehicle_center_y - tire_radius, vehicle_center_y + tire_radius] ax.plot(rear_tire_x, rear_tire_y, 'g-', label='后轮胎' ,lw=2) ax.fill(rear_tire_x, rear_tire_y, color='g', alpha=0.3)
# 绘制车辆轮廓(简化为矩形) vehicle_rect_x = [vehicle_center_x - vehicle_length / 2 - track_width / 2, vehicle_center_x - vehicle_length / 2 + track_width / 2, vehicle_center_x + track_width / 2, vehicle_center_x - vehicle_length / 2 + track_width / 2] vehicle_rect_y = [vehicle_center_y - vehicle_width / 2, vehicle_center_y - vehicle_width / 2, vehicle_center_y + vehicle_width / 2, vehicle_center_y + vehicle_width / 2] ax.plot(vehicle_rect_x, vehicle_rect_y, 'k-', lw=2) ax.fill(vehicle_rect_x, vehicle_rect_y, color='gray', alpha=0.3)
# 设置坐标轴范围 #ax.set_xlim(vehicle_center_x - steering_radius - 1, vehicle_center_x + steering_radius + 1) #ax.set_ylim(vehicle_center_y - vehicle_width / 2 - tire_radius - 1, vehicle_center_y + vehicle_width / 2 + tire_radius + 1)
# 添加图例 ax.legend()
# 设置标签 ax.set_xlabel('X-axis') ax.set_ylabel('Y-axis')
# 设置标题 ax.set_title('车辆转向示意图')
# 显示网格 ax.grid(True)
# 显示图像 plt.show() |
问题二代码 |
Python语言 |
import numpy as np import pandas as pd
# 参数设定 dt = 0.1 # 时间步长,秒 v = 5.5556 # 车辆速度,m/s delta = np.pi / 6 # 前内轮转角,弧度 L = 3 # 轴距,m r_wheel = 0.3 # 车轮半径,m wheel_to_axle = 0.5 # 车轮到轴线的距离,m half_length = 2 # 车辆半长,m half_width = 1 # 车辆半宽,m
# 初始化 t = 0 # 时间,秒 theta = 0 # 初始朝向角,弧度(车头方向为y轴正方向) x = 0 # 初始x位置,m y = 0 # 初始y位置,m R = L / np.tan(delta) # 转弯半径,m
# 初始化结果数组 results = []
# 模拟时间 while t < 100: # 假设模拟100秒 # 更新朝向角和位置 theta += v / R * dt x += v * np.sin(theta) * dt y -= v * np.cos(theta) * dt # 注意y的更新是负的
# 计算车轮位置 x_front_inner = x - (L / 2 - wheel_to_axle) * np.sin(theta) y_front_inner = y + (L / 2 - wheel_to_axle) * np.cos(theta) - r_wheel x_front_outer = x - (L / 2 + wheel_to_axle) * np.sin(theta) y_front_outer = y + (L / 2 + wheel_to_axle) * np.cos(theta)
x_rear_inner = x + (L / 2 - wheel_to_axle) * np.sin(theta) y_rear_inner = y - (L / 2 - wheel_to_axle) * np.cos(theta) - r_wheel x_rear_outer = x + (L / 2 + wheel_to_axle) * np.sin(theta) y_rear_outer = y - (L / 2 + wheel_to_axle) * np.cos(theta)
# 保存到结果数组中 result = [t, x, y, x_front_inner, y_front_inner, x_front_outer, y_front_outer, x_rear_inner, y_rear_inner, x_rear_outer, y_rear_outer] results.append(result)
# 更新时间 t += dt
# 将结果保存到DataFrame中 df = pd.DataFrame(results, columns=['时间/s', 'Center_X', 'Center_Y', 'Front_Inner_X', 'Front_Inner_Y', 'Front_Outer_X', 'Front_Outer_Y', 'Rear_Inner_X', 'Rear_Inner_Y', 'Rear_Outer_X', 'Rear_Outer_Y'])
# 将DataFrame保存到Excel文件中 df.to_excel(r'C:\Users\34866\Desktop\B94\结果2.xlsx', index=False) import numpy as np import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 # 假设results.csv文件已经通过前面的Python代码生成 #df = pd.read_csv('result2.csv')
# 绘制车辆中心轨迹 plt.plot(df['Center_X'], df['Center_Y'], label='车辆中心', color='black')
# 绘制车轮轨迹 plt.plot(df['Front_Inner_X'], df['Front_Inner_Y'], label='前内轮',color='green',linestyle='--',linewidth=1,alpha=0.75) plt.plot(df['Front_Outer_X'], df['Front_Outer_Y'], label='前外轮', color='palegreen',linestyle='--',linewidth=1,alpha=1) plt.plot(df['Rear_Inner_X'], df['Rear_Inner_Y'], label='后内轮', color='lightskyblue',linestyle='--',linewidth=1,alpha=1) plt.plot(df['Rear_Outer_X'], df['Rear_Outer_Y'], label='后外轮', color='lightskyblue',linestyle='--',linewidth=1,alpha=1)
# 添加图例 plt.legend()
# 添加坐标轴标签 plt.xlabel('X位置(m)') plt.ylabel('Y位置(m)') plt.title('车辆转弯更新') # 显示图形 plt.show() |
问题三代码 |
Python语言 |
import matplotlib.pyplot as plt import math import matplotlib.patches as patches # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 # 停车位和车辆尺寸 parking_space_width = 2.4 # m parking_space_length = 5.3 # m vehicle_length = 2.0 # m vehicle_width = 4.0 # m
# 假设的最小转弯半径(基于车辆长度和宽度) min_turning_radius = vehicle_length / 2 + 1.0 # m
# 计算车辆A开始转弯的位置 start_turn_x = parking_space_length / 2 start_turn_y = parking_space_width / 2 - min_turning_radius + vehicle_width / 2
# 计算车辆A完全驶出停车位后的位置(简化起见,假设车辆尾部刚好驶出停车位) end_turn_x = start_turn_x + vehicle_length end_turn_y = min_turning_radius - math.sqrt(min_turning_radius**2 - (vehicle_length / 2)**2)
# 绘制停车位的矩形 for i in range(3): # 假设有3个停车位 rect = patches.Rectangle((i * (parking_space_width + 0.1), 0), parking_space_width, parking_space_length, edgecolor='dimgray', facecolor='none') plt.gca().add_patch(rect)
# 绘制车辆A(简化为矩形) rect_vehicle = patches.Rectangle((start_turn_x - vehicle_length / 2+1, start_turn_y - vehicle_width / 2+1), vehicle_length, vehicle_width, edgecolor='black', facecolor='none') plt.gca().add_patch(rect_vehicle)
# 绘制最小转弯半径的圆(车辆转弯时的近似轨迹) circle_min = plt.Circle((start_turn_x + vehicle_length / 2, start_turn_y), min_turning_radius - vehicle_width / 2, color='b', fill=False) plt.gca().add_artist(circle_min)
# 绘制车辆A的转弯轨迹(使用简化的圆弧) # 由于我们没有具体的转向角数据,这里我们使用一个简化的圆弧来表示 # 注意:这只是一个近似值,真实的转弯轨迹可能因车辆转向几何而异 # 计算圆弧的起始和结束角度(以弧度为单位) theta_start = math.atan2(start_turn_y - (start_turn_y - vehicle_width / 2), start_turn_x - (start_turn_x + vehicle_length / 2)) theta_end = math.atan2(end_turn_y, end_turn_x - (start_turn_x + vehicle_length / 2))
# 绘制圆弧部分 wedge = patches.Wedge((start_turn_x + vehicle_length / 2, start_turn_y), min_turning_radius - vehicle_width / 2, theta_start, theta_end - theta_start, color='r', fill=False) plt.gca().add_artist(wedge)
# 绘制最终位置(车辆A完全驶出停车位后的位置,简化为一个点) plt.plot(end_turn_x, end_turn_y, 'bo',label='最终位置')
# 设置坐标轴范围和比例 plt.xlim(0, 3 * (parking_space_width + 0.1)) plt.ylim(0, parking_space_length)
# 添加标题和坐标轴标签(可选) plt.title('停车位和车辆A') plt.xlabel('X位置(m)') plt.ylabel('Y位置(m)') plt.legend() # 显示图形 plt.grid(True) # 添加网格线(可选) plt.show() import matplotlib.pyplot as plt import numpy as np # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 # 设定参数 L = 5.3 # 停车位长度 (m) W = 2.4 # 停车位宽度 (m) R = 5.5 # 车位前方道路宽度 (m) Wa = 2.0 # 车辆A的宽度 (m) La = 4.0 # 车辆A的长度 (m)
# 计算最小转弯半径 # 考虑到车辆A与旁边车辆之间的最小间距为(W - Wa) / 2,车辆A长度的一半为La / 2 r_min = (W - Wa) / 2 + La / 2
# 计算最大转弯半径 # 考虑到车辆A与前方道路边缘之间的最大间距为(R - Wa) / 2 # 但这个值可能太小,因此选择一个合理的最大转弯半径 # 假设车辆A能沿着道路中心线转弯,那么最大转弯半径为道路宽度的一半减去车辆宽度的一半 r_max = R / 2 - Wa / 2
# 计算最小和最大转弯角度 theta_min = np.arctan(La / r_min) theta_max = np.arctan(La / r_max)
# 转换为角度 theta_min_deg = np.degrees(theta_min) theta_max_deg = np.degrees(theta_max)
# 车辆开始转弯的位置(假设在停车位正中) start_turn_position = (L / 2 - La / 2, W / 2 - Wa / 2)
# 可视化 fig, ax = plt.subplots()
# 绘制停车位 rect_parking = plt.Rectangle((0, 0), L, W, fill=False, edgecolor='black', label='停车位') ax.add_patch(rect_parking)
# 绘制车辆(假设车辆平行于停车位停放) rect_vehicle = plt.Rectangle(start_turn_position, La, Wa, fill=True, color='black', label='车辆A') ax.add_patch(rect_vehicle)
# 绘制最小转弯半径的圆(示意) circle_min = plt.Circle(start_turn_position, r_min, fill=False, color='green', label=f'最小回转半径值 ({r_min:.2f} m)') ax.add_patch(circle_min)
# 绘制最大转弯半径的圆(示意,注意这里只是示意,实际上最大转弯半径对应的路径是弧线) circle_max = plt.Circle(start_turn_position, r_max, fill=False, color='red', linestyle='--', label=f'最大回转半径值 ({r_max:.2f} m)') ax.add_patch(circle_max)
# 设置坐标轴限制 ax.set_xlim(0, L ) ax.set_ylim(0, W ) ax.set_aspect('equal', 'box')
# 添加图例 ax.legend()
# 添加文本显示最小和最大转弯角度 ax.text(L / 4, W - 0.5, f'Min Turning Angle: {theta_min_deg:.2f}°', ha='center') ax.text(3 * L / 4, W - 0.5, f'Max Turning Angle: {theta_max_deg:.2f}°', ha='center')
# 显示车辆开始转弯的位置 ax.text(start_turn_position[0] + La / 4, start_turn_position[1] + Wa / 2, 'Start Turning', ha='center', va='center')
# 输出结果 print(f"最小转弯角度: {theta_min_deg:.2f}°") print(f"最大转弯角度: {theta_max_deg:.2f}°") print(f"车辆开始转弯的位置: ({start_turn_position[0]:.2f}, {start_turn_position[1]:.2f})")
# 显示 |
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 2024年华东杯B题数学建模论文:基于车辆运动学转弯模型的自动驾驶规划问题
发表评论 取消回复