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), так как она более распространена

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

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

noonv

  • 9 июня 2012, 06:33
+
+2
Здорово :)
Может, имеет смысл добавить твой код на C++ к этой статье?

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

mishmash

  • 9 июня 2012, 06:39
+
+2
я уже включил этот код в состав своего кроссплатформенного мини-фреймворка заточенного для роботов :)
в ближайшее время постараюсь написать краткую заметку об этом и выложить наработки :)
avatar

noonv

  • 9 июня 2012, 06:45
+
+2
Здорово! Тоже хочу сделать своего TurtleBot'а, у меня как раз все компоненты есть: румба, подаренная на день рождения, и кинект от иксбокса
avatar

lisnake

  • 21 июня 2012, 11:33
+
+1
Хорошо.

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

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

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

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

mishmash

  • 21 июня 2012, 17:57

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