Цель- C Непрерывный контур управления - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь создать полет с помощью DJI SDK через Virtual Sticks. Я разработал, как управлять дроном в направлении координаты GPS, используя функцию atan2 для вычисления угла между двумя координатами GPS, затем поверните дрон к этому углу и наклоните, чтобы двигаться в этом направлении.

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

Следует ли мне использовать dispatch_source_set_timer в сочетании с GCD или есть лучший способ добиться этого и избежать утечек памяти? Пример кода ниже:

образец кода взят из другого вопрос ответ

// Create a dispatch source that'll act as a timer on the concurrent queue
dispatch_source_t dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,
                                                          dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)); 

// Setup params for creation of a recurring timer
double interval = 2.0;
dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 0);
uint64_t intervalTime = (int64_t)(interval * NSEC_PER_SEC);
dispatch_source_set_timer(dispatchSource, startTime, intervalTime, 0);

// Attach the block you want to run on the timer fire
dispatch_source_set_event_handler(dispatchSource, ^{
    // code to calculate bearing and send Virtual Stick commands to yaw and pitch drone
});

// Start the timer
dispatch_resume(dispatchSource);

// ----

// When you want to stop the timer, you need to suspend the source
dispatch_suspend(dispatchSource);

// If on iOS5 and/or using MRC, you'll need to release the source too
dispatch_release(dispatchSource);

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