Turtlebot: как научить Румбу общаться с компьютером


Сегодня мы продолжили наше исследование Румбы. В прошлый раз мы научились управлять ей при помощи Arduino. Следующим шагом мы решили попробовать поуправлять Румбой непосредственно с компьютера.

Однако мы сразу же столкнулись с проблемой: мы не можем передавать сигнал непосредственно по сериал-порту на Румбу, т. к. от компьютера по Rx идёт 12 В, а Румба просит 5 В. Нужен специальный преобразователь. Не найдя такового под рукой, мы, конечно же, решили воспользоваться Arduino. Arduino легко справляется с этой задачей.

Т.е. мы соединили Ардуино с Румбой так же, как описано в прошлой статье. А Ардуино через USB подключили к компьютеру. Чтобы отправленные нами сигналы попадали на Румбу, мы залили на Ардуино код, который просто берёт любой отправленный на Rx сигнал и переправляет его на Румбу:


#include <SoftwareSerial.h>

SoftwareSerial myserial(10, 11);

void setup() {
    Serial.begin(19200);
    myserial.begin(19200);
}

void loop() {
	if(Serial.available() > 0) {
		byte b = Serial.read();
		myserial.write(b);
	}

	if(myserial.available() > 0) {
		byte b = myserial.read();
		Serial.write(b);
	}
}

Кстати, в setup, думаю, можно дописать специальную команду, указанную в спецификации к Roomba SCI (он же Roomba ROI) на стр.2 (METHOD 2), которая трижды подаёт и убирают напряжение с dd-пина с периодом от 50 до 500 мс. Это позволит Румбе перейти в режим работы на скорости 19200. Тогда setup будет выглядеть так:

void setup() {

	Serial.begin(19200);
	myserial.begin(19200);

	pinMode(2, OUTPUT);

	//Wake up
	digitalWrite(2, LOW);
	delay(100);
	digitalWrite(2, HIGH);
	delay(2000);

	//Change to 19200 baud rate
	for(int i = 0; i < 3; i++){
		digitalWrite(2, LOW);
		delay(250);
		digitalWrite(2, HIGH);
		delay(250);
	}
}

После всего этого мы написали на Python код (см. ниже), который отправляет серии байтовых команд на румбу, как описано в спецификации к Roomba SCI на стр.9.

Скажем, команда старт — 128 — в 16-ричной системе равна 80. Её мы и подаём первой. Скорость мы сделали равной 200 мм/с (первые два байта после команды \x89 означают скорость вращения колёс, вторые — радиус поворота вокруг оси). Вообще, максимальная скорость, как видно из спецификации — 500 мм/с . Т.е. за секунду Румба может проехать полметра. Вот, собственно, сам код:

import serial
import time

ser = serial.Serial(‘/dev/ttyACM0’, 19200, timeout=0.1)

print “Starting…”
ser.open()
time.sleep(3)

if(ser.isOpen()):
	#start
	ser.write(“\x80”)
	time.sleep(0.5)
	#control
	ser.write(“\x82”)
	time.sleep(0.5)
	#move forvard
	ser.write(“\x89\x00\xc8\x80\x00”)
	time.sleep(1)
	#move backward
	ser.write(“\x89\xff\x38\x80\x00”)
	time.sleep(1)
	#turn right
	ser.write(“\x89\x00\xc8\x00\x01”)
	time.sleep(1)
	#turn left
	ser.write(“\x89\x00\xc8\xff\xff”)
	time.sleep(1)
	#stop
	ser.write(“\x00\x00\x00\x00\x00”)
	time.sleep(1)
	#power off
	ser.write(“\x85”)
else:
	print “Something wrong :(“

print “That’s all”
ser.close()

Обратите внимение, что в serial выбран порт ttyACM0. У вас, возможно, будет ttyS0 (если ваша Ардуино работает через COM-порт). Ну или, в зависимости от ОС, может быть что-нибудь ещё.

Также мы обнаружили важную особенность работы через USB-порт (в отличие от COM-версий Ардуино): этот порт инициализируется около трёх секунд. Поэтому всё, что отправляется в это вермя, Румба просто не может прочитать. В том числе и команду контроля (ser.write(“\x82”)). То есть если убрать time.sleep(3) после ser.open(), то Румба не поедет!

После запуска этого кода наша Румба станцевала маленький, но очень красивый танец.

Итак, мы научились подавать на Румбу сигналы с компьютера. Этого вполне достаточно, чтобы экспериментировать с лекциями С. Трана или собрать боевого робота:

Фото взято отсюда

UPD: немного подкорректировал статью под USB-версию Ардуино (CraftDuino, FreeDuino или Arduino UNO), так как она более распространена


0 комментариев на «“Turtlebot: как научить Румбу общаться с компьютером”»

  1. отлично! правда, я писал программу управления на С++, а в остальном — прямо один в один — даже такую же фотку румбы с ножом хотел использовать 🙂

    • Здорово 🙂
      Может, имеет смысл добавить твой код на C++ к этой статье?

      На подходе ещё одна статья — на этот раз уже про ROS. Написали тестовый ROS-node для управления Roomba.

    • я уже включил этот код в состав своего кроссплатформенного мини-фреймворка заточенного для роботов 🙂
      в ближайшее время постараюсь написать краткую заметку об этом и выложить наработки 🙂

  2. Здорово! Тоже хочу сделать своего TurtleBot’а, у меня как раз все компоненты есть: румба, подаренная на день рождения, и кинект от иксбокса

    • Хорошо.

      Мы написали три поста по работе с румбой.

      Планируем выложить третий, окончательный, в котором будет туториал по сборке и установке ПО для создания тёртлбота. Правда, к сожалению, уже неделю всё время съедают другие проекты.

      Надеюсь, к концу этой недели сделаем и выложим.

      Если у тебя будут какие-нибудь результаты, пиши сюда в комментарии, будем очень признательны 🙂

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

Arduino

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

Разделы

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

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

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

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