Turtlebot: ROS и Roomba


Итак, мы уже научились управлять Румбой с Arduino и с компьютера. Но нам этого мало. Мы хотели бы делать это при помощи ROS. Это, как нам кажется, ещё на один шаг приблизит нас к реализации Turtlebot.

Кстати, хороший туториал для работы с ROS, а также поэтапный процесс установки, можно найти на официальном сайте. Русскую версию туториалов можно найти здесь.

Итак, сначала мы подключили компьютер к Румбе таким образом, как это было показано в предыдущем посте (т. е. через Arduino). Далее, мы скачали и сбилдили два росовских пакета: cereal_port и roomba_500_series. Именно в такой последовательности, так как пакет roomba_500_series имеет зависимости от cereal_port.

Наберите в терминале:

    cd ~/ros_workspace
    svn co http://isr-uc-ros-pkg.googlecode.com/svn/stacks/serial_communication/trunk/cereal_port/
    cd cereal_port
    make
    cd ..
    svn co http://isr-uc-ros-pkg.googlecode.com/svn/stacks/roomba_robot/trunk/roomba_500_series/

Однако перед тем как билдить roomba_500_series, убедитесь , что у вас правильно выставлен порт передачи данных и режим скорости передачи данных. Для этого откройте файл roomba500_lightweigh.cpp, который находится в пакете roomba_500_series в папке src.

Наберите в терминале:

    roscd roomba_500_series
    cd src
    gedit roomba500_lightweight.cpp

Найдите в нём строчку:

n.param(“roomba/port”, port, “/dev/ttyUSB0”);

и исправьте на то, что вам подходит. В нашем случае порт был “/dev/ttyACM0″.

Далее, мы исправили скорость передачи данных. Её можно найти в файле OpenInterface.cpp в том же пакете по пути src/IRobot/ .

Наберите в терминале:

    roscd roomba_500_series
    cd src/iRobot
    gedit OpenInterface.cpp

Найдите метод

int irobot::OpenInterface::openSerialPort(bool full_control)
{
    try{ serial_port_->open(port_name_.c_str(), 115200); }
    catch(cereal::Exception& e){ return(-1); }
    this->startOI(full_control);
    return(0);
}

И исправьте 115200 на нужную вам скорость. В нашем случае — это 19200.

В этом же методе добавьте после строчки «catch …» sleep(3), чтобы он выглядел так:

// Open the serial port
int irobot::OpenInterface::openSerialPort(bool full_control)
{
	try{ serial_port_->open(port_name_.c_str(), 19200); }
	catch(cereal::Exception& e){ return(-1); }
	sleep(3);
	this->startOI(full_control);

	return(0);
}

Это из-за проблемы, о которой мы упоминали в прошлой статье: для инициализации ttyACM-порта, нужно около трёх секунд. Вы можете этого не делать, если у вас COM-версия Arduino.

Итак, всё готово. После этого мы отбилдили пакет roomba_500_series. Запустили нод roomba500_lightweight.

Наберите в терминале:

roscore

В новом окне терминала:

    roscd roomba_500_series
    make
    rosrun roomba_500_series roomba500_light_node

Убедились, что в терминале пишется строка «Connected to Roomba» (это значит, что физически что-то воткнуто в нужный порт) и не пишется “Could not retrieve sensor packets.” (это значит, что скорость передачи данных настроена правильно, т.е. Rx и Tx сигналы доходят в нужном виде).

Нод roomba500_lightweight считывает сообщения типа geometry_msgs::Twist, которые приходят на топик /cmd_vel, и публикует сообщения типа nav::Odometry на топик /odom. Нас интересовало лишь первое. Т.е. нужно было написать такой нод, который бы публиковал в топик /cmd_vel сообщения нужного вида. Что мы и сделали.

Нод можно взять здесь. Отбилдите его и запустите параллельно уже запущенному ноду roomba500_light_node

    cd ~/ros_workspace
    svn co http://mishmash.googlecode.com/svn/trunk/ros/turtlebot/roomba_control/
    cd roomba_control
    make
    rosrun roomba_control test_moving

После этого румба должна сделать несколько па (проехать вперёд, назад, повернуться влево, повернуться вправо и остановиться).

Если вы откроете файл src/test_moving.cpp в пакете roomba_control, то увидите, что упрвление довольно простое.

    roscd roomba_control
    cd src
    gedit test_moving.cpp

В сообщении Twist используются только два параметра:

  1. linear.x — линейная скорость Румбы (от -1 полный назад 500мм/с до 1 — полный вперёд — 500мм/с)
  2. angular.z — угловая скорость румбы

Таким образом, мы вплотную подобрались к вопросу, как же сделать Turtlebot из Roomba.

UPD: Обратите внимание, что в строках типа «svn co http://mishmash.googlecode.com/svn/trunk/ros/turtlebot/roomba_control/» в начале URL должно идти «http://», но при отображении http куда-то проглатывается. Постараюсь с этим разобраться. Пока прошу при наборе команды в терминале дописывать в начало http://


0 комментариев на «“Turtlebot: ROS и Roomba”»

    • Спасибо 🙂
      Собственно, планируется завершающий шаг — подключение kinect, настройка стека Turtlebot, сборка всей конструкции (мы уже выпилили крышки и крепления для неё), ну и запуск.

      Надеюсь, получится.

      Пока небольшие проблемки с установкой тёртлботовского стека под Ubuntu 12.04

    • будем надеяться, что всё получится 🙂

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение