WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Fahrspurerkennung - Regression mit zwei stetigen Polynomen

 

EliteTUM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 19.01.2014, 18:49     Titel: Fahrspurerkennung - Regression mit zwei stetigen Polynomen
  Antworten mit Zitat      
Hallo zusammen,

ich möchte erste Voruntersuchungen für eine mögliche Fahrspurerkennung anstellen. In der unglaublich umfangreich erhältlichen Literatur bin ich auf einige Paper gestoßen, welche als Fahrspurmodell zwei kubische Polynome verwenden, welche in Position und Steigung, evtl. sogar Krümmung stetig aneinander geheftet sind.

Die generelle Verwendbarkeit von kubischen Polynomen von als Fahrbahnmarkierungsmodell ist in vielen Veröffentlichungen ja schon aufgezeigt worden. Eine hinreichend genaue Approximation von Klothoiden, Kreissegmenten und Geraden ist damit ja möglich. Einen Testcode, wie das Modell-Fitting mit möglichen Messwerten einer Klothoide aussehen würde, habe ich schon mal erstellt und hängte ich entsprechend unten an.
Was ich nun gern machen würde ist, dass ich statt einem einzigen Polynom 3. Ordnung einfach zwei hintereinander geschaltete verwende. Damit liese sich ein Straßenverlauf mit Krümmungsunstetigkeiten oder schnellen Krümmungsänderungen schön approximieren und dennoch weit genug in die Distanz fitten. Man stelle sich eine lang gezogene Linkskurve, ein kurzes Geradenstück und kurze Rechtskurve vor; mit einem Polynom dritter Ordnung könnte man die Straße ENTWEDER nicht genau genug annähern ODER man würde die Vorrausschaudistanz stark kürzen müssen, um die Straße genau genug annähern zu können. Mit zwei Polynomen 3. Ordnung ließe sich dieser Konflikt entschärfen.

Leider weiß ich nicht, wie ich es schaffe, diese Randbedingung der stetigen Polynome in die Koeffizientenberechnung in der Ausgleichsrechnung umzusetzen. Nach einiger Recherche bin ich auf die Verwendung von Splines gestoßen, welche ja eine ähnliche Anwendung darstellen. Ich möchte aber eine beliebige Anzahl von Punkten mit genau zwei kubischen Splines approximieren. Wie ich jedoch genau diese Begrenzung auf zwei Splines technisch hinbekomme, habe ich nicht ganz verstanden. Hat hier jemand mehr Erfahrung mit der Materie und kann mich vielleicht ranführen?

Bin für jede Hilfe dankbar!


Mein bisheriges Ergebnis:

Code:
% Lineare Regression eines Polynoms
%
% 19.01.2014

clear all;
close all;
clc;




% Schritt 1 - Allgemein die Punkte entlang einer Klothoide berechnen
%
% Quelle: http://www.researchgate.net/post/Ho.....othoid_with_limited_data2

a           = 2;
f1          = @(s)1/a*cos(s.^2);
f2          = @(s)1/a*sin(s.^2);

p           = @(t)quadl(f1,0,t);
q           = @(t)quadl(f2,0,t);

resolution  = 2000;
L           = 3;
l           = linspace(eps,L,resolution);

xRaw        = arrayfun(p,l);
yRaw        = arrayfun(q,l);

% we need row-vectors later on, so we need to assert the correct sizes
if ( size( xRaw, 1 ) > size( xRaw, 2 ) )
   xRaw = xRaw';
end

if ( size( yRaw, 1 ) > size( yRaw, 2 ) )
   yRaw = yRaw';
end




% Schritt 2 - Probe entnehmen
%

iStart = 1;
iStep  = 5;
iEnd   = 100;
iShift = 100;

while ( iStart ~= iEnd && iStart < length( xRaw ) )
    % select some points along the clothoid
   xSelected    = xRaw( iStart : iStep : iEnd );
   ySelected    = yRaw( iStart : iStep : iEnd );
   
    % for rotation purpose we arrange all points in one matrix
    pSelected   = [ xSelected; ySelected ];
   
   
   
   
    % Schritt 3 - Transformieren der Koordinaten und verrauschen des
    %             Signals
    %
    % Quelle: http://www.mathworks.com/matlabcentral/answers/93554
   
    % we need at least 2 points to calculate the heading angle
    if length( xSelected ) < 2
        break;
    end
   
    % calculate heading angle
    heading     = -1 * atan2( ySelected( 2 ) - ySelected( 1 ), xSelected( 2 ) - xSelected( 1 ) );
   
    % calculate the rotation matrix
    R           = [ cos(heading), -sin(heading); sin(heading), cos(heading) ];
   
    % calculate the vector to shift the selected points into the origin
    tCenter     = repmat( [ xSelected(1); ySelected(1) ], 1, length(xSelected) );
       
    % transform the selected points
    pTrans      = R * ( pSelected - tCenter );
    xTrans      = pTrans( 1, : );
    yOrigTrans  = pTrans( 2, : );
   
    % add noise with standard deviation of 6e-4
    yTrans      = yOrigTrans + 0.0006 .* randn( size(yOrigTrans) );
   
   
   
    % Schritt 4 - Polynomkoeffizienten schätzen (Ausgleichsrechnung)
    %
    % Quelle: http://math.nmsu.edu/~breakingaway/.....icientsOfAPolynomial.html

   
    polyOrder   = 3;
   
    % Create Coefficient Matrix
    for iPoly = 0:polyOrder
        C( :, iPoly+1 ) = xTrans'.^iPoly;
    end
   
    % Create Vector with our "measured" points
    D = yTrans';
   
    % Calculate Moore-Penrose-Pseudoinverse to find a solution
    S = inv( C' * C ) * C' * D;
   
   
   
   
    % Schritt 5 - Berechne eine Schar von Punkten aus dem geschätzen Polynom
    %

    xEstim  = linspace( xTrans(1), xTrans(end), 100 );
   
    % Create Coefficient Matrix
    for iPoly = 0:polyOrder
        CEstim( :, iPoly+1 ) = xEstim'.^iPoly;
    end
    CEstim(:,1) = 0;
   
    yEstim = CEstim * S;
   
   
   
   
    % Schritt 6 - Zur Kontrolle das Ergebnis plotten
    figHdl = figure(1);
    clf(figHdl);
    subplot( 2, 1, 1 );
    plot( xRaw, yRaw, 'b-', 'LineWidth', 4 );
    hold on;
    plot( xSelected, ySelected, 'ro' );
    hold off;
    axis equal;
    subplot( 2, 1, 2 );
    plot( xEstim, yEstim, 'k-', 'LineWidth', 4 );
    hold on;
    plot( xTrans, yTrans, 'mo' );  
    plot( xTrans, yOrigTrans, 'c*' );  
    hold off;
    axis equal;
   
   
   
   iStart       = min( [ iStart + iShift; length( xRaw ) ] );
   iEnd       = min( [ iEnd   + iShift; length( xRaw ) ] );
end

_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen


Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.