Files
clover/docs/ru/simple_offboard.md
Oleg Kalachev f77843f4a5 Move ROS Noetic (#327)
* builder: Use 64-bit Raspberry Pi OS

* travis: Use 64-bit builder

* builder: Don't try to install Melodic packages on Noetic

* clover: Use package version 3, update dependencies

* travis: Enable Noetic build

* standalone_install: Auto-select Python, ROS distro

* builder: Use variable substitution for ROS_DISTRO

* builder: Add Noetic package definitions

* builder: Use variable substitution for validation

* aruco_pose, clover: Allow compiling against OpenCV 3 and 4

* builder: Add proper Noetic repository

* builder: Don't force Tornado version

Assume rosbridge_suite depends on the right one.

* builder: Install packages for Python 3

* builder/test: Use Python3 interpreter for ROS tests

TODO (?): add tests for Python2?

* builder: Use Python 3 syntax for Python 3 tests

* builder: Install rpi_ws281x for Python3

* standalone_install: Use proper Python for pytest

* builder: Install espeak for python3

* builder: Use proper path for roscore

* builder: Install rosdep, etc. for python3

* builder: Run Clever/Clover test with Python3

* builder: Use Python3 for Clever compat layer

* builder: Enable OpenCV 4.2 repository

* builder: Force versions for ROS packages that use OpenCV

Also, hold their versions so that they don't get updated for no reason.

* aruco_pose/draw: Replace OpenCV projection code with a rewrite

* builder: Don't try to install compressed_transport twice

* clover: Fix importing urllib for Python3

* aruco_pose, clover: Expose Python scripts through CMake

* clover/selfcheck: Be more python3-compatible

This is basically commit a01d199890 from buster-python3, not sure if it aged well.

* roswww_static: Add python script installation

* clover_blocks: Use Python3 syntax for exec

* aruco_pose: Remove unused code

* Melodic => Noetic in some docs

* docs: add 0.22 migration article

* docs: remove unneeded comment

* docs: python 3 updates

* docs: python 3 update in auto_setup article

* docs: add ROS Noetic transition note

* aruco.launch: add placement, length and map arguments

* genmap.py: add -o argument for output file name

* docs: use -o argument of genmap.py

* simple_offboard: correctly check manual control timeout, separate it from kill switch check

* blocks: force led_leds index to int

* docs: update and fix 0.22 migration articles

* blocks: fix set_leds with color-typed argument

* aruco_gen: Open file in binary mode for Python3 compatibility

* clover: Use proper variable in aruco.launch

* led: change default number of leds to 72

* aruco_pose: Make sure there are no undefined symbols

Also, compile in apriltag_quad_thresh.cpp - it contains some of the functions referenced
in aruco.cpp, which would otherwise be undefined.

* aruco_pose: Make vendored library compatible with older OpenCVs

* aruco_pose, clover: Reduce the amount of OpenCV libs requested

* aruco_pose, clover: Move subscriptions to the end of init

* aruco_pose: Don't expose vendored library symbols

* aruco_pose: Simplify dynamic parameter callback setting

* builder: Build with debug symbols

* clover: Attempt to respawn dying nodelets

* Change Raspberry Pi OS to latest armhf, use packages.coex.tech as a source

* Add CRYPTOGRAPHY_DONT_BUILD_RUST=1

* Fix Node.js installation

* image: use older CMake (3.13.4-1)
Fixing https://travis-ci.org/github/CopterExpress/clover/jobs/764367665#L6984

* image: update Raspberry Pi OS to 2021-03-04

* image: bring back moving ld.so.preload out of the way while building

* Fix pthreads ld error

* Try to fix pthreads ld error

* Another attempt to fix pthreads ld error

* Yet another attempt to fix pthreads ld error

* Try to fix

* Be verbose

* Temporarily disable rc and camera_markers building

* Fix standalone-install

* Revert "Temporarily disable rc and camera_markers building"

This reverts commit e119220e91.

* Try to fix

* Try to fix

* Revert "image: use older CMake (3.13.4-1)"

This reverts commit df28da0060.

* Revert "Revert "image: use older CMake (3.13.4-1)""

This reverts commit a28c774e8f.

* Verbosity

* Debugging

* More debugging

* Display all CMake variables

* Try to fix

* Another try to fix

* Revert "Another try to fix"

This reverts commit 5a4c3a0da7.

* Another try to fix

* And another

* And yet another

* Continue...

* Cleanup

* Sources lists cleanup

* More cleanup

* Restore .git directory in clover repo

* Fix building documentation

* Fix documentation building in image

* Trigger build to update ws281x package

* Test

* Disable unneeded hack

* Disable hack

* image: add cmake-modules package

* www: add viewing clover.err file from web interface

* Remove hacks

* Show nodelet version

* docs: add packages article

* image: add image-view package for recording video from topics

* Minor fix

* CI: add Docker authentication on image build

* CI: fix Bash syntax

* CI: fix authentication in Docker

* CI: move Melodic build and editorconfig-lint to GitHub Actions (#331)

* Create main.yml

* Update main.yml

* Disable native Melodic build in Travis

* Run editorconfig-lint in Actions

* Let wget be less verbose

* Test

* Test ok

* Disable editorconfig-lint in Travis

* docs: add links to hardware sources

* CI: move image building to GitHub actions (#335)

* Start working on building image in GitHub actions

* Trigger GitHub on push to any branch

* Fix TRAVIS_TAG

* Add compress image step

* Disable image build in Travis

* Add upload image step

* Fix compress image

* Fix

* Fix

* Minor fix

* Trigger build on tag

* Show images sizes not in human format

* Upload only built image

* Make prerelease

* Upload assets on release not on tags

* readme: change build badge to GitHub Actions

* readme: add support chat badge

* CI: move documentation building to GitHub Actions (#337)

* CI: change docs target branch to actions

* CI: change docs target branch to master

* CI: use gh-pages target branch for docs

* CI: split up to several workflows

* CI: remove .travis.yml

* CI: change apt to apt-get

* CI: push documentation site to the main repo

* builder: less verbosity

* CI: add new key for apt
Fixing https://github.com/CopterExpress/clover/runs/2700356960#step:3:74

* Add Noetic building to CI

* Add test for QR recognition

* Fix

* Move QR recognition test to a separate file

* Fix QR recognition code for Python 3

* Import SetLEDs, LEDStateArray, LEDState in tests

* Add more imports to tests
(from documentation)

* Fix permissions

* Fix standalone-install for Python 2

* Fix QR recognition test

* Don’t use ROS for QR recognition test

* docs: remove non-working example

* Make v4l2 device file an argument in main_camera.launch

* Wait for v4l2 device before launching the camera driver

* Use exec in waitfile

* Transfer main camera nodelet manager to main_camera.launch

* Update cv_camera version to 0.5.1

* docs: minor fix

* Revert cv_camera to 0.5.0

* Update Raspberry Pi OS to 2021-05-07

* docs: add link to the last ROS Melodic version.

Co-authored-by: Alexey Rogachevskiy <sfalexrog@gmail.com>
2021-06-08 20:13:46 +03:00

17 KiB
Raw Blame History

Автономный полет (OFFBOARD)

Note

В версии образа 0.20 пакет clever был переименован в clover. Для более ранних версий см. документацию для версии 0.19.

Hint Для автономных полетов рекомендуется использование специальной сборки PX4 для Клевера.

Модуль simple_offboard пакета clover предназначен для упрощенного программирования автономного полета дрона (режим OFFBOARD). Он позволяет устанавливать желаемые полетные задачи и автоматически трансформирует систему координат.

simple_offboard является высокоуровневым способом взаимодействия с полетным контроллером. Для более низкоуровневой работы см. mavros.

Основные сервисы get_telemetry (получение телеметрии), navigate (полет в заданную точку по прямой), navigate_global (полет в глобальную точку по прямой), land (переход в режим посадки).

Использование из языка Python

Для использования сервисов, необходимо создать объекты-прокси к ним. Используйте этот шаблон для вашей программы:

import rospy
from clover import srv
from std_srvs.srv import Trigger

rospy.init_node('flight')

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_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)
set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
land = rospy.ServiceProxy('land', Trigger)

Неиспользуемые функции-прокси можно удалить из кода.

Описание API

Note

Незаполненные числовые параметры устанавливаются в значение 0.

get_telemetry

Получить полную телеметрию коптера.

Параметры:

  • frame_id – система координат для значений x, y, z, vx, vy, vz. Пример: map, body, aruco_map. Значение по умолчанию: map.

Формат ответа:

  • frame_id – система координат;
  • connected есть ли подключение к FCU;
  • armed состояние armed винтов (винты включены, если true);
  • mode текущий полетный режим;
  • x, y, z – локальная позиция коптера (м);
  • lat, lon широта, долгота (градусы), необходимо наличие GPS;
  • alt высота в глобальной системе координат (стандарт WGS-84, не AMSL!), необходимо наличие GPS;
  • vx, vy, vz скорость коптера (м/с);
  • pitch – угол по тангажу (радианы);
  • roll угол по крену (радианы);
  • yaw – угол по рысканью (радианы);
  • pitch_rate – угловая скорость по тангажу (рад/с);
  • roll_rate – угловая скорость по крену (рад/с);
  • yaw_rate – угловая скорость по рысканью (рад/с);
  • voltage общее напряжение аккумулятора (В);
  • cell_voltage напряжение аккумулятора на ячейку (В).

Note

Недоступные по каким-то причинам поля будут содержать в себе значения NaN.

Вывод координат x, y и z коптера в локальной системе координат:

telemetry = get_telemetry()
print(telemetry.x, telemetry.y, telemetry.z)

Вывод высоты коптера относительно карты ArUco-меток:

telemetry = get_telemetry(frame_id='aruco_map')
print(telemetry.z)

Проверка доступности глобальной позиции:

import math
if not math.isnan(get_telemetry().lat):
    print('Global position is available')
else:
    print('No global position')

Вывод текущей телеметрии (командная строка):

rosservice call /get_telemetry "{frame_id: ''}"

navigate

Прилететь в обозначенную точку по прямой.

Параметры:

  • x, y, z координаты (м);
  • yaw угол по рысканью (радианы);
  • yaw_rate угловая скорость по рысканью (применяется при установке yaw в NaN) (рад/с);
  • speed скорость полета (скорость движения setpoint) (м/с);
  • auto_arm перевести коптер в OFFBOARD и заармить автоматически (коптер взлетит);
  • frame_id – система координат, в которой заданы x, y, z и yaw (по умолчанию: map).

Note

Для полета без изменения угла по рысканью достаточно установить yaw в NaN (значение угловой скорости по-умолчанию 0).

Взлет на высоту 1.5 м со скоростью взлета 0.5 м/с:

navigate(x=0, y=0, z=1.5, speed=0.5, frame_id='body', auto_arm=True)

Полет по прямой в точку 5:0 (высота 2) в локальной системе координат со скоростью 0.8 м/с (рысканье установится в 0):

navigate(x=5, y=0, z=3, speed=0.8)

Полет в точку 5:0 без изменения угла по рысканью (yaw = NaN, yaw_rate = 0):

navigate(x=5, y=0, z=3, speed=0.8, yaw=float('nan'))

Полет вправо относительно коптера на 3 м:

navigate(x=0, y=-3, z=0, speed=1, frame_id='body')

Полет влево на 2 м относительно последней целевой точки полета дрона:

navigate(x=0, y=2, z=0, speed=1, frame_id='navigate_target')

Повернуться на 90 градусов по часовой:

navigate(yaw=math.radians(-90), frame_id='body')

Полет в точку 3:2 (высота 2) в системе координат маркерного поля со скоростью 1 м/с:

navigate(x=3, y=2, z=2, speed=1, frame_id='aruco_map')

Вращение на месте со скоростью 0.5 рад/c (против часовой):

navigate(x=0, y=0, z=0, yaw=float('nan'), yaw_rate=0.5, frame_id='body')

Полет вперед 3 метра со скоростью 0.5 м/с, вращаясь по рысканью со скоростью 0.2 рад/с:

navigate(x=3, y=0, z=0, speed=0.5, yaw=float('nan'), yaw_rate=0.2, frame_id='body')

Взлет на высоту 2 м (командная строка):

rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed: 0.5, frame_id: 'body', auto_arm: true}"

Note

При программировании миссии дрона в терминах "вперед-назад-влево-вправо" рекомендуется использовать систему координат navigate_target вместо body, чтобы не учитывать неточность прилета дрона в предыдущую целевую точку при вычислении следующей.

navigate_global

Полет по прямой в точку в глобальной системе координат (широта/долгота).

Параметры:

  • lat, lon широта и долгота (градусы);
  • z высота (м);
  • yaw угол по рысканью (радианы);
  • yaw_rate угловая скорость по рысканью (при установке yaw в NaN) (рад/с);
  • speed скорость полета (скорость движения setpoint) (м/с);
  • auto_arm перевести коптер в OFFBOARD и заармить автоматически (коптер взлетит);
  • frame_id – система координат, в которой заданы z и yaw (по умолчанию: map).

Note

Для полета без изменения угла по рысканью достаточно установить yaw в NaN (значение угловой скорости по-умолчанию 0).

Полет в глобальную точку со скоростью 5 м/с, оставаясь на текущей высоте (yaw установится в 0, коптер сориентируется передом на восток):

navigate_global(lat=55.707033, lon=37.725010, z=0, speed=5, frame_id='body')

Полет в глобальную точку без изменения угла по рысканью (yaw = NaN, yaw_rate = 0):

navigate_global(lat=55.707033, lon=37.725010, z=0, speed=5, yaw=float('nan'), frame_id='body')

Полет в глобальную точку (командная строка):

rosservice call /navigate_global "{lat: 55.707033, lon: 37.725010, z: 0.0, yaw: 0.0, yaw_rate: 0.0, speed: 5.0, frame_id: 'body', auto_arm: false}"

set_position

Установить цель по позиции и рысканью. Данный сервис следует использовать при необходимости задания продолжающегося потока целевых точек, например, для полета по сложным траекториям (круговой, дугообразной и т. д.).

Hint Для полета на точку по прямой или взлета используйте более высокоуровневый сервис navigate.

Параметры:

  • x, y, z координаты точки (м);
  • yaw угол по рысканью (радианы);
  • yaw_rate угловая скорость по рысканью (при установке yaw в NaN) (рад/с);
  • auto_arm перевести коптер в OFFBOARD и заармить автоматически (коптер взлетит);
  • frame_id – система координат, в которой заданы x, y, z и yaw (по умолчанию: map).

Зависнуть на месте:

set_position(frame_id='body')

Назначить целевую точку на 3 м выше текущей позиции:

set_position(x=0, y=0, z=3, frame_id='body')

Назначить целевую точку на 1 м впереди текущей позиции:

set_position(x=1, y=0, z=0, frame_id='body')

Вращение на месте со скоростью 0.5 рад/c:

set_position(x=0, y=0, z=0, frame_id='body', yaw=float('nan'), yaw_rate=0.5)

set_velocity

Установить скорости и рысканье.

  • vx, vy, vz требуемая скорость полета (м/с);
  • yaw угол по рысканью (радианы);
  • yaw_rate угловая скорость по рысканью (при установке yaw в NaN) (рад/с);
  • auto_arm перевести коптер в OFFBOARD и заармить автоматически (коптер взлетит);
  • frame_id – система координат, в которой заданы vx, vy, vz и yaw (по умолчанию: map).

Note

Параметр frame_id определяет только ориентацию результирующего вектора скорости, но не его длину.

Полет вперед (относительно коптера) со скоростью 1 м/с:

set_velocity(vx=1, vy=0.0, vz=0, frame_id='body')

set_attitude

Установить тангаж, крен, рысканье и уровень газа (примерный аналог управления в режиме STABILIZED). Данный сервис может быть использован для более низкоуровневого контроля поведения коптера либо для управления коптером при отсутствии источника достоверных данных о его позиции.

Параметры:

  • pitch, roll, yaw – необходимый угол по тангажу, крену и рысканью (радианы);
  • thrust – уровень газа от 0 (нет газа, пропеллеры остановлены) до 1 (полный газ);
  • auto_arm перевести коптер в OFFBOARD и заармить автоматически (коптер взлетит);
  • frame_id – система координат, в которой задан yaw (по умолчанию: map).

set_rates

Установить угловые скорости по тангажу, крену и рысканью и уровень газа (примерный аналог управления в режиме ACRO). Это самый низкий уровень управления коптером (исключая непосредственный контроль оборотов моторов). Данный сервис может быть использован для автоматического выполнения акробатических трюков (например, флипа).

Параметры:

  • pitch_rate, roll_rate, yaw_rate – угловая скорость по тангажу, крену и рыканью (рад/с);
  • thrust уровень газа от 0 (нет газа, пропеллеры остановлены) до 1 (полный газ).
  • auto_arm перевести коптер в OFFBOARD и заармить автоматически (коптер взлетит);

Положительное направление вращения yaw_rate (при виде сверху) против часовой, pitch_rate вперед, roll_rate влево.

land

Перевести коптер в режим посадки (AUTO.LAND или аналогичный).

Note

Для автоматического отключения винтов после посадки параметр PX4 COM_DISARM_LAND должен быть установлен в значение > 0.

Посадка коптера:

res = land()

if res.success:
    print('Copter is landing')

Посадка коптера (командная строка):

rosservice call /land "{}"

Дополнительные материалы