# Практика с Turtlesim

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

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

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

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

![](https://368069091-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOSXnrt0c9kcKOFr9q6qb%2Fuploads%2FwGqLTcjRjpk7Sn5fTkXp%2Frobo_dif.png?alt=media)

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

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

Любой робот или другой объект в пространстве имеет шесть степеней свободы (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`. Других степеней свободы дифференциальный робота не имеет. Но, например, коптер имеет все доступные степени свободы.&#x20;

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

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

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

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

/rosout\
/rosout\_agg

&#x20;Это служебные топики которые существуют всегда пока запущен 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).

{% hint style="info" %}
**Важно!** Вам не надо перебивать всю команду которая написана внизу! Вы набираете:

rostopic pub /t&#x20;

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

`rostopic pub /turtle1/` &#x20;

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

`rostopic pub /turtle1/cm`&#x20;

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

rostopic pub /turtle1/cmd\_vel&#x20;

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

{% endhint %}

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

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

```
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 - эта комбинация клавиш прекратит работу программы публикации. &#x20;

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

## Получение данных&#x20;

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

> **Одометрия** (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
```

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

{% hint style="info" %}
**Это практический пример того как  устроено взаимодействие в ROS - вы пишите сообщение с параметрами в топик - устройство его исполняет. Такого же поведения вам необходимо будет добиться для своих устройств собранных на базе Arduino.   Об этом в следующей главе.**
{% endhint %}

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

{% embed url="<https://www.youtube.com/watch?v=qCzxlS3jmdM>" %}
