Элементы управления DJI Virtual Stick применяются неправильно - PullRequest
0 голосов
/ 04 мая 2018

Я создаю приложение для дронов, которое будет отправлять команды полета для полета в помещении. Я внедряю виртуальные джойстики DJI Mobile SDK, которые описаны здесь .

После экспериментирования с учебником по симуляторам DJI, найденным здесь , я реализовал урезанную версию без симуляции для своего приложения. Когда я тестировал свое приложение на открытом воздухе, элементы управления работают последовательно и правильно.

Однако, когда я выхожу в помещение, дрон выполняет только 1 действие независимо от отправленной команды: дрон летит в направлении своего заднего левого винта. Дрон всегда будет летать в этом направлении, даже если команда только повернет дрона.

Есть идеи, что может происходить? Я не уверен, какой код отправлять, так как мой код работает на открытом воздухе.

ОБНОВЛЕНИЕ # 1

Вот мои настройки контроллера полета (реализовано в Swift):

self.flightController = (DJISDKManager.product() as? DJIAircraft)?.flightController

self.flightController?.rollPitchControlMode = DJIVirtualStickRollPitchControlMode.velocity
self.flightController?.yawControlMode = DJIVirtualStickYawControlMode.angle
self.flightController?.rollPitchCoordinateSystem = DJIVirtualStickFlightCoordinateSystem.body

ОБНОВЛЕНИЕ № 2

Код для изменения Yaw (с некоторыми жестко закодированными числами). В основном используется для того, чтобы дрон полностью развернулся.

private var turnTime = 0
private var turnTimer: Timer? = nil

func turn() {
    self.turnTimer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: (#selector(turnDroneCommand)), userInfo: nil, repeats: true)
}

@objc func turnDroneCommand() {
    self.turnTime += 1

    let data = DJIVirtualStickFlightControlData(pitch: 0, roll: 0, yaw: Float(180), verticalThrottle: 0)

    self.flightController.send(data, withCompletion: { (error) in
        if error != nil {
            // Fire custom error callback
        }
    })

    if self.turnTime >= 7 {
        self.turnTimer?.invalidate()
        self.turnTime = 0
        // Fire custom success callback
    }
}

Я реализовал практически идентичный метод изменения высоты тона. Как уже говорилось, текущий результат не отличается для обеих команд.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

У нас была похожая проблема с виртуальным RC на M100, это проблема с прошивкой M100, а не с SDK. мы не используем какой-либо SDK, мы используем прямые последовательные команды непосредственно на ком-порт на M100. Мы отказались от попыток использовать виртуальный RC и теперь посылаем команды скорости, которые работают отлично.

0 голосов
/ 18 июня 2018

После долгих встреч с разработчиками в DJI я могу предложить частичное решение.

ЧАСТИЧНОЕ РЕШЕНИЕ

Если вы посмотрите на код, приведенный в обновлении № 2 вопроса, вы заметите следующие строки:

self.turnTimer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: (#selector(turnDroneCommand)), userInfo: nil, repeats: true)

и

self.turnTime += 1
...
if self.turnTime >= 7 {
    self.turnTimer?.invalidate()
    self.turnTime = 0
    // Fire custom success callback
}

Параметр timeInterval установлен на 0,2 секунды. Это означает, что команды отправляются с частотой 5 Гц менее 2 секунд. По словам разработчиков из DJI, команды должны отправляться с частотой 10 Гц (или выше, но я не проверял это) в течение дольше , чем 2 секунды.

ВЫДАЮЩИЙСЯ ВЫПУСК

Matrice 100 (M100) все еще «дрейфует» к заднему левому винту перед выполнением команд виртуальной ручки. Разработчики в DJI, похоже, не имеют доступа к M100 и не могут сами его протестировать. Так как это кажется (основываясь на очень, очень ограниченном тестировании) проблемой, уникальной для M100, это не может быть проблемой с самим Mobile SDK.

Я отмечаю это как ответ на случай, если кто-то наткнется на проблему «игнорировать команду» с другим дроном DJI. Если решение для дрифта будет найдено, я обновлю соответственно.

...