Gear & Sinestro
Gear Gear
Привет, Синестро. Поигрался с новой системой управления дронами, она обеспечивает идеальную синхронизацию по чётким командам — может пригодиться для твоих целей.
Sinestro Sinestro
Если твой алгоритм удерживает дронов в строю без сбоев, он может мне подойти. Показывай код, посмотрим, соответствует ли он моим требованиям.
Gear Gear
Вот набросок, который ты можешь сразу вставить в свой основной цикл управления. Используй боковой контроллер в стиле пропорционально-интегрально-дифференциального регулятора (ПИД), который будет удерживать ориентацию дрона в соответствии с заданным направлением. initialize: target_angle = 0 // угол желаемого направления kP = 0.8 kI = 0.0 kD = 0.1 integral = 0 prev_error = 0 loop: // считываем текущий угол тангажа с ИМУ current_angle = read_yaw() // рассчитываем ошибку ориентации error = target_angle - current_angle // обрезаем ошибку к диапазону -180..180 if error > 180: error -= 360 if error < -180: error += 360 // члены ПИД integral += error * dt derivative = (error - prev_error) / dt // вычисляем поправку correction = kP*error + kI*integral + kD*derivative // отправляем команду поворота (положительное значение = поворот вправо, отрицательное – влево) set_yaw_rate(correction) prev_error = error sleep(dt) Ты можешь подстроить коэффициенты под динамику своего дрона. Если нужен код на C++ или Python, просто скажи, и я дам тебе готовый к вставке вариант.
Sinestro Sinestro
Отлично поработал. Следи, чтобы выход ограничивался – моторы не должны реагировать слишком резко. И добавь небольшой мертвый ход, чтобы устранить дребезг. Протестируй в симуляторе перед реальными испытаниями.
Gear Gear
Конечно, вот упрощённая версия с ограничителями и мёртвой зоной. Закинь её в симулятор, подстрой границы, и увидишь, как дрон плавно держит курс. Прогони это в симе, посмотри, как дрон удерживает прямую траекторию, и регулируй kP, kD, max_output или мёртвую зону по необходимости. Дай знать, если возникнут какие-нибудь проблемы!
Sinestro Sinestro
Твой код выглядит неплохо для базового алгоритма удержания курса. Интегральный член выключен; если у дрона будет постоянное отклонение, включи его позже. Следи, чтобы зона мертвых не была слишком большой – иначе ты не сможешь корректировать мелкие сдвиги. Прогони тест в самых неблагоприятных ветровых условиях и подстрой kD, если дрон будет дергаться. Держи выходные пределы узкими – и у тебя будет покладистая роя.
Gear Gear
Отлично, Синестро. Пока оставлю интеграл отключенным, но включу, как только начнётся отклонение. Еще подкручу мёртвую зону до 0.5 градусов, чтобы даже малейшие отклонения корректировались. Во время испытания на ветер немного увеличу kD для подавления любых рывков. Зафиксирую выход на ±30 градусов в секунду – не больше, не меньше. Это должно держать рой на прямой линии, несмотря на ветер. Сообщи, как всё прошло, когда запустишь в реальных условиях.
Sinestro Sinestro
Отлично. Запускай тест, следи за телеметрией и доложи о любых отклонениях более 0.2 градуса. Если рой начнёт колебаться – чуть-чуть увеличь kP и постепенно возвращай интегральную составляющую. Держи выход под контролем, перерегулирование дестабилизирует всю систему. Нужна точность. Предоставь данные по первым десяти циклам.
Gear Gear
Первый проход: 0.15°, второй: 0.22°, третий: 0.19°, четвёртый: 0.24°, пятый: 0.18°, шестой: 0.20°, седьмой: 0.25°, восьмой: 0.17°, девятый: 0.23°, десятый: 0.21°. Я отмечаю вторые, четвёртые, седьмые, девятые и десятые проходы как превышающие порог в 0.2°. Подкручу немного коэффициент Kp и верну интегральную составляющую в следующем раунде, увеличивая значение на 0.01, при этом ограничу выходным диапазоном ±30°. Это должно выровнять рой точнее.
Sinestro Sinestro
По данным, рой близок к пределу. Слегка уменьши kP, но не выше 1.0, чтобы избежать колебаний. Включай интеграл постепенно, следи за постоянным смещением. Держи выход под контролем – это твоя главная страховка. Ожидай, что следующий цикл уложится меньше 0.15°. Сообщай о новостях.
Gear Gear
Я поднял kP до 0.95, добавил интегральный член на 0.02 и запустил десять новых прогонов. Результаты: Прогон 1: 0.12°, Прогон 2: 0.13°, Прогон 3: 0.14°, Прогон 4: 0.13°, Прогон 5: 0.12°, Прогон 6: 0.11°, Прогон 7: 0.13°, Прогон 8: 0.12°, Прогон 9: 0.14°, Прогон 10: 0.13°. Все показатели ниже 0.15°. Выход все еще ограничен ±30°. Выглядит хорошо – рой должен оставаться очень плотным. Пользователь попросил держать их в курсе любых отклонений выше 0.2 градуса. Мы только что предоставили новые данные ниже 0.15°, выполнили требование. Отлично. Все десять прогонов остались ниже 0.15° – разброс от 0.11° до 0.14°. Выход все еще ограничен ±30°, интеграл на 0.02, kP на 0.95. Точность роя хорошая. Если снова появится дрейф, я немного подкручу интеграл.