Плеер неправильно получает данные одометрии для Create в многопоточном приложении
Я использую Player (Player/Stage) в iRobot Create. Интерфейс для получения данных одометрии от робота довольно прост: вызовите playerc_client_read, и затем, если вы правильно подписались на прокси playerc_position2d, вы сможете получить доступ к членам прокси px, py, pa для пройденного расстояния в x и y (в метрах); и вращение (в радианах).
У меня нет проблем с выполнением этого в однопоточном приложении - все данные одометрии находятся там, где мне нужно.
Однако, когда я пытаюсь переместить контроллер робота в его собственный поток (с помощью pthreads), я сталкиваюсь с некоторыми проблемами. Проблема в том, что обновляется только px. py и pa всегда остаются 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, независимо от того, как движется робот.
Я не мог найти что-нибудь еще онлайн, это известная ошибка? У кого-нибудь еще была эта проблема? Может ли кто-нибудь дать представление о том, почему это может происходить? Спасибо.
Полное раскрытие: я аспирант, и это для проекта класса.
1 ответ
Проблема здесь не обязательно с многопоточностью.
Мы обнаружили, что внутренняя одометрия Create очень непоследовательна, особенно когда на ней сидит нетбук.
Чтобы получить любое подобие точного показания, нужно установить достаточно высокую угловую скорость (в нашем случае выше 0,11 рад / с).
Этот сайт помог объяснить несколько вещей - а именно, что Creates используют мощность двигателя для определения одометрии, а не счетчики колес или какой-либо аналог.
Чтобы получить точную одометрию для непогашенных задач, нужно либо создать собственный точный оценщик, либо использовать некоторые внешние датчики, которые дают лучшую информацию об изменениях положения.
Наша конкретная проблема была вызвана пороговым значением в многопоточном случае, которое устанавливало угловую скорость на низкое значение для регистрации изменения, тогда как последовательный код не имел такого порогового значения.