タートルシムによるPID制御
概要
ムーブタートルは、ROSのタートルシム内でタートルを指定された座標(ポイント)に移動させるシンプルなROS Pythonスクリプトです。このプロジェクトは、コロラド鉱山学校(CSOM)のCSCI473のクラスプロジェクトとして始まり、その後、クローズドループシステムを作成する方法を学ぶためのプロジェクトに進化しました。この知識は、CSOMのヒューマンセンターロボティクス(HCR)ラボでの私の仕事に役立ちました。
背景
背景として、ROSはロボットオペレーティングシステムの略です。ROSはオープンソースのロボティクスミドルウェアで、通常はUbuntuオペレーティングシステムと組み合わせて使用され、ロボットシステムのソフトウェアコンポーネント/クラスターをより良く管理するために使用されます。ROSの使い方については、ROSの公式ウィキで学ぶことができます。ROSで書くコードはC++またはPythonのいずれかです。
タートルシムは、ROSの新しいユーザーにROSとROSパッケージの入門として使用されるシンプルな2Dロボットシミュレーターです。タートルシムは、タートルを表示するシンプルな2Dディスプレイを開くだけです。そのタートルは「ロボット」として機能し、その「ロボット」にメッセージを送信して移動または回転させることができます。タートルシムは移動中に、実世界の物理をシンプルにシミュレートするためにいくつかのランダムエラーを生成します。
ROSとタートルシムが何であるかを知った上で、なぜそれらを使用していたのか? 2020年春、私はコロラド鉱山学校で「ヒューマンセンターロボティクス」というクラスを受講していました。このクラスは、私の学部のコンピュータサイエンスの授業の一部でした。クラスはハオ・ジャン博士によって教えられました。クラスは3つのプロジェクトで構成されており、最初のプロジェクトはROSのセットアップ、ROSの使い方の学習、タートルシムのタートルがMを描くためのオープンループまたはクローズドループアルゴリズムの実装でした。元のプロジェクトの説明はこちらで見ることができます。
クラスを受講していたとき、私はオープンループアルゴリズムを実装することでこのプロジェクトを完了しました。この解決策は機能しましたが、本当にひどく、「十分良い」Aを描きましたが、「素晴らしい」にはほど遠いものでした。2020年2月中旬にプロジェクトを提出した後、私は2021年2月頃までそのことを忘れていました。
課題
2021年2月、私はコロラド鉱山学校のヒューマンセンターロボティクス(HCR)ラボでリサーチアシスタントとして雇われ、ハオ・ジャン博士の下で働きました。ラボの目標は「生涯にわたる協調的自律性に関する研究を行い、ロボットが長期間にわたって操作し適応できるようにすること」です。2022年9月1日(2022年9月1日)現在、ラボはコロラド鉱山学校からマサチューセッツ大学アマースト校に移転しました。しかし、私がそこに働いていたとき、彼らはまだコロラドにいました。
HCRラボでは、私はトリトンプロジェクトに取り組むように指示されました。トリトンプロジェクトは、トリトンと呼ばれる数十台のロボットで構成されていました。トリトンは、次のような三角形のオムニホイール地上ロボットでした。
トリトンとともに、オプティトラックの8台のIRカメラが、地面から数フィート上に「八角形の順序」で配置されていました。これらのカメラを使用して、オプティトラックのMotiveソフトウェア、Windows 10を実行しているPC、ROSを使用して、2メートル×2メートル×2メートル(x、y、z)の空間が作成され、モーションキャプチャマーカーを持つ物体の正確な実世界の位置を特定できます。
トリトンプロジェクトでの私の最初のタスクは、トリトンロボットを特定の実世界の位置に移動させるスクリプトを作成することでした。当時、私はこれを達成する方法がわからなかったのですが、CSCI473の最初のプロジェクトでクローズドループシステムのアイデアが紹介されたことを思い出し、クローズドループシステムとフィードバックシステムについて本格的に研究を始めました。
研究
研究中に、AerospaceControlsLabによる素晴らしいビデオを発見しました:
このビデオでは、PIDシステムのアイデアが示され、説明されました。PIDシステムは、実世界のデータに基づいて特定の出力を生成するクローズドループ制御ループシステムです。基本的に、これは、望ましい値と測定された値の違いに基づいて出力を調整するフィードバックシステムです。これはPIDコントローラの公式です:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$は制御信号です。
- $K_p$、$K_i$、$K_d$はそれぞれ比例、積分、微分ゲインです。
- $e(t)$はエラー信号(望ましい出力と実際の出力の違い)です。
- $\int e(t) dt$は時間にわたるエラーの積分です。
- $\frac{de(t)}{dt}$はエラーの微分です。
これについてもっと学ぶには、AerospaceControlsLabのビデオや、この素晴らしいウィキペディアの記事をチェックしてください。
研究を行い、賢い友人や教授からの助けを得た結果、トリトンが特定の座標に到達するのを助けるために比例コントローラ、Pコントローラを使用するのが最適であると判断しました。
トリトンは地上ロボットであるため、X座標とY座標のことだけを心配すればよいことがわかりました。これを知った上で、Pコントローラ内で測定し処理する望ましい値と測定された値を決定する必要がありました。私の研究では、ROSウィキにあるゴー・トゥ・ゴールという素晴らしい投稿を見つけ、以下のエラーに焦点を当てていました:
- 距離エラー:望ましい位置(X、Y)と現在の位置(X、Y)との距離の違い。
- シータエラー:望ましい向きと現在の向きの違い。
提案された解決策
これらすべてを考慮すると、トリトンを特定の実世界の座標に移動させるための解決策は、トリトンの距離エラーと目標座標に対するシータエラーに比例コントローラを使用することです。しかし、これを物理システムに実装する前に、シミュレーションでアイデアをテストしたいと思いました。当時、タートルシムをシミュレーションとして使用するのが最良の選択だと思いました。
シミュレーションでのテスト
理論的な解決策が概説されたので、私は最初にシミュレーションを通じてそれを検証することにしました。実世界は、解決策の効果を混乱させ、無関係な問題に対処することにつながるノイズでしばしば混雑しています。これを認識し、私はCSCI473のプロジェクトを再訪し、この理論的解決策のテストグラウンドとして適応しました。
古いコードをROS MelodicからROS Noeticに更新し、いくつかの反復的な改良を加えた結果、提案された解決策をタートルシムで機能させることができました。その機能のデモは、この記事の最後にいくつかのクールな目標座標パスとともに見つけることができます。これに関するすべてのコードはこちらで見ることができます。
結論
要約すると、このプロジェクトを通じて、タートルシムのタートルはクローズドループシステムを使用して設定された座標に効果的にナビゲートし、2020年の最初のオープンループシステムを大幅に上回りました。成功裏にテストされた後、私はこの解決策をトリトンロボットに実装しました。しかし、実世界のノイズは予期しない問題を引き起こし、数週間のデバッグと実世界のテストが必要でした。その数週間の後、私は最終的にトリトンが特定の実世界の座標に到達するのを実現しました。これは、タートルシムでテストした方法を使用してのことです。以下は、タートルシムでテストした方法を使用して特定の実世界の座標に移動するトリトンのデモです:
振り返ってみると、実世界の物理をよりよくシミュレートするシミュレーションを使用すればよかったと思います。タートルシムは学習には最適ですが、実世界のロボティクスのアイデアをテストするには最適ではありません。当時、私のシンプルなユースケースには十分だと思っていましたが、後にそれがそうではないことが証明されました。
このブログ投稿の主な目的は、タートルシムのタートル、そしてその後トリトンロボットが指定された目標位置(X、Y)に正確にナビゲートできるクローズドループシステムの作成を概説することでした。この目的は達成されたと信じていますが、HCRラボでの私の仕事に興味を持たれたかもしれません。これを考慮して、HCRラボでの私の仕事経験についてのブログ投稿をもっと作成する計画があります…
ムービングタートル(タートルシム)デモ
このビデオには以下のデモが含まれています:
- ケイリー・ノーダル: シンプルなCayley Nodalデザイン
- 円: 蜘蛛の巣のようなデザイン
- 内円: 「円の中の円」デザイン
- M: 非常にシンプルなMデザイン