# 3.4 Автопилот Автопилот является ключевым компонентом системы навигации БПЛА и реализован в файле `autopilot.py`. Класс `AutoPilot` наследуется от базового класса `Pilot` и обеспечивает управление полётом на основе визуальной одометрии. \section{Структура автопилота} Автопилот хранит следующие данные: \begin{itemize} \item \textbf{Позиция} — текущее положение БПЛА (объект класса Position) \item \textbf{Ориентиры} — набор ключевых кадров (VisionChunk) с известными позициями \item \textbf{Целевой ориентир} — индекс текущего ориентира для коррекции \item \textbf{Предыдущий кадр} — последний обработанный кадр \end{itemize} \section{Оптический поток} Метод `calculate_optical_flow` вычисляет оптический поток между двумя последовательными кадрами с использованием алгоритма Лукаса-Канаде: \begin{enumerate} \item Создание сетки точек для отслеживания (шаг 20 пикселей) \item Вычисление разреженного оптического потока \item Фильтрация по ошибке предсказания (порог 12.0) \item Центрирование координат относительно центра изображения \end{enumerate} \section{Коррекция по ориентирам} Метод `get_position_by_chunk` определяет позицию БПЛА путём сопоставления текущего кадра с ближайшим ориентиром: \begin{enumerate} \item Поиск ближайшего ориентира по евклидову расстоянию \item Сопоставление ключевых точек между кадрами \item Оценка матрицы гомографии \item Проверка качества гомографии \item Обновление позиции при выполнении критериев \end{enumerate} \section{Критерии качества} Для принятия коррекции позиции используются следующие критерии: \begin{itemize} \item Минимальное количество инлайеров (не менее 6) \item Доля инлайеров от общего числа сопоставлений (не менее 60\%) \item Детерминант матрицы гомографии (от 0.1 до 10.0) \item Средняя ошибка репроекции (не более 3.0 пикселей) \end{itemize} \section{Команды управления} Автопилот формирует команды управления в виде объекта `PilotCommand`, содержащего: \begin{itemize} \item `dangle` — изменение угла курса \item `velocity` — скорость движения \item `stop` — флаг остановки \item `proccessing_time` — время обработки кадра \end{itemize}