13 KiB
Simple offboard
Модуль simple_offboard пакета clever предназначен для упрощенного программирования автономного дрона (режим OFFBOARD). Он позволяет устанавливать желаемые полетные задачи и автоматически трансформирует систему координат.
simple_offboard является высокоуровневым способом взаимодействия с полетным контроллером. Для более низкоуровневой работы см. mavros.
Основные сервисы – get_telemetry (получение всей телеметрии разом), navigate (полет в заданную точку по прямой), land (переход в режим посадки).
Общие для сервисов параметры:
auto_arm=true/false– перевести коптер в OFFBOARD и заармить автоматически (коптер взлетит, если находится на полу!)frame_id— система координат в TF2, в которой заданы координаты и рысканье (yaw), описание систем координат;update_frame— считать ли систему координат изменяющейся (например,falseдляlocal_origin,fcu,fcu_horiz,trueдляmarker_map);x,y– горизонтальные координаты в системе координатframe_id;z— высота в системе координатframe_id;lat,lon– широта и долгота (в градусах);yaw— рысканье в радианах в системе координатframe_id(0 – коптер смотрит по оси X);yaw_rate— угловая скорость по рысканью в радианах в секунду (против часовой),yawдолжен быть установлен в NaN;thrust— уровень газа от 0 (нет газа) до 1 (полный газ).
Warning
API модуля
simple_offboardна данный момент нестабилен и может измениться.
Использование из языка Python
Пример программы, объявляющей прокси ко всем сервисам:
import rospy
from clever import srv
from std_srvs.srv import Trigger
rospy.init_node('foo')
# Создаем прокси ко всем сервисам:
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)
land = rospy.ServiceProxy('land', Trigger)
release = rospy.ServiceProxy('release', Trigger)
Неиспользуемые фукнции-прокси можно удалить из кода.
Список сервисов
get_telemetry
Получить полную телеметрию коптера. Параметр: frame_id – фрейм для значений x, y, z, vx, vy, vz. Пример: local_origin, fcu_horiz, aruco_map.
Ответ:
frame_id– фреймconnected– есть ли подключение к FCUarmed– состояниеarmedвинтов (винты включены, если true)mode- текущий полетный режимx, y, z– позиция коптера в системе координатframe_idlat, lon– текущая широта и долгота (при наличии gps)vx, vy, vz– скорость коптераpitch– угол по тангажу (радианы)roll– угол по крену (радианы)yaw– угол по рысканью в фреймеframe_idpitch_rate– угловая скорость по тангажуroll_rate– угловая скорость по кренуyaw_rate– угловая скорость по рысканьюvoltage– общее напряжение аккумуляторcell_voltage– напряжение аккумулятора на ячейку
Пример. Вывести координаты x, y и z коптера в локальной системе координат:
telemetry = get_telemetry()
print telemetry.x, telemetry.y, telemetry.z
Вывод текущей телеметрии из командной строки:
rosservice call /get_telemetry "{frame_id: ''}"
navigate
Прилететь в обозначенную точку по прямой.
Параметры:
x,y,z– координаты в системеframe_idyaw– угол по рысканьюyaw_rate– угловая скорость по рысканью (при установке yaw в NaN)speed– скорость полета (скорость движения setpoint)frame_id,update_frame,auto_arm.
Примеры:
# плавно взлететь на высоту 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 м/с
navigate(x=5, y=0, z=3, speed=0.8)
# пролететь вправо относительно коптера на 3 м
navigate(x=0, y=-1, z=0, speed=1, frame_id='fcu_horiz')
# прилететь в точку 3:2 (высота 2) в системе координат маркерного поля
# со скоростью 1 м/с
navigate(x=3, y=2, z=2, speed=1, frame_id='aruco_map', update_frame=True)
Пример взлета на коптере на 2 метра из командной строки:
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}"
navigate_global
Info Образ версии >0.5.
Полет по прямой в точку в глобальной системе координат (широта/долгота).
Параметры:
lat,lon– широта и долгота;z– высота в системе координатframe_id;yaw– угол по рысканью;yaw_rate– угловая скорость по рысканью (при установке yaw в NaN);speed– скорость полета (скорость движения setpoint);frame_id,update_frame,auto_arm.
Объявление прокси к сервису:
navigate_global = rospy.ServiceProxy('/navigate_global', srv.NavigateGlobal)
Полет в глобальную точку по прямой (оставаясь на текущей высоте):
navigate_global(lat=55.707033, lon=37.725010, z=0, frame_id='fcu_horiz')
Пример полета в глобальную точку из командной строки:
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}"
set_position
Установить цель по позиции и рысканью.
Параметры:
x,y,z– координаты точки в системе координатframe_id;yaw– угол по рысканью;yaw_rate– угловая скорость по рысканью (при установке yaw в NaN);speed– скорость полета (скорость движения setpoint);frame_id,update_frame,auto_arm.
Hint Для полета на точку по прямой или взлета используйте более высокоуровневый сервис
navigate.
Задание позиции относительно текущей позиции коптера:
set_position(x=0, y=0, z=3, frame_id='fcu_horiz', auto_arm=true) # взлет на 3 метра
set_position(x=1, y=0, z=0, frame_id='fcu_horiz') # пролететь вперед на 1 метр
set_position(x=0, y=-1, z=0, frame_id='fcu_horiz') # пролететь вправо на 1 метр
Задание позиции относительно системы маркеров
(фрейм aruco_map не будет опубликован, пока коптер хоть раз не увидит один из маркеров):
set_position(x=2, y=2, z=3, frame_id='aruco_map', update_frame=True) # полет в координату 2:2, высота 3 метра
Вращение на месте со скоростью 0.5 рад/c:
set_position(x=0, y=0, z=0, frame_id='fcu_horiz', yaw=float('nan'), yaw_rate=0.5)
set_velocity
Установить скорости и рысканье.
vx,vy,vz– требуемая скорость полета;yaw– угол по рысканью;yaw_rate– угловая скорость по рысканью (при установке yaw в NaN);frame_id,update_frame,auto_arm.
Note
Параметр
frame_idвлияет только на ориентацию результирующего вектора скорости, но не на его длину.
Параметры: vx, vy, vz, yaw, frame_id, update_frame
Полет вперед (относительно коптера) со скоростью 1 м/с:
set_velocity(vx=1, vy=0.0, vz=0, frame_id: 'fcu_horiz')
Полет по кругу:
set_velocity(vx=0.2, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.5, frame_id: 'fcu_horiz', update_frame: True)
set_attitude
Установить тангаж, крен, рысканье и уровень газа.
Note
Параметр
frame_idопределяет систему координат, в которой задаетсяyaw.
Параметры:
pitch,roll,yaw– необходимый угол по тангажу, крену и рысканью (рад.);thrust– уровень газа от 0 (нет газа) до 1 (полный газ);frame_id,update_frame.
set_rates
Установить угловые скорости по тагажу, крену и рысканью и уровень газа.
Параметры:
- pitch_rate, roll_rate, yaw_rate – угловая скорость по танажу, крену и рыканью (рад/с);
- thrust – уровень газа от 0 (нет газа) до 1 (полный газ).
release
Перестать публиковать sepoint'ы коптеру (отпустить управление). Возможно продолжение управления средствами MAVROS, Веб-пультом управления.
Посадка
Info Образ версии >0.5.
Для посадки можно использовать сервис /land. При вызове сервиса коптер автоматически переведется в режим AUTO.LAND (или аналогичный).
Объявление прокси к сервису:
land = rospy.ServiceProxy('/land', Trigger)
Посадка коптера:
res = land()
if res.success:
# коптер успешно переведен в режим AUTO.LAND
# ...
Пример использования сервиса из командной строки:
rosservice call /land "{}"
Note
Для автоматического отключения винтов после посадки PX4-параметр
COM_DISARM_LANDдолжен быть установлен в значение > 0.
В предущих версиях для посадки необходимо перевести коптер в режим AUTO.LAND, используя mavros.
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.