クワッドローターをターゲットに向けて導く


9

クワッドローターに取り組んでいます。-私はその位置を知っている私が行ってみたい、 -目標位置、及びそのI計算Aベクターから -私の目標に私を取る単位ベクトルを:b cabc

c = b - a
c = normalize(c)

クワッドローターは回転せずにどの方向にも移動できるため、私がやろうとしたのは

  1. ロボットのヨー角でを回転させるc
  2. コンポーネントに分割するバツy
  3. それらをロール角とピッチ角としてロボットに渡します。

問題は、ヨーが0°±5の場合、これは機能しますが、ヨーが+90または-90に近い場合、失敗し、誤った方向に進みます。私の質問は、ここに明らかな何かが足りないのですか?


1
ヨー角をどのように計算していますか?また、どのコントローラーを使用しており、どのようにデータを送信していますか?
DaemonMaker

興味深い質問@Hamza、ロボット工学へようこそ。
マークブース

@Hamza、どの言語とシステムを使用していますか?イムは、Atmega328とAdaプログラミング言語を使用したクワッドコプターにも取り組んでいます。プロジェクトに関するブログをお持ちの場合は、共有してください。

あなたは正しい@MarkBoothです。2つのタブを開いており、他の投稿を重複としてマークするつもりでした。私はこれを誤ってマークしましたが、元に戻す方法はありませんでした。それを閉じるには複数の投票が必要であることを考えると、これは問題にならないと思いました。しかし、それが私の代わりにコメントを投稿したことには気づきませんでした。
DaemonMaker 2013

問題ありません@DaemonMakerこれらのことが起こります。重複投票が終了するとコメントが自動的に投稿されるようになりました。コメントを投稿する前に他の質問を確認するように促すので便利な機能だと思います。
マークブース

回答:


6

あなたのソリューションを再実装して、私はこれを得ます:

ベクトル間の角度

まず、特に単位ベクトルではなく、点B間の角度が必要です。 2点間の角度

θ=メートルathata2BバツバツByy

車両のヨー角

ψθ

ヘディング対ヨー

y

コンパスローズ

バツ

極グラフ

これらの測定値間の90度のオーバーラップと、目的のヨーから車両のヨーを加算(減算ではなく)することにより、ターゲットが±5°以内にあり、±90°で不適切な動作をしたことが原因である可能性があります。

コンポーネントXおよびYへの変換

θψバツy

PID制御

車両のロールとピッチにPID制御ループを使用することで、最良の結果が得られる場合があります。つまり、コードを修正してターゲットに到達できたら、代わりにオーバーシュートを開始し、前後に振動すると思います。正しく調整されたPIDは、ターゲットへの迅速なアプローチを可能にしながら、それが発生するのを防ぎます。

バツy


これは、90%以上の編集であり、答えを完全に変更します(PIDからATAN2へ)。しかし、あなたの派手なグラフィック式のスキルは獣です!
Spiked3

私はまだPIDをお勧めします(これは一番下にあります)。私の仮定が正しいことを確認するために、質問の最初の部分を調べました。グラフィックの数式は、チェックする価値のあるラテックスのフォーマットの一部です。
Ian

「方位角は正のy軸から始まり、時計回りに増加しますが、ヨーは正のx軸から始まり、反時計回りに増加します」参照?「(θ−ψ)のx成分をロールに、y成分をピッチに変換する」それはまったくわかりません。詳しく説明してください(何か不足しています)。
Spiked3

元の質問では、「[xおよびyコンポーネント]をロールおよびピッチ角としてロボットに渡す」と述べていましたが、これは、クワッドコプターがロール角を変更すると左右に移動し、ピッチ角を変更すると前後に移動することを示しています。いくつかの明確さを追加します。
Ian

きちんとした。それがそのように行われるのを見たことがありません。私はこれまでに見て、自分でやっています。cos/ sinをフリップするだけで同じ結果が得られます。ロール/ピッチについてもう少し考えなければなりません。はい、それは動きを引き起こしますが、それがあなたがそこに着く速度以外に、あなたがどこにいるのか、どこへ行くのかとはどう関係があるのか​​分かりません。ありがとう。
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、高度((X、Y)&Z)であると思います。あなたはYAW(X, Y)2Dで処理する必要があり、Zの高度を下げるか得るだけです(そして、それが正規化があなたが持っている以上のものであると私が思う理由です)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.