Skocz do zawartości

Zagadnienie parkowania samochodu


Puchaczov

Pomocna odpowiedź

Cześć, potrzebuję napisać algorytm oparty o logikę rozmytą który będzie parkował samochód (taki teoretyczny). Nie mogę dociec dlaczego mi to nie działa, może ktoś podpowiedzieć czy mam poprawne dane wejściowe?

Moimi zmiennymi wejściowymi są: kąt do osi X oraz odległość ciężarówki od osi X

Wyjściem jest kąt skrętu kół.

Oto moje funkcje zbiory rozmyte

           //kat do osi miejsca parkingowego
           left = new TrapezoidFunction(-180, 0, -180, -10);
           straight = new TrapezoidFunction(-20, 20, 0.0, 0.0);
           right = new TrapezoidFunction(0, 180, 10, 180);

           //odleglosc ciezarowki os osi x
           distVLeft = new TrapezoidFunction(-1000, -40, -1000, -60);
           distLeft = new TrapezoidFunction(-60, 0, -30, -30);
           distCenter = new TrapezoidFunction(-30, 30, 0, 0);
           distRight = new TrapezoidFunction(0, 60, 30, 30);
           distVRight = new TrapezoidFunction(40, 1000, 60, 1000);

           //kat o jaki maja zostac skrecone kola
           leftAngle = new TrapezoidFunction(-40, 0.0, -40, -10);
           centerAngle = new TrapezoidFunction(-10, 10, 0.0, 0.0);
           rightAngle = new TrapezoidFunction(0.0, 40, 10, 40);
           steeringAngle = new FuzzyFrame(-40, 40, new List<Function>() { leftAngle, centerAngle, rightAngle });

Od razu nasuwa mi się pytanie czy otrzymaną wartością z kontrolera powienien być przyrost kąta skrętu kół czy nowy kąt ustawienia kół?

WheelAngle = updateWheelAngle(biezacyKatUstawieniaDoOsiX, xMiejscaParkingowego - xBiezacejPozycji);

w taki sposob generuje nowy kąt pod którym skręcone są koła. Czy biezacyKatUstawieniaDoOsiX nie powinien być różnicą poprzedniego kąta i tego nowego tak jak w przypadku pozycji?

                
              var radians = DegToRad(WheelAngle);
               x = x + Velocity * Time * Math.Cos(radians);
               y = y + Velocity * Time * (Math.Sin(radians));
               currAngle = currAngle + (Velocity * Time) / (Length * Math.Tan(radians));

w taki sposób próbuję wygenerować współrzędne nowego punktu. Jednak te punkty są niepoprawne. Kolejne iteracje nie powodują nawet zbliżania się do jakiegokolwiek sensownego wyniku. Zastanawiam się czy dobrze to próbuję policzyć. Velocity i Time przyjmuje jako 1 (stała prędkość)

Link do komentarza
Share on other sites

Możesz udostępnić zbiory rozmyte w jakieś wizualnej wersji (wykres)? Skąd wzięły się konkretne wartości? Wyklucz błąd wynikający z tych zbiorów?

Próbowałeś wspierać się Matalbem? Toolbox od sieci rozmytych jest całkiem przyjemny.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.