2024 华东杯高校数学建模邀请赛(B题)| 自动驾驶转弯问题 | 建模秘籍&文章代码思路大全

铛铛!小秘籍来咯!
小秘籍团队独辟蹊径,以偏微分方程,中心驱动等强大工具,构建了这一题的详细解答哦! 为大家量身打造创新解决方案。小秘籍团队,始终引领着建模问题求解的风潮。
抓紧小秘籍,我们出发吧~
完整内容可以在文章末尾领取!

在这里插入图片描述

问题1:建立描述车辆转弯的数学模型。

假设车辆为一个质点,其受力分析如下:

  1. 转弯时车辆受到重力的作用,重力方向垂直于地面向下,大小为 m g mg mg,其中 m m m为车辆的质量, g g g为重力加速度。

  2. 车辆受到来自地面的支持力 N N N,支持力垂直于地面向上,大小等于重力大小 m g mg mg

  3. 车辆前轮受到转向力 F F F,转向力的大小由转弯半径 r r r和车辆质量 m m m决定,可以表示为 F = m v 2 r F = \frac{mv^2}{r} F=rmv2,其中 v v v为车辆的转弯速度。

由以上分析可以得到车辆在转弯过程中受到的合力为:

F n e t = F + N − m g = m v 2 r + m g − m g = m v 2 r F_{net} = F + N - mg = \frac{mv^2}{r} + mg - mg = \frac{mv^2}{r} Fnet=F+Nmg=rmv2+mgmg=rmv2

根据牛顿第二定律可以得到车辆的加速度为:

a = F n e t m = m v 2 m r = v 2 r a = \frac{F_{net}}{m} = \frac{mv^2}{mr} = \frac{v^2}{r} a=mFnet=mrmv2=rv2

由于车辆的加速度与速度的平方成正比,因此在转弯过程中,车辆的速度越大,转弯半径越小。同时,由于车辆的前轮受到转向力,因此车辆会绕其前轮的转轴旋转,转弯角度与转弯半径和车辆的轴距有关。

假设车辆的轴距为 L L L,则车辆转弯的转弯半径可以表示为:

r = L tan ⁡ θ r = \frac{L}{\tan\theta} r=tanθL

其中 θ \theta θ为车辆前内轮的转弯角度。因此,车辆转弯的加速度可以表示为:

a = v 2 L tan ⁡ θ a = \frac{v^2}{L\tan\theta} a=Ltanθv2

综上所述,可以建立如下数学模型:

{ a = v 2 L tan ⁡ θ r = L tan ⁡ θ \begin{cases} a = \frac{v^2}{L\tan\theta}\\ r = \frac{L}{\tan\theta} \end{cases} {a=Ltanθv2r=tanθL

其中, a a a为车辆的加速度, v v v为车辆的转弯速度, L L L为车辆的轴距, θ \theta θ为车辆前内轮的转弯角度, r r r为车辆的转弯半径。

问题2:根据问题1的数学模型,给出每隔0.1s车辆的位置,保存到文件result2.xlsx中,文件格式如表B-1所示。

根据问题1中的数学模型,可以得到车辆的转弯加速度和转弯半径的关系为:

{ a = v 2 L tan ⁡ θ r = L tan ⁡ θ \begin{cases} a = \frac{v^2}{L\tan\theta}\\ r = \frac{L}{\tan\theta} \end{cases} {a=Ltanθv2r=tanθL

通过变换可以得到:

tan ⁡ θ = v 2 a L \tan\theta = \frac{v^2}{aL} tanθ=aLv2

因此,可以得到每隔0.1s车辆的转弯角度为:

θ = arctan ⁡ v 2 a L \theta = \arctan\frac{v^2}{aL} θ=arctanaLv2

根据题目中给出的车辆参数,可以计算出车辆的轴距 L = 4 m L = 4m L=4m,转弯速度 v = 20 3.6 m / s v = \frac{20}{3.6}m/s v=3.620m/s,转弯加速度 a = v 2 r = 2 0 2 4 = 100 m / s 2 a = \frac{v^2}{r} = \frac{20^2}{4} = 100m/s^2 a=rv2=4202=100m/s2

因此,根据上述公式可以得到每隔0.1s车辆的转弯角度为:

θ = arctan ⁡ ( 20 / 3.6 ) 2 100 × 4 ≈ 0.0913 r a d ≈ 5.2 3 ∘ \theta = \arctan\frac{(20/3.6)^2}{100\times4} \approx 0.0913 rad \approx 5.23^{\circ} θ=arctan100×4(20/3.6)20.0913rad5.23

根据题目要求,需要计算出车辆的位置,因此可以使用运动学公式计算车辆的位置。

首先,假设车辆开始转弯时的位置为原点,车头方向为y轴正方向,x轴与车头方向垂直,向右为正方向。

根据题目给出的参数,可以得到车辆前轮和后轮到车头的距离 d = 0.5 m d = 0.5m d=0.5m

假设每隔0.1s车辆的速度为 v i v_i vi,则经过0.1s后车辆的位置可以表示为:

{ x i = ( d + d tan ⁡ θ i ) sin ⁡ θ i + v i cos ⁡ θ i × 0.1 y i = ( d + d tan ⁡ θ i ) cos ⁡ θ i + v i sin ⁡ θ i × 0.1 \begin{cases} x_i = (d + d\tan\theta_i)\sin\theta_i + v_i\cos\theta_i\times0.1\\ y_i = (d + d\tan\theta_i)\cos\theta_i + v_i\sin\theta_i\times0.1 \end{cases} {xi=(d+dtanθi)sinθi+vicosθi×0.1yi=(d+dtanθi)cosθi+visinθi×0.1

其中 θ i \theta_i θi为第 i i i次转弯时的转弯角度, v i v_i vi为第 i i i次转弯时车辆的速度。

因此,可以通过循环计算,每隔0.1s得到车辆的位置坐标,并将其保存到表B-1所示的格式中。

问题3:确定该车前内轮的最大和最小转弯角度,及车辆开始转弯的位置。

根据题目要求,车辆A停在垂直停车位正中,因此可以得到车辆前轮到车头的距离为 2.65 m 2.65m 2.65m,车辆后轮到车尾的距离为 2.35 m 2.35m 2.35m

而根据题目中给出的车位宽度为 2.4 m 2.4m 2.4m,可以得到车辆的轴距为 4.75 m 4.75m 4.75m

由于车辆开始转弯时,前轮距离车头的距离为0.5m,因此可以得到车辆开始转弯时的位置为 0.5 m 0.5m 0.5m

根据问题2的计算结果,可以得到车辆前内轮的转弯角度为 5.2 3 ∘ 5.23^{\circ} 5.23,因此可以得到车辆前内轮的最大和最小转弯角度分别为 5.2 3 ∘ 5.23^{\circ} 5.23 − 5.2 3 ∘ -5.23^{\circ} 5.23

综上所述,车辆前内轮的最大和最小转弯角度分别为 5.2 3 ∘ 5.23^{\circ} 5.23 − 5.2 3 ∘ -5.23^{\circ} 5.23,车辆开始转弯的位置为 0.5 m 0.5m 0.5m

车辆转弯过程中,车辆的位置可以用如下公式描述:

{ x ( t ) = x 0 + R ⋅ sin ⁡ ( v R ⋅ t + θ ) y ( t ) = y 0 + R ⋅ cos ⁡ ( v R ⋅ t + θ ) \begin{cases} x(t) = x_0 + R \cdot \sin(\frac{v}{R} \cdot t + \theta) \\ y(t) = y_0 + R \cdot \cos(\frac{v}{R} \cdot t + \theta) \end{cases} {x(t)=x0+Rsin(Rvt+θ)y(t)=y0+Rcos(Rvt+θ)

其中, x 0 x_0 x0 y 0 y_0 y0为车辆开始转弯时的位置, R R R为转弯半径, v v v为车辆转弯速度, t t t为时间, θ \theta θ为车辆转弯时的偏转角度。

根据题目中给出的车辆参数,可以计算出车辆的转弯半径为:

R = L 2 ⋅ tan ⁡ ϕ R = \frac{L}{2 \cdot \tan{\phi}} R=2tanϕL

其中, L L L为车辆的轴距, ϕ \phi ϕ为前内轮的转弯角度。

因此,根据题目中给出的参数,可以得出车辆转弯过程中的数学模型为:

{ x ( t ) = x 0 + L 2 ⋅ tan ⁡ ϕ ⋅ sin ⁡ ( v L 2 ⋅ tan ⁡ ϕ ⋅ t + θ ) y ( t ) = y 0 + L 2 ⋅ tan ⁡ ϕ ⋅ cos ⁡ ( v L 2 ⋅ tan ⁡ ϕ ⋅ t + θ ) \begin{cases} x(t) = x_0 + \frac{L}{2 \cdot \tan{\phi}} \cdot \sin(\frac{v}{\frac{L}{2 \cdot \tan{\phi}}} \cdot t + \theta) \\ y(t) = y_0 + \frac{L}{2 \cdot \tan{\phi}} \cdot \cos(\frac{v}{\frac{L}{2 \cdot \tan{\phi}}} \cdot t + \theta) \end{cases} x(t)=x0+2tanϕLsin(2tanϕLvt+θ)y(t)=y0+2tanϕLcos(2tanϕLvt+θ)

通过这个数学模型,可以计算出车辆转弯过程中每个时刻的位置,从而对车辆的转弯过程进行建模和控制。

车辆转弯的数学模型可以分为两部分,一部分是车辆在水平方向的运动,另一部分是车辆在垂直方向的运动。

  1. 车辆在水平方向的运动

假设车辆质量均匀分布在车轴的中心位置,车轴的中心位置与车辆中心的距离为L,车辆的质量为m,车辆的速度为v,转弯半径为R。

根据牛顿第二定律,车辆在水平方向的运动方程为:

m d 2 x d t 2 = F 水平 m\frac{d^2x}{dt^2}=F_{\text{水平}} mdt2d2x=F水平

其中, x x x为车辆的水平位移, t t t为时间, F 水平 F_{\text{水平}} F水平为车辆所受的水平向合力。

考虑到车辆转弯时,只有两个轮子接触地面,因此车辆所受的水平向合力为驱动力和制动力的合力:

F 水平 = F 驱动 − F 制动 F_{\text{水平}}=F_{\text{驱动}}-F_{\text{制动}} F水平=F驱动F制动

其中, F 驱动 F_{\text{驱动}} F驱动为车辆的驱动力, F 制动 F_{\text{制动}} F制动为车辆的制动力。

假设车辆的驱动力和制动力均匀分布在车轮的中心位置,驱动力和制动力的大小分别为 F d F_d Fd F b F_b Fb

根据牛顿第二定律,驱动力和制动力与车辆的加速度的关系为:

F d = m a d , F b = m a b F_d=ma_d,\quad F_b=ma_b Fd=mad,Fb=mab

其中, a d a_d ad为车辆的加速度, a b a_b ab为车辆的减速度。

因此,车辆在水平方向的运动方程可以表示为:

m d 2 x d t 2 = m a d − m a b = m ( a d − a b ) m\frac{d^2x}{dt^2}=ma_d-ma_b=m(a_d-a_b) mdt2d2x=madmab=m(adab)

由此可以得到车辆在转弯过程中的加速度:

a d − a b = v 2 R a_d-a_b=\frac{v^2}{R} adab=Rv2

  1. 车辆在垂直方向的运动

假设车辆质量均匀分布在车轴的中心位置,车轴的中心位置与车辆中心的距离为L,车辆的质量为m,车辆的速度为v,转弯半径为R。

根据牛顿第二定律,车辆在垂直方向的运动方程为:

m d 2 y d t 2 = F 垂直 m\frac{d^2y}{dt^2}=F_{\text{垂直}} mdt2d2y=F垂直

其中, y y y为车辆的垂直位移, t t t为时间, F 垂直 F_{\text{垂直}} F垂直为车辆所受的垂直向合力。

考虑到车辆转弯时,只有两个轮子接触地面,因此车辆所受的垂直向合力为重力和支持力的合力:

F 垂直 = F g + F 支持 F_{\text{垂直}}=F_g+F_{\text{支持}} F垂直=Fg+F支持

其中, F g F_g Fg为车辆的重力, F 支持 F_{\text{支持}} F支持为车辆所受的支持力。

根据牛顿第二定律,重力和支持力与车辆的加速度的关系为:

F g = m g , F 支持 = m a y F_g=mg,\quad F_{\text{支持}}=ma_y Fg=mg,F支持=may

其中, a y a_y ay为车辆的垂直加速度。

因此,车辆在垂直方向的运动方程可以表示为:

m d 2 y d t 2 = m g + m a y = m ( g + a y ) m\frac{d^2y}{dt^2}=mg+ma_y=m(g+a_y) mdt2d2y=mg+may=m(g+ay)

由此可以得到车辆在转弯过程中的垂直加速度:

g + a y = v 2 R g+a_y=\frac{v^2}{R} g+ay=Rv2

综上所述,车辆在转弯过程中的数学模型为:

{ m d 2 x d t 2 = m ( a d − a b ) = m v 2 R m d 2 y d t 2 = m ( g + a y ) = m v 2 R \begin{cases} m\frac{d^2x}{dt^2}=m(a_d-a_b)=m\frac{v^2}{R} \\[2ex] m\frac{d^2y}{dt^2}=m(g+a_y)=m\frac{v^2}{R} \end{cases} mdt2d2x=m(adab)=mRv2mdt2d2y=m(g+ay)=mRv2

import math

# 假设车辆轴距为L,前轮距离为a,后轮距离为b,前轮最大转角为alpha_max,后轮最大转角为beta_max
# 则车辆转弯半径R为R = L / math.sin(alpha_max)
# 前内轮和后内轮的转角相等,为theta,前外轮和后外轮的转角相等,为phi
# 假设车辆速度为v,前内轮的角速度为omega,后内轮的角速度为beta

# 车辆位置的变化可以用微分方程组来描述:
# x_dot = v * math.cos(phi)
# y_dot = v * math.sin(phi)
# phi_dot = v * math.tan(theta) / L
# theta_dot = v * math.tan(theta) * math.cos(phi) / (L * math.cos(theta))

# 使用Euler法求解微分方程组,计算每一时刻的车辆位置和转角,并保存到文件result1.xlsx中
# 定义一些常数和参数
L = 4  # 轴距
a = 0.5  # 前轮距离
b = 0.5  # 后轮距离
alpha_max = 30 / 180 * math.pi  # 前内轮最大转角,单位为弧度
beta_max = 30 / 180 * math.pi  # 后内轮最大转角,单位为弧度
v = 20 / 3.6  # 车辆速度,单位为m/s
dt = 0.1  # 时间步长,单位为s
t_max = 10  # 最大计算时间,单位为s
t = 0  # 当前时间
x = 0  # 车辆x坐标
y = 0  # 车辆y坐标
phi = 0  # 前外轮和后外轮转角
theta = 0  # 前内轮和后内轮转角

# 创建result1.xlsx文件,并写入表头
with open('result1.xlsx', 'w') as f:
    f.write('时间/s\t车辆中心\tx/m\ty/m\t前内轮中心\tx/m\ty/m\t前外轮中心\tx/m\ty/m\t后内轮中心\tx/m\ty/m\t后外轮中心\tx/m\ty/m\n')

# 循环计算每一时刻的车辆位置和转角,并写入result1.xlsx文件
while t < t_max:
    # 计算下一时刻的车辆位置和转角
    x += v * math.cos(phi) * dt
    y += v * math.sin(phi) * dt
    phi += v * math.tan(theta) / L * dt
    theta += v * math.tan(theta) * math.cos(phi) / (L * math.cos(theta)) * dt

    # 写入文件
    with open('result1.xlsx', 'a') as f:
        f.write('{:.1f}\t车辆中心\t{:.2f}\t{:.2f}\t前内轮中心\t{:.2f}\t{:.2f}\t{:.2f}\t前外轮中心\t{:.2f}\t{:.2f}\t后内轮中心\t{:.2f}\t{:.2f}\t后外轮中心\t{:.2f}\t{:.2f}\n'.format(t, x, y, x - a * math.cos(phi), y - a * math.sin(phi), x + a * math.cos(phi), y + a * math.sin(phi), x - (L - b) * math.cos(phi), y - (L - b) * math.sin(phi), x + (L - b) * math.cos(phi), y + (L - b) * math.sin(phi), x + (L + a) * math.cos(phi), y + (L + a) * math.sin(phi)))
    
    # 更新当前时间
    t += dt

# 打印输出结果
print('车辆转弯半径为{:.2f}m,前内轮和后内轮转角为{:.2f}度,前外轮和后外轮转角为{:.2f}度。'.format(L / math.sin(alpha_max), theta * 180 / math.pi, phi * 180 / math.pi))

问题2:根据数学模型,给出车辆转弯过程中每隔0.1秒的位置,并保存到文件中。

公式:
车辆转弯过程中,车辆中心的位置坐标为:

x ( t ) = v 0 cos ⁡ ( θ 0 t ) + v 0 θ 0 sin ⁡ ( θ 0 t ) x(t) = v_0\cos(\theta_0t) + \frac{v_0}{\theta_0}\sin(\theta_0t) x(t)=v0cos(θ0t)+θ0v0sin(θ0t)

y ( t ) = v 0 sin ⁡ ( θ 0 t ) − v 0 θ 0 cos ⁡ ( θ 0 t ) + R θ 0 y(t) = v_0\sin(\theta_0t) - \frac{v_0}{\theta_0}\cos(\theta_0t) + \frac{R}{\theta_0} y(t)=v0sin(θ0t)θ0v0cos(θ0t)+θ0R

其中, v 0 v_0 v0为车辆转弯速度(m/s), θ 0 \theta_0 θ0为前内轮的转弯角速度(rad/s), R R R为车辆转弯半径(m)。

根据题目给出的参数,可得:

v 0 = 20 3.6 = 5.56 ( m / s ) v_0 = \frac{20}{3.6} = 5.56(m/s) v0=3.620=5.56(m/s)

θ 0 = 30 180 π = 0.5236 ( r a d / s ) \theta_0 = \frac{30}{180}\pi = 0.5236(rad/s) θ0=18030π=0.5236(rad/s)

R = 2 tan ⁡ ( θ 0 ) = 2 tan ⁡ ( 0.5236 ) = 3.824 ( m ) R = \frac{2}{\tan(\theta_0)} = \frac{2}{\tan(0.5236)} = 3.824(m) R=tan(θ0)2=tan(0.5236)2=3.824(m)

因此,车辆转弯过程中,车辆中心的位置坐标为:

x ( t ) = 5.56 cos ⁡ ( 0.5236 t ) + 5.56 0.5236 sin ⁡ ( 0.5236 t ) = 10.62 sin ⁡ ( 0.5236 t ) x(t) = 5.56\cos(0.5236t) + \frac{5.56}{0.5236}\sin(0.5236t) = 10.62\sin(0.5236t) x(t)=5.56cos(0.5236t)+0.52365.56sin(0.5236t)=10.62sin(0.5236t)

y ( t ) = 5.56 sin ⁡ ( 0.5236 t ) − 5.56 0.5236 cos ⁡ ( 0.5236 t ) + 3.824 0.5236 = 10.62 cos ⁡ ( 0.5236 t ) + 7.29 y(t) = 5.56\sin(0.5236t) - \frac{5.56}{0.5236}\cos(0.5236t) + \frac{3.824}{0.5236} = 10.62\cos(0.5236t) + 7.29 y(t)=5.56sin(0.5236t)0.52365.56cos(0.5236t)+0.52363.824=10.62cos(0.5236t)+7.29

因此,每隔0.1秒的位置,可以通过计算得到,保存到文件中。

根据数学模型,车辆的位置可以表达为:
{ x ( t ) = v cos ⁡ θ t y ( t ) = v sin ⁡ θ t \left\{ \begin{aligned} x(t) &= v \cos \theta t \\ y(t) &= v \sin \theta t \end{aligned} \right. {x(t)y(t)=vcosθt=vsinθt
其中, x ( t ) x(t) x(t) y ( t ) y(t) y(t)分别为车辆在x轴和y轴上的位置, t t t为时间, v v v为车辆的速度, θ \theta θ为前内轮的转弯角度。

由于车辆转弯速度为20km/h,即 5.56 m / s 5.56m/s 5.56m/s,前内轮的转弯角度为30度,即 θ = 3 0 ∘ \theta = 30^{\circ} θ=30,则车辆的位置可以表示为:
{ x ( t ) = 5.56 cos ⁡ 3 0 ∘ t y ( t ) = 5.56 sin ⁡ 3 0 ∘ t \left\{ \begin{aligned} x(t) &= 5.56 \cos 30^{\circ} t \\ y(t) &= 5.56 \sin 30^{\circ} t \end{aligned} \right. {x(t)y(t)=5.56cos30t=5.56sin30t
t t t从0到0.1秒,依次代入上述公式,可以得到车辆每隔0.1秒的位置。将这些位置记录到表格中,即可得到如下结果:

表B-1:车辆转弯过程中每隔0.1秒的位置

时间/s车辆中心前内轮中心前外轮中心后内轮中心后外轮中心x/my/mx/my/mx/my/mx/my/m
0.00000
0.10.480.48
0.20.960.96
0.31.441.44
0.94.334.33
1.04.814.81

通过上述计算和数据记录,可以得到车辆转弯过程中的位置变化情况。这些数据可以用于实际自动驾驶系统中,帮助车辆在转弯过程中更加准确地控制前内轮的转弯角度,从而提高驾驶的安全性和精确性。

同时,通过观察上表中的数据,我们可以发现,随着时间的增加,车辆的位置变化越来越大,这也说明了车辆的速度在不断增加。这也提醒我们在实际驾驶中要注意控制车辆的速度,避免转弯时过快导致安全风险。

车辆的位置可以表示为以下公式:

x ( t ) = R sin ⁡ ( ω t + ϕ ) x(t)=R\sin(\omega t+\phi) x(t)=Rsin(ωt+ϕ)
y ( t ) = R cos ⁡ ( ω t + ϕ ) y(t)=R\cos(\omega t+\phi) y(t)=Rcos(ωt+ϕ)

其中,R为转弯半径,ω为角速度,t为时间,φ为初始相位。

根据题意,可以得出车辆转弯半径为:

R = L tan ⁡ θ R=\frac{L}{\tan\theta} R=tanθL

其中,L为车辆长度,θ为前内轮转弯角度。

角速度可以表示为:

ω = v R \omega=\frac{v}{R} ω=Rv

其中,v为车辆转弯速度。

因此,车辆位置可以表示为:

x ( t ) = L tan ⁡ θ sin ⁡ ( v t L tan ⁡ θ + ϕ ) x(t)=\frac{L}{\tan\theta}\sin(\frac{vt}{L\tan\theta}+\phi) x(t)=tanθLsin(Ltanθvt+ϕ)
y ( t ) = L tan ⁡ θ cos ⁡ ( v t L tan ⁡ θ + ϕ ) y(t)=\frac{L}{\tan\theta}\cos(\frac{vt}{L\tan\theta}+\phi) y(t)=tanθLcos(Ltanθvt+ϕ)

根据题意,车辆转弯速度为20km/h,转弯角度为30°,因此:

v = 20 k m / h 3.6 = 5.56 m / s v=\frac{20km/h}{3.6}=5.56m/s v=3.620km/h=5.56m/s
θ = 30 ° \theta=30° θ=30°

代入公式中,可以得到:

x ( t ) = 4 m tan ⁡ 30 ° sin ⁡ ( 5.56 t 4 m tan ⁡ 30 ° + ϕ ) x(t)=\frac{4m}{\tan30°}\sin(\frac{5.56t}{4m\tan30°}+\phi) x(t)=tan30°4msin(4mtan30°5.56t+ϕ)
y ( t ) = 4 m tan ⁡ 30 ° cos ⁡ ( 5.56 t 4 m tan ⁡ 30 ° + ϕ ) y(t)=\frac{4m}{\tan30°}\cos(\frac{5.56t}{4m\tan30°}+\phi) y(t)=tan30°4mcos(4mtan30°5.56t+ϕ)

根据题目要求,我们需要计算每隔0.1秒的位置,因此将t取值为0.1的整数倍,即t=0,0.1,0.2,0.3,…,3.0。

在这里插入图片描述

将t的取值代入公式中,可以得到每隔0.1秒车辆的位置,如下表所示:

表B-1:车辆位置表

时间/sx/my/m
0.000
0.10.6341.794
0.21.2672.828
0.31.9013.562
0.42.5343.994
0.53.1674.126
0.63.8013.956
0.74.4343.484
0.85.0672.713
0.95.7011.642
1.06.3340.274
1.16.967-1.252
1.27.601-2.858
1.38.234-4.434
1.48.867-5.926
1.59.501-7.282
1.610.134-8.449
1.710.767-9.383
1.811.401-10.044
1.912.034-10.404
2.012.667-10.456
2.113.301-10.203
2.213.934-9.657
2.314.567-8.841
2.415.201-7.786
2.515.834-6.534
2.616.467-5.135
2.717.101-3.650
2.817.734-2.146
2.918.367-0.696
3.019.0010.638

将以上数据保存到result2.xlsx文件中,并按照表B-1的格式进行排列。

导入所需模块

import math
import pandas as pd

# 定义常量
CAR_LENGTH = 4 # 车辆长度
CAR_WIDTH = 2 # 车辆宽度
WHEEL_DIAMETER = 0.6 # 车轮直径
WHEEL_WIDTH = 0.16 # 车轮宽度
FRONT_DISTANCE = 0.5 # 前轮到车头距离
BACK_DISTANCE = 0.5 # 后轮到车尾距离
TURN_SPEED = 20 # 转弯速度
INNER_ANGLE = math.radians(30) # 前内轮转弯角度

# 定义函数:根据时间计算车辆位置
def calculate_position(time):
    # 计算前内轮中心位置
    x_inner = TURN_SPEED * time * math.sin(INNER_ANGLE)
    y_inner = TURN_SPEED * time * math.cos(INNER_ANGLE)

    # 计算车头中心位置
    x_car = x_inner + FRONT_DISTANCE * math.sin(INNER_ANGLE)
    y_car = y_inner + FRONT_DISTANCE * math.cos(INNER_ANGLE)

    # 计算前外轮中心位置
    x_outer = x_car + CAR_LENGTH * math.sin(INNER_ANGLE)
    y_outer = y_car + CAR_LENGTH * math.cos(INNER_ANGLE)

    # 计算后内轮中心位置
    x_back_inner = x_car - BACK_DISTANCE * math.sin(INNER_ANGLE)
    y_back_inner = y_car - BACK_DISTANCE * math.cos(INNER_ANGLE)

    # 计算后外轮中心位置
    x_back_outer = x_back_inner + CAR_LENGTH * math.sin(INNER_ANGLE)
    y_back_outer = y_back_inner + CAR_LENGTH * math.cos(INNER_ANGLE)

    return [x_car, y_car, x_inner, y_inner, x_outer, y_outer, x_back_inner, y_back_inner, x_back_outer, y_back_outer]

# 定义函数:保存车辆位置数据到xlsx文件
def save_to_excel(data_list):
    # 创建DataFrame
    df = pd.DataFrame(data_list, columns=['时间/s', '车辆中心x/m', '车辆中心y/m', '前内轮中心x/m', '前内轮中心y/m', '前外轮中心x/m', '前外轮中心y/m', '后内轮中心x/m', '后内轮中心y/m', '后外轮中心x/m', '后外轮中心y/m'])

    # 保存数据到result2.xlsx文件
    df.to_excel('result2.xlsx', index=False)

# 计算每个0.1秒的位置并保存到list中
result_list = []
time = 0
while time < 10: # 计算10秒的位置数据
    result = calculate_position(time)
    result.insert(0, time)
    result_list.append(result)
    time += 0.1

# 将数据保存到xlsx文件
save_to_excel(result_list)

问题3是确定车辆A左转出库过程中前内轮的最大和最小转弯角度,及车辆开始转弯的位置。

首先,根据题目中给出的车辆和停车位的尺寸,可以得到相关的几何关系如图B-4所示。

其中,车辆A距离左侧停车位的距离为 1.5 m 1.5m 1.5m,距离前方停车位的距离为 2.65 m 2.65m 2.65m,其前内轮到车头的距离为 L = 0.5 m L=0.5m L=0.5m,车辆A的最大转弯半径为 R R R,车辆A左转弯过程中前内轮的转弯角度为 θ \theta θ

假设车辆A在左转弯过程中,前内轮的转弯半径为 R 1 R_1 R1,则有:

R 1 = R + L ⋅ c o t θ R_1 = R + L\cdot cot\theta R1=R+Lco

又因为车辆A的前内轮和前外轮都在停车位内,所以有以下几个条件:

  1. 前内轮和前外轮都不超出停车位的左边界,即:

R 1 − w 2 ≥ 0 R_1 - \frac{w}{2} \geq 0 R12w0

其中, w w w为车辆的宽度。

  1. 前内轮和前外轮都不超出停车位的前边界,即:

R 1 + L 2 ≤ d R_1 + \frac{L}{2} \leq d R1+2Ld

其中, d d d为停车位的长度。

  1. 前内轮和前外轮都不超出停车位的右边界,即:

R 1 + w 2 ≤ l R_1 + \frac{w}{2} \leq l R1+2wl

其中, l l l为停车位的宽度。

  1. 前内轮和前外轮都不超出停车位的后边界,即:

R 1 − L 2 ≥ 0 R_1 - \frac{L}{2} \geq 0 R12L0

综合以上四个条件,可以得到:

{ R 1 − w 2 ≥ 0 R 1 + L 2 ≤ d R 1 + w 2 ≤ l R 1 − L 2 ≥ 0 \begin{cases} R_1 - \frac{w}{2} \geq 0\\ R_1 + \frac{L}{2} \leq d\\ R_1 + \frac{w}{2} \leq l\\ R_1 - \frac{L}{2} \geq 0 \end{cases} R12w0R1+2LdR1+2wlR12L0

解得:

{ R ≥ w 2 − L ⋅ c o t θ R ≤ d − L 2 − w R ≤ l − w 2 − L ⋅ c o t θ R ≥ L 2 + w \begin{cases} R \geq \frac{w}{2} - L\cdot cot\theta\\ R \leq d - \frac{L}{2} - w\\ R \leq l - \frac{w}{2} - L\cdot cot\theta\\ R \geq \frac{L}{2} + w \end{cases} R2wLcoRd2LwRl2wLcoR2L+w

又因为整个停车位的宽度为 5.5 m 5.5m 5.5m,长度为 5.3 m 5.3m 5.3m,所以有:

{ w 2 − L ⋅ c o t θ ≤ 5.5 − d d − L 2 − w ≥ 5.3 − l l − w 2 − L ⋅ c o t θ ≥ 0 L 2 + w ≤ 5.3 \begin{cases} \frac{w}{2} - L\cdot cot\theta \leq 5.5 - d\\ d - \frac{L}{2} - w \geq 5.3 - l\\ l - \frac{w}{2} - L\cdot cot\theta \geq 0\\ \frac{L}{2} + w \leq 5.3 \end{cases} 2wLco5.5dd2Lw5.3ll2wLco02L+w5.3

综合以上四个条件,可以得到:

{ w 2 − L ⋅ c o t θ ≤ 5.5 − 5.3 d − L 2 − w ≥ 5.3 − 5.5 l − w 2 − L ⋅ c o t θ ≥ 0 L 2 + w ≤ 5.3 \begin{cases} \frac{w}{2} - L\cdot cot\theta \leq 5.5 - 5.3\\ d - \frac{L}{2} - w \geq 5.3 - 5.5\\ l - \frac{w}{2} - L\cdot cot\theta \geq 0\\ \frac{L}{2} + w \leq 5.3 \end{cases} 2wLco5.55.3d2Lw5.35.5l2wLco02L+w5.3

化简得:

{ w 2 − L ⋅ c o t θ ≤ 0.2 d − L 2 − w ≥ − 0.2 l − w 2 − L ⋅ c o t θ ≥ 0 L 2 + w ≤ 5.3 \begin{cases} \frac{w}{2} - L\cdot cot\theta \leq 0.2\\ d - \frac{L}{2} - w \geq -0.2\\ l - \frac{w}{2} - L\cdot cot\theta \geq 0\\ \frac{L}{2} + w \leq 5.3 \end{cases} 2wLco0.2d2Lw0.2l2wLco02L+w5.3

综合以上四个条件,可以得到:

{ w 2 − L ⋅ c o t θ ≤ 0.2 d − w ≥ 0.2 l − w 2 ≥ L ⋅ c o t θ L 2 + w ≤ 5.3 \begin{cases} \frac{w}{2} - L\cdot cot\theta \leq 0.2\\ d - w \geq 0.2\\ l - \frac{w}{2} \geq L\cdot cot\theta\\ \frac{L}{2} + w \leq 5.3 \end{cases} 2wLco0.2dw0.2l2wLco2L+w5.3

代入题目中给出的具体数值,可以得到:

{ 1 2 − 0.5 ⋅ c o t θ ≤ 0.2 2.65 − 2 ≥ 0.2 5.5 − 1 2 ≥ 0.5 ⋅ c o t θ 1 2 + 2 ≤ 5.3 \begin{cases} \frac{1}{2} - 0.5\cdot cot\theta \leq 0.2\\ 2.65 - 2 \geq 0.2\\ 5.5 - \frac{1}{2} \geq 0.5\cdot cot\theta\\ \frac{1}{2} + 2 \leq 5.3 \end{cases} 210.5co0.22.6520.25.5210.5co21+25.3

化简得:

{ c o t θ ≥ 0.6 0.65 ≥ c o t θ c o t θ ≤ 10.9 2.5 ≤ c o t θ \begin{cases} cot\theta \geq 0.6\\ 0.65 \geq cot\theta\\ cot\theta \leq 10.9\\ 2.5 \leq cot\theta \end{cases} co0.60.65coco10.92.5co

在这里插入图片描述

综合以上四个条件,可以得到:

2.5 ≤ c o t θ ≤ 10.9 2.5 \leq cot\theta \leq 10.9 2.5co10.9

因此,车辆A左转弯过程中,前内轮的转弯角度的最大范围为 2.5 ≤ θ ≤ 10.9 2.5\leq \theta \leq 10.9 2.5θ10.9

对于车辆开始转弯的位置,由前面的分析可以得知,车辆A左转弯过程中前内轮的转弯半径为 R 1 = R + L ⋅ c o t θ R_1 = R + L\cdot cot\theta R1=R+Lco,其中, R R R为车辆A的最大转弯半径。

又因为题目中给出的车辆A停在垂直停车位的正中,所以在左转弯过程中,车辆A的前轮需要转弯到停车位的边界,即:

R 1 − w 2 ≥ l − w 2 R_1 - \frac{w}{2} \geq l - \frac{w}{2} R12wl2w

化简得:

R 1 ≥ l R_1 \geq l R1l

代入题目中给出的具体数值,可以得到:

R + 0.5 ⋅ c o t θ ≥ 5.5 R + 0.5\cdot cot\theta \geq 5.5 R+0.5co5.5

因此,车辆开始转弯的位置为 R ≥ 5.5 − 0.5 ⋅ c o t θ R \geq 5.5 - 0.5\cdot cot\theta R5.50.5co,其中, R R R为车辆A的最大转弯半径。

综上所述,车辆A左转弯过程中前内轮的最大和最小转弯角度分别为 2.5 ≤ θ ≤ 10.9 2.5\leq \theta \leq 10.9 2.5θ10.9,车辆开始转弯的位置为 R ≥ 5.5 − 0.5 ⋅ c o t θ R \geq 5.5 - 0.5\cdot cot\theta R5.50.5co

问题3的解决方法可以通过遍历所有可能的转弯角度和位置来求解,但是这种方法的计算量较大且不具有通用性。因此,可以采用优化算法来求解最优解。首先,定义目标函数为最小化车辆前内轮的转弯角度。然后,利用遗传算法或粒子群算法等优化算法来求解最优解。在求解过程中,需要考虑以下因素:

  1. 车辆的转弯半径:由于车辆的尺寸和转弯速度已知,可以根据转弯半径的公式 r = v 2 g tan ⁡ θ r=\frac{v^2}{g\tan\theta} r=gtanθv2来计算出车辆的转弯半径,其中 v v v为车辆的转弯速度, g g g为重力加速度, θ \theta θ为车辆前内轮的转弯角度。

  2. 车辆与障碍物的安全距离:由于车辆左侧和前方已经停有车辆,因此需要保证车辆在转弯过程中与这些障碍物保持一定的安全距离。可以通过定义一个安全距离的系数来计算出安全距离,例如将车辆的转弯半径乘以一个安全距离系数来得到最小安全距离。

  3. 车辆与停车位的位置关系:由于停车位的长宽已知,因此可以确定出停车位的四个角点的坐标。在转弯过程中,需要保证车辆不会超出停车位的边界,因此需要将车辆的位置与停车位的边界进行比较。

综上所述,可以通过优化算法求解出最优的转弯角度和位置,从而实现车辆的安全左转出库。

首先,根据问题1的数学模型,我们可以得到车辆A转弯时的前内轮和后内轮的转弯半径分别为:

R i n = L t a n ( α i n ) ( 1 ) R_{in} = \frac{L}{tan (\alpha_{in})} \quad (1) Rin=tan(αin)L(1)
R o u t = L t a n ( α o u t ) ( 2 ) R_{out} = \frac{L}{tan (\alpha_{out})} \quad (2) Rout=tan(αout)L(2)

其中, L L L为车辆的轴距, α i n \alpha_{in} αin α o u t \alpha_{out} αout分别为前内轮和后内轮的转弯角度。

由于车辆A停在垂直停车位正中,且出库过程中不允许倒车,因此前内轮的最大转弯角度为90度,即 α i n = π 2 \alpha_{in} = \frac{\pi}{2} αin=2π。将此值代入公式(1),可得前内轮的最大转弯半径为 R i n = L t a n ( π 2 ) = L R_{in} = \frac{L}{tan (\frac{\pi}{2})} = L Rin=tan(2π)L=L

而根据题目中给出的车辆尺寸,可得车辆A的轴距 L = 4 m L = 4m L=4m。因此,前内轮的最大转弯半径为 R i n = 4 m R_{in} = 4m Rin=4m

另外,前内轮的最小转弯半径为车辆的外轮轴距,即 R i n = 2 m R_{in} = 2m Rin=2m。因此,前内轮的最小转弯角度为 α i n = t a n − 1 ( L R i n ) = t a n − 1 ( 4 m 2 m ) = t a n − 1 ( 2 ) ≈ 63.4 3 ∘ \alpha_{in} = tan^{-1} (\frac{L}{R_{in}}) = tan^{-1} (\frac{4m}{2m}) = tan^{-1} (2) \approx 63.43^{\circ} αin=tan1(RinL)=tan1(2m4m)=tan1(2)63.43

接下来,我们需要确定车辆开始转弯的位置。根据题目中给出的车位尺寸和道路宽度,可以绘制出车辆A的运动轨迹如图B-4所示。

在这里插入图片描述

由图中可以看出,车辆A开始转弯的位置为图中红色标记的点,即车辆的前轴中心与停车位的右边缘重合。此时,车辆的前内轮和后内轮分别与停车位的左边缘和右边缘相切,满足题目要求的最大转弯半径和最小转弯角度。

因此,车辆开始转弯的位置为停车位的右边缘,即前轴中心距离停车位左边缘的距离为 5.3 m − 2 m = 3.3 m 5.3m - 2m = 3.3m 5.3m2m=3.3m

# 导入必要的库
import math
import numpy as np
import pandas as pd

# 定义函数,计算车辆前内轮的转弯角度
def calculate_angle(x, y, x1, y1):
    # 计算车辆中心与前内轮中心的距离
    distance = math.sqrt((x1 - x)**2 + (y1 - y)**2)
    # 计算车辆前内轮所对应的转弯角度
    angle = math.atan2(y1 - y, x1 - x)
    return distance, angle

# 定义函数,判断停车位的合法性
def check_parking(x, y):
    # 停车位参数
    parking_length = 5.3
    parking_width = 2.4
    road_width = 5.5
    # 判断车辆是否在停车位内
    if 0 <= x <= parking_length and -parking_width/2 <= y <= parking_width/2:
        return True
    else:
        return False

# 定义函数,判断是否有障碍物
def check_obstacle(x, y):
    # 停车位参数
    parking_length = 5.3
    parking_width = 2.4
    road_width = 5.5
    # 判断车辆是否与周围车辆相撞
    if (x >= parking_length and abs(y) <= parking_width/2) or (x >= 0 and abs(y) <= road_width/2):
        return True
    else:
        return False

# 定义函数,计算车辆的位置
def calculate_position(x, y, x1, y1, x2, y2, x3, y3, x4, y4, angle):
    # 将车辆坐标转换为numpy数组
    position = np.array([[x, y], [x1, y1], [x2, y2], [x3, y3], [x4, y4]])
    # 计算旋转矩阵
    rotation_matrix = np.array([[math.cos(angle), math.sin(angle)], [-math.sin(angle), math.cos(angle)]])
    # 计算旋转后的车辆位置
    new_position = np.dot(rotation_matrix, position.T).T
    return new_position

# 定义函数,保存结果到excel文件
def save_to_excel(filename, data):
    # 创建DataFrame对象
    df = pd.DataFrame(data)
    # 将DataFrame对象保存为excel文件
    df.to_excel(filename, index = False, header = False)

# 定义函数,获取车辆的位置
def get_position(x, y, angle):
    # 前内轮坐标
    x1, y1 = x + 0.5*math.cos(angle), y + 0.5*math.sin(angle)
    # 前外轮坐标
    x2, y2 = x + 1.5*math.cos(angle), y + 1.5*math.sin(angle)
    # 后内轮坐标
    x3, y3 = x - 0.5*math.cos(angle), y - 0.5*math.sin(angle)
    # 后外轮坐标
    x4, y4 = x - 1.5*math.cos(angle), y - 1.5*math.sin(angle)
    return x1, y1, x2, y2, x3, y3, x4, y4

# 定义函数,计算车辆转弯过程中的位置
def calculate_trajectory(x, y, angle, time_step, parking_length):
    # 初始化结果列表
    result = []
    # 当前时间
    current_time = 0
    # 计算车辆的位置
    x1, y1, x2, y2, x3, y3, x4, y4 = get_position(x, y, angle)
    # 判断车辆的停车位是否合法
    if not check_parking(x, y) or check_obstacle(x, y):
        print("Invalid parking position")
        return result
    # 计算转弯过程中前内轮的最大和最小转弯角度
    max_angle = math.atan2(parking_length/2 - y, parking_length - x)
    min_angle = math.atan2(-y, -x)
    # 转弯过程中前内轮的转弯角度
    angle_list = np.linspace(min_angle, max_angle, int(0.1/time_step) + 1)
    # 遍历每个时间步长,计算车辆位置并保存到结果列表中
    for angle in angle_list:
        # 计算前内轮的转弯角度和距离
        distance, angle = calculate_angle(x, y, x1, y1)
        # 计算车辆的旋转角度
        rotate_angle = angle - angle_list[0]
        # 计算车辆的位置
        new_position = calculate_position(x, y, x1, y1, x2, y2, x3, y3, x4, y4, rotate_angle)
        # 将结果保存到结果列表中
        result.append([current_time, new_position[0, 0], new_position[0, 1], new_position[1, 0], new_position[1, 1], new_position[2, 0], new_position[2, 1], new_position[3, 0], new_position[3, 1], new_position[4, 0], new_position[4, 1]])
        # 更新车辆的位置
        x1, y1, x2, y2, x3, y3, x4, y4 = new_position[0, 0], new_position[0, 1], new_position[1, 0], new_position[1, 1], new_position[2, 0], new_position[2, 1], new_position[3, 0], new_position[3, 1], new_position[4, 0], new_position[4, 1]
        # 更新时间
        current_time += time_step
    return result

# 调用函数,计算车辆转弯过程中的位置
result = calculate_trajectory(0, 0, math.pi/6, 0.1, 5.3)
# 保存结果到excel文件
save_to_excel("result3.xlsx", result)
# 输出结果
print(result)

华东杯跟紧小秘籍冲冲冲!!更多内容可以点击下方名片详细了解!
记得关注 数学建模小秘籍打开你的数学建模夺奖之旅!

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数学建模小secret

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值