Matlabファジーコントロール車両パーキングケース共有
最近、ファジィ制御による自動駐車を研究しているHowNetの記事を見て、その論文を再現しました。
ファジー制御方法については、前の記事を参照してください。
Matlabファジーコントロールツールボックスの使用とファジーコントロールpidの例のリファレンス(1)
Matlabファジーコントロールツールボックスの使用とファジーコントロールpidの例のリファレンス(2つ)
車両は後進時に一定の低速で移動します。このプロセス中、車両の後輪の軌道は後進速度とは関係ありません。後進速度は、後進プロセス中の一定時間内に車両が移動した距離にのみ影響します。運転ルートが影響を受けます。車両の軌道は(xr、yr、θ)で表すことができ、便宜上、ここでは(x、y、θ)を使用します。このとき、車両の軌道変更制御量は(×、y、θ)であり、直接出力量はφである。ファジー制御の入力変数としてx、y、θを選択し、出力変数としてφを選択します。入力変数xのファジーセットの数は4に設定され、言語変数はLB、LM、LS、XCEとして表されます。入力変数yのファジーセットの数は4であり、言語変数はFAR、MD、CL、YCEとして表されます。入力変数
θのファジーセットの数は5であり、言語変数はRBV、RBH、H、RUH、RUVとして表され、出力変数φのファジーセットの数は7であり、言語変数はPB、PM、PS、ZE、NS、NM、NBとして表されます。ファジー段階で最も重要なことはメンバーシップ関数を設計することであり、メンバーシップ関数の外観は設計者が必要とする特性と経験に関連しています。メンバーシップ関数の外観を説明するために三角形または台形を使用するのが一般的です。この記事では、三角メンバーシップ関数を使用します。
FISエディタで編集した自動駐車システムの入力と出力を図に示します。
図に示すように、テキストはマムダニ型ファジィ推論システムを確立します。この種の推論はそれぞれから始まります。
ルールの結果から得られたファジーセットは、クラスタリング操作によって結果のファジーセットと結合された後、非ファジー化(解決)されます。
ぼかし)システム出力を生成します。非ファジー化の方法はセントロイドです。変数xの範囲を入力します
は[0、90]、入力変数yの範囲は[0、80]、入力変数θの範囲は[-80、80]、出力変数は
φの範囲は[-45,45]です。
入力変数x、y、θのメンバーシップ関数を図に示します。
出力変数ϕのメンバーシップ関数を図に示します。
ファジールールについては、fisファイルを参照してください。fisファイルの公式アカウントは、バックグラウンドで「ファジー制御自動駐車」と応答します。
コードは次のように表示されます。
clc;
clear;
close all;
l = 25;
w = 20;
v = 5;
Ts =0.4; %采样时间间隔 - second
N=2000; % 最大循环次数
fuzzyfis=readfis('boche.fis');
% x(1) = 10; %汽车起点的x坐标
% y(1) = 30; %汽车起点的y坐标
% phi(1) =0; %汽车车身起始倾角
x(1) = 20; %汽车起点的x坐标
y(1) = 30; %汽车起点的y坐标
phi(1) =0; %汽车车身起始倾角
figure;
pause(1);
for i=1:1:N-1
pause(0.1);
inputcanshu=[x(i),y(i),phi(i)];
outputcanshu=evalfis(inputcanshu,fuzzyfis);
theta(i)=outputcanshu;
x(i+1)=x(i)+v*Ts*cos(phi(i)*pi/180)*cos(theta(i)*pi/180);
y(i+1)=y(i)+v*Ts*sin(phi(i)*pi/180)*cos(theta(i)*pi/180);
phi(i+1)=phi(i)-(v*Ts*300/l)*sin(theta(i)*pi/180);
if x(i+1) >= 100 || y(i+1) >= 90 %如果超出模糊逻辑控制器的输入范围,则停止
break;
end
x0 = x(i) + w/2*sind(phi(i)); %左前角x坐标
y0 = y(i) - w/2*cosd(phi(i)); %左前角y坐标
x1 = x(i) - w/2*sind(phi(i)); %右前角x坐标
y1 = y(i) + w/2*cosd(phi(i)); %右前角y坐标
p = x(i) - l*cosd(phi(i));
q = y(i) - l*sind(phi(i));
x2 = p + w/2*sind(phi(i)); %左后角x坐标
y2 = q - w/2*cosd(phi(i)); %左后角y坐标
x3 = p - w/2*sind(phi(i)); %右后角x坐标
y3 = q + w/2*cosd(phi(i)); %右后角y坐标
%画汽车后轴中心
plot (x(i), y(i), 'rs');
axis([-20 120 0 100]);
xlabel('x - cm');ylabel('y - cm');
hold on
grid on;
%画车位示意图
h1 = line([-20 40], [60 60]);
h2 = line([40 40], [60 95]);
h3 = line([40 115], [95 95]);
h4 = line([115 115], [60 95]);
h5 = line([115 120], [60 60]);
set(h1, 'linewidth', 5, 'color', 'b');
set(h2, 'linewidth', 5, 'color', 'b');
set(h3, 'linewidth', 5, 'color', 'b');
set(h4, 'linewidth', 5, 'color', 'b');
set(h5, 'linewidth', 5, 'color', 'b');
%画车身轮廓
l0 = line([x0 x1], [y0 y1]);
l1 = line([x1 x3], [y1 y3]);
l2 = line([x2 x3], [y2 y3]);
l3 = line([x0 x2], [y0 y2]);
set(l0, 'linewidth', 4, 'color', 'm');
set(l1, 'linewidth', 2, 'color', 'b');
set(l2, 'linewidth', 4, 'color', 'g');
set(l3, 'linewidth', 2, 'color', 'b');
end
結果を図に示します。