Библиотека сайта rus-linux.net
Развлекаемся с iRobot Create
Оригинал: Fun with the iRobot Create
Автор: Zach Banks
Дата: 1 мая 2009
Перевод: Александр Тарасов aka oioki
Дата перевода: 12 октября 2009
В мире Linux мало что взаимодействует с физическим миром. У вас есть устройства ввода, с помощью которых вы можете работать с компьютером, но компьютер не может взаимодействовать с вами. Так давайте попробуем соорудить робота, которым он будет управлять. Фирма iRobot, известная своими роботизированными пылесосами Roomba, создали робота для обучения, называется он iRobot Create, он основан на Roomba, и работать с ним чрезвычайно легко. Create обладает простой базой, которую можно с легкостью расширять. Некоторые даже приделывали ноутбук на робота, чтобы он был мобильным, но во многих случаях это плохое решение. Несложно создать беспроводную связь между Linux-компьютером и роботом Create, хотя этот способ официально не описан.
Самый простой способ взаимодействия с Create - посредством последовательного COM-кабеля, который идет в комплекте с роботом. Для некоторых компьютеров потребуется адаптер USB-COM, его можно купить меньше чем за 15 долларов. Логически это будет TTY-линия, например /dev/ttyS0, либо если вы используете USB-адаптер - соединение будет отображаться в файл вроде /dev/ttyUSB0.
Самый простой способ передать команду по последовательному кабелю - воспользоваться терминалом. Существует множество самых разных версий подобных программ. Я пользуюсь gtkterm - терминалом с графическим интерфейсом, но если вам больше нравятся консольные приложения, можно воспользоваться screen и minicom. После установки и запуска gtkterm, нужно выставить правильный порт в Configuration→Port. Порт - это dev-файл, о котором мы говорили выше. Если не уверены какой именно, попробуйте по порядку все. Скорость нужно выставить 57600 бод. Остальные настройки (No parity, 8-bit, 1 stopbit and no flow control) можно оставить как есть. Еще удобно включать Local echo (также в меню Configuration) - при этом можно будет видеть, что вы печатаете.
Рисунок 1. Настройки конфигурации gtkterm
Чтобы проверить конфигурацию, включите питание Create и подключите его к своему компьютеру. Если все нормально, терминал начнет каждую секунду печатать следующие строки:
bat: min 0 sec 11 mV 16699 mA 566 deg-C 21
Если вы не планируете монтировать компьютер на своего робота, тогда вы сразу поймете, что кабель жутко мешает передвижению робота. Для решения этой проблемы нужно сделать беспроводную связь. Хотя 802.11 Wi-Fi стал неотъемлемой частью большинства ноутбуков, но все же является редкостью для встраиваемых систем вроде Create. Другим кандидатом является Bluetooth, также ставший повсеместным. Однако модули Bluetooth сами по себе дороже, часто не поддерживаются в Linux и дальность их действия очень мала. Недавно на сцену вышли модули XBee от компании Maxstream. Они очень похожи на модемы Bluetooth и лучше подходят для таких проектов.
Все детали для нашего проекта можно приобрести в интернет-магазине SparkFun, и приведены в таблице 1. В дополнение к этим деталям, потребуются еще макетная плата, провода и все для пайки.
Таблица. Необходимые детали
Деталь | Описание | Количество | Цена каждой |
WRL-08664 | Модуль XBee | 2 | $24.95 |
WRL-08687 | USB XBee Explorer | 1 | $24.95 |
BOB-08276 | Макетная плата XBee | 1 | $2.95 |
PRT-08272 | Гнездо XBee | 2 | $1.00 |
BOB-08745 | Преобразователь уровня напряжения | 1 | $1.95 |
PRT-00116 | Выводы | 1 | $2.50 |
COM-00526 | Регулятор 3.3В | 1 | $1.95 |
COM-08375 | Фильтрующий конденсатор 0.1 мкФ | 1 | $0.25 |
PRT-08287 | Коннектор DB-25 "папа" | 1 | $0.95 |
Во-первых, нужно настроить два модуля XBee. Сначала включите один в USB XBee explorer и соедините его с компьютером USB-кабелем (USB XBee Explorer - это по сути плата преобразования serial-to-USB, в который включается модуль XBee). Опять же, запустите gtkterm, откройте USB-устройство (скорее всего, /dev/ttyUSB0), и установите скорость передачи 9600 бод. Введите в терминал +++, и модуль должен ответить OK.
Теперь модуль можно начинать настраивать. Введите такую последовательность ATID3330,DH0,DL1,MY0,BD6,WR,CN,
и после каждой запятой модуль будет отвечать OK
. Теперь извлеките этот XBee и вставьте другой. Опять же введите +++ и подождите когда он ответит OK. Однако в этот раз нужно ввести следующее: ATID3330,DH0,DL0,MY1,BD6,WR,CN
. Каждый модуль настраивается на передачу друг другу данных в сети 0x3330
на скорости 57600 бод. Один модуль подключается к компьютеру, а другой ставится на робота. Модули взаимозаменяемы - на робота можно поставить любой из них.
Далее, нужно реализовать схему соединения XBee с собственно роботом. Эта схема соединяет 3.3-вольтовый XBee с 5-вольтовым Create. Спаяйте все в соответствии со схемами на рисунках 2 и 3. Внешний вид готовой макетной платы изображен на фотографиях 4 и 5.
Рисунок 2. Логическая схема соединения XBee и Create
Рисунок 3. Схема пайки на макетной плате
Рисунок 4. Обзор электронных компонентов
Рисунок 5. Внешний вид Create со всеми установленными компонентами
Включите коннектор DB-25 в порт расширения Create, удалив командный модуль, если он есть. Другой модуль XBee в этот момент должен быть подключен к компьютеру и настроен в gtkterm на коммуникацию со скоростью 57600 бод. Как и раньше, включите питание у Create, и если все пройдет удачно, на вашем терминале начнут выводиться строки, а лампочка RX на USB Explorer должна моргать. Если же нет, проверьте все контакты и настройки модулей XBee.
Даже если у вас не получится или если не захотите иметь беспроводную связь, все равно можно управлять Create тем же самым способом. В роботах Create и Roomba реализован протокол iRobot Open Interface (сокращенно OI). На стороне компьютера у нас будет работать Python-скрипт, который будет взаимодействовать с Create с реализацией OI от iRobot на языке Python. Это позволит нам сконцентрироваться на своей задаче управления, не заботясь об опкодах и подобных низкоуровневых вещах. Вам также потребуются Python-модули pySerial и openinterface.py (см. в конце статьи раздел Источники информации). В файле openinterface.py есть маленький баг, из-за которого будет сложно работать с ним в Linux. Самый простой способ его исправить - выполнить эту sed-команду в каталоге с файлом:
$ sed -ie "803s/ - 1//" openinterface.py
Либо вы сами можете удалить " - 1
" на строке 803.
Библиотекой очень легко пользоваться - к примеру, пустить робота вперед на полной скорости можно следующей программой:
import openinterface as oi PORT = "/dev/ttyUSB0" # какой у вас последовательный порт bot = oi.CreateBot(com_port=PORT,mode="full") bot.drive_straight(500) # поехать вперед на полной скорости
Чтобы получить данные сенсоров, нужно сформировать к ним запрос. Если воспользоваться функцией bot.stream_sensors(), робот Create будет обновлять указанные в аргументах сенсоры автоматически каждые 15 миллисекунд. Для прекращения этого действия нужно выполнить функцию bot.stop_streaming_sensors(). Хотя и можно указать, какие конкретно сенсоры нужно запрашивать, но обычно проще всего опрашивать их все.
Управление роботом очень простое. Функция bot.drive() принимает два аргумента: скорость и радиус поворота. Скорость - это целое число в интервале от -500 до 500, определяющая среднюю скорость колес в миллиметрах/секунду. Отрицательные значения обозначают движение назад. Радиус поворота - лежит в пределах от -200 до 200, определяет радиус поворота в миллиметрах. Положительные значения означают поворот налево, а отрицательные - направо. Есть специальные методы, с помощью которых можно ехать вперед и поворачивать корпус одновременно.
Следующая программа заставит робота объезжать препятствия, основываясь на показаниях сенсоров:
bot.stream_sensors(6) # пакет 6 -- все сенсоры while True: # вечный цикл if bot.sensors["bump-left?"]: # столкнулись слева? bot.drive(-500, 10) # устанавливаем нужную скорость bot.wait(5) # едем в течение 5 циклов elif bot.sensors["bump-right?"]: # иначе другое направление bot.drive(500, 10) bot.wait(5) else: bot.drive_straight(500) # иначе просто едем bot.wait() # ограничиваем скорость
Можно также с легкостью задействовать музыкальные функции Create, хранить мелодии можно в 17 звуковых слотах. Для сохранения мелодии нужно воспользоваться функцией bot.define_song(). Первый аргумент - это номер слота, в который нужно сохранить мелодию. По этому же номеру потом можно будет обратиться к записанной мелодии. Остальные аргументы - это ноты, записанные парами (тон,длительность). Длительность задается в 1/64 частях секунды (поэтому 64 будет означать длительность в 1 секунду). Чтобы воспроизвести мелодию, нужно вызвать функцию bot.play_song(). Меня вряд ли можно отнести к музыкальным гениям, и вы наверняка сочините мелодию получше:
bot.define_song(1, # номер мелодии ("G1", 16), # пары нот ("G2", 16), # тон, длительность ("G3", 64), # 64 = 1 секунда ("G9", 16)) # мелодия до 100 нот # ...ляляля... bot.play_song(1)
Чтобы управлять Create с помощью джойстика, можно воспользоваться Python-модулем pygame (подробности API pygame для работы с джойстиком лежат за пределами этой статьи, все это можно прочесть в документации):
import pygame from pygame import locals pygame.init() js = pygame.joystick.Joystick(0) # создать объект джойстик js.init() import openinterface as oi PORT = "/dev/ttyUSB0" # какой у вас последовательный порт bot = oi.CreateBot(com_port=PORT,mode="full") while True: if js.getAxis(0) > 0: turn = 1 - js.getAxis(0) else: turn = -(1 + js.getAxis(0)) bot.drive(js.getAxis(1)*500, turn*200) bot.wait()
Эта программа задействует джойстик (который определяется автоматически) для примитивного управления роботом. Программа составлена таким образом, что при нейтральном положении джойстика робот движется вперед и не вращается.
Что же делать дальше? Все зависит от вас. С аппаратной стороны - можно подключить к роботу дополнительные схемы и управлять им с помощью цифровых сигналов (см. спецификацию на выводы OI). Мы рассмотрели лишь базовый набор функций и немного программирования, остается еще куча возможностей. К примеру, можно превратить робот Create в будильник, который будет бегать по комнате и будить вас своими громкими звуками. Либо можно воспользоваться сенсорами "расстояния" и "угла" и измерять им свою комнату.
Источники информации
- SparkFun Electronics: www.sparkfun.com
- Спецификации iRobot Open Interface: Create%20Open%20Interface_v2.pdf
- Модуль pySerial: pyserial.wiki.sourceforge.net/pySerial
- Модуль openinterface.py: openinterface.py
- Модуль pygame: www.pygame.org
Зак Банкс - экспериментатор, застрявший между софтом и хардом. Он будет рад получить ваши комментарии на zjbanks@gmail.com.