Управление реальным роботом без обратной связи в ROS (часть 4): различия между версиями

Материал из RoboWiki
Перейти к навигации Перейти к поиску
Строка 154: Строка 154:
  
 
И наоборот, рассмотрим случай, когда робот вращается на месте, то есть Vc==0, а W!=0. Также неудивительно, что вы получите противоположные касательные скорости колес, и робот будет вращаться на месте.
 
И наоборот, рассмотрим случай, когда робот вращается на месте, то есть Vc==0, а W!=0. Также неудивительно, что вы получите противоположные касательные скорости колес, и робот будет вращаться на месте.
[[Файл:Eq5.png|127px|thumb|center|]]
+
[[Файл:Eq5.png|162px|thumb|center|]]

Версия 02:19, 17 июля 2019

В том уроке мы сделаем первые шаги в запуске ROS на реальном роботе. Мы преобразуем команды линейной и угловой целевых скоростей робота в команды, подаваемые на двигатели, которые будут вращать левое и правое колеса нашего робота с дифференциальным приводом. Мы используем разомкнутую систему управления (без обратной связи), которая не использует данные с датчиков (например, энкодеров) в качестве обратной связи.

Обзор: разомкнутая система управления роботом

Цели: 1. Организация управления роботом без обратной связи через WiFi с помощью команд скорости

2. Обучение управлению без обратной связи роботом с дифференциальным приводом, с использованием интерфейса передачи сообщений ROS через WiFi, и управление двигателями реального робота

Обзор: У нас есть две машины: хост-машина с Ubuntu и робот, управляемый через Raspberry Pi. Устройства обмениваются сообщениями ROS, объединяя их в сеть для совместного использования одного и того же мастера ROS. Узлы ROS для Raspberry Pi управляют двигателями (влево + вправо) и публикуют показания энкодеров робота. Ноды ROS на хост-машине вычисляют целевые значения скорости для двигателей, а также обновляют одометрию робота.

План:

  1. Установить ПО на Raspberry Pi, которая на роботе
  2. Настроить сеть между хост-машиной и Raspberry Pi
  3. Создать ноды ROS для отправки команд на моторы робота
  4. Проверить, что робот корректно отрабатывает команды управления

Код репозитория (хранилища):

git clone -b openloop https://github.com/richardw05/gopigo_ws.git

Видео-мануал

Совместимость:

Программное обеспечение

  • ROS: Kinetic
  • OS: Ubuntu 16.04

Аппаратное обеспечение

  • Робот с дифференциальным приводом: GoPiGo
  • USB-адаптер WiFi: Raspberry Pi USB WiFi Dongle

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

Если вы заказываете новый USB-адаптер WiFi, рассмотрите устройство WiFi, поддерживающее стандарт 802.11 AC, если в будущем вы собираетесь передавать данные с камеры.

0. (GoPiGo) Установка ПО

Raspberry Pi робота будет взаимодействовать с платой GoPiGo, которая контролирует и связывается с различными периферийными устройствами (такими как двигатели, инфракрасные датчики и т.д.). Мы установим ROS и библиотеку GoPiGo на Raspberry Pi.

А. Установите ROS на Raspberry Pi. На Raspberry Pi предусмотрена специальная процедура установки ROS. Следуйте инструкциям отсюда: wiki.ros.org/ROSberryPi/Installing ROS Kinetic on the Raspberry Pi

Б. Установите GoPiGo на Raspberry Pi. Инструкции по установке библиотеки GoPiGo можно найти здесь: http://www.dexterindustries.com/GoPiGo/programming/python-programming-for-the-raspberry-pi-gopigo/installing-gopigo-python-library

1. (Опционально) Работа по сети с ROS через WiFi

Сеть WiFi позволит хост-машине и роботу общаться через сообщения ROS. Сначала мы настроим сеть WiFi, а затем настроим сеть ROS.

А. Настройка сети WiFi

Если у вас уже есть SSH между компьютерами, вы можете пропустить этот шаг. Но убедитесь, что оба устройства подключены к одной подсети (или просто подключены к одному и тому же маршрутизатору). Мы хотим организовать SSH от хост-машины к Raspberry Pi.

Если вы не знаете IP-адрес устройства, используйте nmap для поиска устройств в подсети.

nmap -sn 192.168.1.0/24

Теперь вы можете организовать SSH к Raspberry Pi.

ssh pi@{IPADDRESS}

Если у вас возникли проблемы в организации SSH к Raspberry Pi, вам может понадобиться добавить открытый ключ SSH вашего хоста в Raspberry Pi ~/.ssh/authorized_keys.

Это опционально, но IP-адрес трудно запомнить и периодически менять, поэтому рассмотрите возможность использования хостнейма вместо него

hostname -I

Б. ROS через WiFi

Мы настроили оба устройства для связи через WiFi с ROS, заставив их использовать один и тот же мастер ROS. Мы выбираем запуск мастера ROS на хост-компьютере. На хост-компьютере запускаем мастер ROS

roscore

На Raspberry Pi сконфигурируйте его для использования мастера ROS хост-машины.

В качестве временного решения,

export ROS_MASTER_URI=http://IP_ADDRESS:11311

Для постоянного решения добавьте строку выше в ваш файл .bashrc.

Проверьте, что это работает. На Raspberry Pi:

rostopic pub /test std_msgs/Float32 5.0

На хост-машине:

rostopic echo /test

Ссылки:

  • wiki.ros.org/ROS/Tutorials/MultipleMachines
  • nootrix.com/software/ros-networking
  • wiki.ros.org/turtlebot/Tutorials/indigo/NetworkConfiguration

2. Архитектура

В этом проекте наш хост-компьютер будет читать высокоуровневые команды целевой скорости для корпуса робота, которые преобразуются в отдельные команды для левого и правого колес, которые должен будет отработать робот. Как показано ниже, у нас есть два ключевых узла ROS: diffdrive_controller, который запускается на хост-машине, и gopigo_controller, который запускается на роботе. Это разделение позволит нам в будущем заменить другое оборудование роботов, переписав конкретные ноды ROS GoPiGo.

Подавая некоторую целевую скорость для корпуса робота, мы преобразуем ее в отдельные команды для двигателей левого и правого колес

Исходя из архитектуры стека навигации ROS, мы в основном реализуем базовый контроллер. Ниже показан более детальный анализ основных сообщений, передаваемых между нодами ROS.

Поток сообщений ROS через ноды ROS.

В реальном времени мы берем целевые линейные и угловые скорости и используем обратную кинематику для генерации касательных (линейных) скоростей для левого и правого колес. Робот преобразует эти целевые касательные скорости в целевые угловые скорости. Затем они преобразуются в команды двигателям и отправляются на двигатели. Подробности дополнительно обсуждаются ниже в реализации.

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

3. Реализация

Мы реализуем этот проект с нуля. Начинаем с инициализации рабочего пространства. Затем мы создаем контроллер GoPiGo, который взаимодействует с двигателями. Кроме того, мы создаем контроллер дифференциального привода, который будет управлять скоростями каждого из колес.

А. Инициализация новой рабочей среды

Мы создаем рабочее пространство под названием gopigo_ws. Напомним некоторые команды:

mkdir gopigo_ws
catkin init
cd gopigo_ws
mkdir src
catkin build

Б. Контроллер GoPiGo

Контроллер GoPiGo получает заданные скорости и преобразует их в команды для двигателей робота. Для каждого колеса мы берем целевую касательную скорость (линейную скорость точки на колесе), преобразуем ее в угловую скорость (как быстро вращается колесо), а затем преобразуем ее в команды для двигателя (направление и скорость вращения двигателя).

Используются следующие сокращения:

  • v: касательная скорость
  • w: угловая скорость
  • R: радиус колеса

Связь касательной и угловой скоростей: v=w*R

Для двигателей мы можем указать направление вращения двигателя (0 назад; 1 вперед) и скорость двигателя (0 самая медленная; 255 самая быстрая). Учитывая, что скорости двигателя не имеют единиц измерения, мы создадим отображение целевых угловых скоростей на команды для двигателя.

Несколько факторов, которые следует учитывать: существует минимальная командная скорость двигателя, ис если подать скорость ниже нее колесо просто не сдвинется (из-за трения), и есть максимальная командная скорость двигателя, достигнув которую мы не сможем увеличивать скорость дальше. Также мы должны дискретно указать направление вращения двигателя.

Отображение угловых скоростей колеса (рад/с) в команды двигателя (0, 255)

Как показано выше, мы создаем простое кусочно-линейное отображение угловых скоростей в команды двигателя, как будет показано ниже. Мы интерполируем угловую скорость, когда заданы минимальная и максимальная скорости двигателя. Дальнейшая калибровка может помочь создать более точное отображение.

Ссылки:

С. Контроллер дифференциального привода

Контроллер дифференциального привода принимает сообщения /cmd_vel и вычисляет касательные скорости для левого и правого колес. Не совсем очевидно, как мы переходим от линейных и угловых скоростей (v, w) корпуса робота к отдельным скоростям колес. К счастью, это хорошо изученная проблема, известная как обратная кинематика.

Определим следующие входы:

  • Vc: целевая линейная скорость корпуса робота
  • Wc: целевая угловая скорость корпуса робота
  • L: Расстояние между колесами робота

Определим следующие выходы:

  • Vr: касательная скорость правого колеса
  • Vl: касательная скорость левого колеса

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

Eq0.png
Eq1.png

Интересно, что мы можем решить эти уравнения, чтобы получить:

Eq2.png
Eq3.png

Рекомендуется попробовать решить задачу определения скорости колес. Рассмотрите крайние случаи. Представьте, что мы хотим, чтобы робот просто ехал прямо. Таким образом Vc!=0, и наоборот Wc==0. Неудивительно, что вы получите одинаковые касательные скорости колес, а значит робот будет двигаться прямо:

Eq4.png

И наоборот, рассмотрим случай, когда робот вращается на месте, то есть Vc==0, а W!=0. Также неудивительно, что вы получите противоположные касательные скорости колес, и робот будет вращаться на месте.

Eq5.png