owned this note
owned this note
Published
Linked with GitHub
# База знаний по проекту БПЛА
[TOC]
# Перечень сокращений
* API – интерфейс прикладного программирования
* АРМ – автоматизированное рабочее место
* БД – база данных
* БПЛА – беспилотный летательный аппарат
* ИС – информационная система
* ЛВС – локальная вычислительная сеть (также LAN)
* НСУ – наземная станция управления
* ПДУ – пульт дистанционного управления БПЛА
* ПК – полётный контроллер (автопилот)
* ПО – программное обеспечение
* СУБД – система управления базами данных
* ТЗ – техническое задание
* WP – way point: целевая (маршрутная) точка (геоточка)
* Система - ПО системы АРМ оператора НСУ
* Миссия - полётное задание
* ARM - ARMING, "снятие с предохранителя", выставляет относительную высоту в 0
* DISARM - "установка на предохранитель"
* SNR - SONAR - точный (ультразвуковой) датчик относительной высоты
* ПВД - датчик приемника воздушного давления, трубка Пито
* GCS - ground control station - НСУ - наземная станция управления
## Протоколы и инструменты
* MAVlink - основной протокол коммуникации между ПК и компом
*
# Команда проекта
* ПМ - Айрат Галямов (galyamov.airat@gmail.com)
* Lead - Радмир Кашаев (kashaev.rr@gmail.com)
* Backend dev - Даниил Панин (danilpanin76698@gmail.com)
# Полезные ссылки
* Доска задач: https://trello.com/b/uMMlwtXh/%D0%B0%D1%80%D0%BC-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0-%D0%BD%D1%81%D1%83
* База знаний (эта страница): https://hackmd.io/@Deffy/HJRopyk25/edit
* Хранилище: https://disk.yandex.ru/d/Oejmwn77lZXGeA
* Куча книг по Java: https://disk.yandex.ru/d/KLcbo6eSfsVowQ
* Репозиторий:
* https://github.com/rkashaev/uav-gcs-mvp
* https://github.com/Metafiz/uav-ground-control-station
# Правила оформления коммитов
К правилам, указанным [тут](https://ru.hexlet.io/blog/posts/git-commit-message), ОБЯЗАТЕЛЬНО добавляем номер тикета:
* `UAV-11 подправил зависимости, новый алгоритм`
Если в рамках коммита делаются сразу несколько тикетов, пишем их через пробел:
* `UAV-12 UAV-32 исправил это и это`
# Java naming conventions
Коротко: https://www.javatpoint.com/java-naming-conventions
Подробно: https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html
# Информация по Netbeans RCP
* Заранее установить JDK 11+, рекомендованный JDK 17
* Прямая ссылка для скачивания NetBeans: https://dlcdn.apache.org/netbeans/netbeans-installers/14/Apache-NetBeans-14-bin-windows-x64.exe
# Протокол обмена компьютера с ArduPilot
https://trello.com/c/4u6Zet58
Называется MAVlink
https://ardupilot.org/dev/docs/mavlink-commands.html
у него есть свой MAVSDK - портирован на кучу языков, в т.ч. и на Java
https://mavsdk.mavlink.io/main/en/index.html
доки расписаны только для MAVSDK для c++ И Python:
https://mavsdk.mavlink.io/main/en/python/
список команд Mavlink:
https://mavlink.io/en/messages/common.html
Цикл работы:
1. подключаем прибор кабелем к компу (появится виртуальный com-port, обычно COM3)
2. запускаем mavsdk_server с параметрами подключения: `mavsdk_server_win32.exe serial://COM3:115200` - он подключится порту и будет ждать подключения от программ на порту 50051 по дефолту
3. следующая минимальная программа отображает данные реального времени (используется реактивное программирование в стиле RxJava):
```java
void connect() {
System drone = new System();
Core.ConnectionState state = drone.getCore().getConnectionState().blockingFirst();
println("Connected to drone: " + state.getIsConnected());
println("Getting telemetry: ");
Telemetry telemetry = drone.getTelemetry();
Boolean armed = telemetry.getArmed().blockingFirst();
println("Armed: " + armed);
Telemetry.FlightMode flightMode = telemetry.getFlightMode().blockingFirst();
println("FlightMode: " + flightMode);
Telemetry.Health health = telemetry.getHealth().blockingFirst();
println("Health: ");
println("\tIsArmable: " + health.getIsArmable());
println("\tIsAccelerometerCalibrationOk: " + health.getIsAccelerometerCalibrationOk());
println("\tIsMagnetometerCalibrationOk: " + health.getIsMagnetometerCalibrationOk());
println("\tIsGyrometerCalibrationOk: " + health.getIsGyrometerCalibrationOk());
println("\tIsGlobalPositionOk: " + health.getIsGlobalPositionOk());
println("\tIsHomePositionOk: " + health.getIsHomePositionOk());
println("Battery: ");
telemetry.getBattery().subscribe(b -> {
String batText = String.format("Bat%d - %4.2f%%, %5.2fV", b.getId(), b.getRemainingPercent() * 100, b.getVoltageV());
panel.bottomTable.setParameter(1, batText);
});
println("Getting allowable flight modes:");
ActionServer.AllowableFlightModes fModes = drone.getActionServer().getAllowableFlightModes().blockingGet();
println("\tCan auto: " + fModes.getCanAutoMode());
println("\tCan guided: " + fModes.getCanGuidedMode());
println("\tCan stabilized: " + fModes.getCanStabilizeMode());
telemetry.getPosition().subscribe(p -> {
String coords = String.format("%9.6f, %9.6f", p.getLatitudeDeg(), p.getLongitudeDeg());
panel.topTable.setParameter(2, coords);
});
telemetry.getGpsInfo().subscribe(gpsInfo -> {
panel.bottomTable.setParameter(4, "SAT: " + gpsInfo.getNumSatellites());
panel.bottomTable.setParameter(9, "GPS: " + gpsInfo.getFixType());
});
telemetry.getAttitudeEuler().subscribe(ea -> {
String format = String.format("%5.1f, %5.1f, %5.1f",
ea.getPitchDeg(), ea.getYawDeg(), ea.getRollDeg());
// show pitch
int pitch = ea.getPitchDeg().intValue();
panel.centralScale.setPitch(pitch);
panel.backBurner.setElevation(pitch);
// show roll
int roll = ea.getRollDeg().intValue();
panel.headScale.setDegrees(roll);
panel.backBurner.setSlant(roll);
panel.centralScale.setSlant(roll);
// show yaw
int yaw = ea.getYawDeg().intValue();
panel.compass.setDegrees(yaw);
});
}
private void println(String s) {
java.lang.System.out.println(s);
}
```
Объекты, получаемые из System уже надо читать в доках по ссылкам выше.
# Формат файла миссии
http://ardupilot-mega.ru/index.php/manuals/missionplanner
# Карты в Swing приложении
* Рабочий вариант, использует OpenStreetMap, плюс поддерживает и другие провайдеры: https://github.com/msteiger/jxmapviewer2