基于MATLAB代码模糊控制自动泊车系统
平行泊车,模糊控制算法
附带说明文档和.fis和.m文件
以下是基于 MATLAB 的模糊控制自动泊车系统实现代码,适用于平行泊车场景。模糊控制算法通过规则推理生成车辆的转向角和速度,从而实现平滑、稳定的自动泊车。
输入变量:
输出变量:
模糊规则:
function [delta, v] = fuzzy_parking_controller(ex, ey, theta)
% 输入参数:
% ex: 横向误差
% ey: 纵向误差
% theta: 航向角偏差
% 创建模糊推理系统
fis = newfis('ParkingFIS');
% 添加输入变量:横向误差 ex
fis = addvar(fis, 'input', 'ex', [-2, 2]);
fis = addmf(fis, 'input', 1, 'NL', 'trimf', [-2, -2, -1]); % Negative Large
fis = addmf(fis, 'input', 1, 'NS', 'trimf', [-2, -1, 0]); % Negative Small
fis = addmf(fis, 'input', 1, 'ZE', 'trimf', [-1, 0, 1]); % Zero
fis = addmf(fis, 'input', 1, 'PS', 'trimf', [0, 1, 2]); % Positive Small
fis = addmf(fis, 'input', 1, 'PL', 'trimf', [1, 2, 2]); % Positive Large
% 添加输入变量:纵向误差 ey
fis = addvar(fis, 'input', 'ey', [-5, 5]);
fis = addmf(fis, 'input', 2, 'NL', 'trimf', [-5, -5, -2.5]);
fis = addmf(fis, 'input', 2, 'NS', 'trimf', [-5, -2.5, 0]);
fis = addmf(fis, 'input', 2, 'ZE', 'trimf', [-2.5, 0, 2.5]);
fis = addmf(fis, 'input', 2, 'PS', 'trimf', [0, 2.5, 5]);
fis = addmf(fis, 'input', 2, 'PL', 'trimf', [2.5, 5, 5]);
% 添加输入变量:航向角偏差 theta
fis = addvar(fis, 'input', 'theta', [-pi/4, pi/4]);
fis = addmf(fis, 'input', 3, 'NL', 'trimf', [-pi/4, -pi/4, -pi/8]);
fis = addmf(fis, 'input', 3, 'NS', 'trimf', [-pi/4, -pi/8, 0]);
fis = addmf(fis, 'input', 3, 'ZE', 'trimf', [-pi/8, 0, pi/8]);
fis = addmf(fis, 'input', 3, 'PS', 'trimf', [0, pi/8, pi/4]);
fis = addmf(fis, 'input', 3, 'PL', 'trimf', [pi/8, pi/4, pi/4]);
% 添加输出变量:前轮转角 delta
fis = addvar(fis, 'output', 'delta', [-pi/4, pi/4]);
fis = addmf(fis, 'output', 1, 'NL', 'trimf', [-pi/4, -pi/4, -pi/8]);
fis = addmf(fis, 'output', 1, 'NS', 'trimf', [-pi/4, -pi/8, 0]);
fis = addmf(fis, 'output', 1, 'ZE', 'trimf', [-pi/8, 0, pi/8]);
fis = addmf(fis, 'output', 1, 'PS', 'trimf', [0, pi/8, pi/4]);
fis = addmf(fis, 'output', 1, 'PL', 'trimf', [pi/8, pi/4, pi/4]);
% 添加输出变量:车速 v
fis = addvar(fis, 'output', 'v', [-1, 1]);
fis = addmf(fis, 'output', 2, 'NL', 'trimf', [-1, -1, -0.5]);
fis = addmf(fis, 'output', 2, 'NS', 'trimf', [-1, -0.5, 0]);
fis = addmf(fis, 'output', 2, 'ZE', 'trimf', [-0.5, 0, 0.5]);
fis = addmf(fis, 'output', 2, 'PS', 'trimf', [0, 0.5, 1]);
fis = addmf(fis, 'output', 2, 'PL', 'trimf', [0.5, 1, 1]);
% 添加模糊规则
ruleList = [
1 1 1 1 1 1; % ex=NL, ey=NL, theta=NL -> delta=NL, v=NL
2 2 2 2 2 1;
3 3 3 3 3 1;
4 4 4 4 4 1;
5 5 5 5 5 1;
];
fis = addrule(fis, ruleList);
% 模糊推理
fis.Inputs(1).Value = ex;
fis.Inputs(2).Value = ey;
fis.Inputs(3).Value = theta;
evalfis(fis);
delta = fis.Outputs(1).Value;
v = fis.Outputs(2).Value;
end
% 初始化
x_car = 0; y_car = 0; % 车辆初始位置
theta_car = 0; % 车辆初始航向角
goal_x = 5; goal_y = 2; % 目标停车位中心
L = 2.5; % 车辆轴距
dt = 0.1; % 时间步长
% 记录轨迹
trajectory = [];
% 主循环
for t = 0:dt:20
% 计算误差
ex = goal_x - x_car;
ey = goal_y - y_car;
theta_error = atan2(goal_y - y_car, goal_x - x_car) - theta_car;
% 模糊控制
[delta, v] = fuzzy_parking_controller(ex, ey, theta_error);
% 更新车辆状态
x_car = x_car + v * cos(theta_car) * dt;
y_car = y_car + v * sin(theta_car) * dt;
theta_car = theta_car + (v / L) * tan(delta) * dt;
% 记录轨迹
trajectory = [trajectory; x_car, y_car];
% 可视化
clf;
plot_trajectory(trajectory, goal_x, goal_y);
hold on;
drawnow;
end
function plot_trajectory(trajectory, goal_x, goal_y)
% 绘制轨迹
plot(trajectory(:, 1), trajectory(:, 2), 'b', 'LineWidth', 2);
hold on;
plot(goal_x, goal_y, 'r*', 'MarkerSize', 10);
axis equal;
xlim([-1, 6]);
ylim([-1, 3]);
title('Fuzzy Control Based Parallel Parking');
end
以上代码实现了基于模糊控制的平行泊车系统,适用于自动驾驶研究和仿真测试。