Пакет симуляции Turtlesim

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. Других степеней свободы дифференциальный робота не имеет. Но, например, коптер имеет все доступные степени свободы. Попробуем управление робота.

Запусти симулятор turtlesim

rosrun turtlesim turtlesim_node

Найдем топик управления

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

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

Установим линейную скорость на 0.5 м/с.

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: 0.0" -r 10

Черепашка начнет движение прямолинейно по направлению оси X робота.

Усложним пример, добавим угловую скорость.

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

Черепашка начнет движение по окружности.

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

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

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

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

results matching ""

    No results matching ""