Введение в операционную систему роботов: идеальная платформа приложений для роботов
Опубликовано: 2022-03-11Операционная система для роботов (ROS) — это не настоящая операционная система, а структура и набор инструментов, которые обеспечивают функциональность операционной системы в гетерогенном компьютерном кластере. Его полезность не ограничивается роботами, но большинство предоставляемых инструментов ориентировано на работу с периферийным оборудованием.
ROS разделен на более чем 2000 пакетов, каждый из которых предоставляет специализированную функциональность. Количество инструментов, подключенных к фреймворку, вероятно, является его самой большой силой.
Почему я должен использовать Robot OS?
ROS предоставляет функциональные возможности для аппаратной абстракции, драйверы устройств, связь между процессами на нескольких машинах, инструменты для тестирования и визуализации и многое другое.
Ключевой особенностью ROS является то, как программное обеспечение запускается и как оно взаимодействует, что позволяет вам разрабатывать сложное программное обеспечение, не зная, как работает определенное оборудование. ROS предоставляет способ подключения сети процессов (узлов) к центральному концентратору. Узлы могут работать на нескольких устройствах, и они подключаются к этому концентратору различными способами.
Основными способами создания сети являются предоставление запрашиваемых услуг или определение соединений издателя/подписчика с другими узлами. Оба метода взаимодействуют через указанные типы сообщений. Некоторые типы предоставляются базовыми пакетами, но типы сообщений могут определяться отдельными пакетами.
Разработчики могут собрать сложную систему, соединив существующие решения для небольших задач. То, как реализована система, позволяет нам:
Заменяйте компоненты с аналогичными интерфейсами на лету, избавляя от необходимости останавливать систему для различных изменений
Мультиплексирование выходов нескольких компонентов в один вход для другого компонента, что позволяет параллельно решать различные задачи.
Подключайте компоненты, созданные на разных языках программирования, просто внедряя соответствующие соединители в систему обмена сообщениями, что упрощает разработку программного обеспечения путем подключения существующих модулей от разных разработчиков.
Создавайте узлы в сети устройств, не беспокоясь о том, где выполняется код, и внедрите системы межпроцессного взаимодействия (IPC) и удаленного вызова процедур (RPC).
Напрямую подключайтесь к каналам по запросу с удаленного оборудования без написания дополнительного кода, используя два предыдущих пункта.
Мы планируем продемонстрировать, насколько это полезно, путем итеративной разработки простого решения. Есть несколько ключевых преимуществ по сравнению с другими подходами. ROS поддерживает несколько платформ и позволяет устанавливать соединения между процессами на нескольких устройствах через одноранговые соединения, которые обрабатываются за кулисами. Дизайн позволяет поддерживать любой язык, обертывая коммуникационные классы C++ или вручную разрабатывая классы для языкового интерфейса.
ROS создается собственным сообществом, предназначенным для своего сообщества. Через несколько лет это привело к большому количеству повторно используемых пакетов, которые легко интегрировать благодаря архитектуре системы.
Альтернативные подходы, такие как MRPT, CARMEN, LCM, Player, Microsoft RDS и другие, предоставляют некоторые из этих функций, но не все. В большинстве случаев недостатки дизайна связаны с ограничениями языковой поддержки, неоптимизированным взаимодействием между процессами или отсутствием поддержки различных устройств, что, возможно, является самой сложной проблемой для решения.
Что мы собираемся строить?
Поскольку наше внимание сосредоточено на структуре, а не на фактических алгоритмах для конкретных задач, данная задача будет довольно простой. Наша цель — создать программное обеспечение для бортового компьютера, которое позволит нам удаленно управлять и контролировать робота, подключенного к нам через Wi-Fi, с помощью геймпада на нашем компьютере и камеры, установленной на роботе.
Прежде всего, мы подключим простую программу к простой симуляции, чтобы продемонстрировать основные принципы ROS. Мы подключим геймпад к компьютеру и попробуем разработать хорошую схему управления для преобразования ввода геймпада в управляющие сигналы для робота.
Основными языками для написания кода ROS являются C++ и Python, причем C++ предпочтительнее из-за лучшей производительности. Мы объясним наши примеры на Python из-за меньшего количества шаблонов в коде и отсутствия необходимости в явном построении.
Установка и настройка
Версии ROS называются по имени. На данный момент последним выпуском является Jade Turtle , а последней LTS-версией — Indigo Igloo . Предпочтительнее использовать LTS-версию, а обратная совместимость с ROS не гарантируется, поэтому все примеры будут написаны для Indigo .
ROS доступен на различных платформах *NIX. Официально поддерживаемая версия находится в Ubuntu. Версии OS X, Arch Linux, Debian, Raspbian и Android поддерживаются сообществом.
Мы рассмотрим процесс установки Ubuntu 14.04 на рабочий стол. Процессы для всех поддерживаемых версий и платформ доступны на официальном сайте. Также доступны виртуальные машины с установленной ROS.
Установка зависит от платформы (и для большинства платформ предусмотрены пакеты), но конфигурация рабочей области одинакова для всех платформ.
Установка на Убунту
ROS предоставляет собственные репозитории. Первый шаг — добавить их.
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116 sudo apt-get update
После этого у вас будут все размещенные пакеты для всех версий ROS, доступные для вашей версии Ubuntu. Например, Ubuntu 14.04 поддерживает indigo
и jade
.
Установка базовых пакетов на настольный компьютер имеет один из трех вариантов:
sudo apt-get install ros-indigo-ros-base
для минимальной установкиsudo apt-get install ros-indigo-desktop
для получения основных дополнительных инструментов с графическим интерфейсомsudo apt-get install ros-indigo-desktop-full
для наличия всех официальных функций, включая различные симуляторы и библиотеки для навигации и восприятия
Для наилучшего рабочего опыта рекомендуется полный вариант. Для установки на устройства, которые будут использоваться только для запуска узлов, достаточно базовой версии. Независимо от того, какой вариант вы выберете, вы можете установить любой необходимый пакет с именем package_name
, запустив:
sudo apt-get install ros-indigo-<package-name>
Подчеркивания заменены дефисами в конечном имени, поэтому stage_ros
будет в пакете ros-indigo-stage-ros
.
Следующим шагом будет инициализация rosdep
. Пакеты в ROS могут объявлять, от каких компонентов они зависят. rosdep
позволяет компилировать эти пакеты без лишней ручной обработки зависимостей. Чтобы инициализировать его, вызовите:
sudo rosdep init rosdep update
ROS имеет несколько переменных среды, используемых его инструментами. При установке по умолчанию скрипт bash для их инициализации находится в /opt/ros/indigo/setup.bash
. Переменные необходимо инициализировать в каждом сеансе bash, поэтому лучшее решение — добавить их в ~/.bashrc
.
echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc source ~/.bashrc
Некоторые пакеты устанавливают внешние зависимости через rosinstall
, который доступен в виде пакета и устанавливается через sudo apt-get install python-rosinstall
.
Это конец установки на Ubuntu. Далее следует краткое введение в установку рабочих областей.
Конфигурация
Начиная с Groovy Galapagos , рабочие области ROS управляются через catkin
. Нам нужно определить каталог для всех пакетов, которые мы размещаем. Внутри каталога мы создаем папку src
и вызываем внутри нее форму catkin_init_workspace
. Это создаст различные символические ссылки на текущую исходную версию ROS. Следующим шагом является добавление этой рабочей области в переменные среды.
Чтобы выполнить всю эту настройку рабочего пространства, выберите пустой каталог и выполните следующие команды:
mkdir src cd src catkin_init_workspace cd .. catkin_make echo "source $(pwd)/devel/setup.bash" >> ~/.bashrc source ~/.bashrc
Теперь вы создали рабочее пространство, в котором вы можете создавать свои собственные пакеты ROS.
Знакомство с инструментами
Создание любого кода — это большой скачок. Давайте сначала познакомимся с некоторыми системами, работающими за кулисами. Нашим первым шагом будет запуск базового графического интерфейса и просмотр сообщений, которые он генерирует.
Чтобы запустить что-либо в ROS, необходимо запустить основной процесс. Это так же просто, как открыть новое окно терминала и ввести:
roscore
Во всей вашей подключенной сети устройств roscore
нужно запускать только один раз, на устройстве, на котором будет размещен центральный концентратор для диспетчеризации связи.
Основная роль roscore
— сообщить узлам, к каким другим узлам они должны подключаться и каким образом (через сетевой порт или разделяемую память). Цель состоит в том, чтобы позволить узлам заботиться только о том, какие данные они хотят знать, а не о том, к какому узлу они хотят подключиться, при этом минимизируя время и пропускную способность, необходимые для выполнения всей связи.
правильно
После запуска roscore
мы можем запустить основной инструмент с графическим интерфейсом для ROS: rqt
. То, что мы видим, очень разочаровывает — пустое окно. rqt
содержит широкий спектр плагинов, которые можно настроить для любой визуальной конфигурации и любого количества предопределенных представлений.
Для начала запустим плагин Robot Steering , выбрав его в Plugins > Robot Tools > Robot Steering
. Мы получаем два ползунка, представляющих линейное и вращательное движение, которые мы хотим, чтобы наш робот имел. В верхней части плагина мы видим текстовое поле с /cmd_vel
. Мы можем переименовать его во что угодно. Он представляет собой название темы, в которой публикуется руководство. Инструменты терминала — лучшее место, чтобы увидеть, что происходит в фоновом режиме.
Терминальные инструменты
В ROS есть несколько мощных инструментов для проверки того, что происходит в системе. Первый инструмент, который мы представим, это rostopic
. Это позволяет нам проверять темы, на которые узлы могут подписываться и публиковать. Запуск rostopic list
даст:
/cmd_vel /rosout /rosout_agg
Последние 2 темы всегда работают и связаны с центральными системами ROS. Тема /cmd_vel
публикуется нашим руководством. Переименование темы в руле переименует и здесь. Теперь нас интересует, что происходит в рамках темы. Запуск rostopic echo /cmd_vel
ничего нам не покажет (если только вы не возились с ползунками). Процесс выполняется до тех пор, пока мы его не отменим. Давайте теперь переместим вертикальный ползунок на 20 м/с. Глядя на эхо, мы можем видеть повторяющееся снова и снова следующее:
linear: x: 0.2 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0
Как часто спамит это сообщение? rostopic hz /cmd_vel
говорит со средней частотой 10 Гц. Ну и сколько подобных тем я могу запустить через свой медленный вай-фай? rostopic bw /cmd_vel
обнаруживает в среднем 480 Б/с.
Теперь это все хорошо, но мы говорили о типах сообщений. Эти данные хороши для человека, но приложению потребуются необработанные данные, и ему потребуется знать тип сообщения, чтобы оно могло интерпретировать данные. Тип можно определить с помощью rostopic type /cmd_vel
, сообщающего нам, что это geometry_msgs/Twist
. Все инструменты терминала ROS, вызываемые без каких-либо аргументов, возвращают стандартное справочное сообщение.
Вики ROS достаточно хороша, чтобы поиск этой строки в Интернете привел к объяснению вики того, что она содержит и как она структурирована. Но мы не должны полагаться на это. rosmsg
— это общий инструмент для типов сообщений. Запуск rosmsg show geometry_msgs/Twist
вернет:
geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z
Сообщение состоит из двух трехмерных векторов, представляющих линейную и угловую скорость в трехмерном пространстве.
Если мы хотим, к каким темам подключен узел, rosnode info <node-name>
предоставит нам подробные данные об узле. Инструменты rostopic
, rosmsg
и rosnode
являются основными инструментами для проверки необработанной функциональности ROS. В ROS гораздо больше инструментов с графическим интерфейсом и терминалом, но это выходит за рамки нашего введения.
Основными инструментами для запуска узлов ROS являются rusrun
и roslaunch
. rosrun
может запускать узлы через rosrun <package_name> <node_name>
, а roslaunch
запускает узлы на основе файлов запуска, с которыми мы немного познакомимся, поскольку они являются наиболее сложным элементом автоматизации ROS.
Мы можем закрыть все, что мы запускали, чтобы начать работу над нашим первым кодом. Для справки в будущем само собой разумеется, что для запуска всего, что связано с ROS, требуется активный экземпляр roscore
. Многие проблемы, с которыми вы сталкиваетесь, можно решить, закрыв окно терминала, в котором roscore
, и открыв новое, чтобы перезапустить его. Это обновляет все зависимости, которые необходимо перезагрузить, как в bash
, так и в roscore
.
Создание геймпада Teleoperation
Наша первая цель — имитировать функциональность управления Robot Steering
, создав узел, который публикует данные geometry_msgs/Twist
в /cmd_vel
на основе ввода с геймпада. Наша первая остановка – пакет joy
.

Пакет « joy
»
Пакет joy
содержит общие драйверы ROS для джойстиков и геймпадов. Он не включен в установку по умолчанию, поэтому его необходимо установить через:
sudo apt-get install ros-indigo-joy
После установки запускаем rosrun joy joy_node
. Это подключит нас к джойстику или геймпаду по умолчанию. Запуск rostopic list
показывает нам, что у нас есть тема с именем /joy
. Прослушивание через rostopic echo
показывает нам сообщения следующего формата (обратите внимание, что для публикации сообщений необходимо взаимодействовать с геймпадом или джойстиком).
header: seq: 4156 stamp: secs: 1450707466 nsecs: 204517084 frame_id: '' axes: [0.0, 0.0, 0.0, -0.0, 0.0, 0.0, 0.0, 0.0] buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Вы можете пока игнорировать заголовки. Кроме этого, у нас есть axes
и buttons
, хорошо объясняющие, что они собой представляют. Перемещение осей и нажатие кнопок на контроллере приведет к изменению этих чисел. Используя наши инструменты, мы можем определить, что тип сообщения — sensor_msgs/Joy
, а формат — следующий:
std_msgs/Header header uint32 seq time stamp string frame_id float32[] axes int32[] buttons
Создание нашей телеоперации
Первый шаг к написанию кода — создание пакета. В папке src
рабочей области запустите:
catkin_create_pkg toptal_tutorial rospy joy geometry_msgs sensor_msgs
Здесь мы указываем имя пакета, который мы создаем, а затем пакеты, от которых мы планируем зависеть. Не беспокойтесь, позже зависимости можно обновить вручную.
Теперь у нас есть папка toptal_tutorial
. В папке создайте папку scripts
, в которой будут храниться все наши скрипты Python.
Давайте создадим файл с именем teleop.py
и в нем установим:
#!/usr/bin/env python import rospy from sensor_msgs.msg import Joy def joy_callback(data): print data def main(): rospy.init_node('teleop') rospy.Subscriber('joy', Joy, joy_callback) while not rospy.is_shutdown(): pass if __name__ == '__main__': main()
Нам также нужно установить chmod +x teleop.py
, чтобы скрипт стал работоспособным. Запуск rosrun joy joy_node
в одном терминале и rosrun toptal_tutorial teleop.py
в другом приведет к тому, что вывод терминала teleop.py
будет заполнен сообщениями Joy.
Давайте посмотрим, что делает код.
Во-первых, мы импортируем rospy, в котором размещена библиотека для взаимодействия с платформой ROS. Каждый пакет, который определяет сообщения, имеет подпакет msg
с определениями сообщений. Мы импортируем Joy
для обработки ввода. Нет необходимости импортировать встроенные типы сообщений (например, Header
из std_msgs.msg
, который находится в сообщении Joy
), если мы не хотим явно указать их.
Наш первый шаг — инициализация узла с определенным именем (в данном случае мы называем его «телеоп»). После этого мы создаем подписчика, который подписывается на тему «радости» типа sensor_msgs.msg.Joy
и обрабатывает каждое сообщение, вызывая функцию joy_callback
. Обратные вызовы получают один параметр, данные из сообщения. Доступ к членам данных прост. Если бы мы хотели напечатать состояние первой оси, если вспомнить тип сообщения, мы бы print data.axes[0]
, и это будет число с плавающей запятой. Цикл в конце повторяется до тех пор, пока ROS не выключится.
Нашим следующим шагом будет обработка наших данных. Мы должны создать Twist-сообщение, которое будет меняться в зависимости от ввода, а затем опубликовать его в теме cmd_vel
.
#!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist # new from functools import partial # new def joy_callback(pub, data): # modified cmd_vel = Twist() # new cmd_vel.linear.x = data.axes[1] # new cmd_vel.angular.z = data.axes[0] # new pub.publish(cmd_vel) # new def main(): rospy.init_node('teleop') pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) # new rospy.Subscriber('joy', Joy, partial(joy_callback, pub)) # modified while not rospy.is_shutdown(): pass if __name__ == '__main__': main()
Во-первых, мы добавляем сообщение Twist
и добавляем поддержку привязки аргументов функции через functools.partial
. Мы создаем издатель pub
, который публикует в cmd_vel
сообщение типа Twist
. Мы привязываем этого публикатора к обратному вызову и заставляем его публиковать сообщение Twist на каждом входе со скоростями, представленными первыми двумя осями. Этот код делает то, что мы от него ожидаем, и мы можем увидеть результат через rostopic echo /cmd_vel
.
У нас есть еще одна проблема. Тема /joy
может публиковаться с большой скоростью. Если мы проследим за rostopic hz /cmd_vel
и будем двигать аналоговый джойстик по кругу, то увидим большое количество сообщений. Это не только приводит к большому количеству сообщений, но и процессам, которые получают эти сообщения, приходится обрабатывать каждое из них. Нет необходимости публиковать эти данные так часто, и лучше просто публиковать со стабильной частотой 10 Гц. Мы можем сделать это с помощью следующего кода.
#!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist from functools import partial def joy_callback(cmd_vel, data): # modified cmd_vel.linear.x = data.axes[1] cmd_vel.angular.z = data.axes[0] # moved pub.publish(cmd_vel) to main loop def main(): rospy.init_node('teleop') cmd_vel = Twist() # new pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) rospy.Subscriber('joy', Joy, partial(joy_callback, cmd_vel)) # modified rate = rospy.Rate(10) # new while not rospy.is_shutdown(): pub.publish(cmd_vel) # new rate.sleep() # new if __name__ == '__main__': main()
Мы изменили обратный вызов, чтобы получить изменяемый объект Twist
и изменить его в цикле. Функция sleep
от rospy.Rate
поддерживает стабильную выходную частоту.
Окончательный код приведет к тому, что тема /cmd_vel
получит команды скорости с частотой 10 Гц, имитируя вывод плагина rqt
Robot Steering .
Запуск смоделированной системы
Моделирование мира
Наша первая цель — создать среду, в которой мы можем смоделировать сценарий, которого хотим достичь. Узел stageros
в пакете stage_ros
позволяет нам запускать одного робота на 2D-сцене, определенной с помощью изображения. Существует целый синтаксис, описанный в пакете stage_ros
для файлов привязки и способов их создания. Это довольно просто, но выходит за рамки нашей компетенции. К счастью, в пакете есть несколько демо-миров. Во-первых, давайте перейдем в каталог файлов, запустив:
roscd stage_ros cd world
В папке есть несколько файлов. Давайте запустим один.
rosrun stage_ros stageros willow-erratic.world
Это создало несколько тем. Значение каждого из них также задокументировано вместе с пакетом. Важно то, что он имеет cmd_vel
.
На отображаемой сцене есть синий квадрат, представляющий робота, которым вы управляете. Используя либо наш код, либо управление роботом , мы можем управлять этим роботом. Попробуйте.
Настройка нашей системы через файлы запуска
давайте создадим папку launch
в нашем пакете, а в ней создадим файл с именем teleop.launch
. Окончательная структура папок должна выглядеть так:
toptal_tutorial/ ├── CMakeLists.txt ├── launch │ └── teleop.launch ├── package.xml ├── scripts │ └── teleop.py └── src
В файле teleop.launch
мы определим набор узлов и их взаимосвязей.
<launch> <arg name="world_file" default="$(find stage_ros)/world/willow-four-erratics-multisensor.world" /> <node pkg="stage_ros" type="stageros" name="simulated_world" args="$(arg world_file)"></node> <group ns="robot_0"> <node pkg="joy" type="joy_node" name="joy_input"></node> <node pkg="toptal_tutorial" type="teleop.py" name="joy_convert"></node> </group> </launch>
Новый мир состоит из четырех роботов, и каждая из их тем имеет префикс robot_<n>
. Итак, у робота номер 0 есть тема команды скорости, которая называется robot_0/cmd_vel
. Вот почему мы поместили наш элемент управления в пространство имен robot_0
, чтобы приспособить их имена к новой форме. В этом смысле вы можете думать об именах разделов как о папках в файловой системе.
Для запуска файлов запуска не roscore
. В некотором смысле, roscore
— это просто частный случай файла запуска, который ничего не делает. Если roscore
отсутствует, только первый запущенный файл запуска будет запускать ядро, а остальные будут подключаться к нему. Теперь мы запускаем запуск с помощью:
roslaunch toptal_tutorial teleop.launch
Если все правильно, то получится симулятор с 4 роботами, один из которых управляется с помощью нашего геймпада или джойстика. В этом мире скрыто намного больше, чем в предыдущем. Каждый из четырех роботов имеет:
/robot_<n>/base_pose_ground_truth /robot_<n>/base_scan_0 /robot_<n>/base_scan_1 /robot_<n>/camera_info_0 /robot_<n>/camera_info_1 /robot_<n>/cmd_vel /robot_<n>/depth_0 /robot_<n>/depth_1 /robot_<n>/image_0 /robot_<n>/image_1 /robot_<n>/odom
Мы заменяем <n>
на 0, 1, 2 или 3. Это подводит нас к нашей последней теме.
Просмотр наших данных с помощью rqt
Мы не слишком углублялись в rqt
, но это идеальный инструмент для просмотра более сложных данных. Вы можете поэкспериментировать со всеми темами, но мы сосредоточимся на image_0
, image_1
, depth_0
и depth_1
.
Давайте rqt
и удалим все открытые плагины. Теперь мы откроем 4 визуализатора изображений ( Plugins > Visualization > Image View
) и разместим их в виде сетки 2x2. Наконец, в верхнем левом углу каждого из представлений давайте выберем одну из четырех заявленных тем для robot_0
.
То, что мы получаем, это стереовидение с восприятием глубины, с камерами низкого разрешения. Имейте в виду, что мы могли бы получить этот результат даже без нашей системы ввода. Если мы просто запустим это (из папки stage_ros/world
):
rosrun stage_ros stageros willow-four-erratics-multisensor.world
и добавьте плагин Robot Steering с темой под названием /robot_0/cmd_vel
, мы бы получили те же результаты, если бы элементы управления были ползунками на экране.
Применение результатов к реальной системе
Многие аппаратные средства имеют полную поддержку ROS, очень часто предоставляемую сторонними добровольцами. Многие платформы роботов имеют драйверы, которые генерируют сообщения такого типа, а в ROS есть узлы, которые принимают веб-камеру и публикуют поток изображений.
Хотя последний результат был симуляцией того, чего мы хотим достичь, того же можно добиться с помощью следующих модификаций:
- Установите ROS на бортовой компьютер вашего робота
- Создайте файл запуска для бортового компьютера, который соединяет ROS с базовой платформой и всеми датчиками высокого уровня, такими как камеры, лазерные дальномеры и другие. Необходимые узлы могут уже существовать или могут быть реализованы путем создания издателя/подписчика на ROS с одной стороны и драйвера для последовательной связи с другой.
- Запустить файл запуска при запуске
- На вашем удаленном компьютере добавьте
export ROS_MASTER_URI=http://<robot_hostname>:11311/
в ваш запуск bash, заставив удаленный компьютер искатьroscore
на данном имени хоста и порту. -
rqt
и/или любые скрипты для мониторинга и управления роботом
На самом деле все сводится к экспорту соответствующей переменной окружения на удаленное устройство, а все остальное делается само собой. Для запуска ROS на кластере компьютеров требуется выполнить только один шаг для каждой машины.
Заключение
Мы продемонстрировали, как с очень небольшим количеством кода вы можете иметь сложную систему переменных, которой вы можете манипулировать по своему усмотрению. Простая система издатель/подписчик позволяет быстро разработать программный конвейер, обрабатывающий данные в кластере компьютеров, не беспокоясь при этом о базовой реализации определенных элементов.
В то время как мы использовали простой симулятор, более сложные симуляторы, такие как gazebo
(также включенные в полную версию для настольных компьютеров), позволяют создавать трехмерные миры с физикой и сложными датчиками и могут дать вам представление о конечных результатах и продукте задолго до его разработки.
Это введение было очень простым, но мы надеемся, что вы заинтересовались работой с этим универсальным фреймворком.