Наведення квадротора до цілі


9

Я працюю над кадротором. Я знаю його положення - , куди я хотів би піти - цільове положення , і з цього обчислюю вектор - одиничний вектор, який приведе мене до моєї цілі:abc

c = b - a
c = normalize(c)

Оскільки квадротор може рухатися в будь-якому напрямку без обертання, те, що я намагався зробити, це

  1. обертати на кут нахилу роботівc
  2. розділити його на його компонентиx,y
  3. передайте їх роботу у вигляді кутів нахилу та нахилу.

Проблема полягає в тому, що якщо проникнення дорівнює 0 ° ± 5, це працює, але якщо дріт знаходиться поблизу +90 або -90, він виходить з ладу і спрямовує неправильні напрямки. Моє запитання: я пропускаю щось очевидне тут?


1
Як ви обчислюєте кут нахилу? Крім того, який контролер ви використовуєте і як ви надсилаєте їм дані?
DaemonMaker

Цікаве запитання @Hamza, ласкаво просимо до робототехніки .
Марк Бут

@Hamza, якою мовою та системою ти користуєшся? Я також працюю над квадрокоптером з мовою програмування Atmega328 та Ada. Якщо у вас є блог про проект, будь ласка, поділіться.

Ви правильні @MarkBooth, у мене були відкриті дві вкладки і я мав намір позначити інший пост як дублікат. Я позначав це помилково і не бачив способу його скасувати. Зважаючи на те, що для його закриття потрібно більше одного голосу, я вважав, що це не буде проблемою. Я не усвідомлював, що він розмістив коментар від мого імені.
DaemonMaker

Без проблем @DaemonMaker такі речі трапляються. Закрити, оскільки дублюючі голоси тепер автоматично публікують коментарі, що, на мою думку, є корисною функцією, оскільки воно спонукає людей переглянути інше питання, перш ніж вони самі піддають голосування.
Марк Бут

Відповіді:


6

Повторно реалізуючи ваше рішення, я отримую це:

Кут між векторами

По-перше, ви хочете, щоб кут між точками і - не був конкретно одиничним вектором. ABКут між 2 балами

( через програмування Fx ): θ=math.atan2(BxAx,ByAy)

Кут нахилу автомобіля

Далі (і я підозрюю, що це ваша проблема), вам слід відняти кут повороту транспортного засобу від обчисленого . ψθ

Заголовка проти Яу

Якщо ви використовуєте компас для "кута похилу" вашого автомобіля, це також може бути вашою помилкою; заголовок і позіхання - це не те саме . Заголовок компаса дорівнює нулю вздовж позитивної осі , збільшуючись у міру повороту за годинниковою стрілкою :y

Компас піднявся

Коса дорівнює нулю вздовж позитивної осі , збільшуючись у міру повернення проти годинникової стрілки :x

Полярний графік

90-градусне перекриття між цими вимірюваннями в поєднанні з додаванням (замість того, щоб віднімати) автомобіль позіхання від бажаного позіхання може бути причиною того, що справи спрацювали, коли ваша ціль знаходилася в межах ± 5 ° і поводилася погано при ± 90 °.

Перетворення на компоненти X і Y

Звідти ви говорите, що ви перетворюєте цей результат в його і компоненти, передаючи їх роботу як кути нахилу і нахилу. За допомогою наведених вище виправлень ви повинні отримати бажаний результат у цей момент. Однак безпосередньо відображення цих компонентів на кути нахилу може бути проблематичним, оскільки ви розглядаєте лише різницю положення, а не швидкість (справді, імпульс) автомобіля.(θψ)xy

PID-контроль

Вам, можливо, найкраще послужити, використовуючи петлі управління PID для рулону та кроку транспортного засобу. Тобто, як тільки ви виправите свій код і зможете вразити вашу ціль, я гадаю, що ви почнете замінювати його замість цього - коливатися вперед і назад. Правильно налаштований PID дозволить не допустити цього, але все одно дозволить швидко наблизитися до цілі.

Замість того, щоб підключати ваші та до ролика та нахилу, вважайте їх значеннями помилок, які PID-коли та нахили приймають як вхідні.xy


Це дещо редагує там понад 90% і повністю змінює відповідь (з PID на ATAN2). Але ваші кричущі навички графічної формули - це звіра!
Spiked3

Я все-таки рекомендую PID (він є внизу), я просто переробив початкову частину питання, щоб переконатися, що мої припущення були правильними. Графічні формули є частиною латексного форматування, що варто перевірити.
Ян

"Заголовок компаса починається від позитивної осі y і збільшується за годинниковою стрілкою, тоді як позіхання починається від позитивної осі x і збільшується проти годинникової стрілки" посилання? "перетворення компонента x (θ − ψ) в рулон і y компонента в крок" Я цього не розумію - більше пояснення, будь ласка (мені щось не вистачає).
Spiked3

У початковому запитанні було зазначено "передача [компонентів x та y] роботові як кути нахилу і нахилу", що, як на мене, вказує, що квадрокоптер рухається стороною в бік, змінюючи кут нахилу, а вперед та назад, змінюючи кут нахилу. Я додам трохи ясності.
Ян

акуратний. Я ніколи не бачив, щоб це робилося так. Я бачив, і роби сам, просто перевертаю cos / гріх, щоб отримати ті ж результати. Мені доведеться ще трохи подумати про рулон / крок. Так, це спричинило б рух, але я не впевнений, що це має щось спільне з тим, де ти є і куди їдеш, крім швидкості, з якою ти туди потрапляєш. Дякую.
Spiked3

5

Я припускаю, що ви тут говорите про 3D-вектор. Чи можете ви просто так узагальнити normalize()? Це спільне (я ніколи цього не бачив, якщо це так, то для мене новини). В іншому випадку очевидні проблеми з компасами стосуються кожного з компонентів X та Y. Чому б не назвати їх рулоном та / або нахилом та / або позіханням? (змішування 3D та 2D номенклатури плутає питання).

Мій 2D нормалізація виглядає приблизно так;

int Pilot_QuickestTurnTo(int hdgNow, int hdgNew)
{
    hdgNow = Pilot_Hdg360(hdgNow);
    hdgNew = Pilot_Hdg360(hdgNew);
    if (hdgNow < hdgNew)
        hdgNow += 360;
    int left = hdgNow - hdgNew;
        return (left < 181 ? -left : 360 - left);
}

Якщо це дійсно чотирикутник, я припускаю, що ваші X та Y компоненти дійсно YAW, Altitude ((X, Y) & Z). Вам потрібно буде обробляти YAW(X, Y)в 2D і просто скидати або набирати висоту для Z (і знову ж таки, тому я підозрюю, нормалізація - це більше, ніж у вас як).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.