iRobot Сreate #4 – управление движением (акселерометр, голосовое) с Android через ROS


ПРОДОЛЖЕНИЕ и ОКОНЧАНИЕ Создание проекта в ROS, написание subscriber для получения сообщений из узла rosserial и запуска сервисов irobot_create_2_1 — начало здесь далее здесь и еще здесь

Создаем новый проект vp_arduino1

cd ~/ros_pkgs
roscreate-pkg vp_arduino1 std_msgs rospy

Cоздадим файл сообщений Arduino1.msg. Для этого создадим в директории нашего пакета папку msg и в ней файл Arduino1.msg. Файл наполним следующим содержанием:

int16 var1
int16 var2
int16 var3
int16 var4
int16 var5

Установка системы зависимостей и сборка пакета

rosdep install vp_arduino1
rosmake vp_arduino1

Пакет собран.
Теперь пишем код для subscriber на python
Получая сообщения анализируем первый параметр и запускаем сервисы пакета irobot_create
Создаем файл node_arduino_1_1.py:

roscd vp_aruino1
mkdir nodes
cd nodes
touch  node_arduino_1_1.py

Содержимое файла

#!/usr/bin/env python
import roslib; roslib.load_manifest('vp_arduino1')
import rospy
import irobot_create_2_1

from vp_arduino1.msg import Arduino1
from irobot_create_2_1.srv import *

def callback(data):
    rospy.loginfo(rospy.get_name()+"Params %s %s %s %s %s"%(data.var1,data.var2,data.var3,data.var4,data.var5))
    if data.var1==139:
      rospy.wait_for_service('leds')
      try:
        srvLeds = rospy.ServiceProxy('leds', Leds)
        resp1 = srvLeds(data.var2,data.var3,data.var4,data.var5)
        print resp1.success
      except rospy.ServiceException, e:
        print "Service Led failed: %s"%e
    elif data.var1==136:
      rospy.wait_for_service('demo')
      try:
        srvDemo = rospy.ServiceProxy('demo', Demo)
        resp1 = srvDemo(data.var2)
        print resp1.success
      except rospy.ServiceException, e:
        print "Service Demo failed: %s"%e
    elif data.var1==128:
      rospy.wait_for_service('break')
      try:
        srvBreak = rospy.ServiceProxy('break', Break)
        resp1 = srvBreak(data.var2)
        print resp1.success
      except rospy.ServiceException, e:
        print "Service Break-start failed: %s"%e
    elif data.var1==145:
      rospy.wait_for_service('tank')
      try:
        srvTank = rospy.ServiceProxy('tank', Tank)
        resp1 = srvTank(1,data.var3,data.var4)
        print "%s %s %s"%(resp1.success,data.var3,data.var4)
      except rospy.ServiceException, e:
        print "Service Tank failed: %s"%e
    else:
        print "not Services"
def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber("Theme_arduino1", Arduino1, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()

И теперь запускаем робота
Первый терминал

roscore

Второй терминал

rosrun rosserial_python serial_node.py /dev/ttyUSB0

Получаем список тем (топиков)

rostopic list

Список

/Theme_arduino1
/rosout
/rosout_agg

Выдача сообщений в топик Theme_arduino1

rostopic echo Theme_arduino1

при посылке из Android-устройства видим

var1: 139
var2: 8
var3: 153
var4: 170
var5: 180
---
var1: 145
var2: 0
var3: 100
var4: 0
var5: 0
---
var1: 145
var2: 0
var3: 50
var4: 255
var5: 156

Третий терминал — запуск драйвера irobot_create_2_1

rosparam set /brown/irobot_create_2_1/port /dev/ttyACM0
rosrun irobot_create_2_1 driver.py

Четвертый терминал — запуск subscriber

rosrun vp_arduino1 node_arduino_1_1.py

И получение сообщений при посылке из Android-устройства

Результат наблюдаем в терминале
[INFO] [WallTime: 1348674186.519380] /listener_7319_1348674183862Params 139 8 153 170 156
[INFO] [WallTime: 1348674194.157557] /listener_7319_1348674183862Params 145 0 0 0 0
[INFO] [WallTime: 1348674197.132703] /listener_7319_1348674183862Params 145 255 56 0 0
[INFO] [WallTime: 1348674200.168712] /listener_7319_1348674183862Params 145 254 162 0 0
[INFO] [WallTime: 1348674203.193468] /listener_7319_1348674183862Params 145 255 6 255 56
[INFO] [WallTime: 1348674206.212403] /listener_7319_1348674183862Params 145 254 212 254 212
[INFO] [WallTime: 1348674209.231324] /listener_7319_1348674183862Params 145 255 106 0 100
[INFO] [WallTime: 1348674212.261905] /listener_7319_1348674183862Params 145 0 200 0 0

И результат — видео


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

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
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение