From 156527641ab4f79f17e96da87d604681079f4541 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 5 Aug 2020 13:44:32 +0300 Subject: [PATCH] Continue working on ROS book --- docs/assets/right-hand-rotate.png | Bin 0 -> 9592 bytes docs/assets/right-hand-rule.svg | 87 +++++++++++++++++++ docs/ru/SUMMARY.md | 5 +- docs/ru/ros.md | 134 ++++++++++++++++++++++++------ docs/ru/ros_advanced.md | 20 ++++- docs/ru/ros_conventions.md | 40 +++++++++ docs/ru/ros_gui.md | 4 + 7 files changed, 258 insertions(+), 32 deletions(-) create mode 100644 docs/assets/right-hand-rotate.png create mode 100644 docs/assets/right-hand-rule.svg create mode 100644 docs/ru/ros_conventions.md diff --git a/docs/assets/right-hand-rotate.png b/docs/assets/right-hand-rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..036f27f487ec325366a38ead7ed965f9643d5f9d GIT binary patch literal 9592 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 Kp$#gw5&r{3^#Fwc literal 0 HcmV?d00001 diff --git a/docs/assets/right-hand-rule.svg b/docs/assets/right-hand-rule.svg new file mode 100644 index 00000000..2bdcf5b9 --- /dev/null +++ b/docs/assets/right-hand-rule.svg @@ -0,0 +1,87 @@ + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ru/SUMMARY.md b/docs/ru/SUMMARY.md index 16029a39..a5a47fc5 100644 --- a/docs/ru/SUMMARY.md +++ b/docs/ru/SUMMARY.md @@ -49,11 +49,8 @@ * [`mavros`](mavros.md) * ROS: учебник * [Общая информация](ros.md) - * [ROS-ноды](ros_node.md) - * [ROS-топики](ros_topic.md) - * [ROS-сервисы](ros_service.md) - * [ROS-параметры](ros_params.md) * [Графические инструменты](ros_gui.md) + * [Соглашения ROS](ros_conventions.md) * [Продвинутое использование](ros_advanced.md) * Дополнительные материалы * [COEX Pix](coex_pix.md) diff --git a/docs/ru/ros.md b/docs/ru/ros.md index 2704603e..32f7ab42 100644 --- a/docs/ru/ros.md +++ b/docs/ru/ros.md @@ -1,29 +1,26 @@ -ROS -=== +# Введение в ROS -Основная статья: http://wiki.ros.org +Основная документация: http://wiki.ros.org. -ROS – это широко используемый фреймворк для создания сложных и распределенных робототехнических систем. +**ROS** – это широко используемый фреймворк для создания сложных, распределенных робототехнических систем. На ROS основана [программная платформа Клевера](programming.md). -Установка ---- +## Установка -Основная статья: http://wiki.ros.org/melodic/Installation/Ubuntu +ROS уже установлен на [образе для RPi для Клевера](image.md). -ROS уже установлен на [образе для RPi](image.md). +Для использования ROS на компьютере рекомендуется ОС Ubuntu Linux (либо виртуальная машина, например [Parallels Desktop Lite](https://itunes.apple.com/ru/app/parallels-desktop-lite/id1085114709?mt=12) или [VirtualBox](https://www.virtualbox.org)). Воспользуйтесь [официальной документацией](http://wiki.ros.org/melodic/Installation/Ubuntu) для установки ROS на компьютер. -Для использования ROS на компьютере рекомендуется ОС Ubuntu Linux (либо виртуальная машина, например [Parallels Desktop Lite](https://itunes.apple.com/ru/app/parallels-desktop-lite/id1085114709?mt=12) или [VirtualBox](https://www.virtualbox.org)). +Для быстрого старта вы можете воспользоваться [образом виртуальной машины с ROS и симулятором Клевера](simulation_vm.md). > **Note** Для дистрибутива ROS Melodic рекомендуется Ubuntu версии 18.04. -Концепции ---- +## Концепции ### Ноды -Основная статья: http://wiki.ros.org/Nodes +Основная статья: http://wiki.ros.org/Nodes. -ROS-нода – это специальная программа (обычно написанная на Python или C++), которая взаимодействует с другими нодами посредством ROS-топиков и ROS-сервисов. Разделение сложных робототехнических систем на изолированные ноды дает определенные преимущества: понижается связанность кода, повышается переиспользуемость и надежность. +ROS-нода[^1] – это специальная программа (обычно написанная на Python или C++), которая взаимодействует с другими нодами посредством ROS-топиков и ROS-сервисов. Разделение сложных робототехнических систем на изолированные ноды дает определенные преимущества: понижается связанность кода, повышается переиспользуемость и надежность. Очень многие робототехнические библиотеки и драйвера выполнены именно в виде ROS-нод. @@ -39,22 +36,36 @@ rospy.init_node('my_ros_node') # имя ROS-ноды rospy.spin() # входим в бесконечный цикл... ``` +> **Info** Любая [программа для автономного полета Клевера](programming.md) является ROS-нодой. + ### Топики -Основная статья: http://wiki.ros.org/Topics +Основная статья: http://wiki.ros.org/Topics. -Топик – это именованная шина данных, по которой ноды обмениваются сообщениями. Любая нода может *опубликовать* сообщение в произвольный топик, а также *подписаться* на произвольный топик. +Топик – это именованная шина данных, по которой ноды обмениваются сообщениями. Любая нода может опубликовать сообщение в произвольный топик, а также подписаться на произвольный топик. -Пример публикации сообщения типа [`std_msgs/String`](http://docs.ros.org/api/std_msgs/html/msg/String.html) (строка) в топик `/foo` на языке Python: +Для каждого созданного топика должен быть задан тип сообщений, которые по нему передаются. ROS включает в себя большое количество стандартных типов сообщений, покрывающих различные аспекты робототехники, но при необходимости возможно создание собственных типов сообщений. Примеры стандартных типов сообщений: + +|Тип сообщения|Описание| +|-|-| +|[`std_msgs/Int64`](http://docs.ros.org/api/std_msgs/html/msg/Int64.html)|Целое число.| +|[`std_msgs/Float64`](http://docs.ros.org/api/std_msgs/html/msg/Float64.html)|Число с плавающей точкой (дробное) двойной точности.| +|[`std_msgs/String`](http://docs.ros.org/api/std_msgs/html/msg/String.html)|Строка.| +|[`geometry_msgs/PoseStamped`](http://docs.ros.org/api/geometry_msgs/html/msg/PoseStamped.html)|Позиция и ориентация объекта с заданной [системой координат](frames.md) и временной меткой (широко используется для передачи текущей позиции робота и его частей).| +|[`geometry_msgs/TwistStamped`](http://docs.ros.org/api/geometry_msgs/html/msg/TwistStamped.html)|Линейная и угловая скорость объекта с заданной системой координат и временной меткой.| +|[`sensor_msgs/Image`](http://docs.ros.org/api/sensor_msgs/html/msg/Image.html)|Изображение (см. [статью о работе с камерой](camera.md))| + +> **Info** Смотрите остальные стандартные типы сообщений в пакетах [`common_msgs`](http://wiki.ros.org/common_msgs), [`std_msgs`](http://wiki.ros.org/std_msgs), [`geometry_msgs`](http://wiki.ros.org/geometry_msgs), [`sensor_msgs`](http://wiki.ros.org/sensor_msgs) и других. + +Пример публикации сообщения типа [`std_msgs/String`](http://docs.ros.org/api/std_msgs/html/msg/String.html) в топик `/foo` на языке Python: ```python +import rospy from std_msgs.msg import String -# ... +rospy.init_node('my_ros_node') -foo_pub = rospy.Publisher('/foo', String, queue_size=1) # создаем Publisher'а - -# ... +foo_pub = rospy.Publisher('/foo', String, queue_size=1) # создаем Publisher foo_pub.publish(data='Hello, world!') # публикуем сообщение ``` @@ -62,31 +73,43 @@ foo_pub.publish(data='Hello, world!') # публикуем сообщение Пример подписки на топик `/foo`: ```python +import rospy +from std_msgs.msg import String + +rospy.init_node('my_ros_node') + def foo_callback(msg): print msg.data # Подписываемся. При получении сообщения в топик /foo будет вызвана функция foo_callback. rospy.Subscriber('/foo', String, foo_callback) + +rospy.spin() # входим в бесконечный цикл, чтобы программа не завершила работу ``` -Также, существует возможность работы с топиками с помощью утилиты `rostopic`. Например, с помощью следующей команды можно просматривать сообщения, публикуемые в топик `/mavros/state`: +Также существует возможность работы с топиками с помощью утилиты `rostopic`. Например, с помощью следующей команды можно просматривать сообщения, публикуемые в топик `/mavros/state`: ```bash rostopic echo /mavros/state ``` +Данные в топиках можно мониторить и визуализировать и в [графических инструментах ROS](ros_gui.md). + ### Сервисы -Основная статья: http://wiki.ros.org/Services +Основная статья: http://wiki.ros.org/Services. -Сервис – это некоторый аналог функции, которая может быть вызвана из одной ноды, а обработана в другой. У сервиса есть имя, аналогичное имени топика, и 2 типа сообщений: тип запроса и тип ответа. +Сервис – это аналог функции, которая вызывается в одной ноде, а обрабатывается в другой. У сервиса есть имя, строящееся аналогично имени топика, и тип, включающий в себя поля запроса и поля ответа. + +Таким образом, сервисы реализуют паттерн [*удаленного вызова процедур*](https://ru.wikipedia.org/wiki/Удалённый_вызов_процедур). Пример вызова ROS-сервиса из языка Python: ```python +import rospy from clover.srv import GetTelemetry -# ... +rospy.init_node('my_ros_node') # Создаем обертку над сервисом get_telemetry пакета clover с типом GetTelemetry: get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry) @@ -103,9 +126,68 @@ rosservice call /get_telemetry "{frame_id: ''}" Больше примеров использования сервисов для автономных полетов квадрокоптера Клевер можно посмотреть в [документации ноды simple_offboard](simple_offboard.md). -Работа на нескольких машинах ---- +### Параметры + +TODO + +### Имена + +Основная статья: http://wiki.ros.org/Names. + +Любой топик, сервис или параметр идентифицируется с помощью уникального имени. ROS-имя представляет собой иерархическую структуру с символом `/` в качестве разделителя (сходно с именами в файловой системе). + +Примеры ROS-имен: + +* `/` (глобальное пространство имен) +* `/foo` +* `/stanford/robot/name` +* `/wg/node1` + +Эти имена является глобальными (аналогично полному пути в файлу в файловой системе). На практике рекомендуется использование *приватных* или *относительных* имен. + +#### Приватное имя + +Каждая нода может использовать собственное приватное пространство имен (соответствующее имени ноды) для своих ресурсов. Например, нода `aruco_detect` может публиковать такие топики: + +* `/aruco_detect/markers` +* `/aruco_detect/visualization` +* `/aruco_detect/debug` + +Когда нода ссылается на свой приватный ресурс, вместо пространства имен (`/aruco_detect/`) используется символ `~`, например: + +* `~markers` +* `~visualization` +* `~debug` + +Таким образом, создание топика `foo` в приватном пространство имен из Python будет выглядеть так: + +```python +private_foo_pub = rospy.Publisher('~foo', String, queue_size=1) +``` + +#### Относительное имя + +Несколько нод также могут объединяться в общее пространство имен (например, при одновременной работе нескольких роботов). Для того, чтобы ссылаться на топики с учетом общего пространства имен, в названии ресурса опускается начальный символ `/`. + +Пример создание топика `foo` с учетом общего пространства имен: + +```python +relative_foo_pub = rospy.Publisher('foo', String, queue_size=1) +``` + +> **Hint** В общем случае всегда рекомендуется использовать приватные или относительные имена ресурсов и никогда не использовать глобальные. + +## Работа на нескольких машинах Основная статья: http://wiki.ros.org/ROS/Tutorials/MultipleMachines. Преимуществом использования ROS является возможность распределения нод на несколько машин в сети. Например, ноду, осуществляющую распознавание образом на изображении можно запустить на более мощном компьютере; ноду, управляющую коптером можно запустить непосредственно на Raspberry Pi, подключенном к полетному контроллеру и т. д. + +## Дополнительные материалы + +* Учебник по ROS от Voltbro - http://docs.voltbro.ru/starting-ros/. +* Другие книги по ROS - http://wiki.ros.org/Books. + +**Далее**: [Графические инструменты ROS](ros_gui.md). + +[^1]: Также встречается перевод "узел". diff --git a/docs/ru/ros_advanced.md b/docs/ru/ros_advanced.md index 109de85f..26fb23f7 100644 --- a/docs/ru/ros_advanced.md +++ b/docs/ru/ros_advanced.md @@ -1,9 +1,25 @@ # Продвинутое использование ROS +## Работа с `roslaunch` + +Основная статья: https://wiki.ros.org/roslaunch + +TODO + ## Создание пакетов +ROS-пакет содержит ноды, типы сообщений и сервисов, launch-файлы и другие ресурсы, объединенные единой задачей. + +TODO + ## Создание собственных типов сообщений -### Топики +Основная статья: http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv. -### Сервисы +Для обмена данными [ROS-ноды](ros.md#Ноды) пересылают сообщения определенных типов. ROS включает в себя большое количество стандартных типов сообщений, покрывающих различные аспекты робототехники. Предпочтительным является использование стандартных типов сообщений, так как это может дать совместимость с большим количеством стандартным пакетом. + +Если для ваших данных стандартного типа сообщений не находится, можно создать собственный тип. + +ROS-сообщения описываются в файлах а расширением `.msg`. Они должны находиться в каталоге `msg` вашего пакета. Эти файлы являются простыми текстовыми файлами со списком типом и названий полей сообщения. + +TODO diff --git a/docs/ru/ros_conventions.md b/docs/ru/ros_conventions.md new file mode 100644 index 00000000..047a2bf5 --- /dev/null +++ b/docs/ru/ros_conventions.md @@ -0,0 +1,40 @@ +# Соглашения ROS + +Чтобы упростить взаимодействие компонентов системы и избежать ошибок, ROS вводит определенное количество соглашений. Программная платформа, где возможно, Клевера соответствует этим соглашениями. + +## Системы координат + +Все системы координат в ROS должны быть правыми тройками векторов, то есть соответствовать [правилу правой руки](https://ru.wikipedia.org/wiki/Правило_буравчика). Положительное направление вращения вокруг оси определяется правилом буравчика. + + + +## Единцы измерения + +Основной REP: https://www.ros.org/reps/rep-0103.html. + +Все ноды ROS должны (если возможно) использовать следующие единицы измерения во всех своих внешних интерфейсах. + +### Основные единицы + +|Наименование|Единица| +|------------|-------| +|Длина|метр| +|Масса|килограмм| +|Время|секунда| +|Сила тока|ампер| + +### Производные единицы + +|Наименование|Единица| +|------------|-------| +|Угол|радиан| +|Частота|герц| +|Сила|ньютон| +|Мощность|ватт| +|Напряжение|вольт| +|Температура|градус Цельсия| +|Магнитная индукция|тесла| + +> **Hint** Распространенной ошибкой является попытка использования градусов в качестве единиц измерения углов в интерфейсах ROS. Правильным является использование [радианов](https://ru.wikipedia.org/wiki/Радиан). + +**Далее**: [Продвинутое использование ROS](ros_advanced.md). diff --git a/docs/ru/ros_gui.md b/docs/ru/ros_gui.md index 5b6650ea..6abe0c6b 100644 --- a/docs/ru/ros_gui.md +++ b/docs/ru/ros_gui.md @@ -1 +1,5 @@ # Инструменты визуализации ROS + +TODO + +**Далее**: [Соглашения ROS](ros_conventions.md).