Приведённый робот - результат многолетней работы. Изначально хотелось сделать простого и недорогого робота, обладающего продвинутым интеллектом. Спрашивать имена посетителей и здороваться с ними за руку - это уже слишком. Но и простой объезд препятствий - слишком примитивно. Хотелось бы ввести систему картографии, чтобы было возможно какое-то осмысленное перемещение, а не просто повороты в случайную сторону. В дальнейшем на карту можно наносить какую-то более интеллектуальную информацию. Например, отмечать зоны потенциальной опасности(естественно отмечать должен сам робот, а не человек).
Главная проблема, которая возникла - компромисс между стоимостью, функциональностью и трудозатратами. Первоначально хотелось всё собрать на коленке с минимальными затратами денег. Но постепенно стало ясно, что так не бывает: надо чем-то жертвовать. Конечно, если не принимать во внимание стоимость отдельных компонентов, то можно быстро построить достаточно сложную систему, и наконец-то сесть писать алгоритм искусственного интеллекта, но был выбран другой путь: попытаться добиться приемлемых результатов не покупая ничего сильно дорогого.
Главная проблема в составлении карты - вычисление точного положения окружающих предметов. Тут всё упирается в датчики. Самый простой вариант - определять наличие препятствий при помощи микропереключателей, вмонтированных в бампер (срабатывают при столкновении) - выглядит очень примитивно. Порядочный и уважающий себя робот должен всё-таки определять препятствия на расстоянии, не сталкиваясь с ними. Поэтому я такой вариант был сразу отброшен.
Самый лучший вариант датчика - лазерный сканер. Он позволяет всего за 0.1с просканировать окружающее пространство в диапазоне 180 градусов. Только вот стоит он больше €1000.
Другие известные мне варианты - инфракрасный и ультразвуковой измерители. На первый взгляд ультразвуковой показался намного перспективнее. Причин тут несколько: большая зона обнаружения (позволяющая не пропустить потенциальные препятствия), хорошая видимость разных типов поверхностей (инфракрасный, к примеру, почти не видит чёрные предметы).
В итоге был выбран именно ультразвуковой измеритель расстояния.
После многочисленных попыток сделать самодельное шасси, было принято решение всё-таки купить готовое. Используется шасси RP5. О выборе я не пожалел. Вещь, действительно стоящая. Проходимость просто отличная: лежащий на полу мобильный телефон, тапок, и даже предметы покрупнее, шасси без труда переезжает.
Измеритель расстояния самодельный. Подробному описанию измерителя посвящена отдельная статья. Там же приводится схема.
Характеристики не самые лучшие:
Измеритель имеет свой отдельный микроконтроллер (Atmega8), который сам обрабатывает результаты измерений и управляет положением измерителя. Данные передаются по шине I2C.
Измеритель имеет 2 вращательных степени свободы (вращается в горизонтальной и в вертикальной плоскости). Как позже оказалось, вращение в вертикальной плоскости - совершенно лишнее для составление 2D карт.
Для определения пройденного расстояния используются инкрементные энкодеры. Были взяты обычные недорогие энкодеры. Они имеют 24 положения на один оборот.
Энкодеры были поставлены на ведомые колёса робота, таким образом удалось решить проблему возможного проскальзывания (ведомые колёса не будут крутиться при проскальзывании). После подсоединения к шасси, разрешение получилось 6мм. Соответственно погрешность ±3мм. Многовато. Но энокодеры с большим разрешением уже в разы дороже, а устанавливать энкодеры на ведущие шестерни с повышенным количеством оборотов - как-то не хотелось.
Энкодеры очень хорошо определяют пройденное расстояние при движении по прямой, но угол поворота при помощи них определить невозможно.
Поэтому хотелось поставить ещё датчик магнитного поля (или электронный компас). Например KMZ52. Но пока всё руки не дошли.
Контроллер шасси - устройство, взаимодействующее с двигателями, энкодерами и электронным компасом. Сделано оно для разгрузки центрального процессора, и автономного выполнения команд движения. Например шасси посылает команда "ехать прямо 100мм", при этом оно начинает движение, следит за прямолинейностью, скоростью движения, и останавливается в заданном месте. Контроллер шасси также взаимодействует с платой управление по интерфейсу I2C.
Для задач картографии требуется довольно большие вычислительные ресурсы, а также возможность сохранять результаты в постоянную память. Применять обычный микроконтроллер без операционной системы было бы очень затруднительно. Поэтому было принято решение купить готовую плату с процессором ARM9. Главное преимущество состоит в том, что на него можно уже ставить операционную систему (например Linux).
На плате есть USB, Ethernet. Консоль Linux транслируется через COM-порт. Это открывает достаточно широкие возможности: подключение через USB Bluetooth, WiFi, веб камеры, и многого другого. А главное - для большинства оборудования в ядре Linux уже есть драйвера!
Загрузка ОС выполняется с SD карты.
В этом режиме карта не составляется. Робот просто пытается объезжать препятствия. Алгоритм достаточно примитивный. Для того, чтобы робот успевал проводить сканирования в real-time, выполняются всего 2 измерения.
Есть 2 режима дальности:
В этом режиме робот проезжает заданное расстояние, останавливается, выполняет круговое сканирование с заданным шагом угла, затем едет дальше. Время каждого сканирования зависит от шага угла и от количества повторных измерений. Для хорошего распознавания предметов нужен шаг около 6 градусов, при этом полное сканирование выполняется достаточно долго. Надеюсь, что движение по уже составленной карте не потребует таких же длинных остановок.
Реализовано:
Требуется реализовать:
С радостью поделюсь опытом и исходными кодами, если это кому-нибудь понадобится.
Вообще, хотелось бы делать универсальные модули и драйверы, подходящие под разное железо, и разрабатывать их совместно.
Свои замечания и предложения вы можете оставлять при помощи формы обратной связи или оставить комментарии к статье.
Да, видел такой алгоритм. Но я пока завяз с датчиками.
Купил плату MinImu-9 (гироскоп, акселерометр, компас), и пытаюсь разобраться с определением текущего положения робота. Следующее в планах - разобраться с фильтром Калмана. Если я не ошибаюсь, то SLAM как-раз на нём и основывается.
http://dagurobot.com/goods.php?id=131
И я правильно понимаю, что Вы просто берете данные с другой оси гусениц?
Еще интересно какой контроллер используется как умный?
Сергей, спасибо за ваш интерес.
Постараюсь в ближайшее время дополнить статью.
А пока кратко отвечу на ваши вопросы.
Конструкцию колёс лучше всего посмотреть в даташите по RP5. Вряд ли я смогу описать лучше, чем там.
Энкодеры брал самые дешёвые. Паял их на одну плату с двух сторон, эпоксидкой приклеивал плату к корпусу, а с колёсами соединял при помощи термоусадочной трубки. Фотки где-то были, можно выложить как отдельную статью. (Но мне кажется проще купить шасси RP6, там энкодеры уже встроены, хотя я так и не нашёл никаких технических характеристик).
Контроллер шасси собран на контроллере atmega8. Для управления двигателями используется драйвер L293D, но по ощущениям он слабоват, если буду переделывать, то возьму L298, там можно будет ещё и ток измерять.
"Система картографии" слишком обширное понятие.
Для каждой области там свои нюансы.
Вот конкретно для ультразвука лучше всего подходят двумерные векторные карты. Т.е фактически карты нет, есть только набор разных объектов, которые хранят некие координаты.
http://vt-tech.eu/ru/articles/robotic/143-robo-sonar.html
Поделюсь. Только лучше это оформить как отдельную статью.
Постараюсь в ближайшее время сделать, если руки дойдут :)