回答:
PIDの基本的な例を見ると、各ホイール、エンコーダー、およびpwmに1つずつ、PIDコントローラーの2つのコピーをインスタンス化する必要があると思います。
PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);
次に、loop()
同等の方法で、両方のエンコーダーを読み取り、各エンコーダー値を関連するものに渡しPID
、最後に両方のPWM値を書き出します。
今のところSetpointLeft
、SetpointRight
実際には同じ値を指すことができますが、このように別々に定義すると、後で有効にする機能を追加できます。
これは基本的な場合には有効かもしれませんが、それで十分かどうかは、直線がどれだけ正確であるかによって異なります。
各ホイールにエンコーダーがある場合、2つのPIDループを実行し、各ホイールの追従誤差を比較すると、ホイールがスリップしないと仮定して、距離にわたって最大アッベ誤差を計算できます。そのエラーが要件よりも小さい場合、推測航法が必要なすべてです。
ただし、ホイールがスリップする傾向がある場合は、制御システムが検出できない次のエラーを隠している可能性があり、ホイールエンコーダーとは無関係にスリップを検出または位置を計算し、修正するために高レベルのソフトウェアを使用する方法が必要になります直線を維持するためにホイールの位置/速度を要求しました。
ジョンが示唆、あなたが位置を決定するために加速度計を使用することができるが、その正確性及び経時累積誤差の影響を与えてもよい、あなたが検出し、車輪スリップを補正するために、加速度計データを用いたほうが良いかもしれません。
モバイルロボット工学では、現在の位置をより正確に判断するために、カルマンフィルター技術が一般的に使用され、加速度計やホイールエンコーダーなどの複数のソースからのデータを融合します。
あなたは相対的な位置決意を持って行うものは何でもしかし、時間をかけてあなた自身がであることを信じている位置がします、あなたの実際の物理的な位置から離れて漂流します。
これを回避する唯一の方法は、車両の基準フレームの外側に基準点を持つことです。
たとえば、ルンバは通常、部屋を動き回るのに推測航法を使用しますが、ドッキングする必要があるときはいつでも、充電ドックから送信される赤外線のビームを探します。ルンバがそのビームをランダムに移動すると、ルンバはそれを検出し、ビームにロックして、ソースに戻ります。バンプセンサーと組み合わせて、充電接点に正確に配置できます。
ロボットの場合、ホームポジションがあり、そこに戻って、既知の場所にあることを検出できます。その時点で、現在位置を正確に把握し、計算された位置が実際の位置からどれだけ離れているかを報告できます。
ロボットが数百メートル以上直線で移動する必要がある場合は、Arduino GPSシールドを追加するなど、別の手法に切り替えることもできます。
最終的に、精度の要件によっては、これらの手法を組み合わせて使用する必要がある場合があります。
ガイドビームが可能な場合は、テクニックに従って非表示のラインを使用して、非常に簡単に目的の操作を実行できる場合があります。制限された領域で任意の直線で移動する必要がある場合、roombaのように、一対のガイドビーム(互いに直角)を使用して、1つのデカルト軸での合成位置を修正できる場合があります。ロボットがビームの1つを通過するたびに。
ここには多くのオプションがあり、選択したものは必要なものに依存します。
両方の車輪を駆動するために単一の車軸を使用していない場合、私が見ることができる唯一の解決策は、3軸加速度計または別のセンサーを追加してロボットの向きを検出し、それに応じて各モーターへの信号を調整することです。
上記のように、各車輪に同じ速度で移動するように指示することから始め、PIDはそれらがその速度で実行されていることを確認します。しかし、これは完璧ではありません。エラーのチェックと修正を続ける必要があります(1)2つのホイールエンコーダカウントを定期的に読み取り、比較し、カウントを等しくする必要がある場合は1つのホイールをわずかに速くします。(2)加速度計とコンパスが必要なエンコーダは決して完璧ではありません。
カルマンフィルターを見ています。エンコーダ、コンパス、加速度計のデータを組み合わせて見出しを付けたい場合。