- •Аннотация
- •Содержание
- •Введение
- •Глава 1. Исследовательский раздел
- •Научная новизна и актуальность работы
- •Анализ современных методов построения авиационных маршрутов
- •Обзор существующих аналогов
- •4. Бпла delta-m (российская разработка)
- •5. Agisoft Metashape (ранее PhotoScan)
- •Постановка задачи
- •Описание модели взаимодействия пользователей с веб-интерфейсом
- •1. Общая структура интерфейса
- •2. Сценарии взаимодействия
- •Интеграция геопространственных данных в системы управления бпла
- •Перспективные направления исследований
- •Обзор структуры беспилотника
- •1. Входы (куда Pixhawk получает информацию)
- •2. Выходы (куда Pixhawk отправляет команды)
- •Глава 2. Реализация
- •2.1. Техническое задание
- •2.2. Построение ортодромии и локсодромии
- •2.3. Ручной ввод координат и параметров полета
- •1. Механизм ввода координат
- •2. Параметры полета
- •4. Обработка ошибок
- •2.4. Генерация kmz-файлов
- •2.5. Проверка пересечений с запретными зонами
- •1. Клиентская часть (JavaScript):
- •2. Серверная часть (Python/Flask):
- •2.6. Подключение и обзор беспилотника
- •2.7. Сервис высот
- •Глава 3. Испытательный раздел
- •3.1. Тестирование работы алгоритмов для программного комплекса на беспилотнике Holybro x500
- •3.2. Составление тест-кейсов для алгоритмов в совокупности с программным комплексом
- •3.3. Результаты тестирования
- •3.4. Опытная эксплуатация
- •Заключение
- •Список сокращений
- •Список использованных источников
2.3. Ручной ввод координат и параметров полета
Реализованный функционал позволяет пользователю вручную задавать координаты и настраивать параметры полета БПЛА через веб-интерфейс. Это обеспечивает гибкость при планировании маршрутов и интеграции с аппаратурой.
1. Механизм ввода координат
Способы задания точек:
Текстовые поля:
Широта и долгота вводятся в формате 56.936596, 65.796525 (десятичные градусы).
Пример валидации на серверной части:
if not (isinstance(start_point, list) and len(start_point) == 2:
return jsonify({"error": "Invalid start_point format"}), 400
если неверно введена начальная точка (isinstance(start_point, list) - проверяет являются ли введенные данные списком, а len(start_point) == 2 – проверяет, что в списке только 2 элемента), то пользователю будет выведена ошибка.
Интерактивная карта:
Пользователь кликает на карте (Yandex Maps), чтобы установить маркеры.
Координаты автоматически передаются в форму через JavaScript:
// Фрагмент из пользовательского интерфейса
map.events.add('click', function (e) {
const coords = e.get('coords');
document.getElementById('latitude').value = coords[0].toFixed(5);
document.getElementById('longitude').value = coords[1].toFixed(5);
});
В данном коде происходит обработка кликов по карте. Сначала передается широта, а потом долгота
2. Параметры полета
Настраиваемые параметры:
Скорость (м/с): Ограничение: > 0 (проверка в коде):
if speed <= 0:
return jsonify({"error": "Speed must be positive"}), 400
Высота (м): Ограничение: 10–500 м (для безопасности полета).
пользовательский интерфейс (HTML):
<input type="number" id="speed" step="0.1" min="1" max="50" required>
<input type="number" id="altitude" min="10" max="500" required>
4. Обработка ошибок
Сценарии:
Некорректный формат координат (например, 91.12345 для широты):
# Проверка диапазонов на серверной части.
if not (-90 <= lat <= 90) or not (-180 <= lon <= 180):
return jsonify({"error": "Coordinates out of bounds"}), 400
Нечисловые значения параметров:
if isinstance(speed, str):
return jsonify({"error": "Speed must be a number"}), 400
Визуализация ошибок: В пользовательском интерфейсе выводятся уведомления через alert() (рис. 2.3.1).
Рисунок 2.3.1 Пример работы обработчика ошибок
2.4. Генерация kmz-файлов
Функционал генерации KMZ-файлов реализован для экспорта маршрутов БПЛА в GIS-системы (Google Earth, QGIS). Формат KMZ представляет собой ZIP-архив, содержащий KML-файл с геоданными, что обеспечивает совместимость с большинством картографических платформ.
Блок-схема алгоритма генерации KMZ-файла можно увидеть в приложении 2
Алгоритм генерации
Создание KML-структуры:
Используется библиотека xml.etree.ElementTree для формирования XML-документа:
kml = ET.Element("kml", xmlns="http://www.opengis.net/kml/2.2") #создание элемента
document = ET.SubElement(kml, "Document") #создаю контейнер внутри KML
placemark = ET.SubElement(document, "Placemark") # создаю элемент для описания географического объекта
line_string = ET.SubElement(placemark, "LineString") # элемент для задания линейного объекта (путь)
coordinates_element = ET.SubElement(line_string, "coordinates") #указание координат линии
Координаты маршрута преобразуются в строку формата долгота,широта,высота:
coords_text = ' '.join([f"{coord[1]},{coord[0]},0" for coord in coordinates])
coordinates_element.text = coords_text
Сохранение KML: Сгенерированный XML-документ сохраняется во временный файл route.kml:
kml_tree.write(kml_file_path)
Упаковка в KMZ: Файл route.kml архивируется в ZIP-архив с расширением .kmz с использованием библиотеки zipfile:
with zipfile.ZipFile(kmz_file_path, 'w', zipfile.ZIP_DEFLATED) as kmz:
kmz.write(kml_file_path, 'doc.kml')
Временный KML-файл удаляется после создания архива.
Пример KML-структуры
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Placemark>
<name>Маршрут</name>
<LineString>
<coordinates>
37.61730,55.75583,0 30.33510,59.93428,0
</coordinates>
</LineString>
</Placemark>
</Document>
</kml>
Обработка ошибок
Отсутствие координат: Если маршрут не задан, возвращается HTTP-ошибка 400:
if not coordinates:
return jsonify({"error": "Нет данных для маршрута"}), 400
Проблемы с файловой системой: Ошибки записи/чтения файлов логируются и обрабатываются через try-except:
except Exception as e:
logging.error(f"Ошибка при создании KMZ: {str(e)}")
return jsonify({"error": "Ошибка при создании KMZ"}), 500
Интеграция с интерфейсом
Скачивание файла: Ссылка на KMZ возвращается в JSON-ответе и отображается в интерфейсе:
{"kmz_url": "/static/route.kmz"}
Файл скачивается с веб-интерфейса (рис.2.4.1)
Рисунок 2.4.1 Скачанный файл маршрута
Визуализация: Пример KMZ-файла, открытого в Google Earth, демонстрирует маршрут с заданными точками (рис. 2.4.2).
Рисунок 2.4.2 Пример KMZ-файла, открытого в Google Earth
