2024华东杯数学建模B题完整1-3小问代码+16页配套建模思路

      2024华东杯数学建模B题完整思路+配套代码获取

2024华东杯B题16页完整建模思路可视化图表+可执行代码+后续成品论文icon-default.png?t=N7T8https://mbd.pub/o/bread/ZpWWm5Zy
 

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

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

  1. 转弯时车辆受到重力的作用,重力方向垂直于地面向下,大小为mgmg,其中mm为车辆的质量,gg为重力加速度。
  2. 车辆受到来自地面的支持力NN,支持力垂直于地面向上,大小等于重力大小mgmg。
  3. 车辆前轮受到转向力FF,转向力的大小由转弯半径rr和车辆质量mm决定,可以表示为F=mv2rF = \frac{mv^2}{r},其中vv为车辆的转弯速度。

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

Fnet=F+N−mg=mv2r+mg−mg=mv2r F_{net} = F + N - mg = \frac{mv^2}{r} + mg - mg = \frac{mv^2}{r}

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

a=Fnetm=mv2mr=v2r a = \frac{F_{net}}{m} = \frac{mv^2}{mr} = \frac{v^2}{r}

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

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

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

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

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

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

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

其中,aa为车辆的加速度,vv为车辆的转弯速度,LL为车辆的轴距,θ\theta为车辆前内轮的转弯角度,rr为车辆的转弯半径。

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

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

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

通过变换可以得到:

tan⁡θ=v2aL \tan\theta = \frac{v^2}{aL}

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

θ=arctan⁡v2aL \theta = \arctan\frac{v^2}{aL}

根据题目中给出的车辆参数,可以计算出车辆的轴距L=4mL = 4m,转弯速度v=203.6m/sv = \frac{20}{3.6}m/s,转弯加速度a=v2r=2024=100m/s2a = \frac{v^2}{r} = \frac{20^2}{4} = 100m/s^2。

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

θ=arctan⁡(20/3.6)2100×4≈0.0913rad≈5.23∘ \theta = \arctan\frac{(20/3.6)^2}{100\times4} \approx 0.0913 rad \approx 5.23^{\circ}

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

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

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

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

{xi=(d+dtan⁡θi)sin⁡θi+vicos⁡θi×0.1yi=(d+dtan⁡θi)cos⁡θi+visin⁡θ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}

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

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

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

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

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

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

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

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

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

{x(t)=x0+R⋅sin⁡(vR⋅t+θ)y(t)=y0+R⋅cos⁡(vR⋅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}

其中,x0x_0和y0y_0为车辆开始转弯时的位置,RR为转弯半径,vv为车辆转弯速度,tt为时间,θ\theta为车辆转弯时的偏转角度。

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

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

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

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

{x(t)=x0+L2⋅tan⁡ϕ⋅sin⁡(vL2⋅tan⁡ϕ⋅t+θ)y(t)=y0+L2⋅tan⁡ϕ⋅cos⁡(vL2⋅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}

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

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

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

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

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

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

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

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

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

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

假设车辆的驱动力和制动力均匀分布在车轮的中心位置,驱动力和制动力的大小分别为FdF_d和FbF_b。

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

Fd=mad,Fb=mabF_d=ma_d,\quad F_b=ma_b

其中,ada_d为车辆的加速度,aba_b为车辆的减速度。

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

md2xdt2=mad−mab=m(ad−ab)m\frac{d^2x}{dt^2}=ma_d-ma_b=m(a_d-a_b)

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

ad−ab=v2Ra_d-a_b=\frac{v^2}{R}

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

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

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

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

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

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

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

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

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

支持Fg=mg,F支持=mayF_g=mg,\quad F_{\text{支持}}=ma_y

其中,aya_y为车辆的垂直加速度。

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

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

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

g+ay=v2Rg+a_y=\frac{v^2}{R}

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

{md2xdt2=m(ad−ab)=mv2Rmd2ydt2=m(g+ay)=mv2R\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}

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)=v0cos⁡(θ0t)+v0θ0sin⁡(θ0t) x(t) = v_0\cos(\theta_0t) + \frac{v_0}{\theta_0}\sin(\theta_0t)

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

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

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

v0=203.6=5.56(m/s) v_0 = \frac{20}{3.6} = 5.56(m/s)

θ0=30180π=0.5236(rad/s) \theta_0 = \frac{30}{180}\pi = 0.5236(rad/s)

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

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

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

y(t)=5.56sin⁡(0.5236t)−5.560.5236cos⁡(0.5236t)+3.8240.5236=10.62cos⁡(0.5236t)+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

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

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

由于车辆转弯速度为20km/h,即5.56m/s5.56m/s,前内轮的转弯角度为30度,即θ=30∘\theta = 30^{\circ},则车辆的位置可以表示为: {x(t)=5.56cos⁡30∘ty(t)=5.56sin⁡30∘t \left\{ \begin{aligned} x(t) &= 5.56 \cos 30^{\circ} t \\ y(t) &= 5.56 \sin 30^{\circ} t \end{aligned} \right. 将tt从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)=Rsin⁡(ωt+ϕ)x(t)=R\sin(\omega t+\phi) y(t)=Rcos⁡(ωt+ϕ)y(t)=R\cos(\omega t+\phi)

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

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

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

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

角速度可以表示为:

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

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

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

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

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

v=20km/h3.6=5.56m/sv=\frac{20km/h}{3.6}=5.56m/s θ=30°\theta=30°

代入公式中,可以得到:

x(t)=4mtan⁡30°sin⁡(5.56t4mtan⁡30°+ϕ)x(t)=\frac{4m}{\tan30°}\sin(\frac{5.56t}{4m\tan30°}+\phi) y(t)=4mtan⁡30°cos⁡(5.56t4mtan⁡30°+ϕ)y(t)=\frac{4m}{\tan30°}\cos(\frac{5.56t}{4m\tan30°}+\phi)

根据题目要求,我们需要计算每隔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.5m1.5m,距离前方停车位的距离为2.65m2.65m,其前内轮到车头的距离为L=0.5mL=0.5m,车辆A的最大转弯半径为RR,车辆A左转弯过程中前内轮的转弯角度为θ\theta。

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

R1=R+L⋅cotθR_1 = R + L\cdot cot\theta

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

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

R1−w2≥0R_1 - \frac{w}{2} \geq 0

其中,ww为车辆的宽度。

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

R1+L2≤dR_1 + \frac{L}{2} \leq d

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

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

R1+w2≤lR_1 + \frac{w}{2} \leq l

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

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

R1−L2≥0R_1 - \frac{L}{2} \geq 0

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

{R1−w2≥0R1+L2≤dR1+w2≤lR1−L2≥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}

解得:

{R≥w2−L⋅cotθR≤d−L2−wR≤l−w2−L⋅cotθR≥L2+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}

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

{w2−L⋅cotθ≤5.5−dd−L2−w≥5.3−ll−w2−L⋅cotθ≥0L2+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}

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

{w2−L⋅cotθ≤5.5−5.3d−L2−w≥5.3−5.5l−w2−L⋅cotθ≥0L2+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}

化简得:

{w2−L⋅cotθ≤0.2d−L2−w≥−0.2l−w2−L⋅cotθ≥0L2+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}

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

{w2−L⋅cotθ≤0.2d−w≥0.2l−w2≥L⋅cotθL2+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}

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

{12−0.5⋅cotθ≤0.22.65−2≥0.25.5−12≥0.5⋅cotθ12+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}

化简得:

{cotθ≥0.60.65≥cotθcotθ≤10.92.5≤cotθ\begin{cases} cot\theta \geq 0.6\\ 0.65 \geq cot\theta\\ cot\theta \leq 10.9\\ 2.5 \leq cot\theta \end{cases}

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

2.5≤cotθ≤10.92.5 \leq cot\theta \leq 10.9

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

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

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

R1−w2≥l−w2R_1 - \frac{w}{2} \geq l - \frac{w}{2}

化简得:

R1≥lR_1 \geq l

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

R+0.5⋅cotθ≥5.5R + 0.5\cdot cot\theta \geq 5.5

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

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

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

  1. 车辆的转弯半径:由于车辆的尺寸和转弯速度已知,可以根据转弯半径的公式r=v2gtan⁡θr=\frac{v^2}{g\tan\theta}来计算出车辆的转弯半径,其中vv为车辆的转弯速度,gg为重力加速度,θ\theta为车辆前内轮的转弯角度。
  2. 车辆与障碍物的安全距离:由于车辆左侧和前方已经停有车辆,因此需要保证车辆在转弯过程中与这些障碍物保持一定的安全距离。可以通过定义一个安全距离的系数来计算出安全距离,例如将车辆的转弯半径乘以一个安全距离系数来得到最小安全距离。
  3. 车辆与停车位的位置关系:由于停车位的长宽已知,因此可以确定出停车位的四个角点的坐标。在转弯过程中,需要保证车辆不会超出停车位的边界,因此需要将车辆的位置与停车位的边界进行比较。

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

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

Rin=Ltan(αin)(1)R_{in} = \frac{L}{tan (\alpha_{in})} \quad (1) Rout=Ltan(αout)(2)R_{out} = \frac{L}{tan (\alpha_{out})} \quad (2)

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

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

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

另外,前内轮的最小转弯半径为车辆的外轮轴距,即Rin=2mR_{in} = 2m。因此,前内轮的最小转弯角度为αin=tan−1(LRin)=tan−1(4m2m)=tan−1(2)≈63.43∘\alpha_{in} = tan^{-1} (\frac{L}{R_{in}}) = tan^{-1} (\frac{4m}{2m}) = tan^{-1} (2) \approx 63.43^{\circ}。

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

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

因此,车辆开始转弯的位置为停车位的右边缘,即前轴中心距离停车位左边缘的距离为5.3m−2m=3.3m5.3m - 2m = 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)
  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值