Merge branch 'master' into simple-offboard-refactored

This commit is contained in:
Oleg Kalachev
2018-03-19 20:45:20 +03:00
235 changed files with 769 additions and 563 deletions

View File

@@ -1,16 +1,16 @@
Simple offboard
===
Модуль `simple_offboard` пакета `clever` предназначен для упрощенного программирования автономного дрона (режим `OFFBOARD`). Он позволяет устанавливать желаемые полетные задачи и автоматически трансформирует [систему координат](/docs/frames.md).
Модуль `simple_offboard` пакета `clever` предназначен для упрощенного программирования автономного дрона (режим `OFFBOARD`). Он позволяет устанавливать желаемые полетные задачи и автоматически трансформирует [систему координат](frames.md).
`simple_offboard` является высокоуровневым способом взаимодействия с полетным контроллером. Для более низкоуровневой работы см. [mavros](/docs/mavros.md).
`simple_offboard` является высокоуровневым способом взаимодействия с полетным контроллером. Для более низкоуровневой работы см. [mavros](mavros.md).
Основные сервисы `get_telemetry` (получение всей телеметрии разом), `navigate` (полет в заданную точку по прямой), `land` (переход в режим посадки).
Основные сервисы `get_telemetry` (получение всей телеметрии), `navigate` (полет в заданную точку по прямой), `navigate_global` (полет в глобальную точку по прямой), `land` (переход в режим посадки).
Общие для сервисов параметры:
* `auto_arm` = `true`/`false` перевести коптер в OFFBOARD и заармить автоматически (**коптер взлетит, если находится на полу!**)
* `frame_id` — система координат в TF2, в которой заданы координаты и рысканье (yaw), [описание систем координат](/docs/frames.md);
* `auto_arm` = `true`/`false` перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**)
* `frame_id` — система координат в TF2, в которой заданы координаты и рысканье (yaw), [описание систем координат](frames.md);
* `update_frame` — считать ли систему координат изменяющейся (например, `false` для `local_origin`, `fcu`, `fcu_horiz`, `true` для `marker_map`);
* `x`, `y` горизонтальные координаты в системе координат `frame_id`;
* `z` — высота в системе координат `frame_id`;
@@ -24,14 +24,14 @@ Simple offboard
Использование из языка Python
---
Пример программы, объявляющей прокси ко всем сервисам:
Для использования сервисов, необходимо создать объекты-прокси к ним. Пример программы, объявляющей прокси ко всем сервисам `simple_offboard`:
```python
import rospy
from clever import srv
from std_srvs.srv import Trigger
rospy.init_node('foo')
rospy.init_node('foo') # название вашей ROS-ноды
# Создаем прокси ко всем сервисам:
@@ -39,7 +39,6 @@ get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)
set_position = rospy.ServiceProxy('set_position', srv.SetPosition)
set_position_global = rospy.ServiceProxy('set_position_global', srv.SetPositionGlobal)
set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)
set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
@@ -49,39 +48,50 @@ release = rospy.ServiceProxy('release', Trigger)
Неиспользуемые фукнции-прокси можно удалить из кода.
Список сервисов
Описание API
---
### get_telemetry
Получить полную телеметрию коптера. Параметр: `frame_id` – фрейм для значений `x`, `y`, `z`, `vx`, `vy`, `vz`. Пример: `local_origin`, `fcu_horiz`, `aruco_map`.
Получить полную телеметрию коптера.
Ответ:
Параметры:
* `frame_id` – фрейм
* `connected` есть ли подключение к <abbr title="Flight Control Unit, полетный контроллер">FCU</abbr>
* `armed` состояние `armed` винтов (винты включены, если true)
* `mode` - текущий [полетный режим](/docs/modes.md)
* `x, y, z` позиция коптера в системе координат `frame_id`
* `lat, lon` текущая широта и долгота (при наличии [gps](/docs/gps.md))
* `vx, vy, vz` скорость коптера
* `pitch`  угол по тангажу (радианы)
* `roll` угол по крену (радианы)
* `yaw` – угол по рысканью в фрейме `frame_id`
* `pitch_rate` – угловая скорость по тангажу
* `roll_rate` – угловая скорость по крену
* `yaw_rate` – угловая скорость по рысканью
* `voltage` общее напряжение аккумулятор
* `cell_voltage` напряжение аккумулятора на ячейку
* `frame_id`  [фрейм](frames.md) для значений `x`, `y`, `z`, `vx`, `vy`, `vz`. Пример: `local_origin`, `fcu_horiz`, `aruco_map`.
Пример. Вывести координаты x, y и z коптера в локальной системе координат:
Формат ответа:
* `frame_id` – фрейм;
* `connected` есть ли подключение к <abbr title="Flight Control Unit, полетный контроллер">FCU</abbr>;
* `armed` состояние `armed` винтов (винты включены, если true);
* `mode` - текущий [полетный режим](modes.md);
* `x, y, z` – локальная позиция коптера;
* `lat, lon` широта, долгота (при наличии [gps](gps.md));
* `vx, vy, vz` скорость коптера;
* `pitch`  угол по тангажу (радианы);
* `roll` угол по крену (радианы);
* `yaw` – угол по рысканью в фрейме `frame_id`;
* `pitch_rate` – угловая скорость по тангажу (*work in progress*);
* `roll_rate` – угловая скорость по крену (*work in progress*);
* `yaw_rate` – угловая скорость по рысканью (*work in progress*);
* `voltage` общее напряжение аккумулятора;
* `cell_voltage` напряжение аккумулятора на ячейку;
Вывод координат `x`, `y` и `z` коптера в локальной системе координат:
```python
telemetry = get_telemetry()
print telemetry.x, telemetry.y, telemetry.z
```
Вывод текущей телеметрии из командной строки:
Вывод высоты коптера относительно [карты ArUco-меток](aruco.md):
```python
telemetry = get_telemetry(frame_id='aruco_map')
print telemetry.z
```
Вывод текущей телеметрии (командная строка):
```bash
rosservice call /get_telemetry "{frame_id: ''}"
@@ -93,41 +103,53 @@ rosservice call /get_telemetry "{frame_id: ''}"
Параметры:
* `x`, `y`, `z` координаты в системе `frame_id`
* `yaw` угол по рысканью
* `yaw_rate` угловая скорость по рысканью (при установке yaw в NaN)
* `speed` скорость полета (скорость движения setpoint)
* `frame_id`, `update_frame`, `auto_arm`.
* `x`, `y`, `z` координаты в системе `frame_id`;
* `yaw` угол по рысканью;
* `yaw_rate` угловая скорость по рысканью (при установке yaw в `NaN`);
* `speed` скорость полета (скорость движения setpoint);
* `auto_arm` перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
* `frame_id`, `update_frame`.
Примеры:
Взлететь на высоту 1.5 м со скоростью взлета 0.5 м/с:
```python
# плавно взлететь на высоту 1.5 м со скоростью взлета 0.5 м/с
navigate(x=0, y=0, z=1.5, speed=0.5, frame_id='fcu_horiz', auto_arm=True)
```
Прилететь по прямой в точку 5:0 (высота 2) в локальной системе координат со скоростью 0.8 м/с:
```python
# прилететь по прямой в точку 5:0 (высота 2)
# в локальной системе координат со скоростью 0.8 м/с
navigate(x=5, y=0, z=3, speed=0.8)
```
Пролететь вправо относительно коптера на 3 м:
```python
# пролететь вправо относительно коптера на 3 м
navigate(x=0, y=-1, z=0, speed=1, frame_id='fcu_horiz')
```
Прилететь в точку 3:2 (высота 2) в системе координат [маркерного поля](aruco.md) со скоростью 1 м/с:
```python
# прилететь в точку 3:2 (высота 2) в системе координат маркерного поля
# со скоростью 1 м/с
navigate(x=3, y=2, z=2, speed=1, frame_id='aruco_map', update_frame=True)
```
Пример взлета на коптере на 2 метра из командной строки:
Вращение на месте со скоростью 0.5 рад/c:
```python
navigate(x=0, y=0, z=0, yaw=float('nan'), yaw_rate=0.5, frame_id='fcu_horiz')
```
Пролететь вперед 3 метра со скоростью 0.5 м/с, вращаясь по рысканью со скоростью 0.2 рад/с:
```python
navigate(x=3, y=0, z=0, speed=0.5, yaw=float('nan'), yaw_rate=0.2, frame_id='fcu_horiz')
```
Взлететь на высоту 2 м (командная строка):
```bash
rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, speed: 0.5, frame_id: 'fcu_horiz', update_frame: false, auto_arm: true}"
rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed: 0.5, frame_id: 'fcu_horiz', update_frame: false, auto_arm: true}"
```
### navigate_global
@@ -141,15 +163,10 @@ rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, speed: 0.5, frame_id
* `lat`, `lon` широта и долгота;
* `z` высота в системе координат `frame_id`;
* `yaw` угол по рысканью;
* `yaw_rate` угловая скорость по рысканью (при установке yaw в NaN);
* `yaw_rate` угловая скорость по рысканью (при установке yaw в `NaN`);
* `speed` скорость полета (скорость движения setpoint);
* `frame_id`, `update_frame`, `auto_arm`.
Объявление прокси к сервису:
```python
navigate_global = rospy.ServiceProxy('/navigate_global', srv.NavigateGlobal)
```
* `auto_arm` перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
* `frame_id`, `update_frame`.
Полет в глобальную точку по прямой (оставаясь на текущей высоте):
@@ -157,15 +174,17 @@ navigate_global = rospy.ServiceProxy('/navigate_global', srv.NavigateGlobal)
navigate_global(lat=55.707033, lon=37.725010, z=0, frame_id='fcu_horiz')
```
Пример полета в глобальную точку из командной строки:
Полет в глобальную точку (командная строка):
```bash
rosservice call /navigate_global "{lat: 55.707033, lon: 37.725010, z: 0.0, yaw: 0.0, speed: 3.0, frame_id: 'fcu_horiz', update_frame: false, auto_arm: false}"
rosservice call /navigate_global "{lat: 55.707033, lon: 37.725010, z: 0.0, yaw: 0.0, yaw_rate: 0.0, speed: 3.0, frame_id: 'fcu_horiz', update_frame: false, auto_arm: false}"
```
### set_position
Установить цель по позиции и рысканью.
Установить цель по позиции и рысканью. Данный сервис следует использовать при необходимости задания продолжающегося потока целевых точек, например, для полета по сложным траекториям (круговой, дугообразной и т. д.).
> **Hint** Для полета на точку по прямой или взлета используйте более высокоуровневый сервис `navigate`.
Параметры:
@@ -173,29 +192,19 @@ rosservice call /navigate_global "{lat: 55.707033, lon: 37.725010, z: 0.0, yaw:
* `yaw` угол по рысканью;
* `yaw_rate` угловая скорость по рысканью (при установке yaw в NaN);
* `speed` скорость полета (скорость движения setpoint);
* `frame_id`, `update_frame`, `auto_arm`.
* `auto_arm` перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
* `frame_id`, `update_frame`.
> **Hint** Для полета на точку по прямой или взлета используйте более высокоуровневый сервис `navigate`.
Задание позиции относительно текущей позиции коптера:
Назначить целевую точку на 3 м выше текущей позиции:
```python
set_position(x=0, y=0, z=3, frame_id='fcu_horiz', auto_arm=true) # взлет на 3 метра
set_position(x=0, y=0, z=3, frame_id='fcu_horiz')
```
```python
set_position(x=1, y=0, z=0, frame_id='fcu_horiz') # пролететь вперед на 1 метр
```
Назначить целевую точку на 1 м впереди текущей позиции:
```python
set_position(x=0, y=-1, z=0, frame_id='fcu_horiz') # пролететь вправо на 1 метр
```
Задание позиции относительно системы маркеров
(фрейм `aruco_map` не будет опубликован, пока коптер хоть раз не увидит один из маркеров):
```python
set_position(x=2, y=2, z=3, frame_id='aruco_map', update_frame=True) # полет в координату 2:2, высота 3 метра
set_position(x=1, y=0, z=0, frame_id='fcu_horiz')
```
Вращение на месте со скоростью 0.5 рад/c:
@@ -211,11 +220,10 @@ set_position(x=0, y=0, z=0, frame_id='fcu_horiz', yaw=float('nan'), yaw_rate=0.5
* `vx`, `vy`, `vz` требуемая скорость полета;
* `yaw` угол по рысканью;
* `yaw_rate` угловая скорость по рысканью (при установке yaw в NaN);
* `frame_id`, `update_frame`, `auto_arm`.
* `auto_arm` перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
* `frame_id`, `update_frame`.
> **Note** Параметр `frame_id` влияет только на ориентацию результирующего вектора скорости, но не на его длину.
Параметры: vx, vy, vz, yaw, frame_id, update_frame
> **Note** Параметр `frame_id` определяет только ориентацию результирующего вектора скорости, но не его длину.
Полет вперед (относительно коптера) со скоростью 1 м/с:
@@ -223,7 +231,7 @@ set_position(x=0, y=0, z=0, frame_id='fcu_horiz', yaw=float('nan'), yaw_rate=0.5
set_velocity(vx=1, vy=0.0, vz=0, frame_id: 'fcu_horiz')
```
Полет по кругу:
Один из вариантов полета по кругу:
```python
set_velocity(vx=0.2, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.5, frame_id: 'fcu_horiz', update_frame: True)
@@ -231,42 +239,32 @@ set_velocity(vx=0.2, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.5, frame_id: 'fc
### set_attitude
Установить тангаж, крен, рысканье и уровень газа.
Установить тангаж, крен, рысканье и уровень газа (примерный аналог управления в [режиме `STABILIZED`](modes.md)). Данный сервис может быть использован для более низкоуровнего контроля поведения коптера либо для управления коптером при отсутствии источника достоверных данных о его позиции.
> **Note** Параметр `frame_id` определяет систему координат, в которой задается `yaw`.
> **Note** Параметр `frame_id` определяет только систему координат, в которой задается рысканье (`yaw`).
Параметры:
* `pitch`, `roll`, `yaw` – необходимый угол по тангажу, крену и рысканью (рад.);
* `thrust` – уровень газа от 0 (нет газа) до 1 (полный газ);
* `auto_arm` перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
* `frame_id`, `update_frame`.
### set_rates
Установить угловые скорости по тагажу, крену и рысканью и уровень газа.
Установить угловые скорости по тагажу, крену и рысканью и уровень газа (примерный аналог управления в [режиме `ACRO`](modes.md). Это самый низкий уровень управления коптером (исключая непосредственный контроль оборотов моторов). Данный сервис может быть использован для автоматического выполнения акробатических трюков (например, флипа).
Параметры:
* pitch_rate, roll_rate, yaw_rate – угловая скорость по танажу, крену и рыканью (рад/с);
* thrust уровень газа от 0 (нет газа) до 1 (полный газ).
* `pitch_rate`, `roll_rate`, `yaw_rate` – угловая скорость по танажу, крену и рыканью (рад/с);
* `thrust` уровень газа от 0 (нет газа) до 1 (полный газ).
* `auto_arm` перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
### release
### land
Перестать публиковать sepoint'ы коптеру (отпустить управление).
Возможно продолжение управления средствами [MAVROS](/docs/mavros.md), [Веб-пультом управления](/docs/web_rc.md).
Перевести коптер в [режим](modes.md) посадки (`AUTO.LAND` или аналогичный).
Посадка
-------
> **Info** Образ версии >0.5.
Для посадки можно использовать сервис `/land`. При вызове сервиса коптер автоматически переведется в [режим](/docs/modes.md) `AUTO.LAND` (или аналогичный).
Объявление прокси к сервису:
```python
land = rospy.ServiceProxy('/land', Trigger)
```
> **Note** Для автоматического отключения винтов после посадки PX4-параметр `COM_DISARM_LAND` должен быть установлен в значение > 0.
Посадка коптера:
@@ -278,26 +276,18 @@ if res.success:
# ...
```
Пример использования сервиса из командной строки:
Посадка коптера (командная строка):
```bash
rosservice call /land "{}"
```
> **Note** Для автоматического отключения винтов после посадки PX4-параметр `COM_DISARM_LAND` должен быть установлен в значение > 0.
### release
В предущих версиях для посадки необходимо перевести коптер в режим ``AUTO.LAND``, используя mavros.
Перестать публиковать setpoint'ы коптеру (отпустить управление). Необходим для продолжения контроля средствами [MAVROS](mavros.md).
```python
from mavros_msgs.srv import SetMode
Дополнительные материалы
------------------------
# ...
set_mode = rospy.ServiceProxy('/mavros/set_mode', SetMode) # объявляем прокси к сервису переключения режимов
# ...
set_mode(base_mode=0, custom_mode='AUTO.LAND') # включаем режим посадки
```
Для полетов в поле ArUco-макеров см. [навигация по ArUco](/docs/aruco.md).
* [Полеты в поле ArUco-макеров](aruco.md).
* [Примеры программ и сниппеты](snippets.md).