Удаленное управление Turtlebot через браузер джойстиком, голосом, с помощью Kinect. Часть 1


Имеется в наличии работающий Turtlebot (ROS fuerte) — немного измененный.
Есть желание построить карту помещения и управлять движением голосом («Иди на кухню», «иди в зал», «на место» и т.д.) и удаленно.
А пока — промежуточная задача — добавить камеру заднего вида (USB на поворотной платформе) и управлять камерой и движением робота через браузер с рабочего места, и управление не простое а с помощью:
— голоса,
— джойстика,
— датчика kinect.

Подключение камеры

Камера подключена к контроллеру Arduino, Arduino общается с ROS с помощью библиотеки rosserial, примеры использования здесь и здесь.

Установка rosserial

sudo apt-get install ros-fuerte-rosserial
rosdep install rosserial_arduino
rosmake rosserial_arduino

Пишем скетч на Arduino, который будет получать сообщения из ROS из топика turtlebot_servo1 (тип std_msgs/Int16). Один байт — угол поворота первой сервы, второй — угол поворота второй сервы.
Используется библиотека ros.h(папку ros_lib из /opt/ros/fuerte/stacks/rosserial/rosserial_arduino/librariesв папку libraries Arduino) и Servo.h.
Для визуализации получаемых данных добавил экран WH0802.
Код скетча

#include <Servo.h>

Servo myservo1,myservo2;

/*  подключение WH0802 к arduino
 * LCD RS - pin 12
 * LCD Enable - pin 11
 * LCD D4 - pin 5
 * LCD D5 - pin 4
 * LCD D6 - pin 3
 * LCD D7 - pin 2
 * LCD R/W - GND
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 */

#include <LiquidCrystal.h>

// инициализация библиотеки
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// rosserial

#include <ros.h>
#include <std_msgs/Int16.h>
#include <std_msgs/Float32.h>

ros::NodeHandle  nh;
void messageCb( const std_msgs::Int16& toggle_msg){
  digitalWrite(13, HIGH-digitalRead(13));   // blink the led
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(lowByte(toggle_msg.data));
  lcd.setCursor(0, 1);
  lcd.print(highByte(toggle_msg.data));
  myservo1.write(lowByte(toggle_msg.data));
  myservo2.write(highByte(toggle_msg.data));

  }

ros::Subscriber sub("turtlebot_servo", &messageCb );

void setup() {
  lcd.begin(8, 2);
  pinMode(13, OUTPUT);
  nh.initNode();
  nh.subscribe(sub);
  lcd.setCursor(4, 0);
  lcd.print("start");
  myservo1.attach(8);
  myservo2.attach(9);
}

void loop() {
  nh.spinOnce();
  delay(1000);
}

Проверяем:

1 монитор

roscore

2 монитор

rosrun rosserial_python serial_node.py /dev/ttyACM0

3 монитор — отправка данных в тему turtlebot_servo

(1 серва — 90, 2 серва — 0):

rostopic turtlebot_servo std_msgs/Int16 90

или, например (1 серва — 45, 2 серва — 100):

rostopic turtlebot_servo std_msgs/Int16 25645

Смотрим документацию по iRobotCreate:
сервоприводы питание — вывод 10 iRobotCreate
Arduino питание — вывод 9 iRobotCreate
GND — вывод 14 iRobotCreate

Далее — Часть 2. Отправка-получение сообщений в ROS из браузера через rosbridge


4 комментария на «“Удаленное управление Turtlebot через браузер джойстиком, голосом, с помощью Kinect. Часть 1”»

  1. Доброго времени суток. Спасибо за статью. Я на конец сдвинулся с мертвой точки. Но не могли бы вы подробно рассказать как подключить библиотеки ROS в ArduinoIDE? У меня при компиляции скетча выходит ошибка:

    In file included from /opt/ros/groovy/include/ros/time.h:53,
    
                     from /home/milinsky/arduino-1.0.4/libraries/ros/ros.h:38,
    
                     from sketch_may14a.ino:25:
    /opt/ros/groovy/include/ros/platform.h:63: error: ‘ros::get_environment_variable’ declared as an ‘inline’ variable
    /opt/ros/groovy/include/ros/platform.h:63: error: ‘string’ is not a member of ‘std’
    /opt/ros/groovy/include/ros/platform.h:63: error: ‘str’ was not declared in this scope
    /opt/ros/groovy/include/ros/platform.h:63: error: expected primary-expression before ‘const’
    /opt/ros/groovy/include/ros/platform.h:63: error: initializer expression list treated as compound expression
    /opt/ros/groovy/include/ros/platform.h:63: error: expected ‘,’ or ‘;’ before ‘{’ token
    sketch_may14a:58: error: expected `}' at end of input

    Заранее спасибо!

    • Я делал так
      Сначала
      sudo apt-get install ros-fuerte-rosserial
      rosdep install rosserial_arduino
      rosmake rosserial_arduino
      Затем папку /opt/ros/fuerte/stacks/rosserial/rosserial_arduino/ros_lib
      переносил в папку libraries Arduino директории
      Если не создавать пользовательские типы сообщений из ROS — то все должно работать
      если создавать свои типы сообщений, то посмотреть — расписано как делается в этом топике
      https://robocraft.ru/blog/1039.html
      надо попробовать еще раз внимательно по шагам и все получится

  2. Поставил Fuerte. rosserial_arduino собрался без проблем. Библиотеки подгрузил в IDE. Теперь появляется следующая ошибка:

    В файле, включенном из /home/milinsky/arduino-1.0.4/libraries/ros_lib/ros.h:39,
                     из sketch_may16a.ino:25:
    /home/milinsky/arduino-1.0.4/libraries/ros_lib/ArduinoHardware.h:38:22: ошибка: WProgram.h: Нет такого файла или каталога
    

    Файл WProgram.h нигде не нашел. Помогите пожалуйста.

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

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