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


Продолжение. Начало — Часть 1

Пакет rosbridge

Создан в Университет Брауна, rosbridge был первоначально предназначен для любого не ROS процессов клиента для работы с системой ROS. Rosbridge позволяет внешним клиентам иметь доступ к темам и сервисам ROS (публикация и получение из тем, вызов сервисов). Rosbridge является частью мете-пакета rosbridge_suite, включающего различные дополнительные пакеты для реализации протокола rosbridge.
Установка пакета

sudo apt-get install ros-fuerte-rosbridge-suite

Мне необходимо в браузере иметь изображения с камеры заднего вида и с камер kinect Turtlebot-а, необходимо установить пакет mjpeg_server

sudo apt-get install ros-fuerte-mjpeg-server

Rosbridge клиенты могут быть написаны на любом языке, который поддерживает WebSockets. Библиотеки с открытым источником WebSocket клиента доступны для Python, Java, Android, C и пр. Мы будем использовать Javascript.

8 мая 2013 года получил в рассылке пришло сообщение об официальном запуске сайта RobotWebTools. RobotWebTools представляет собой набор с открытым исходным кодом модули и инструменты для создания веб-приложений робота.

В своем проекте я использовал еще старую javascript-библиотеку ros.js

Библиотека ros.js

Для использования в блоке html-страницы подключаем библиотеку ros.js

<script type="text/javascript" src="ros.js"></script>

Создаем websocket соединение к rosbridge по порту 9090

var con = new Bridge("ws://ip_robot:9090");

Теперь можно получать и публиковать сообщения в ROS
Публикация сообщения в тему — con.publish(topic, msg), например

con.publish('/cmd_vel', {"linear":{"x":1.0,"y":0,"z":0},"angular":{"x":0,"y":0,"z":0}});

Если тема не существует — до отправки сообщений необходимо создать тему — con.advertise(topic, type), например

con.advertise('/turtlebot_servo','std_msgs/Int16');

Чтобы подписаться на получение сообщений из темы — сначала создаем функцию обратного вызова, а затем подписаться на получение сообщений из темы, например:

var get_data1(msg1)
  {alert(msg1);}
var cback1=function(msg1){JSON.stringify(msg1);get_data1(msg1);}
con.subscribe(cback1,"/from_arduino1","stg_msgs/String");

Создание тестовой страницы html-страницы, отправка-получение сообщений из ROS

Создадим простейшую html-страницу, которая создаст websocket-соединение, создадим две темы web_publisher1, web_subscriber1 и протестируем отправку-получение данных в ROS. Добавим на страницу и изображение с камеры нетбука.

Код html-страницы следующий (test1.html)

<html>
<head>
<script src='ros.js'></script>
<script type="text/javascript">
var choice_robot="192.168.0.8";   // ip моего компа с ROS в сети
var con = new Bridge("ws://192.168.0.8:9090");

// получение данных
var get_ros1=function(msg)
  {
  alert(msg);
  document.getElementById("getdata1").value=msg;
  }

con.onOpen=function()
  {
  var cback=function(msg1) {JSON.stringify(msg1),get_ros1(msg1.data);}
    con.subscribe(cback,'/web_subscriber1','std_msgs/String');
  con.advertise('/web_publisher1', 'std_msgs/String');	
  }
//  отправка
function send_ros1() {
  con.publish('/web_publisher1', {'data':document.getElementById("putdata1").value});
  }

</script>
</head>
<body>
<h2 id="start">Rosbridge example</h2>
<h3 id="">Отправка - получение сообщений</h3>
    <form id=formoptions name=formoptions action="javascript:void();" onsubmit="feturn false;">
      
 Получить из темы web_subscriber1 
      <input name=getdata1 id=getdata1>
      
 Отправить в тему web_publisher12
      <input  name=putdata1 id=putdata1>
      <button id='button1' value='send' onclick='send_ros1();'>Отправить</button>
    </form>
</body>
</html>

Запуск
Создаем в одной из папок с проектами ROS (у меня ~/ros_pkgs/drone_teleop) папку www. В ней папку test. Теперь копируем в нее файлы test1.html и ros.js.

Просмотр в терминале (Guake terminal)
0 терминал

$ roscore

1 терминал

$ rosrun rosbridge_server rosbridge.py

2 терминал

$ rosrun roswww webserver.py

Открываем браузер на любом другом компе из сети и набираем в адресной строке http://192.168.0.8:8000/drone_teleop/test/test1.html
(192.168.0.8 — адреса нашего компьютера с ROS)

Смотрим в ROS список тем

$ rostopic list

Появились темы web_subscriber1 и web_publisher1

Попробуем оправить из браузера сообщения. Cмотрим ROS приходящие

$rostopic echo web_publisher1

отправим из ROS сообщение в тему web_subscriber1

$ rostopic pub web_subscriber1 std_msgs/String Привет_браузер

Видим в браузере

Добавим на страницу вывод потокового изображения с web-камеры из ROS
Сначала организуем вывод в ROS потокового изображения с web-камеры.
Установим пакет bosch-drivers

$ sudo apt-get install ros-fuerte-bosch-drivers

Перейдем в пакет usb_cam и создадим launch-файл usb_cam-test1.launch

$ roscd usb_cam
$ cd src
$ sudo touch usb_cam-test1.launch
$ sudo gedit usb_cam-test1.launch

следующего содержания

<launch>
  <node name="usb_cam1" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0"></param>
    <param name="image_width" value="320"></param>
    <param name="image_height" value="240"></param>
    <param name="pixel_format" value="yuyv"></param>
    <param name="camera_frame_id" value="usb_cam"></param>
    <param name="io_method" value="mmap"></param>
  </node>
  <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
    <remap from="image" to="/usb_cam1/image_raw"/>
    <param name="autosize" value="true"></param>
  </node>
</launch>

Запустим launch-файл
3 терминал

$ roslaunch usb_cam usb_cam-test1.launch

В тему /usb_cam1/image_raw публикуются данные image_raw
Должно появиться окошко с потоковым выводом изображения

Для вывода в браузере
изменяем файл test1.html — вставляем одну строку после /form>

<img id_camera_robot src="http://192.168.0.8:8080/stream?topic=/usb_cam1/image_raw">

И запускаем mjpeg_server
4 терминал

$ rosrun mjpeg_server mjpej_server

Перегружаем страницу в браузере и видим потоковое изображение с камеры из ROS, тема /usb_cam1/image_raw ROS

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