База знаний по проекту БПЛА

Перечень сокращений

  • API – интерфейс прикладного программирования
  • АРМ – автоматизированное рабочее место
  • БД – база данных
  • БПЛА – беспилотный летательный аппарат
  • ИС – информационная система
  • ЛВС – локальная вычислительная сеть (также LAN)
  • НСУ – наземная станция управления
  • ПДУ – пульт дистанционного управления БПЛА
  • ПК – полётный контроллер (автопилот)
  • ПО – программное обеспечение
  • СУБД – система управления базами данных
  • ТЗ – техническое задание
  • WP – way point: целевая (маршрутная) точка (геоточка)
  • Система - ПО системы АРМ оператора НСУ
  • Миссия - полётное задание
  • ARM - ARMING, "снятие с предохранителя", выставляет относительную высоту в 0
  • DISARM - "установка на предохранитель"
  • SNR - SONAR - точный (ультразвуковой) датчик относительной высоты
  • ПВД - датчик приемника воздушного давления, трубка Пито
  • GCS - ground control station - НСУ - наземная станция управления

Протоколы и инструменты

  • MAVlink - основной протокол коммуникации между ПК и компом

Команда проекта

Полезные ссылки

Правила оформления коммитов

К правилам, указанным тут, ОБЯЗАТЕЛЬНО добавляем номер тикета:

  • 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

Протокол обмена компьютера с 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):
    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 приложении

Select a repo