2012-04-17 1 views
0

Я использую Player (Player/Stage) в iRobot Create. Интерфейс для получения данных одометрия у робота довольно прост: вызовите playerc_client_read, а затем, если вы правильно подписали прокси-сервер playerc_position2d, вы должны иметь доступ к членам прокси-сервера px, py, pa для расстояния, пройденного по x и y (в метрах); и вращение (в радианах).Игрок неправильно получает данные одометрия для создания в многопоточном приложении

У меня нет проблем с выполнением этого в однопоточном приложении - все данные одометрия находятся там, где мне это нужно.

Однако, когда я пытаюсь переместить контроллер робота в свой поток (с помощью pthreads), я сталкиваюсь с некоторыми проблемами. Проблема в том, что обновляется только px. ру и ра всегда остаются 0.

Вот суть робота резьбы

//declare everything (including the playerc_client_t* object and playerc_position2d_t* object) 
//connect to server (in pull mode or push mode, it doesn't seem to matter) 
//subscribe to position2d proxy 

while(!should_quit) { 
playerc_client_read(client) 
double xPosition = position2d->px; 
double yPosition = position2d->py; 
double radians = position2d->pa; 

//do some stuff 
sleep(10 milliseconds) 
} 
cleanup and unsubscribe 

и достаточно точно, только xPosition когда-либо установить в то время как yPosition и радиан остаются 0 независимо от того, как движется робот.

Я ничего не нашел в Интернете, это известная ошибка? У кого-нибудь еще была эта проблема? Может ли кто-нибудь объяснить, почему это может произойти? Спасибо.

Полное раскрытие информации: Я аспирант, и это для проекта класса.

ответ

0

Вопрос здесь не обязательно с резьбой.

Мы обнаружили, что внутренняя одометрия Create является очень противоречивой, особенно когда нетбук сидит на ней.

Чтобы получить какое-либо подобие точного считывания, нужно установить угловую скорость достаточно высоко (в нашем случае - более 0,11 рад/с).

This site помог объяснить несколько вещей - а именно, что Creates используют мощность двигателя для определения одометра, а не счетчиков колес или любого аналогового сигнала.

Чтобы получить точную одометрию для задач мертвой расплаты, нужно либо построить собственную точную оценку, либо использовать некоторые внешние датчики, которые дают лучшую информацию о позиционных изменениях.

Наша конкретная проблема была вызвана пороговым значением в многопоточном корпусе, который задал угловую скорость до минимума для регистрации изменения, тогда как последовательный код не имел такого порогового значения.

Смежные вопросы