Программирование
Платформа позволяет использовать Raspberry Pi для того, чтобы запрограммировать автономный полет дрона. Чаще всего программа для автономного полета пишется на языке Python. Программа может получать телеметрию (заряд батареи, ориентацию, положение, скорости) и отправлять команды, например: полететь в точку, установить ориентацию, установить угловую скорость.
Платформа основывается на фреймворке ROS, который обеспечивает связь между пользовательской программой и сервисами, которые запущены в фоне в виде systemd-демона drone
.
Для автономного полета используется режим OFFBOARD. API переводит дрон в этом режим автоматически. В случае необходимости прерывания автономного полета, необходимо перевести дрон в любой другой режим, используя стик переключения режимов на пульте.
Модули и датчики
Во вкладке модули и датчики вы можете посмотреть их подключение и программирование.
Система позиционирования
Для того, чтобы дрон мог зависать на месте или летать между точками, необходимо использование системы позиционирования. Такая система вычисляет и сообщает дрону, где он находится. Предполагается использование систем позиционирования: лазерный дальномер, визуальные маркеры (используется камера и маркеры, наклеенные на пол или потолок), GPS и других.
ArUco-маркеры
Технология визуальных маркеров позволяет рассчитать позицию дрона относительно распознанных маркеров и передать эту информацию в полетный контроллер.
Читайте статью про ArUco-маркеры для получения подробностей.
GPS (уличный полет)
Использование GPS позволяет также использовать для навигации глобальные координаты – широту и долготу (функция navigate_global
).
Основная статья: подключение GPS.
Автономный полет
Для изучения языка программирования Python можно обратиться к самоучителю.
После настройки системы позиционирования становится возможным написание скриптов для автономных полетов. Для выполнения скриптов подключитесь в Raspberry Pi по SSH.
Перед первым полетом рекомендуется проверить конфигурацию при помощи утилиты selfcheck.py:
rosrun drone selfcheck.py
Для того, чтобы запустить Python-скрипт, используйте команду python3
:
python3 flight.py
Пример программы для полета (взлет, пролет вперед, посадка):
import rospy
from drone 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)
# Взлет на высоту 1 м
navigate(x=0, y=0, z=1, frame_id='body', auto_arm=True)
# Ожидание 3 секунды
rospy.sleep(3)
# Пролет вперед 1 метр
navigate(x=1, y=0, z=0, frame_id='body')
# Ожидание 3 секунды
rospy.sleep(3)
# Посадка
land()
Функция navigate не ожидает, пока дрон долетит до целевой точки; скрипт продолжит выполнение сразу. Для блокирующей версии смотрите пример функции
navigate_wait
.
Обратите внимание, что параметр auto_arm
установлен на True
только у первого вызова функции navigate
. Этот параметр армит дрон и переводит его в режим автономного полета (OFFBOARD).
Параметр frame_id
задает систему координат, относительно которой задаются целевая точка для полета дрона:
body
связана с корпусом дрона;navigate_target
связана с предыдущей целевой точкой полета;map
связана с локальной системой координат дрона;aruco_map
связана с картой ArUco-маркеров;aruco_N
связана ArUco-маркером с ID=N.
Подробности описаны в статье "Системы координат".
Полное описания API приведено в статье "Автономный полет".
Также доступна поддержка блочного программирования автономных полетов.
Дополнительное оборудование
Платформа также имеет API для работы с периферией. Читайте соответствующие статьи для подробностей: