Каковы этапы инициализации и выполнения миссии WayPoint в DJI Windows SDK? - PullRequest
1 голос
/ 22 апреля 2020

Я использую следующий код, чтобы попытаться инициализировать Миссию Waypoint и загрузить ее в самолет (DJI Mavi c Air).

Сначала я проверяю состояние обработчика путевых точек, затем инициализирую путевую точку, добавляю ее в список, затем включаю список в инициализированную миссию путевых точек. Затем запускается метод загрузки миссии путевой точки на воздушное судно, после чего проверяется состояние. Выходные данные отладок показаны ниже:

Состояние путевой точки = READY_TO_UPLOAD;

Местоположение новой путевой точки - 55.555549621582,0.555555522441864

Загрузить возвращаемое значение миссии - INVALID_REQUEST_IN_CURRENT_ST0 *1000* Состояние путевой точки = READY_TO_UPLOAD

Состояние READY_TO_UPLOAD предполагает, что она находится в подходящем состоянии для загрузки миссии путевой точки в соответствии с документацией Windows SDK, однако очевидно, что загрузка завершается неудачно, и состояние остается неизменным.

Что необходимо изменить, чтобы успешно выполнить миссию путевой точки, чтобы она могла управляться самолетом?

//Check the initial state of the waypoint handler
var currentState = DJISDKManager.Instance.WaypointMissionManager.GetWaypointMissionHandler(0).GetCurrentState();
Debug.WriteLine("Waypoint state = {0}", currentState);

//Initialise new location coordinate
randomLocation.X = 55.55555;
randomLocation.Y = 0.55555555;
Debug.WriteLine("New waypoint location - {0},{1}", randomLocation.X, randomLocation.Y);
LocationCoordinate2D waypointLocation = new LocationCoordinate2D { latitude = randomLocation.X, longitude = randomLocation.Y };

// Create a waypoint instance and add to waypoint list
Waypoint waypoint = new Waypoint { location = waypointLocation };
waypointList.Add(waypoint);

//Create new waypoint mission instance and load in the waypoint list
WaypointMission waypointMission = new WaypointMission
        {
            waypointCount = 1,
            autoFlightSpeed = 2.5,
            finishedAction = WaypointMissionFinishedAction.NO_ACTION,
            headingMode = WaypointMissionHeadingMode.USING_WAYPOINT_HEADING,
            flightPathMode = WaypointMissionFlightPathMode.CURVED,
            repeatTimes = 0,
            waypoints = waypointList,
            missionID = 1
        };

//load the waypoint mission to the aircraft and check the current state
var load_retval = DJISDKManager.Instance.WaypointMissionManager.GetWaypointMissionHandler(0).LoadMission(waypointMission); ;
Debug.WriteLine("Load mission return value - {0}", load_retval);

currentState = DJISDKManager.Instance.WaypointMissionManager.GetWaypointMissionHandler(0).GetCurrentState();
Debug.WriteLine("Waypoint state = {0}", currentState);

1 Ответ

1 голос
/ 22 апреля 2020

После долгих ошибок и ошибок я выяснил шаги, необходимые для запуска миссии путевой точки:

Установка SDK в режим наземной станции

Сначала вы необходимо установить SDK в режим наземной станции следующим способом:

DJISDKManager.Instance.ComponentManager.GetFlightControllerHandler(0, 0).SetGroundStationModeEnabledAsync(new BoolMsg() { value = true })

Загрузка миссии

Во-вторых, вы должны загрузить свою миссию путевых точек в SDK, используя следующий метод:

DJISDKManager.Instance.WaypointMissionManager.GetWaypointMissionHandler(0).
LoadMission(waypointMission)

Где waypointMission может быть обозначением миссии путевой точки в вашем вопросе. Эта путевая миссия должна следовать некоторым ограничениям. Например, общее расстояние не может быть длинным (не знаю, какое именно число). Этот метод возвращает SDKError, если с миссией что-то не так.

Загрузка миссии путевой точки на дрон

После загрузки миссии в SDK ее все равно необходимо загрузить на дрон. Это делается следующим способом:

DJISDKManager.Instance.WaypointMissionManager.GetWaypointMissionHandler(0).

UploadMission ()

(опционально) с указанием симулятора

На этом этапе вы можете начать Режим симуляции, если вы не хотите, чтобы ваш дрон взлетал. Это можно сделать с помощью следующего кода:

FlightControllerHandler _flightControllerHandler = DJISDKManager.Instance.ComponentManager.GetFlightControllerHandler(0, 0);

        var simSettings = new SimulatorInitializationSettings()
        {
            latitude = 0,
            longitude = 0,
            satelliteCount = 12
        };


        await _flightControllerHandler.StartSimulatorAsync(simSettings);

Важно, чтобы значение satelliteCount было больше 10. В противном случае SDK выдаст ошибку с ошибкой о том, что уровень сигнала GPS недостаточно хорош.

Начало миссии Наконец, вы можете начать миссию путевой точки следующим образом

DJISDKManager.Instance.WaypointMissionManager.GetWaypointMissionHandler(0).StartMission()

Другие примечания:

  • Мост из этих вызовов async, и их лучше всего ожидать.
  • Даже если вы ожидаете звонков, я заметил, что загрузка миссии не будет завершена к моменту завершения метода. Поэтому, если вы позвоните StartMission() сразу после UploadMission(), это может привести к INVALID_REQUEST_IN_CURRENT_STATE

    . Я обошел эту проблему, имея отдельную кнопку для загрузки и запуска миссии. Таким образом, я могу ждать Миссия должна быть загружена до начала миссии.

  • Все вышеперечисленные методы возвращают тип SDKError. Если все прошло хорошо, это будет NO_ERROR, важно проверить, так ли это для каждого звонка.

...