Автомобиле-подобный робот Lego NXT с удаленным управлением с ПК на базе ROS

В своe время решил освоить замечательную систему ROS, о которой часто упоминают на robocraft. Чтобы освоение было интересным стал делать робота Lego в виде автомобиля, который бы самостоятельно объезжал препятствия и составлял карту местности. Поставленной цели я еще не достиг, но уже есть что показать.
Итак, сейчас построен автомобиле-подобный робот, которым можно управлять из ROS и соответственно анализировать данные с него также посредством ROS.

Общая концепция заключается в следующем:
1. На ПК выполняется ядро ROS и узлы, необходимые для управления движением робота, управления радаром робота, составления карты препятствий и получения видео с камеры смартфона.
2. На смартфоне запускается узел rosjava, который по командам, полученным из соответствующих топиков, формирует команды управления двигателями Lego NXT, а также по сигналам с датчиков NXT формирует сообщения и посылает их в топики ROS. Помимо этого узел формирует сообщения с изображениями с камеры и посылает их в ROS.
3. На Lego NXT используется прошивка LeJOS, которая позволяет удаленно управлять двигателями и получать информацию с датчиков.


Основные узлы:
android/NXTNode — узел написан на rosjava и выполняется на смартфоне. Данный узел через топик /joint_command получает команды для управления двигателями и формирует низкоуровневые команды управления двигателями согласно API прошивки LeJos. Также этот узел циклически считывает показания датчиков Lego NXT и формирует сообщения в топики /joint_state и /ultrasonic_sensor.
/android_gingerbread/ros_camera_preview_view — стандартный узел из пакета android_gingerbread. Выполняется на смартфоне и публикует изображение с камеры смартфона.
nxt_radar_control — узел написан на python и выполняется на ПК. Его задача управлять двигателем дальномера, получать с него данные и формировать сообщения для /cloud_topic.
nxt_steering_control — узел написан на python и выполняется на ПК. Он является просто конвертором сообщений от /pilot/drive в сообщения /joint_command.
encoder_to_odom — узел написан на python и выполняется на ПК. Вычисляет данные одометрии по данным с энкодеров двигателей, которые он берет из топика /joint_state.
/costmap_node — стандартный узел из стека navigation. Предназначен для составление карты препятствий.
/robot_pose_ekf — стандартный узел, реализующий расширенный фильтр Калмана для вычисления одометрии робота.

Взаимосвязь узлов можно увидеть на следующем рисунке (скриншот rxgraph)


Запуск

Все исходные коды разработанных узлов находятся в репозитории code.google.com/p/lego-nxt-car-like/. Стандартные пакеты использовались из релиза ROS Electric.
Для запуска управления роботом необходимо:
1. Установить на Lego NXT прошивку LeJos (http://lejos.sourceforge.net/)
2. Загрузить исходные коды пакетов из code.google.com/p/lego-nxt-car-like/
3. Установить на смартфон программу android_pubsub.apk из стека nxj_ros_android
4. Выполнить команду в терминале: roslaunch nxt_steering_control nxt_radar_control.launch
5. Запустить на смартфоне android_pubsub.apk, указать адрес ROS и нажать ОК.
6. После этого можно управлять роботом с помощью nxj_teleop



Планы по развитию

1. Использовать датчики смартфона (акселерометр, GPS, компас) для повышения качества одометрии.
2. Использовать визуальную одометрию.
3. Повысить точность радара, используя вместо ультразвукового дальномера инфракрасный.
4. Собственно реализовать автономное управления. Сейчас уже разработан локальный планировщик для автомобиле-подобного робота, который работает на модели в gazebo.

Комментарии (8)

RSS свернуть / развернуть
+
0
Супер! Отличный проект. Большое спасибо! А за использование ROS отдельное спасибо! :) Будем ждать продолжения :)
Если хотите, чтобы ваш проект участвовал в конкурсе КиберВесна, то просто отредактируйте статью и добавьте тег кибервесна
avatar

admin

  • 9 марта 2012, 12:04
+
0
Действительно очень хороший проект. Читать такие посты приятно. Тоже жду продолжения:)
avatar

Ozze

  • 11 марта 2012, 16:04
+
0
Спасибо всем за поддержку. Есть наработки по локальному планировщику (плагин для узла movebase в ROS) для автомобиле-подобного робота, который работает сейчас на модели в Gazebo, их постараюсь опубликовать. А вот с этим роботом сейчас я на распутье. Дело в том, что из-за того что управление двигателями и чтение сенсоров Lego идет по-сути на андройде через BT, возникают достаточно серьезные ошибки в одометрии и определении препятствии. Я вижу два варианта:
1. Реализовать программу управления в самом Lego, а с андройдом (или даже напрямую с ПК) эта программа будет обмениваться высокоуровневыми командами. Например, андройд или ПК будет отправлять Lego команду «scan», а в ответ получать сразу «облако точек» с радара.
2. Заменить блок Lego на вот такую штуку и реализовать все алгоритмы в Androide
Кто что может посоветовать?
avatar

alexbuyval

  • 11 марта 2012, 18:41
+
0
конечно 2! — Заменить блок Lego на вот такую штуку и реализовать все алгоритмы прямо в ней!
это же ARDUINO!
более того, можно вместо ADK взять обычную Xduino + bluetooth shield

еще лучше поменять платформу например вот habrahabr.ru/blogs/DIY/135043/
там как раз про ADK и грабли =)

у меня такой же, только на DF Romeo — это Arduino + motorshield + expansion shield — по-моему идеальный вариант

На сайте DF Robot есть отличный набор «Christmas DIY» там опционально Bluetooth, несколько вариантов датчиков и всякие плюшки. все опции дешевле чем по отдельности.+ в каталоге мноого всего интересного.
набор стоит от 79$ до 200$? доставка -38$

В России
Romeo стоит 1600, платформа 1500, bluetooth 600-900,

я вот как раз хочу подружить Рому (так зовут моего робота из за платы Romeo =) с ROS, можно продолжить вместе!
avatar

RoboZeka

  • 11 марта 2012, 23:03
+
+1
Спасибо за ссылки. Менять платформу, пока не хочу. Основная причина в том, что у тележек из наборов типа Christmas DIY передние колеса не поворачиваются. Я искал такую, чтобы поворачивались, но в итоге все сводилось к тому, что нужно покупать радиоупр. модель автомобиля и ее адаптировать.
Еще я не хочу исключать Android из схемы, т.к. это по-сути камера, акселерометр, компас и более мощные вычислительные ресурсы чем у Arduino.
С Arduino я еще ни разу не работал, поэтому это тоже одна из причин (помимо слабых выч. ресурсов), почему я не хочу переносить туда алгоритмы :)
По поводу интеграции с ROS плат Arduino, я так понимаю для этого используется http://www.ros.org/wiki/rosserial и мне тоже было бы интересно разобраться с этим.
avatar

alexbuyval

  • 12 марта 2012, 05:39
+
0
интеграция ROS и любой другой платформы можно сделать самостоятельно — ничего супер-сложного в этом нет. rosserial — это просто один из вариантов сериализации данных через последовательное соединение. никто не мешает реализовать свой вариант ;)
avatar

admin

  • 12 марта 2012, 06:16
+
+1
Android по прежнему — в центре устройства, посмотрите на робота Митю! — habrahabr.ru/blogs/DIY/135043/
как раз в первую очередь из за камеры, Wi-Fi, акселерометров и тд…
функционал любой, вплоть до устрановки ROS прямо в телефон.

Arduino осваивается с нуля за неделю по вечерам. (не зная ни электроники, ни С++) — самый дружелюбный контроллер из всего что я видел.

у платформы типа «ТАНК» (2WD, 4WD, Rover..) есть свои приемущества — например радиус поворота = 0!
avatar

RoboZeka

  • 12 марта 2012, 12:59
+
0
По поводу платформы: я специально ориентировался на автомобильную платформу в надежде когда-нибудь в будущем с масштабировать наработки на реальный автомобиль :)
По поводу связки Android-Arduino: из статьи на хабре я понял, что там есть проблемы с развязкой питания, но для меня остался открытым вопрос по скорости их взаимодействия. Кто-нибудь может сказать какая будет примерно задержка получения андройдом показаний с датчиков подключенных к ардуино?
avatar

alexbuyval

  • 13 марта 2012, 06:45

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.