Continue working on ROS book

This commit is contained in:
Oleg Kalachev
2020-08-05 13:44:32 +03:00
parent 4f9e4b1a28
commit 156527641a
7 changed files with 258 additions and 32 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
]>
<svg version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
x="0px" y="0px" width="507px" height="459px" viewBox="-21.914 -25.609 507 459" enable-background="new -21.914 -25.609 507 459"
xml:space="preserve">
<defs>
</defs>
<path fill="#E5D4B1" stroke="#000000" stroke-width="3" d="M466.982,303.788c-22-3-57-23-62-26s-28-28-40-47s-23-42-27-55
s-8-26-9-33s1-23.5,4-30.5c-7-5-21-6-27,7s-11,33-11,46s22,55,8,61s-17,14-89-4s-102-20-109-6s34,20,56,24s72.021,22.634,65,32
c-4.35,5.802-9.375,4.488-20.709,8.488c-19.611,6.922-19.308,9.966-43.791,18.345c-24.433,8.362-22.843,32.226-15.167,36.23
s14.016,6.342,46.386-12.013c14.35-5.34,31.782-8.885,47.115-10.218s24.668,56,41.334,64.667s35.999,8,47.999,8
s18.666,2.001,25.333-1.333s25.334,1.332,35.334,6.666c0,0,38.667,18.667,42,22.667"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M234.483,270.787c33.999-1.999,45.999,30.667,53.999,48.001"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M306.149,245.453c0.334,25.334,11.001,46.668,25.333,54.666"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M239.816,230.787c-8,1.333-17.333,20-13.333,25.333"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M197.149,220.12c-5.333,4-16,13.333-13.333,18.667"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M149.149,212.12c-6.667,4-8.834,15.501-10.167,18.167"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M222.483,280.121c8,4,12,17.332,9.333,26.666"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M201.296,287.393c6.667,4,7.248,23.993,4.581,27.993"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M175.848,298.59c8.648,6.485,9.591,15.534,5.089,26.466"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M293.982,236.288c-4,10-7,18-6,24"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M294.982,165.288c11.947,1.707,2.677,3.252,25-1"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M399.149,286.788c-4,12-8,15.999-14.667,19.999"/>
<path fill="#E5D4B1" stroke="#000000" stroke-width="3" d="M299.816,374.455c15.905-3.181,27.334-5.333,36-8
s21.332-10.001,24.666-16.667s0.667-7.999-1.333-12.666s-23.999-2-29.333,0s-10,4-32,7.333s-28,5-39.334,3.666
c-9.292-1.094,1.335,22.333,6.001,25S269.816,380.455,299.816,374.455z"/>
<path fill="#E5D4B1" stroke="#000000" stroke-width="3" d="M316.784,311.788c18.897-1.333,28.348-2.666,33.435,2.667
s2.906,10.667,1.453,12s-18.171,8.666-26.893,11.333c-8.723,2.667-10.176,0.667-27.619,4.667c-17.444,4-18.897,5.333-23.986,7.333
c-5.088,2-15.263,1.333-24.711-6c-9.449-7.333-7.996-20-7.269-24c0.727-4,1.455-12.667,19.625-14s12.354,4.666,35.614,5.333
C319.691,311.788,316.784,311.788,316.784,311.788z"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M245.815,318.455c-1.923,17.305,1.109,18.166,10.667,25.333"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M275.149,318.787c0,5.333,1.333,17.333,1.333,17.333"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M308.149,317.12c0,2.667,1.334,13.333,1.334,17.333"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M314.815,347.122c0,4,6.667,17.333,6.667,17.333"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M282.482,354.788c1.333,2.667,2.667,14.666,6.667,16"/>
<path fill="none" stroke="#897F6A" stroke-width="2" d="M405.815,318.788c-6.666,12-10.666,42.668-17.333,49.334"/>
<line fill="none" stroke="#963C96" stroke-width="9" stroke-linecap="round" x1="323.482" y1="90.788" x2="322.814" y2="41.788"/>
<polygon fill="#963C96" points="322.814,41.788 299.501,60.3 322.814,0 346.127,60.3 "/>
<line fill="none" stroke="#2828FF" stroke-width="9" stroke-linecap="round" x1="88.996" y1="210.46" x2="40.9" y2="201.067"/>
<polygon fill="#2828FF" points="40.9,201.067 54.24,227.68 0,192.5 63.799,182.044 "/>
<line fill="none" stroke="#E12828" stroke-width="9" stroke-linecap="round" x1="126.377" y1="335.255" x2="95.585" y2="348.005"/>
<polygon fill="#E12828" points="95.585,348.005 118.064,371.413 69.063,358.197 96.605,315.568 "/>
<g>
<path fill="#2828FF" d="M375.868,62.098l-0.308-0.103c-1.121,1.094-2.212,1.887-3.271,2.379s-2.184,0.738-3.373,0.738
c-1.75,0-3.138-0.461-4.163-1.384s-1.538-2.157-1.538-3.702c0-2.01,0.987-3.592,2.963-4.748s4.974-1.883,8.993-2.184v-1.948
c0-1.271-0.144-2.252-0.431-2.943s-0.656-1.176-1.107-1.456s-0.991-0.42-1.62-0.42s-1.173,0.109-1.63,0.328
c-0.459,0.219-0.872,0.632-1.241,1.241s-0.643,1.453-0.82,2.533h-3.876v-3.732c1.572-0.697,2.902-1.22,3.988-1.569
c1.088-0.349,2.099-0.605,3.035-0.769s1.836-0.246,2.697-0.246c1.654,0,2.977,0.219,3.969,0.656
c0.99,0.438,1.732,1.148,2.225,2.133s0.738,2.345,0.738,4.081v7.998c0,1.162,0.034,1.986,0.103,2.471s0.175,0.837,0.317,1.056
c0.145,0.219,0.328,0.39,0.555,0.513c0.225,0.123,0.639,0.26,1.24,0.41v1.354h-7.629L375.868,62.098z M375.191,55.104
c-2.119,0.055-3.688,0.451-4.707,1.189s-1.527,1.818-1.527,3.24c0,0.848,0.232,1.494,0.697,1.938s1.107,0.667,1.928,0.667
c0.629,0,1.224-0.167,1.784-0.502s1.005-0.783,1.333-1.343s0.492-1.155,0.492-1.784V55.104z"/>
<path d="M403.971,52.808l9.208,9.311l-2.051,2.051l-9.188-9.372l-9.475,9.29l-1.907-1.928l9.372-9.352L390.6,43.6l2.051-2.051
l9.29,9.27l9.29-9.27l1.928,1.907L403.971,52.808z"/>
<path fill="#E12828" d="M422.54,42.492c0-1.299-0.021-2.242-0.062-2.83s-0.127-1.042-0.256-1.364
c-0.131-0.321-0.328-0.574-0.596-0.759c-0.266-0.185-0.734-0.345-1.404-0.482v-1.354l5.722-0.287h2.522v11.751l0.021,0.021
c1.217-1.135,2.32-1.931,3.312-2.389s2.007-0.687,3.046-0.687c2.434,0,4.259,0.858,5.476,2.574s1.825,4.283,1.825,7.701
c0,3.568-0.804,6.248-2.409,8.039c-1.607,1.791-3.982,2.687-7.127,2.687c-2.16,0-4.136-0.39-5.927-1.169l-1.518,1.169l-2.625-0.369
V42.492z M428.466,58.058c0,1.682,0.29,2.922,0.871,3.722s1.48,1.2,2.697,1.2c1.258,0,2.218-0.66,2.881-1.979
s0.995-3.203,0.995-5.65c0-2.693-0.294-4.703-0.882-6.029s-1.504-1.989-2.748-1.989c-0.602,0-1.196,0.157-1.784,0.472
s-1.073,0.762-1.456,1.343s-0.574,1.22-0.574,1.917V58.058z"/>
</g>
<g>
<path fill="#2828FF" d="M74.339,166.769l-0.308-0.103c-1.121,1.094-2.212,1.887-3.271,2.379s-2.184,0.738-3.373,0.738
c-1.75,0-3.138-0.461-4.163-1.384s-1.538-2.157-1.538-3.702c0-2.01,0.987-3.592,2.963-4.748s4.974-1.883,8.993-2.184v-1.948
c0-1.271-0.144-2.252-0.431-2.943s-0.656-1.176-1.107-1.456s-0.991-0.42-1.62-0.42s-1.173,0.109-1.63,0.328
c-0.459,0.219-0.872,0.632-1.241,1.241s-0.643,1.453-0.82,2.533h-3.876v-3.732c1.572-0.697,2.902-1.22,3.988-1.569
c1.088-0.349,2.099-0.605,3.035-0.769s1.836-0.246,2.697-0.246c1.654,0,2.977,0.219,3.969,0.656
c0.99,0.438,1.732,1.148,2.225,2.133s0.738,2.345,0.738,4.081v7.998c0,1.162,0.034,1.986,0.103,2.471s0.175,0.837,0.317,1.056
c0.145,0.219,0.328,0.39,0.555,0.513c0.225,0.123,0.639,0.26,1.24,0.41v1.354h-7.629L74.339,166.769z M73.663,159.775
c-2.119,0.055-3.688,0.451-4.707,1.189s-1.527,1.818-1.527,3.24c0,0.848,0.232,1.494,0.697,1.938s1.107,0.667,1.928,0.667
c0.629,0,1.224-0.167,1.784-0.502s1.005-0.783,1.333-1.343s0.492-1.155,0.492-1.784V159.775z"/>
</g>
<g>
<path fill="#E12828" d="M93.716,283.163c0-1.299-0.021-2.242-0.062-2.83s-0.127-1.042-0.256-1.363
c-0.131-0.321-0.328-0.574-0.596-0.759c-0.266-0.185-0.734-0.345-1.404-0.481v-1.354l5.722-0.287h2.522v11.75l0.021,0.021
c1.217-1.135,2.32-1.932,3.312-2.39s2.007-0.687,3.046-0.687c2.434,0,4.259,0.857,5.476,2.573s1.825,4.282,1.825,7.7
c0,3.568-0.804,6.248-2.409,8.039c-1.607,1.791-3.982,2.688-7.127,2.688c-2.16,0-4.136-0.391-5.927-1.17l-1.518,1.17l-2.625-0.369
V283.163z M99.643,298.729c0,1.682,0.29,2.922,0.871,3.722s1.48,1.2,2.697,1.2c1.258,0,2.218-0.66,2.881-1.979
s0.995-3.202,0.995-5.649c0-2.693-0.294-4.703-0.882-6.029s-1.504-1.99-2.748-1.99c-0.602,0-1.196,0.158-1.784,0.473
s-1.073,0.762-1.456,1.343s-0.574,1.22-0.574,1.917V298.729z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@@ -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)

View File

@@ -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]: Также встречается перевод "узел".

View File

@@ -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

View File

@@ -0,0 +1,40 @@
# Соглашения ROS
Чтобы упростить взаимодействие компонентов системы и избежать ошибок, ROS вводит определенное количество соглашений. Программная платформа, где возможно, Клевера соответствует этим соглашениями.
## Системы координат
Все системы координат в ROS должны быть правыми тройками векторов, то есть соответствовать [правилу правой руки](https://ru.wikipedia.org/wiki/Правило_буравчика). Положительное направление вращения вокруг оси определяется правилом буравчика.
<img src="../assets/right-hand-rule.svg" width=200><img src="../assets/right-hand-rotate.png" width=200>
## Единцы измерения
Основной REP: https://www.ros.org/reps/rep-0103.html.
Все ноды ROS должны (если возможно) использовать следующие единицы измерения во всех своих внешних интерфейсах.
### Основные единицы
|Наименование|Единица|
|------------|-------|
|Длина|метр|
|Масса|килограмм|
|Время|секунда|
|Сила тока|ампер|
### Производные единицы
|Наименование|Единица|
|------------|-------|
|Угол|радиан|
|Частота|герц|
|Сила|ньютон|
|Мощность|ватт|
|Напряжение|вольт|
|Температура|градус Цельсия|
|Магнитная индукция|тесла|
> **Hint** Распространенной ошибкой является попытка использования градусов в качестве единиц измерения углов в интерфейсах ROS. Правильным является использование [радианов](https://ru.wikipedia.org/wiki/Радиан).
**Далее**: [Продвинутое использование ROS](ros_advanced.md).

View File

@@ -1 +1,5 @@
# Инструменты визуализации ROS
TODO
**Далее**: [Соглашения ROS](ros_conventions.md).