目录
基于模糊控制的汽车停车系统是一种利用模糊逻辑理论对汽车泊车过程进行智能化控制的技术。该系统通过模糊化、模糊推理、解模糊等步骤,根据车辆当前位置、目标车位位置、周围环境信息等输入,动态调整车辆的转向角、油门、刹车等控制量,实现自动、精准、安全的停车。
1.汽车停车系统的模型与控制变量
汽车停车系统可以简化为二维平面运动模型,主要控制变量包括:
-
转向角(δ):决定车辆行驶方向,直接影响车辆能否准确驶入目标车位。
-
车速(v):影响车辆的运动状态,包括加速、匀速、减速、停车等。
-
刹车力度(b):用于控制车辆减速或停车,保证停车过程的安全性。
2.模糊控制器设计
模糊控制器由模糊化、模糊推理、解模糊三个环节组成。
-
模糊化:将汽车停车系统的实际控制变量(如当前距离、偏差角度、速度等)和期望值转化为模糊语言变量,如“负大”(NB)、“负中”(NM)、“负小”(NS)、“零”(ZE)、“正小”(PS)、“正中”(PM)、“正大”(PB)。
-
模糊推理:基于预设的模糊控制规则库,进行模糊推理。模糊控制规则通常根据专家经验或系统仿真实验设计,如:
-
转向角控制规则:
- IF (偏差角度 is PB) THEN (转向角 is PS)
- IF (偏差角度 is PM) THEN (转向角 is PM)
- ...
- IF (偏差角度 is NS) THEN (转向角 is NS)
-
车速控制规则:
- IF (距离是 PB) AND (偏差角度 is PB) THEN (车速 is NS)
- IF (距离是 PM) AND (偏差角度 is PM) THEN (车速 is ZE)
- ...
- IF (距离 is NS) AND (偏差角度 is NS) THEN (车速 is PS)
-
刹车力度控制规则:
- IF (距离 is PB) THEN (刹车力度 is PB)
- IF (距离 is PM) THEN (刹车力度 is PM)
- ...
- IF (距离 is NS) THEN (刹车力度 is NS)
-
-
解模糊:将模糊推理得到的模糊控制输出(转向角、车速、刹车力度的模糊语言变量)通过中心平均法、最大隶属度法等解模糊算法转化为具体的控制量值。
3.模糊控制器工作原理
基于模糊控制的汽车停车系统工作过程如下:
-
环境感知与信息获取:通过车载传感器(如超声波雷达、摄像头、激光雷达等)实时获取车辆当前位置、目标车位位置、周围障碍物信息等。
-
模糊化:将实际值与期望值转化为模糊语言变量。
-
模糊推理:根据模糊控制规则库进行推理,得出转向角、车速、刹车力度的模糊输出。
-
解模糊:将模糊输出转化为具体的控制量值(转向角、车速、刹车力度)。
-
车辆控制:将控制量值发送给车辆的转向系统、油门系统、刹车系统,执行相应的动作,调整车辆行驶状态。
-
反馈与调整:根据车辆新的位置、速度等信息,重复上述过程,不断调整控制量,直至车辆准确停入目标车位。
4.MATLAB核心程序
% --- Executes on button press in pushbuttonRun.
function pushbuttonRun_Callback(hObject, eventdata, handles)
checkbox = get(handles.checkbox1,'Value');
x = str2double(get(handles.xtext,'String'));
y = str2double(get(handles.ytext,'String'));
angle = str2double(get(handles.angletext,'String'));
[xp, yp] = computeCarPoints(x, y, radtodeg(angle));
for i=1:4
if xp(i) > 25 || xp(i)<0 || yp(i) > 22.5 || yp(i) <0
msgbox('Invalid car location.');
return;
end
end
carParking(x,y,angle, checkbox);
%main;
% hObject handle to pushbuttonRun (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in pushbuttonSet.
function pushbuttonSet_Callback(hObject, eventdata, handles)
x = str2double(get(handles.xtext,'String'));
y = str2double(get(handles.ytext,'String'));
angle = str2double(get(handles.angletext,'String'));
[xp, yp] = computeCarPoints(x, y, radtodeg(angle));
for i=1:4
if xp(i) > 25 || xp(i)<0 || yp(i) > 22.5 || yp(i) <0
msgbox('Invalid car location.');
xp
yp
return;
end
end
[xp, yp] = computeCarPoints(x, y, angle);
xp(end+1) = xp(1);
yp(end+1) = yp(1);
plot(xp,yp);
hold on;
plot(x, y, 'ro');
plot(0:25,ones(26)*22.5, 'm--');
drawParkedCars(3.5,1.7);
xT1 = 7.25; yT1 = 20.7;
[xp, yp] = computeCarPoints(xT1, yT1, 180);
xp(end+1) = xp(1);
yp(end+1) = yp(1);
plot(xp,yp, 'r+');
hold on;
plot(xT1, yT1, 'bo');
xlim([0 25]);
ylim([0 25]);
grid on;
drawnow;
hold off;
% hObject handle to pushbuttonSet (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in pushbuttonpparking.
function pushbuttonpparking_Callback(hObject, eventdata, handles)
set(handles.xtext,'String', '7.25');
set(handles.ytext,'String','20.7');
set(handles.angletext,'String', '180');
xT1 = 7.25; yT1 = 20.7;
[xp, yp] = computeCarPoints(xT1, yT1, 180);
xp(end+1) = xp(1);
yp(end+1) = yp(1);
plot(xp,yp);
hold on;
plot(xT1, yT1, 'ro');
plot(0:25,ones(26)*22.5, 'm--');
drawParkedCars(3.5,1.7);
xT2 = 14.25; yT2 = 23.5;
[xp, yp] = computeCarPoints(xT2, yT2, 180);
xp(end+1) = xp(1);
yp(end+1) = yp(1);
plot(xp,yp, 'r+');
hold on;
plot(xT2, yT2, 'bo');
xlim([0 25]);
ylim([0 25]);
grid on;
drawnow;
hold off;
% hObject handle to pushbuttonpparking (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
up4057