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<std::string>(“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://

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

RSS свернуть / развернуть
+
+1
супер! :) какие планируются следующие шаги?
avatar

noonv

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

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

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

mishmash

  • 11 июня 2012, 21:34
+
+1
будем надеяться, что всё получится :)
avatar

noonv

  • 11 июня 2012, 21:38

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