Направление квадротора к цели

9

Я работаю над квадротором. Я знаю его позицию - , куда я хотел бы пойти - целевую позицию , и из этого я вычисляю вектор - единичный вектор, который приведет меня к моей цели:б вaбс

c = b - a
c = normalize(c)

Так как квадротор может вращаться в любом направлении без вращения, я попытался сделать следующее:

  1. повернуть на угол рыскания роботовс
  2. разбить его на его компонентовИкс,Y
  3. передать их роботу как углы крена и тангажа.

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

Хамза
источник
1
Как вы рассчитываете угол рыскания? Кроме того, какой контроллер вы используете и как вы отправляете данные?
DaemonMaker,
Интересный вопрос @Hamza, добро пожаловать в робототехнику .
Марк Бут
@Hamza, какой язык и систему вы используете? Я также работаю над квадрокоптером с языком программирования Atmega328 и Ada. Если у вас есть блог о проекте, пожалуйста, поделитесь.
Вы правы @MarkBooth, у меня было открыто две вкладки, и мы собирались пометить другой пост как дубликат. Я пометил это по ошибке и не нашел способа отменить его. Учитывая, что для его закрытия требуется более одного голоса, я решил, что это не будет проблемой. Я не понял, однако, что он опубликовал комментарий от моего имени.
DaemonMaker
Нет проблем @DaemonMaker, эти вещи случаются. При повторном голосовании теперь автоматически публикуются комментарии, что, на мой взгляд, является полезной функцией, поскольку позволяет людям самим рассмотреть другой вопрос, прежде чем отдать свой голос за себя.
Марк Бут

Ответы:

6

Повторно внедряя ваше решение, я получаю это:

Угол между векторами

Во-первых, вам нужен угол между точками A и В а не единичный вектор. Угол между 2 точками

θзнак равномaTчас,aTaN2(ВИкс-AИкс,ВY-AY)

Угол поворота автомобиля

ψθ

Заголовок против Yaw

Y

Картушка

Икс

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

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

Преобразование в Компонент X и Y

(θ-ψ)ИксY

ПИД-контроль

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

ИксY

Ян
источник
Вот некоторые из них редактируют, более 90% и полностью меняют ответ (с PID на ATAN2). Но ваши умелые навыки графической формулы чудовищны!
Spiked3
Я все еще рекомендую PID (он там внизу), я просто проработал начальную часть вопроса, чтобы убедиться в правильности моих предположений. Графические формулы являются частью форматирования латекса, которое стоит проверить.
Ян
«направление по компасу начинается с положительной оси y и увеличивается по часовой стрелке, в то время как рыскание начинается с положительной оси x и увеличивается против часовой стрелки»? «Преобразование компонента x (θ − ψ) в бросок и компонента y в шаг» Я совсем не понимаю - больше объяснений, пожалуйста (я что-то упускаю).
Spiked3
В первоначальном вопросе говорилось о «передаче [компонентов x и y] роботу в виде углов крена и тангажа», что для меня указывает на то, что квадрокоптер перемещается из стороны в сторону, изменяя угол крена, и вперед и назад, изменяя угол тангажа. Я добавлю немного ясности.
Ян
аккуратный. Я никогда не видел, чтобы это было так. Я видел и делаю сам, просто переверните cos / sin, чтобы получить те же результаты. Я должен подумать о крене / подаче еще немного. Да, это вызвало бы движение, но я не уверен, как это связано с тем, где вы находитесь и куда движетесь, кроме скорости, с которой вы туда добираетесь. Спасибо.
Spiked3
5

Я предполагаю, что вы говорите о трехмерном векторе здесь. Вы можете просто так обобщить 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 (и опять же, поэтому я подозреваю, что нормализация - это больше, чем у вас).

Spiked3
источник