Witam. Mam do zrealizowania mały projekt w którym korzystam z akcelerometry i żyroskopu. Dane z sensorów odbierane są z częstotliwością 50Hz.
Korzystam z dostępnej biblioteki dll w c++. Przy obsłudze tych sensorów niezwykle ważny jest czas reakcji.
Posiadam przykładowy program konsolowy wygląda on mniej więcej tak
DWORD StartTick = GetTickCount();
while ((GetTickCount() - StartTick) <= 100000)
{
do
{
iErr = INEMO2_GetDataSample(hDevice, &frame);
if (iErr == INEMO2_ERROR_NONE)
process();
Mój problem pojawia się, gdy chcę wizualizować rotację obiektu powiedzmy "online" w openGL.
Z tego co czytałem 'każdy' program musi korzystać glutMainLoop();.
Jeżeli funkcję tą glutMainLoop(); wywołam przed kodem to wyświetla mi się okno openGl, ale nie odbieram danych w konsoli.
Jeżeli zrobię rzecz odwrotną to program odbiera dane w konsoli, ale nie wyświetla okna OpenGL.
Pomyślałem,więc że zrobię coś takiego
w funkcji process() dodałem iErr = INEMO2_GetDataSample(hDevice, &frame);
a w funkcji main.
glutTimerFunc(20,process,0);
Nie korzystam z pętli while, tylko cyklicznie wywołuje funkcję timera.
Teoretycznie 20ms (1/50Hz) powinno być ok, w praktyce sprawa się komplikuje. Ruszam sensorem, a reakcja w konsoli jest opóźniona o 1,5 sekundy.
Spróbowałem zmniejszyć czas do 10ms:
- katuje komputer zbyt częstym odświeżaniem
- sensory nie zdążają z wysyłaniem ramek, część ramek które chcę analizować są puste.
Chciałbym zrobić coś takiego.
- uruchomienie pętli while
- odczyt ramki
- analiza ramki
- aktualizacja okna openGl
- powrót na początek pętli
Jestem całkowicie nowy w OpenGl, może ktoś coś podpowie:)
Z góry dziękuje za jakiekolwiek podpowiedzi:)