Управление реальным роботом без обратной связи в ROS (часть 4): различия между версиями
Editor (обсуждение | вклад) |
Editor (обсуждение | вклад) |
||
(не показано 45 промежуточных версий этого же участника) | |||
Строка 37: | Строка 37: | ||
Raspberry Pi робота будет взаимодействовать с платой GoPiGo, которая контролирует и связывается с различными периферийными устройствами (такими как двигатели, инфракрасные датчики и т.д.). Мы установим ROS и библиотеку GoPiGo на Raspberry Pi. | Raspberry Pi робота будет взаимодействовать с платой GoPiGo, которая контролирует и связывается с различными периферийными устройствами (такими как двигатели, инфракрасные датчики и т.д.). Мы установим ROS и библиотеку GoPiGo на Raspberry Pi. | ||
− | А. '''Установите ROS на Raspberry Pi.''' На Raspberry Pi предусмотрена специальная процедура установки ROS. Следуйте инструкциям отсюда: wiki.ros.org/ROSberryPi/Installing ROS Kinetic on the Raspberry Pi | + | А. '''Установите ROS на Raspberry Pi.''' На Raspberry Pi предусмотрена специальная процедура установки ROS. Следуйте инструкциям отсюда: [http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi 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 | Б. '''Установите GoPiGo на Raspberry Pi.''' Инструкции по установке библиотеки GoPiGo можно найти здесь: http://www.dexterindustries.com/GoPiGo/programming/python-programming-for-the-raspberry-pi-gopigo/installing-gopigo-python-library | ||
Строка 61: | Строка 61: | ||
Б. '''ROS через WiFi''' | Б. '''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. | ||
+ | |||
+ | [[Файл:Architecture.png|800px|thumb|center|Подавая некоторую целевую скорость для корпуса робота, мы преобразуем ее в отдельные команды для двигателей левого и правого колес]] | ||
+ | |||
+ | Исходя из архитектуры [http://wiki.ros.org/navigation/Tutorials/RobotSetup стека навигации ROS], мы в основном реализуем базовый контроллер. Ниже показан более детальный анализ основных сообщений, передаваемых между нодами ROS. | ||
+ | |||
+ | [[Файл:Messages.png|800px|thumb|center|Поток сообщений ROS через ноды ROS.]] | ||
+ | |||
+ | В реальном времени мы берем целевые линейные и угловые скорости и используем обратную кинематику для генерации касательных (линейных) скоростей для левого и правого колес. Робот преобразует эти целевые касательные скорости в целевые угловые скорости. Затем они преобразуются в команды двигателям и отправляются на двигатели. Подробности дополнительно обсуждаются ниже в реализации. | ||
+ | |||
+ | [[Файл:Operation.png|800px|thumb|center|Учитывая целевые линейные и угловые скорости для корпуса робота, мы вычисляем соответствующие угловые скорости для левого и правого колес, а затем вычисляем соответствующие команды для двигателей.]] | ||
+ | |||
+ | == 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 самая быстрая). Учитывая, что скорости двигателя не имеют единиц измерения, мы создадим отображение целевых угловых скоростей на команды для двигателя. | ||
+ | |||
+ | Несколько факторов, которые следует учитывать: существует минимальная командная скорость двигателя, ис если подать скорость ниже нее колесо просто не сдвинется (из-за трения), и есть максимальная командная скорость двигателя, достигнув которую мы не сможем увеличивать скорость дальше. Также мы должны дискретно указать направление вращения двигателя. | ||
+ | |||
+ | [[Файл:MotorCMD.png|589px|thumb|center|Отображение угловых скоростей колеса (рад/с) в команды двигателя (0, 255)]] | ||
+ | |||
+ | Как показано выше, мы создаем простое кусочно-линейное отображение угловых скоростей в команды двигателя, как будет показано ниже. Мы интерполируем угловую скорость, когда заданы минимальная и максимальная скорости двигателя. Дальнейшая калибровка может помочь создать более точное отображение. | ||
+ | |||
+ | '''Ссылки: ''' | ||
+ | * Для понимания уравнений: http://www8.cs.umu.se/kurser/5DV122/HT13/material/Hellstrom-ForwardKinematics.pdf | ||
+ | |||
+ | С. '''Контроллер дифференциального привода''' | ||
+ | |||
+ | Контроллер дифференциального привода принимает сообщения /cmd_vel и вычисляет касательные скорости для левого и правого колес. Не совсем очевидно, как мы переходим от линейных и угловых скоростей (v, w) корпуса робота к отдельным скоростям колес. К счастью, это хорошо изученная проблема, известная как обратная кинематика. | ||
+ | |||
+ | Определим следующие входы: | ||
+ | *'''Vc:''' целевая линейная скорость корпуса робота | ||
+ | *'''Wc:''' целевая угловая скорость корпуса робота | ||
+ | *'''L:''' Расстояние между колесами робота | ||
+ | Определим следующие выходы: | ||
+ | *'''Vr:''' касательная скорость правого колеса | ||
+ | *'''Vl:''' касательная скорость левого колеса | ||
+ | |||
+ | Мы знаем, что выполняются следующие уравнения (за подробностями см. Ссылки ниже). Основной смысл состоит в том, что верхнее уравнение отражает ситуацию, когда робот движется прямо вперед, а нижнее уравнение отражает вращение робота на месте: | ||
+ | [[Файл:Eq0.png|153px|thumb|center|]] | ||
+ | [[Файл:Eq1.png|166px|thumb|center|]] | ||
+ | |||
+ | Интересно, что мы можем решить эти уравнения, чтобы получить: | ||
+ | [[Файл:Eq2.png|129px|thumb|center|]] | ||
+ | [[Файл:Eq3.png|126px|thumb|center|]] | ||
+ | |||
+ | Рекомендуется попробовать решить задачу определения скорости колес. Рассмотрите крайние случаи. Представьте, что мы хотим, чтобы робот просто ехал прямо. Таким образом Vc!=0, и наоборот Wc==0. Неудивительно, что вы получите одинаковые касательные скорости колес, а значит робот будет двигаться прямо: | ||
+ | [[Файл:Eq4.png|127px|thumb|center|]] | ||
+ | |||
+ | И наоборот, рассмотрим случай, когда робот вращается на месте, то есть Vc==0, а W!=0. Также неудивительно, что вы получите противоположные касательные скорости колес, и робот будет вращаться на месте. | ||
+ | [[Файл:Eq5.png|162px|thumb|center|]] | ||
+ | |||
+ | '''Ссылки:''' | ||
+ | * [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwiy_O2ultLPAhUmHGMKHSSECIcQFggeMAA&url=http%3A%2F%2Fcs226.stanford.edu%2Fnotes%2FCS226B-04-MotionAndSensing.pptx&usg=AFQjCNHTYNOywF6qPpKiInZ7XesZjBBy5w&cad=rja Презентация о прямой кинематике] | ||
+ | * [http://www8.cs.umu.se/kurser/5DV122/HT13/material/Hellstrom-ForwardKinematics.pdf Математика прямой кинематики] | ||
+ | * [http://apprize.info/programming/ros/10.html Полное руководство по реализации робота] | ||
+ | * [http://wiki.ros.org/pr2_controllers/Tutorials/Using the robot base controllers to drive the robot Пример базового контроллера] | ||
+ | * [https://github.com/markwsilliman/turtlebot Примеры кода управления Turtlebot'ом] | ||
+ | * [https://chess.eecs.berkeley.edu/eecs149/documentation/differentialDrive.pdf Кинематика дифференциального привода] | ||
+ | * [http://robotics.stackexchange.com/questions/8911/how-to-find-kinematics-of-differential-drive-caster-robot Дифференциальный привод с роликом] | ||
+ | * [http://www.cs.cmu.edu/~rasc/Download/AMRobots3.pdf Отличная глава по кинематике] | ||
+ | |||
+ | Теперь, с помощью gopigo_controller и diffdrive_controller мы можем управлять роботом без обратной связи. Публикуя сообщения /cmd_vel, мы сможем контролировать движения робота. | ||
+ | |||
+ | == 4. Лаунчер == | ||
+ | |||
+ | Мы представляем две ноды ROS, которые содержат несколько удобных файлов запуска (лаунч-файлов): nav_behaviors и gopigo_description. Чтобы запустить управление без обратной связи реальным роботом, на хост-машине ввести: | ||
+ | roslaunch nav_behaviors nav_behaviors.launch | ||
+ | На Raspberry Pi: | ||
+ | roslaunch gopigo_description gopigo_interface.launch | ||
+ | Теперь, когда наши ноды ROS ожидают команды скорости, запустите один из этих двух сценариев оболочки в ~/gopigo_ws/: | ||
+ | ./nav_forward.py | ||
+ | ./nav_rotate.py | ||
+ | В результате робот должен двигаться вперед или вращаться на месте, соответственно. Если это произойдет, считайте, что вы успешно создали контроллер управления без обратной связи для своего робота! | ||
+ | |||
+ | Если у вас нет доступа к роботу GoPiGo, вы все равно можете проверить код: | ||
+ | |||
+ | '''Другое оборудование''' | ||
+ | |||
+ | Если у вас робот другого типа, вам нужно отредактировать gopigo_controller/src/gopigo_controller.py. Найдите флаг gopigo_on и отредактируйте его для передачи команд вашим двигателям. Возможно, вам потребуется изменить значения параметров в gopigo_description/launch/gopigo_interface.launch | ||
+ | |||
+ | '''Оборудования нет!''' | ||
+ | |||
+ | Но вы все равно можете проверить контроллер в симуляции. Перейдите в gopigo_description/launch/gopigo_interface.launch и установите для флага gopigo_on значение False. Это исключит любые команды, отправленные на двигатели. Затем вы можете проверить, что следующие сообщения ROS имеют смысл (работают корректно): | ||
+ | rostopic echo /cmd_vel | ||
+ | rostopic echo /lwheel_tangent_vel_target | ||
+ | rostopic echo /rwheel_tangent_vel_target | ||
+ | rostopic echo /lwheel_angular_vel_control | ||
+ | rostopic echo /rwheel_angular_vel_control | ||
+ | rostopic echo /lwheel_angular_vel_motor | ||
+ | rostopic echo /rwheel_angular_vel_motor | ||
+ | |||
+ | Если вы выполните nav_forward.py, то ожидайте увидеть соответствующие значения для соответствующих колес. | ||
+ | |||
+ | Если вы выполните nav_rotate.py, то ожидайте увидеть противоположные значения для соответствующих колес. |
Текущая версия на 16:42, 26 июля 2019
В том уроке мы сделаем первые шаги в запуске ROS на реальном роботе. Мы преобразуем команды линейной и угловой целевых скоростей робота в команды, подаваемые на двигатели, которые будут вращать левое и правое колеса нашего робота с дифференциальным приводом. Мы используем разомкнутую систему управления (без обратной связи), которая не использует данные с датчиков (например, энкодеров) в качестве обратной связи.
Содержание
Обзор: разомкнутая система управления роботом
Цели: 1. Организация управления роботом без обратной связи через WiFi с помощью команд скорости
2. Обучение управлению без обратной связи роботом с дифференциальным приводом, с использованием интерфейса передачи сообщений ROS через WiFi, и управление двигателями реального робота
Обзор: У нас есть две машины: хост-машина с Ubuntu и робот, управляемый через Raspberry Pi. Устройства обмениваются сообщениями ROS, объединяя их в сеть для совместного использования одного и того же мастера ROS. Узлы ROS для Raspberry Pi управляют двигателями (влево + вправо) и публикуют показания энкодеров робота. Ноды ROS на хост-машине вычисляют целевые значения скорости для двигателей, а также обновляют одометрию робота.
План:
- Установить ПО на Raspberry Pi, которая на роботе
- Настроить сеть между хост-машиной и Raspberry Pi
- Создать ноды ROS для отправки команд на моторы робота
- Проверить, что робот корректно отрабатывает команды управления
Код репозитория (хранилища):
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. Следуйте инструкциям отсюда: 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.
В реальном времени мы берем целевые линейные и угловые скорости и используем обратную кинематику для генерации касательных (линейных) скоростей для левого и правого колес. Робот преобразует эти целевые касательные скорости в целевые угловые скорости. Затем они преобразуются в команды двигателям и отправляются на двигатели. Подробности дополнительно обсуждаются ниже в реализации.
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 самая быстрая). Учитывая, что скорости двигателя не имеют единиц измерения, мы создадим отображение целевых угловых скоростей на команды для двигателя.
Несколько факторов, которые следует учитывать: существует минимальная командная скорость двигателя, ис если подать скорость ниже нее колесо просто не сдвинется (из-за трения), и есть максимальная командная скорость двигателя, достигнув которую мы не сможем увеличивать скорость дальше. Также мы должны дискретно указать направление вращения двигателя.
Как показано выше, мы создаем простое кусочно-линейное отображение угловых скоростей в команды двигателя, как будет показано ниже. Мы интерполируем угловую скорость, когда заданы минимальная и максимальная скорости двигателя. Дальнейшая калибровка может помочь создать более точное отображение.
Ссылки:
- Для понимания уравнений: http://www8.cs.umu.se/kurser/5DV122/HT13/material/Hellstrom-ForwardKinematics.pdf
С. Контроллер дифференциального привода
Контроллер дифференциального привода принимает сообщения /cmd_vel и вычисляет касательные скорости для левого и правого колес. Не совсем очевидно, как мы переходим от линейных и угловых скоростей (v, w) корпуса робота к отдельным скоростям колес. К счастью, это хорошо изученная проблема, известная как обратная кинематика.
Определим следующие входы:
- Vc: целевая линейная скорость корпуса робота
- Wc: целевая угловая скорость корпуса робота
- L: Расстояние между колесами робота
Определим следующие выходы:
- Vr: касательная скорость правого колеса
- Vl: касательная скорость левого колеса
Мы знаем, что выполняются следующие уравнения (за подробностями см. Ссылки ниже). Основной смысл состоит в том, что верхнее уравнение отражает ситуацию, когда робот движется прямо вперед, а нижнее уравнение отражает вращение робота на месте:
Интересно, что мы можем решить эти уравнения, чтобы получить:
Рекомендуется попробовать решить задачу определения скорости колес. Рассмотрите крайние случаи. Представьте, что мы хотим, чтобы робот просто ехал прямо. Таким образом Vc!=0, и наоборот Wc==0. Неудивительно, что вы получите одинаковые касательные скорости колес, а значит робот будет двигаться прямо:
И наоборот, рассмотрим случай, когда робот вращается на месте, то есть Vc==0, а W!=0. Также неудивительно, что вы получите противоположные касательные скорости колес, и робот будет вращаться на месте.
Ссылки:
- Презентация о прямой кинематике
- Математика прямой кинематики
- Полное руководство по реализации робота
- the robot base controllers to drive the robot Пример базового контроллера
- Примеры кода управления Turtlebot'ом
- Кинематика дифференциального привода
- Дифференциальный привод с роликом
- Отличная глава по кинематике
Теперь, с помощью gopigo_controller и diffdrive_controller мы можем управлять роботом без обратной связи. Публикуя сообщения /cmd_vel, мы сможем контролировать движения робота.
4. Лаунчер
Мы представляем две ноды ROS, которые содержат несколько удобных файлов запуска (лаунч-файлов): nav_behaviors и gopigo_description. Чтобы запустить управление без обратной связи реальным роботом, на хост-машине ввести:
roslaunch nav_behaviors nav_behaviors.launch
На Raspberry Pi:
roslaunch gopigo_description gopigo_interface.launch
Теперь, когда наши ноды ROS ожидают команды скорости, запустите один из этих двух сценариев оболочки в ~/gopigo_ws/:
./nav_forward.py ./nav_rotate.py
В результате робот должен двигаться вперед или вращаться на месте, соответственно. Если это произойдет, считайте, что вы успешно создали контроллер управления без обратной связи для своего робота!
Если у вас нет доступа к роботу GoPiGo, вы все равно можете проверить код:
Другое оборудование
Если у вас робот другого типа, вам нужно отредактировать gopigo_controller/src/gopigo_controller.py. Найдите флаг gopigo_on и отредактируйте его для передачи команд вашим двигателям. Возможно, вам потребуется изменить значения параметров в gopigo_description/launch/gopigo_interface.launch
Оборудования нет!
Но вы все равно можете проверить контроллер в симуляции. Перейдите в gopigo_description/launch/gopigo_interface.launch и установите для флага gopigo_on значение False. Это исключит любые команды, отправленные на двигатели. Затем вы можете проверить, что следующие сообщения ROS имеют смысл (работают корректно):
rostopic echo /cmd_vel rostopic echo /lwheel_tangent_vel_target rostopic echo /rwheel_tangent_vel_target rostopic echo /lwheel_angular_vel_control rostopic echo /rwheel_angular_vel_control rostopic echo /lwheel_angular_vel_motor rostopic echo /rwheel_angular_vel_motor
Если вы выполните nav_forward.py, то ожидайте увидеть соответствующие значения для соответствующих колес.
Если вы выполните nav_rotate.py, то ожидайте увидеть противоположные значения для соответствующих колес.