В сво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)
Запуск
Все исходные коды разработанных узлов находятся в репозитории http://code.google.com/p/lego-nxt-car-like/. Стандартные пакеты использовались из релиза ROS Electric.
Для запуска управления роботом необходимо:
1. Установить на Lego NXT прошивку LeJos (http://lejos.sourceforge.net/)
2. Загрузить исходные коды пакетов из http://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.
0 комментариев на «“Автомобиле-подобный робот Lego NXT с удаленным управлением с ПК на базе ROS”»
Супер! Отличный проект. Большое спасибо! А за использованиеROS отдельное спасибо! 🙂 Будем ждать продолжения 🙂
Действительно очень хороший проект. Читать такие посты приятно. Тоже жду продолжения:)
Спасибо всем за поддержку. Есть наработки по локальному планировщику (плагин для узла movebase в ROS) для автомобиле-подобного робота, который работает сейчас на модели в Gazebo, их постараюсь опубликовать. А вот с этим роботом сейчас я на распутье. Дело в том, что из-за того что управление двигателями и чтение сенсоров Lego идет по-сути на андройде через BT, возникают достаточно серьезные ошибки в одометрии и определении препятствии. Я вижу два варианта:на вот такую штуку и реализовать все алгоритмы в Androide
1. Реализовать программу управления в самом Lego, а с андройдом (или даже напрямую с ПК) эта программа будет обмениваться высокоуровневыми командами. Например, андройд или ПК будет отправлять Lego команду «scan», а в ответ получать сразу «облако точек» с радара.
2. Заменить блок Lego
Кто что может посоветовать?
конечно 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, можно продолжить вместе!
Спасибо за ссылки. Менять платформу, пока не хочу. Основная причина в том, что у тележек из наборов типа Christmas DIY передние колеса не поворачиваются. Я искал такую, чтобы поворачивались, но в итоге все сводилось к тому, что нужно покупать радиоупр. модель автомобиля и ее адаптировать.http://www.ros.org/wiki/rosserial и мне тоже было бы интересно разобраться с этим.
Еще я не хочу исключать Android из схемы, т.к. это по-сути камера, акселерометр, компас и более мощные вычислительные ресурсы чем у Arduino.
С Arduino я еще ни разу не работал, поэтому это тоже одна из причин (помимо слабых выч. ресурсов), почему я не хочу переносить туда алгоритмы 🙂
По поводу интеграции с ROS плат Arduino, я так понимаю для этого используется
интеграция ROS и любой другой платформы можно сделать самостоятельно — ничего супер-сложного в этом нет. rosserial — это просто один из вариантов сериализации данных через последовательное соединение. никто не мешает реализовать свой вариант 😉
Android по прежнему — в центре устройства, посмотрите на робота Митю! — habrahabr.ru/blogs/DIY/135043/
как раз в первую очередь из за камеры, Wi-Fi, акселерометров и тд…
функционал любой, вплоть до устрановки ROS прямо в телефон.
Arduino осваивается с нуля за неделю по вечерам. (не зная ни электроники, ни С++) — самый дружелюбный контроллер из всего что я видел.
у платформы типа «ТАНК» (2WD, 4WD, Rover..) есть свои приемущества — например радиус поворота = 0!
По поводу платформы: я специально ориентировался на автомобильную платформу в надежде когда-нибудь в будущем с масштабировать наработки на реальный автомобиль 🙂
По поводу связки Android-Arduino: из статьи на хабре я понял, что там есть проблемы с развязкой питания, но для меня остался открытым вопрос по скорости их взаимодействия. Кто-нибудь может сказать какая будет примерно задержка получения андройдом показаний с датчиков подключенных к ардуино?