📖
Arduino + ROS
  • О методичке
  • 1 Введение в ROS
    • Проблемы современной робототехники
    • История ROS
    • Что такое ROS, основные задачи
    • Устройство мобильного робота
    • Почему Linux для роботов?
    • Подготовка рабочего места
  • 2 Linux. Основы командной строки.
    • Команды терминала Linux
    • Протокол SSH
    • Пользователи и их права
  • 3 Основы ROS
    • Введение
    • Базовые понятия ROS
    • Сообщения
    • Topic
    • Service
    • Action
    • Стандарты ROS
    • Установка и запуск ROS
    • Практика с Turtlesim
  • 4 Работа с Arduino
    • Arduino и ROS
    • Создание издателя
    • Создание подписчика
Powered by GitBook
On this page
  • Робот с дифференциальным приводом
  • Запись в топик
  • Получение данных
  1. 3 Основы ROS

Практика с Turtlesim

PreviousУстановка и запуск ROSNextArduino и ROS

Last updated 1 year ago

Теперь, для того чтобы немного лучше понять прочитанное ранее, давайте немного поработаем ROS. Делать это можно используя встроенный симулятор.

Turtlesim - это очень простой симулятор робота, который может перемещаться в двухмерном пространстве. Он удобен для того, чтобы освоить базовые принципы управления такими роботами.

Робот с дифференциальным приводом

В программе turtlesim мы можем эмулировать робота с так называем дифференциальным приводом. На таком роботе на одной оси установлены два мотора, которые могут вращаться в любом направлении.

Если у робота оба мотора вращаются в одном направлении, то такой робот едет прямо вперед. Если моторы вращаются на разные стороны, робот поворачивается на месте.

Если скорости вращения ведущих колес разные, то робот будет выполнять поворот в ту сторону, в которой скорость вращения ведущего колеса меньше по отношению ко второму ведущему колесу.

Любой робот или другой объект в пространстве имеет шесть степеней свободы (DOF). Первые три степени свободы - это координаты робота в пространстве (x,y,z). Остальные три степени свободы относятся к ориентации робота в пространстве. Это такие значения, как крен, тангаж и рыскание.

Робот с дифференциальным приводом перемещается в двухмерной плоскости (2D) (робот не может летать), и его положение в любой момент можно описать двумя координатами Х и Y, лежащими в горизонтальной плоскости. При этом курс робота обозначается как θ (theta). Этих данных вполне достаточно, чтобы описать положение робота с дифференциальным приводом.

Запись в топик

Управляя перемещением робота в пространстве, в большинстве случаев используют схему управления скоростями по степеням свободы. Мы передаем роботу скорости, которые мы хотим, чтобы он "выполнил", и робот начинает движение с заданной скоростью. При этом скорости могут как быть "линейные", то есть скорости по осям X Y Z, так и угловые для задания вращения.

Если мы передадим нулевые скорости, то робот должен остановиться.

Для такой системы управления в ROS уже создано стандартное сообщение geometry_msgs/Twist

rosmsg info geometry_msgs/Twist
===
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

Для нашего дифференциального робота актуальными являются всего два значения - это линейная скорость по оси робота X linear.x (скорость движения робота вперед) и угловая скорость вращения вдоль по оси Z angular.z. Других степеней свободы дифференциальный робота не имеет. Но, например, коптер имеет все доступные степени свободы.

Попробуем управление робота.

Если не запущен, то на забывайте, запустите команду roscore & Как мы помним знак & запускает ее в фотоном режиме, по этому если после системых сообщений нажать еще раз ввод - она освободит терминал.

Запустите команду rostopic list

Вы увидите что у вас существуют два основных топика:

/rosout /rosout_agg

Это служебные топики которые существуют всегда пока запущен ROS

Теперь запустим симулятор turtlesim, запустите команду

rosrun turtlesim turtlesim_node

Теперть откройте новый терминал (в этом вы запустили программу симулятора и он "занят")

В нем снова запустите команду rostopic list

Вы увидите что у вас появилось три новых топика:

rostopic list
===
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

Топик /turtle1/cmd_vel Отвечает за перемещение, давайте публикуем в него данные со скоростями и посмотрим, что происходит.

Установим линейную скорость на 0.5 м/с и угловую 1 рад/с. и будем публиковать данные с частотой 10 герц (параметр -r 10).

Важно! Вам не надо перебивать всю команду которая написана внизу! Вы набираете:

rostopic pub /t

после чего нажимаете TAB и линукс дополнит строку до

rostopic pub /turtle1/

он сделал так потому что у вас дальше есть 3 разных топика, поскольку мы хотим писать в cmd_vel то необходимо добавить пару букв

rostopic pub /turtle1/cm

снова нажать TAB, линукс дополнит до

rostopic pub /turtle1/cmd_vel

Дальше, нажав два раза TAB линукс дополнит все остальные параметры до вида как приведен ниже. Важно понимать что не смотря на форматирование это одна строка и перемещаться по ней можно только стрелками вправо и влево.

Продолжим. Параметр -r 10 означающий публикацию данного сообщения с частотой 10 герц дописываем в конце строки.

Внесем значения скоростей:

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 0.5
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0" -r 10

Черепашка начнет движение по окружности. Для остановки публикации нажмите Ctrl+C - эта комбинация клавиш прекратит работу программы публикации.

Теперь если нажать стрелочку вверх у терминал вам предложит снова только что введенную команду. Поменяйте параметры на свое усмотрение - понаблюдайте за поведением черепахи в симуляторе.

Получение данных

Мы смогли управлять перемещением робото, публикуя сообщения в его управляющий топик. Следующий важный вопрос - это получение данных из топика, например о его положении (Одометрии).

Одометрия (Odometry — от греческих слов hodos («перемещение», «путешествие») и metron («мера», «измерять»)) — использование данных о движении приводов (колес) для оценки перемещения. Стандартной схемой определения одометрии робота является использование энкодеров, считывающих угол поворота колёс.

Зная радиус колес, скорость вращения и геометрию рамы робота, мы можем оценить путь пройденный роботом. Симулятор turtlesim "рассчитывает" такие данные, и мы можем их получить.

Данные о положении черепахи в симуляторе доступны в топике /turtle1/pose тип сообщения turtlesim/Pose. Выведем эти данные.

Запустим робота в какое либо движение (как мы это делали выше)

Откроем новый терминал, и запустим в нем команду

rostopic echo /turtle1/pose

===
x: 9.80225086212
y: 6.08695411682
theta: -1.66393887997
linear_velocity: 0.0
angular_velocity: 0.0

Если робот двигается, то мы увидим, что данные меняются.

Это практический пример того как устроено взаимодействие в ROS - вы пишите сообщение с параметрами в топик - устройство его исполняет. Такого же поведения вам необходимо будет добиться для своих устройств собранных на базе Arduino. Об этом в следующей главе.

Видео иллюстрирующее написанное выше