Практика с Turtlesim
Last updated
Last updated
Теперь, для того чтобы немного лучше понять прочитанное ранее, давайте немного поработаем ROS. Делать это можно используя встроенный симулятор.
Turtlesim - это очень простой симулятор робота, который может перемещаться в двухмерном пространстве. Он удобен для того, чтобы освоить базовые принципы управления такими роботами.
В программе turtlesim
мы можем эмулировать робота с так называем дифференциальным приводом. На таком роботе на одной оси установлены два мотора, которые могут вращаться в любом направлении.
Если у робота оба мотора вращаются в одном направлении, то такой робот едет прямо вперед. Если моторы вращаются на разные стороны, робот поворачивается на месте.
Если скорости вращения ведущих колес разные, то робот будет выполнять поворот в ту сторону, в которой скорость вращения ведущего колеса меньше по отношению ко второму ведущему колесу.
Любой робот или другой объект в пространстве имеет шесть степеней свободы (DOF). Первые три степени свободы - это координаты робота в пространстве (x,y,z). Остальные три степени свободы относятся к ориентации робота в пространстве. Это такие значения, как крен, тангаж и рыскание.
Робот с дифференциальным приводом перемещается в двухмерной плоскости (2D) (робот не может летать), и его положение в любой момент можно описать двумя координатами Х и Y, лежащими в горизонтальной плоскости. При этом курс робота обозначается как θ (theta). Этих данных вполне достаточно, чтобы описать положение робота с дифференциальным приводом.
Управляя перемещением робота в пространстве, в большинстве случаев используют схему управления скоростями по степеням свободы. Мы передаем роботу скорости, которые мы хотим, чтобы он "выполнил", и робот начинает движение с заданной скоростью. При этом скорости могут как быть "линейные", то есть скорости по осям X Y Z, так и угловые для задания вращения.
Если мы передадим нулевые скорости, то робот должен остановиться.
Для такой системы управления в ROS уже создано стандартное сообщение geometry_msgs/Twist
Для нашего дифференциального робота актуальными являются всего два значения - это линейная скорость по оси робота X linear.x
(скорость движения робота вперед) и угловая скорость вращения вдоль по оси Z angular.z
. Других степеней свободы дифференциальный робота не имеет. Но, например, коптер имеет все доступные степени свободы.
Попробуем управление робота.
Если не запущен, то на забывайте, запустите команду roscore &
Как мы помним знак & запускает ее в фотоном режиме, по этому если после системых сообщений нажать еще раз ввод - она освободит терминал.
Запустите команду rostopic list
Вы увидите что у вас существуют два основных топика:
/rosout /rosout_agg
Это служебные топики которые существуют всегда пока запущен ROS
Теперь запустим симулятор turtlesim, запустите команду
rosrun turtlesim turtlesim_node
Теперть откройте новый терминал (в этом вы запустили программу симулятора и он "занят")
В нем снова запустите команду rostopic list
Вы увидите что у вас появилось три новых топика:
Топик /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 герц дописываем в конце строки.
Внесем значения скоростей:
Черепашка начнет движение по окружности. Для остановки публикации нажмите Ctrl+C - эта комбинация клавиш прекратит работу программы публикации.
Теперь если нажать стрелочку вверх у терминал вам предложит снова только что введенную команду. Поменяйте параметры на свое усмотрение - понаблюдайте за поведением черепахи в симуляторе.
Мы смогли управлять перемещением робото, публикуя сообщения в его управляющий топик. Следующий важный вопрос - это получение данных из топика, например о его положении (Одометрии).
Одометрия (Odometry — от греческих слов hodos («перемещение», «путешествие») и metron («мера», «измерять»)) — использование данных о движении приводов (колес) для оценки перемещения. Стандартной схемой определения одометрии робота является использование энкодеров, считывающих угол поворота колёс.
Зная радиус колес, скорость вращения и геометрию рамы робота, мы можем оценить путь пройденный роботом. Симулятор turtlesim "рассчитывает" такие данные, и мы можем их получить.
Данные о положении черепахи в симуляторе доступны в топике /turtle1/pose
тип сообщения turtlesim/Pose
. Выведем эти данные.
Запустим робота в какое либо движение (как мы это делали выше)
Откроем новый терминал, и запустим в нем команду
rostopic echo /turtle1/pose
Если робот двигается, то мы увидим, что данные меняются.
Это практический пример того как устроено взаимодействие в ROS - вы пишите сообщение с параметрами в топик - устройство его исполняет. Такого же поведения вам необходимо будет добиться для своих устройств собранных на базе Arduino. Об этом в следующей главе.
Видео иллюстрирующее написанное выше