30 November 2013

Сервисный робот Tod. Первые шаги вместе с ROS

TOD corporate blog


Добрый день, Хабр. Наша команда занимается разработкой сервисного робота Tod. Мы стремимся к созданию многофункционального робота, который в своих возможностях сможет потягаться с такими флагманами в мобильной робототехники как PR2 Willow Garage. Мы начинаем с малого, но с каждым днем наш робот приобретает новые навыки, оснащается новыми сенсорами. О том, что вообще из себя представляют сервисные роботы, вы можете узнать в нашей предыдущей статье, а сегодня речь пойдет о реализации навигационной системы Tod. Сегодня мы расскажем как научить робота выполнять навигационную задачу определения собственного местоположения на базе колесной одометрии и получать сенсорные данные с ультразвуковых сонаров. Всё это дело будет управляться под операционной системой для роботов ROS (Robot Operating System), которая хорошо зарекомендовала себя в различных робототехнических проектах. Добро пожаловать под кат.

У обывателя слово «робот» скорей всего ассоциируется с умными человекоподобными роботами из фантастических фильмов в духе Терминатора. Чем отличаются настоящие роботы от обычных машин? В первую очередь, роботы обладают автономностью, которая выражается в способности самостоятельно, без вмешательства человека, принимать решения.
Автономный робот для достижения поставленной цели должен уметь решать навигационные задачи. К базовым навигационным задачам можно отнести восприятие окружающей среде на основе интерпретации данных, поступающих с различных видов сенсоров (дальномеры, камеры, GPS-навигатор, специальные маяки и т.д.), планирование маршрута движения и интерактивное взаимодействие с окружающей средой с помощью исполнительных органов, колес и манипуляторов.
В основе качественных навигационных алгоритмов лежит сложная математика, поэтому у многих начинающих робототехников пропадает энтузиазм после столкновения с расчетами якобианов и кватернионов, построением кинематической модели и применением вероятностных алгоритмов. К счастью, на сегодняшний день существует множество робототехнических фреймворков таких, как ROS, Player и Microsoft Robotics Studio, с помощью которых даже новички, обладающие необходимой настойчивостью, смогут использовать в своих проектах сложные навигационные и ИИ алгоритмы.

ROS и навигационный стек


Наша команда неслучайно решила использовать для робота Tod опенсорсный фреймворк Robot Operating System. ROS на сегодняшний день находит применение в робототехнических проектах многих исследовательских групп и компаний. Этот фреймворк предоставляет возможности, сравнимые с функциями целой ОС, включая аппаратные абстракции, управление устройствами на низком уровне, реализацию базовых функций и алгоритмов, передачу сообщений между процессами и менеджер пакетов. Исполняемая в ROS программа представляет собой набор узлов, которые могут обмениваться между собой сообщениями, подписавшись на общую тему. Такие узлы можно независимо реализовывать на языках C++ и Python. ROS полноценно работает под управлением Ubuntu, в частности, мы используем для Tod Ubuntu 12.40 и ROS Groovy. Более подробную информацию о ROS, документацию и хорошие пошаговые руководства можно найти на ros.org.
Для решения навигационных задач ROS предоставляет навигационный стек. В качестве входных данных стек использует данные одометрии (пройденный колесами робота путь) и сенсоров, а на выходе передает роботу команды управления скоростью передвижения. Использование на роботе навигационного стека «из коробки» становится возможным при выполнении некоторых условий:
— Робот по форме должен быть круглым или прямоугольным, а его колеса должны быть неголономными, т.е. движение робота должно осуществляться только вдоль направления вращения колес. Например, колеса автомобиля или велосипеда — неголономные.
— Робот должен предоставить информацию о всех геометрических связях между кинематическими узлами и сенсорами робота. Эта информация задается в URDF модели, а сложные геометрические преобразования из одной системы координат в другую с использованием матриц поворотов, углов Эйлеров и кватернионов может осуществлять узел tf.
— Робот должен посылать сообщения для управления перемещением в формате линейной и угловой скорости.
— Для решения задач определения местоположения и построения карты должен использоваться лазерный дальномер или 3-D сканер. Однако, если несколько схитрить, то можно использовать вместо дорогостоящих сенсоров и другие более дешевые аналоги: сонары или инфракрасные дальномеры. В этом случае, главное соблюдать правильный формат сообщений, которые передаются исполняемому узлу.



На диаграмме представлена общая схема навигационного стека. Текст между стрелками указывает на тип сообщения, которым обмениваются узлы. В этом стеки присутствуют 3 вида узлов:
— Узлы, помещенные в белый прямоугольник предоставляются ROS
— Узлы, помещенные в серые прямоугольники тоже предоставляются ROS, но их использование в стеке не является обязательным
— Узлы, помещенные в бирюзовые прямоугольники, являются аппаратно-зависимыми и их реализация обычно лежит на плечах разработчика.
Теперь, когда требования к использованию навигационного стека ROS известны, можно приступить к его адаптации к нашем роботу Tod.

Base controller и управление перемещением


Base controller — это узел навигационного стека, отвечающий за управление перемещением робота. ROS не предоставляет стандартного base controller'а, поэтому для своего робота необходимо писать собственный узел или брать за основу сторонние опенсорсные решения. Команды управления перемещением робота передаются к base controller в теме cmd_vel в сообщениях типа geometry_msgs/Twist.
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

Вектор linear задает линейную скорость перемещения робота по осям x, y, z, а вектор angular — угловую скорость перемещения по осям x, y, z. Далее эти команды преобразуются в команды управления вращением двигателей, и робот осуществляет перемещение в заданном направлении.
Порядок задания векторов скоростей зависит от кинематики робота. Наш робот Tod оснащен двухколесным дифференциальным приводом на базе двигателей постоянного тока, который позволяет ему перемещаться вперед, назад, по дуге или вращаться на месте. Это означает, что в сообщении geometry_msgs/Twist будет задаваться только линейная скорость по оси x (соответствует движению вперед-назад) и угловая скорость z (соответствует вращению на месте или перемещению по дуге при задании ненулевой линейной скорости).


3-х колесный робот с дифференциальным приводом. Рулевое колесо или шаровая опора обеспечивает роботу устойчивость.

Преобразование этих скоростей перемещения робота в соответствующие скорости вращения двигателей — тривиальная задача по кинематике, требующая некоторых геометрических расчетов.
Низкоуровневую задачу управления вращением двигателем мы поручили Arduino Uno в связке с драйвером Pololu Dual MC33926 Motor Driver Shield, выдающего небходимую мощность для наших 12-ти вольтовых двигателей. После реализации base controller'a можно покататься роботом с помощью клавиатуры и ROS-вского узла turtlebot_teleop, посылающего сообщения geometry_msgs/Twist base controller'у.



Одометрия


Одометрия – самый распространенный метод счисления пути. Суть этого метода заключается в определении позиции робота на основании подсчета инкрементальных оборотов колес относительно любой фиксированной точки на карте. Обычно измерения одометрии производятся оптическими цифровыми энкодерами, закрепленными на колеса или непосредственно на двигатели робота. Tod оснащен цифровыми энкодерами c разрешением 64 импульса на каждый оборот вала двигателя, что соответствует 8384 импульсов на один оборот колеса.


Геометрия одометрии. При заданной позиции робота (x, y, theta) и ширины колесной базы dbaseline требуется рассчитать новую позицию (x', y', theta').

Навигационный стек использует сообщения типа nav_msgs/Odometry для получения данных одометрии.
std_msgs/Header header 
  uint32 seq 
  time stamp 
  string frame_id 
string child_frame_id 
geometry_msgs/PoseWithCovariance pose 
  geometry_msgs/Pose pose 
    geometry_msgs/Point position 
      float64 x 
      float64 y 
      float64 z 
    geometry_msgs/Quaternion orientation 
      float64 x 
      float64 y 
      float64 z 
      float64 w 
  float64[36] covariance 
geometry_msgs/TwistWithCovariance twist 
  geometry_msgs/Twist twist 
    geometry_msgs/Vector3 linear 
      float64 x 
      float64 y 
      float64 z 
    geometry_msgs/Vector3 angular 
      float64 x 
      float64 y 
      float64 z 
  float64[36] covariance

Сообщение geometry_msgs/Pose определяет текущую позицию робота в трехмерном пространстве и ориентацию, которую в случае вращения объекта в трехмерном пространстве будет удобно рассчитывать кватернионами. Уже знакомое нам сообщение geometry_msgs/Twist определяет линейную скорость x и угловую скорость z.
Так как при выполнении вычислений мы имеем дело с несколькими системами координат, то нам понадобится узел tf. Узел tf работая с URDF-моделью робота, берет на себя заботу по выполнению громоздких вычислений преобразования позиции из локальной системы координат робота в глобальную систему координат карты.


Визуализация URDF-модел робота Tod с данными одометрии в симуляторе Rviz.

Сонары


Робот может использовать различные виды сенсоров для получения информации об окружающем мире. Сенсоры сильно различаются по своим характеристикам, имеют свои ограничения, слабые и сильные стороны, поэтому наиболее выгодным считается совместное использование нескольких их видов.
Используя ультразвуковые сонары можно измерять расстояние от объекта до робота. Сонары работают по технологии TOF (time-of-flight). Они испускают звуковой сигнал, который отражается от ближайшего на пути объекта и возвращается в виде эха. Время «полета» сигнала фиксируется, и на его основе рассчитывается расстояние до объекта.


Сонар испускает звуковой сигнал и «слушает» эхо.

Tod использует сонары HC-SR04, поддерживающий диапазон измерения от 0.2 до 5 м с заявленной точностью 0.03 м. Угол обзора одного HC-SR04 составляет 30 градусов, и если разместить несколько сонаров рядом, то можно получить больший угол обзора. 3 сонара, размещенные на передней стороне Tod обеспечивают угол обзора 90 градусов.



Навигационный стек ROS может использовать данные различных видов сенсоров для получения одометрии, построения карты помещения или объезда препятствий. Теоретически есть возможность использовать сонары для построения карты помещения, ведь 12 или более сонаров дают угол обзора в 360 градусов и представляют более дешевую замену дорогостоящим лазерным дальномерам. Tod для построения карты использует Kinect, который по многим сенсорным характеристиками превосходит сонары. Однако, это не повод сбрасывать сонары со счета. Kinect закреплен на роботе достаточно высоко, что не позволяет видеть происходящего прямо под колесами. Сонары захватывают эту слепую зону, тем самым оказываясь полезными в решении задач планирования пути и объезда препятствий.
Как было сказано раннее, навигационный стек поддерживает работу только с лазерным сенсором и 3-D сканером. Это ограничение можно обойти, представив систему сонаров в виде фейкового 3-D сканера. 3-D сканер использует сообщение sensor_msgs/PointCloud, описывающее облако точек в трехмерном пространстве.
std_msgs/Header header 
  uint32 seq 
  time stamp 
  string frame_id 
geometry_msgs/Point32[] points 
  float32 x 
  float32 y 
  float32 z 
sensor_msgs/ChannelFloat32[] channels 
  string name 
  float32[] values

Сенсорные данные сонаров можно представить в таком формате, задав каждую точку облака в виде координат x, y и координаты z равной 0. При этом на каждый сонар можно задать несколько таких точек, что позволяет повысить плотность облака. Вот так выглядит визуализация сенсорных данных сонаров Tod.


Визуализация сенсорных данных сонара в Rviz.

Спасибо за внимание, на сегодня это всё. В следующей статье мы продолжим рассказывать о возможностях навигационного стека ROS на примере нашего подопытного: подключим к Tod Kinect, построим с его помощью карту квартиры, научим планировать маршрут и объезжать препятствия.
Tags:ROSодометриясонары
Hubs: TOD corporate blog
+21
16.4k 68
Comments 24
Top of the last 24 hours