💥1 概述
作为一种方便、快捷的交通工具,汽车已成为人们生活和工作的重要组成部分。随着汽车数量的逐年增加,有限的城市空间显得日趋拥挤,车辆平均分配到的停放空间也日趋缩小,车辆泊车入位困难问题在人们生活中逐渐显现。人们对车辆使用轻便性及安全性要求促使越来越多汽车生产商、科研机构及高校对泊车系统进行研究。目前,国外已有部分汽车生产商推出自己的自动泊车系统,但仅装配于高端车型,我国暂时还未具有自主知识产权的汽车自动泊车系统。因此,本文以低端车型为研究平台,针对自动平行泊车系统的核心技术——泊车控制策略进行探索,目的为提高泊车操作轻便性和泊车过程安全性。 本文采用泊车路径规划和泊车路径跟踪控制方法进行泊车系统控制器控制策略设计。
本文旨在通过一个简单的脚本实现自动泊车的路径规划动态演示,并对泊车路线进行曲线拟合。
📚2 运行结果
🎉3 参考文献
[1]李红. 自动泊车系统路径规划与跟踪控制研究[D].湖南大学,2014.
👨💻4 Matlab代码
主函数部分代码:
clc;clear;close all % main_line.m % 一个简单的脚本实现自动泊车的路径规划动态演示,并对泊车路线进行曲线拟合。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 参数设定 up_limit = 6;%上边界纵坐标 front_p = [5, 2]; % 车位信息C点, 参见说明文档最后碰撞检测第二部分 right_limit = 11; % 横坐标右边界 o_3 = [0.5, 1]; % 泊车点 ini = [6, 4]; % 初始点 c_l = 3; % 车长 c_w = 1.4; % 车宽 r_min = 2; % 最小转弯半径 plot_vec = 0.01; % 动画速度, 数越小, 越快, 为0直接出图 fit_model = 0; % 拟合形式, 1位高次多项式, 其他数为傅里叶级数拟合, 图中最后出现的红色曲线为拟合曲线 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% figure(1) hold on grid on %% 泊车区域限定 % 左下角坐标, 沿x长度, 沿y长度 line([0, right_limit], [up_limit, up_limit] ,'LineWidth',2, 'Color',[0 0 0]); line([0, front_p(1)], [0, 0] ,'LineWidth',2, 'Color',[0 0 0]); line([front_p(1), front_p(1)], [0, front_p(2)] ,'LineWidth',2, 'Color',[0 0 0]); line([front_p(1), right_limit], [front_p(2), front_p(2)],'LineWidth',2, 'Color',[0 0 0]); axis([0 right_limit 0 up_limit], 'equal'); %% 参数 x = ini(1); y = ini(2); % 车辆后轴中心点坐标 c_o = [x, y]; c_line(1,:) = [x, x, y - c_w/2, y + c_w/2]; c_line(2,:) = [x, x + c_l, y + c_w/2, y + c_w/2]; c_line(3,:) = [x + c_l, x + c_l, y + c_w/2, y - c_w/2]; c_line(4,:) = [x + c_l, x, y - c_w/2, y - c_w/2]; for i = 1:4 car(i) = line([c_line(i,1),c_line(i,2)], [c_line(i,3), c_line(i,4)],'LineWidth',1.5, 'Color',[0 0 0]); end %% 弧长确定 % 倒推法, 根据最小转弯半径确定弧2的圆心 cir2 = [o_3(1), o_3(2) + r_min]; % plot(cir2(1), cir2(2), 'ro'); % 根据过初始点和泊车点的圆的圆心确定最大半径 k_1 = (c_o(2) - o_3(2)) / (c_o(1) - o_3(1)); k_2 = - 1/k_1; r_max = y - (k_2 * x + ((c_o(2) + o_3(2))/2 - k_2*(c_o(1) + o_3(1))/2)); % 第一次转弯最大半径 % 弧1, 根据最大最小转弯半径确定的圆心 p_rmin = [x, y - r_min]; p_rmax = [x, y - r_max]; % 最小转弯半径对应的到圆心2-r_min的距离和到初始点的距离, 以及所对应的转角 v_min = p_rmin - cir2; l_min = norm(v_min) - r_min; % 最小转弯半径时, 与o_3连线得到的半径对比 d_min = y - p_rmin(2); alpha_min = pi/2 - atan2(abs(v_min(2)), abs(v_min(1))); % alpha_min*180/pi % 最大转弯半径对应的到圆心2-r_min的距离和到初始点的距离, 以及所对应的转角 v_max = p_rmax - cir2; l_max = norm(v_max) - r_min; d_max = y - p_rmax(2); alpha_max = pi/2 - atan2(abs(v_max(2)), abs(v_max(1))); % alpha_max*180/pi % 2分法找满足相切的两个弧的, 弧1的半径和圆心 l_middle = inf; d_middle = 0; % 由于弧1以最小转弯半径对应圆心构成的到初始点的长一般小于到圆心2的点, 同理, 另一个相反. 以此判断条件, 是否满足泊车最低要求. if (l_min > d_min) && (l_max < d_max) while abs(l_middle - d_middle) > 0.000001 % 根据中间角度对应的射线与x = x交点作为圆心, 计算l和d alpha_middle = (alpha_max + alpha_min)/2; k_middle = -tan(pi/2 - alpha_middle); y_middle = k_middle*c_o(1) + (cir2(2) - k_middle*cir2(1)); d_middle = y - y_middle; v_middle = [x, y_middle] - cir2; l_middle = norm(v_middle) - r_min; if l_middle > d_middle v_min = [x, y_middle] - cir2; l_min = norm(v_min) - r_min; % 最小转弯半径时, 与o_3连线得到的半径对比 d_min = y - y_middle; alpha_min = pi/2 - atan2(abs(v_min(2)), abs(v_min(1))); else v_max = [x, y_middle] - cir2; l_max = norm(v_max) - r_min; d_max = y - y_middle; alpha_max = pi/2 - atan2(abs(v_max(2)), abs(v_max(1))); end end