|
Autor |
Probleme bei Umsetzung des Intelligent Driver Models in Matlab |
|
Ralf89
Neu  Dabei seit: 13.10.2020 Mitteilungen: 3
 | Themenstart: 2020-10-13
|
Hallo zusammen,
ich habe dezente Probleme das IDM in Matlab umzusetzen...ich habe einen Code mir selber zusammengestellt, jedoch funktioniert er einfach nicht wie er sollte. Das nervt mich seit Tagen 😒
Tendenziell sollten n-Fahrzeuge mit unterschiedlichen Längen darin modelliert werden.
Die mathematische Formulierungen können hier nachgesehen werden:
hier
Hat jemand für dieses Problem eine Lösung? 🤔
|
Profil
|
majoka
Senior  Dabei seit: 25.02.2014 Mitteilungen: 810
 | Beitrag No.1, eingetragen 2020-10-19
|
Hallo Ralf89,
willkommen im Forum.
Ich habe es aus eigenem Interesse versucht umzusetzen. Allerdings nur für die spezielle Lösung wie im Wikipedia-Artikel (Fahren im Kreis, alle gleiche Länge usw.).
Ich habe versucht die DGL so aufzustellen, dass man die Anzahl der Fahrzeuge leicht ändern kann.
Die Lösung scheint für die gewählten Anfangswerte plausibel: Fahrzeug 1 hat eine etwas erhöhte Anfangsgeschwindigkeit, bremst daher zunächst auf $v_0$ ab. Beim Auflaufen auf Fahrzeug $50$ nimmt es dessen Geschwindigkeit an.
Gruß
majoka
\sourceon Matlab
clear all
clf
v_0 = 30;
T = 1.5;
a = 0.73;
b = 1.67;
delta = 4;
s_0 = 2;
vehicle_length = 5;
vehicle_number = 50;
circumference = 5000;
% Aufstellen der DGL
state_dot_text = ['state_dot = @(t,state) [\n'];
for i = 1 : vehicle_number
state_count = 2*i-1;
if i == 1
s = ['(state(',num2str(2*vehicle_number-1),')-state(',num2str(state_count) ,')-vehicle_length+circumference)'];
state_dot_text = [state_dot_text ['state(', num2str(state_count+1),');\na*(1 - (state(', num2str(state_count+1),')/v_0).^delta - ((s_0 + state(', num2str(state_count+1),')*T+state(', num2str(state_count+1),')*', '(state(', num2str(state_count+1),')-state(', num2str(2*vehicle_number),'))','/(2*sqrt(a*b)))./',s,').^2);\n'] ];
else
s = ['(state(',num2str(state_count),')-state(',num2str(state_count-2) ,')-vehicle_length)'];
state_dot_text = [state_dot_text ['state(', num2str(state_count+1),');\na*(1 - (state(', num2str(state_count+1),')/v_0).^delta - ((s_0 + state(', num2str(state_count+1),')*T+state(', num2str(state_count+1),')*', '(state(', num2str(state_count+1),')-state(', num2str(state_count-1),'))','/(2*sqrt(a*b)))./',s,').^2);\n'] ];
end
end
state_dot_text = [state_dot_text, '];\n'];
state_dot_text = sprintf(state_dot_text);
eval(state_dot_text)
% Anfangswerte
state_init = zeros(1,vehicle_number*2);
state_init(vehicle_number*2-1:-2:1)= 0.5*linspace(1,circumference,vehicle_number);
state_init(2) = 40;
% Lösung
[time, state] = ode45(state_dot, [0 500], state_init);
% Plot
h3=figure(3);
clf(h3)
axis([-1 1 -1 1])
for t = 1 : numel(time)
clf(h3)
title(['time = ', num2str(time(t)), 's']);
hold on
for i = 1 : vehicle_number
plot(cos(2*pi/circumference*state(t,2*i-1)), sin(2*pi/circumference*state(t,2*i-1)), 'X')
text(cos(2*pi/circumference*state(t,2*i-1))+0.05, sin(2*pi/circumference*state(t,2*i-1)), num2str(i))
axis([-1 1 -1 1])
axis square
end
hold off
pause(0.00015)
end
h1=figure(1);
clf(h1)
hold on
legend_text = [];
for i = 1 : vehicle_number
plot(time,state(:,2*i))
legend_text = [legend_text '''v_{', num2str(i), '}'','];
end
hold off
legend_text = legend_text(1:end-1);
%eval(['legend(', legend_text, ')']);
\sourceoff
|
Profil
|
Ralf89
Neu  Dabei seit: 13.10.2020 Mitteilungen: 3
 | Beitrag No.2, vom Themenstarter, eingetragen 2020-10-29
|
Hallo majoka,
vielen Dank für deine Antwort und deine super Idee zur Umsetzung. In der Zwischenzeit habe ich mich selber daran nochmal probiert...ohne durchschlagenden Erfolg
Als Ausgabe sollte letztendlich ein Weg-Zeit Diagramm stehen. Aber es funktioniert vorne und hinten nichts. Weißt du wo der Fehler in diesem Code liegt? Ich bin da völlig überfragt.
\showon
clear all
clc
% Fahrzeuge
AnzahlFahrzeuge = 3;
Simulationszeit = 60; % Zeit in Sekunden
Xfinal=zeros(0,0); % Position der Fahrzeuge
Tfinal=zeros(0,0);
Vfinal=zeros(0,0);
for i=0:1:Simulationszeit
if i <=30
X = 20*AnzahlFahrzeuge+6*i;
V=6;
end
if i>30 && i<=60
X = 20*AnzahlFahrzeuge+180;
V=0;
end
if i>60
X = 20*AnzahlFahrzeuge+6*i-180;
V=6;
end
Xfinal=[Xfinal;X];
Vfinal=[Vfinal;V];
Tfinal=[Tfinal;i];
end
figure(1);
plot(Tfinal,Xfinal,'k-')
% Eingabe der initialen Abstaende
initial_values=zeros(2*AnzahlFahrzeuge,1);
for i=1:AnzahlFahrzeuge
initial_values(i)=(AnzahlFahrzeuge+1-i)*10;
end
tspan=0:.001:Simulationszeit;
[T,Y] = ode45( @(t,y)idm(t,y,AnzahlFahrzeuge,Xfinal,Tfinal,Vfinal),tspan,initial_values);
% hold on;
% %Position of the other follwer cars
% name_cell = {};
% name_cell{1} = ['Car ' num2str(0) ];
% for k = 1:AnzahlFahrzeuge
% plot(T,Y(:,k),'Color',rand(1,3),'LineWidth',.5*k)
% name_cell{k+1} = ['Car ' num2str(k) ];
% end
% % legend(’Car 0’,’Car 1’, ’Car 2’,’Car 3’,’Car 4’,’Car N-1’,’Car N’)
% legend(name_cell{:});
% xlabel('Time (t)')
% ylabel('Position,x(t)')
function dy = idm(t,y,AnzahlFahrzeuge,Xfinal,Tfinal,Vfinal)
dy = zeros(2*AnzahlFahrzeuge,1);
a = [1.0,0.5,0.3]; % Beschleunigung
b = [1.5,4.0,3.0]; % Verzoegerung
delta = 4; % Beschleunigungsexponent
T = 1.0; % Folgezeit
l = [3.0,2.4,3.2]; % Laenge der Fahrzeuge
s_0 = 2.0; % Minimalabstand
x0_dot = 20; % Geschwindigkeit des ersten Fahrzeugs in m/s
Th=2.0; %Sicherheitsabstand
s0=2.0; %minimaler Abstand
%%%%%%%%%%%%
x0 = interp1(Tfinal,Xfinal,t);
v = interp1(Tfinal,Vfinal,t);
Delta_v(1) = y(AnzahlFahrzeuge+1)-v;
s(1) = x0-y(1) - l(1);
s_star(1) = s0 + max(0,y(AnzahlFahrzeuge+1)*Th + y(AnzahlFahrzeuge+1)*Delta_v(1)*1/(2*sqrt(a(1)*b(1))));
for i=2:AnzahlFahrzeuge
Delta_v(i) = y(AnzahlFahrzeuge+i)-y(AnzahlFahrzeuge+i-1);
s(i) = y(i-1)-y(i) - l(i-1);
s_star(i) = s0 + max(0,y(AnzahlFahrzeuge+i)*Th + y(AnzahlFahrzeuge+i)*Delta_v(i)*2*sqrt(a(i)*b(i)));
end
for i=1:AnzahlFahrzeuge
dy(i) = y(i+AnzahlFahrzeuge);
end
for i=1:AnzahlFahrzeuge
dy(i+AnzahlFahrzeuge) = a*(1 - (y(i+AnzahlFahrzeuge)/x0_dot).^delta - (s_star(i)/s(i)).^2);
end
end
\showoff
|
Profil
|
majoka
Senior  Dabei seit: 25.02.2014 Mitteilungen: 810
 | Beitrag No.3, eingetragen 2020-10-29
|
Ich habe mir bisher nur die erste Fehlermeldung angesehen. Diese resultiert aus der Zeile
\sourceon Matlab
dy(i+AnzahlFahrzeuge) = a*(1 - (y(i+AnzahlFahrzeuge)/x0_dot).^delta - (s_star(i)/s(i)).^2);
\sourceoff
Da $a$ hier jedoch ein Vektor ist, sollte es wohl eher so gehen:
\sourceon Matlab
dy(i+AnzahlFahrzeuge) = a(i)*(1 - (y(i+AnzahlFahrzeuge)/x0_dot).^delta - (s_star(i)/s(i)).^2);
\sourceoff
Wie gesagt, den Rest habe ich mir nicht angeschaut.
|
Profil
|
Ralf89
Neu  Dabei seit: 13.10.2020 Mitteilungen: 3
 | Beitrag No.4, vom Themenstarter, eingetragen 2020-10-30
|
Danke. Das war der Fehler, den ich die ganze Zeit nicht bemerkt hatte! Jetzt läuft das Programm
|
Profil
|
Ralf89 hat die Antworten auf ihre/seine Frage gesehen. |
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|