Wykrywanie przyspieszenia w samochodzie (Akcelerometr iPhone)

Pracuję nad aplikacją na iPhone ' a, w której próbujemy obliczyć przyspieszenie jadącego samochodu. Podobne aplikacje osiągnęły to (Dynolicious), ale różnica polega na tym, że ta aplikacja jest przeznaczona do użytku podczas ogólnej jazdy miejskiej, a nie na pasku przeciągania.

To prowadzi nas do jednego wielkiego problemu, którego Dynolicious na szczęście uniknął: hills. Tak, hills.

Są dwa ważne etapy: kalibracja i faktyczna Jazda.

Nasz początkowy bieg był prosty i ponieśli konsekwencje. Podczas etapu kalibracji wziąłem średnią siłę w telefonie, a podczas biegu po prostu odjąłem średnią siłę od aktualnej siły, aby uzyskać aktualne przyspieszenie tej klatki. Problem polega na tym, że typowy samochód otrzymuje znacznie więcej siły niż tylko siłę do przodu - wszystko od zawracania do dziur powodowało, że wartości nie były zsynchronizowane z tym, co się naprawdę działo.

Następnym uruchomieniem było dodanie warunku, że iPhone musi być zorientowane w taki sposób, że ekran był skierowany w kierunku tyłu samochodu. Korzystając z tej metody, próbowałem podążać tylko siłą na osi z, ale to oczywiście prowadzi do problemów, chyba że iPhone był zorientowany bezpośrednio w pozycji pionowej, z powodu grawitacji.

Trochę trygonometrii później, i udało mi się pracować grawitacji z równania, tak, że samochód był rzeczywiście czytany bardzo, bardzo dobrze przez iPhone.

Dopóki nie uderzę w stok. Jak tylko kąt samochodu zmienił się, nagle ja otrzymywaliśmy przyspieszenia i opóźnienia, które nie miały sensu, i znowu byliśmy poza synchronizacją.

Rozmowa z kimś o wiele mądrzejszym ode mnie w matematyce prowadzi do rozwiązania, które staram się wdrożyć dłużej niż chciałbym przyznać. Jego kroki są następujące:

1) podczas kalibracji zmierz grawitację jako wektor zamiast rozmiaru. Przechowuj wektor. 2) Gdy samochód początkowo porusza się do przodu, weź wektor ruchu i odjmij grawitację. Użyj tego jako pęd do przodu. (Zignoruj na razie przypadki użytkownika, w których będzie to trudne i skupmy się na matematyce :) 3) z wektora do przodu i wektora grawitacji skonstruować płaszczyznę. 4) ilekroć siła jest odbierana, rzut go na wspomnianą płaszczyznę, aby pozbyć się siły bocznej / itp. 5) Następnie użyj tej siły, znanej wielkości grawitacji i znanego kierunku ruchu do przodu, aby zasadniczo rozwiązać trójkąt, aby uzyskać wektor do przodu.

Problem, który powoduje najbardziej trudność w tym nowym systemie to nie Krok 5, który dotarłem do punktu, w którym wszystkie liczby wyglądają tak, jak powinny. Trudną częścią jest w rzeczywistości wykrycie wektora przedniego. Wybieram wektory, których wielkość przekracza grawitację, a stamtąd uśredniam je i odejmuję grawitację. (Robię pewne sprawdzanie błędów, aby upewnić się, że nie używam siły, tylko dlatego, że akcelerometr iPhone ' a był wyłączony o trochę, co zdarza się częściej niż chciałbym). Ale jeśli spiskuję te wektory, których używam, różnią się pod kątem około 20-30 stopni, co może prowadzić do pewnych silnych nieścisłości. W rezultacie aplikacja jest jeszcze bardziej niedokładna niż wcześniej.

Więc w zasadzie-wszystkie matmy i iPhone mózgi tam - jakieś rażące błędy? Jakieś potencjalnie lepsze rozwiązania? Jakieś doświadczenie, które mogłoby się przydać?

Nagroda: oferowanie nagrody w wysokości 250 $za pierwszą odpowiedź, która prowadzi do rozwiązania.

Author: RickNotFred, 2010-04-29

5 answers

Potrzebujesz żyroskopu. W przeciwnym razie istnieje wiele konfiguracji przyspieszającego samochodu na wzgórzu, które mogą spowodować dokładnie takie same odczyty na akcelerometrze. Będą całkowicie niemożliwe do odróżnienia. Dlatego inercyjne systemy nawigacji łączą żyroskop i akcelerometr.

Powód, dla którego nie możesz tego zrobić, podał Einstein! Przy pomiarze lokalnym nie można odróżnić grawitacji od przyspieszenia. Masz kilka przydatnych informacji nielokalnych - założenie, że grawitacja tutaj i grawitacja kilka metrów dalej mają tę samą wartość. Ale nie można porównać grawitacji w dwóch różnych miejscach bez środków do przeprowadzenia tak zwanego "transportu równoległego". To właśnie robi żyroskop.

Zapomnij o $250, ale myślę, że powinieneś dać mi piwo za ilość czasu na badania i rozwój, którą ci oszczędzam. :-)

 10
Author: sigfpe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 22:32:05

Aby to rozwiązać, jeśli to możliwe, musisz odwołać się do czegoś zewnętrznego do samochodu. Prawdopodobnie użycie GPS do pomiaru wzmocnienia wysokości jest najbardziej bezpośrednim podejściem. Oznacza to, że Oblicz nachylenie wzniesienia na podstawie zmierzonego przyrostu wysokości i użyj tego do skompensowania pomiaru przyspieszenia.

Jak wspominali inni, na bardzo głębokim poziomie, nie ma sposobu na rozróżnienie grawitacji i przyspieszenia; jest to znane jako równoważność Zasada (i była jednym z najważniejszych spostrzeżeń Einsteina). Więc trzeba wiedzieć więcej niż wyjście akcelerometru, aby rozwiązać ten problem, a to sprawia, że problem jest trudny. Dla różnych podejść do problemu, zobacz tutaj .

Najlepszą nadzieją jest odniesienie się do czegoś zewnętrznego do samochodu, jak sygnał GPS, lub zdjęcia do pomiaru zmiany położenia czegoś poza samochodem, lub pola magnetycznego ziemi, itp. Ponieważ odbędzie się to w pobliżu dużo metalu (samochód) pole ziemi będzie prawdopodobnie trudne do zmierzenia, a ciągłe zdjęcia jakiegoś obiektu odniesienia (jak słońce) jest oczywiście trudne, więc wydaje się, że GPS jest najlepszym rozwiązaniem.

Więcej o tym, dlaczego potrzebujesz zewnętrznego odniesienia:

Warto zastanowić się, czy można użyć unikalnych cech grawitacji, że 1) jest zawsze "włączony", 2) ma zawsze tę samą wielkość (w tej sytuacji). Ale kiedy wszystko, co wiesz, to całkowite przyspieszenie, nie możesz niezawodnie oddzielić te dwa składki. Jak pokazuje poniższy rysunek, sama znajomość wielkości grawitacji nie wystarczy... poniższy obrazek jest narysowany w ramce odniesienia telefonu, gdzie mierzy wypadkowe przyspieszenie( czarny wektor), a większe kolorowe strzałki są możliwymi wektorami grawitacji, podczas gdy dopasowane kolory mniejsze strzałki są odpowiadającymi im wektorami przyspieszenia. Więc można zobaczyć, bez wiedzy i kąta, nie masz wystarczająco dużo informacji, aby rozwiązać problem.

Alt text http://i42.tinypic.com/6gasnb.png

Inną rzeczą, którą możesz zrobić, to zintegrować wyjście z żyroskopu, aby znaleźć kąt wektora grawitacji. Oznacza to, że zakładając, że zaczynasz na płaskiej, a następnie zawsze śledzić gdzie myślisz, że grawitacja będzie oparta na nagromadzonych małych zmian. Ale jest to bardzo podatne na błędy, a twój błąd w obliczeniach będzie się szybko gromadzić z czasem; i zakłada również, że masz dostęp do żyroskopu.

Dlatego jedynym dobrym rozwiązaniem jest wykorzystanie informacji zewnętrznych.

 3
Author: tom10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-02 15:09:13

Niektóre myśli:

  • grawitacja jest wielkością wektorową, a nie wielkością.
  • Przyspieszenie z powodu grawitacji i przyspieszenie z powodu innej siły nie są rozróżnialne (nie możesz również odróżnić jazdy za rogiem od toczenia samochodu).
  • Możesz mieć więcej szczęścia z dwoma akcelerometrami, ale wtedy będziesz potrzebował dwóch telefonów.

Na moim miejscu napisałbym zastrzeżenie, że " to nie działa na wzgórzach, użyj prosta, pozioma droga do testów."

P. S.: podoba mi się nagroda pieniężna za odpowiedzi, na pewno wrzucę to jako sugestię na meta.stackoverflow.com : p

 1
Author: Seth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 21:39:44

To nie rozwiązuje Twojego problemu całkowicie, ale mam nadzieję, że wyjaśni to, co starałeś się zrobić. Wierzę, że ostatecznie będzie Pan potrzebował innego instrumentu, aby móc w pełni to zrobić. GPS jak zasugerował tom10 brzmi jak najlepsza opcja dla mnie (ponieważ nie ma żyroskopu dostępnego), ale przewiduję problemy z tym, takie jak czas opóźnienia i niedokładność współrzędnych GPS (Nie wiem, jak dokładny jest GPS iPhone ' a).

Po pierwsze zakładam, że iPhone jest mocno przywiązany do cały samochód. Dla nachylenia, które jest w górę lub w dół bez krzywej w lewo lub w prawo, możesz wykonać następujące czynności w celu kalibracji.

Kalibracja

  1. Znajdź powierzchnię taką, że jej stopień nie zmienia się znacząco.
  2. Znajdź wektor przyspieszenia, gdy samochód nie porusza się względem drogi. Zapisuje ten pełny wektor (składowe X, y i z) jako v1. g = / v1 | jest wielkością grawitacji, która powinna pozostać taka sama przez cały czas.
  3. zacznij jechać prosto do przodu po zboczu (w górę lub w dół, nie na bok i oczywiście płaska powierzchnia też jest świetna).
  4. Zapisz ten pełny wektor przyspieszenia jako v2 .
  5. Znajdź v3 , wektor wskazujący ruch do przodu, biorąc v2 - v1 (odejmowanie grawitacji).
  6. Find v4 = v3 x ( v1 x v3 ) gdzie x jest iloczynem wektorowym krzyża .
  7. Znajdź jednostkę wektor v4, v5 = v4 / / v4 /

V5 wskazuje kierunek, w którym grawitacja wskaże, gdy samochód znajduje się na idealnie płaskiej powierzchni. Teraz możesz przynajmniej powiedzieć, czy jesteś na jakimś zboczu i jaki jest kąt tego zbocza. Można to zrobić w następujący sposób:

  1. Zapisz bieżący wektor przyspieszenia, a .
  2. Znajdź iloczyn kropkowy a i v1 , c = a . v1
  3. Jeśli c jest mniejsze niż g (w przeciwieństwie do tego, że jest równe g), samochód znajduje się na zboczu. Kąt nachylenia wynosi theta = arccos (c/g).

Jednak tutaj napotykamy problemy. Nawet jeśli ograniczamy się do zboczy, które są w górę iw dół, a nie zakrzywione / bankowe w lewo lub w prawo, nadal nie możemy powiedzieć na pewno, czy nachylenie idzie w dół lub w górę-tylko kąt. Na początku możemy stwierdzić, czy samochód jedzie w górę czy w dół zbocza, biorąc produkt dot z v1 i v3 (wartość dodatnia oznacza nachylenie w dół, a wartość ujemna nachylenie w górę).

Możesz jednak być w stanie wykorzystać fakt, czy wielkość całkowitego wektora przyspieszenia maleje lub wzrasta wraz ze wzrostem lub spadkiem nachylenia, aby zgadnąć, ale nie będzie to pewne. Na przykład, jeśli kąt (theta) nachylenia był 0 stopni (lub wystarczająco blisko niego), a teraz nie jest, a rzut (iloczyn punktowy) ogólnej przyspieszenie na wektor jednostkowy v3 maleje, wtedy możemy wywnioskować, że samochód jedzie w górę zbocza. Ponownie, byłoby to tylko zgadywanie, które bardzo dobrze może być błędne. Mówię, że może, ale chodzi mi o to, że czasami będzie źle.

To tyle informacji, ile mogę sobie wyobrazić wydostanie się z systemu, który używa tylko akcelerometru. Powodzenia!

 1
Author: Justin Peel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 19:43:57

@Gazzardian,

Więc twoim podstawowym problemem, jak rozumiem, jest wykrycie wektora przedniego. Możesz wybrać te:

  1. próbkujesz prędkość powiedzmy co 0,2 sekundy przez 5 sekund i wyłączasz próbkowanie na następne n sekund, aby zasób nie został zablokowany. Teraz to, co możesz zrobić z tych punktów danych, będzie w stanie rozpoznać szybkość zmiany prędkości(istnieją proste metody numeryczne, aby znaleźć pochodną za pomocą punktów danych). Ale to nie da ci przyspieszenie w najprawdziwszym sensie, ponieważ nie da ci kierunku. AFAIK, akcelerometr daje również kierunek, tzn. ile nachylony jest do jednej z osi / grawitacji.

Skonsultuj tę liczbę, aby wykryć kąt: kąty i wzgórza http://lh6.ggpht.com/_p7FIkTnaSc4/S9kkKF7oECI/AAAAAAAABYg/D1tbxNQXo0E/s288/Hill.png

Inną możliwą metodą jest znalezienie dodatkowej siły podczas wspinaczki na wzgórze. Biorąc pod uwagę dodatkową siłę, możesz być w stanie Znajdź kąt. Składowa pionowa dodatkowej siły jest przeciwstawna, składowa pionowa w przeciwnym kierunku, g.

 0
Author: Soham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 06:23:54