Повторно реалізуючи ваше рішення, я отримую це:
Кут між векторами
По-перше, ви хочете, щоб кут між точками і - не був конкретно одиничним вектором.
AB
( через програмування Fx ):
θ=math.atan2(Bx−Ax,By−Ay)
Кут нахилу автомобіля
Далі (і я підозрюю, що це ваша проблема), вам слід відняти кут повороту транспортного засобу від обчисленого . ψθ
Заголовка проти Яу
Якщо ви використовуєте компас для "кута похилу" вашого автомобіля, це також може бути вашою помилкою; заголовок і позіхання - це не те саме . Заголовок компаса дорівнює нулю вздовж позитивної осі , збільшуючись у міру повороту за годинниковою стрілкою :y
Коса дорівнює нулю вздовж позитивної осі , збільшуючись у міру повернення проти годинникової стрілки :x
90-градусне перекриття між цими вимірюваннями в поєднанні з додаванням (замість того, щоб віднімати) автомобіль позіхання від бажаного позіхання може бути причиною того, що справи спрацювали, коли ваша ціль знаходилася в межах ± 5 ° і поводилася погано при ± 90 °.
Перетворення на компоненти X і Y
Звідти ви говорите, що ви перетворюєте цей результат в його і компоненти, передаючи їх роботу як кути нахилу і нахилу. За допомогою наведених вище виправлень ви повинні отримати бажаний результат у цей момент. Однак безпосередньо відображення цих компонентів на кути нахилу може бути проблематичним, оскільки ви розглядаєте лише різницю положення, а не швидкість (справді, імпульс) автомобіля.(θ−ψ)xy
PID-контроль
Вам, можливо, найкраще послужити, використовуючи петлі управління PID для рулону та кроку транспортного засобу. Тобто, як тільки ви виправите свій код і зможете вразити вашу ціль, я гадаю, що ви почнете замінювати його замість цього - коливатися вперед і назад. Правильно налаштований PID дозволить не допустити цього, але все одно дозволить швидко наблизитися до цілі.
Замість того, щоб підключати ваші та до ролика та нахилу, вважайте їх значеннями помилок, які PID-коли та нахили приймають як вхідні.xy