タートルを動かす (TurtleSim)

プロジェクトオン GitLab & GitHub

Abstract

Move Turtle は、ROS の TurtleSim 内のカメを指定された座標(ポイント)に移動させるシンプルな ROS Python スクリプトです。このプロジェクトは、コロラド・スクール・オブ・マインズ(CSOM)の CSCI473 の授業課題として始まり、後にクローズループシステムの作成方法を学ぶためのプロジェクトへと発展しました。その知識は、CSOM の Human Center Robotics (HCR) ラボでの仕事に役立てられました。

Context

背景として、ROS は ロボットオペレーティングシステム の略です。ROS はオープンソースのロボティクスミドルウェアで、通常は Ubuntu オペレーティングシステムと組み合わせて使用され、ロボットシステムのソフトウェアコンポーネント/クラスターをより適切に管理するために利用されます。ROS の公式 wiki で使用方法を学ぶことができます。ROS で記述するコードは C++ または Python のいずれかです。

TurtleSim は、ROS と ROS パッケージの入門として新規ユーザーに提供されるシンプルな 2D ロボットシミュレータです。TurtleSim が行うのは、カメが表示されたシンプルな 2D ディスプレイを開くだけです。そのカメが「ロボット」として機能し、メッセージを送って移動や回転させることができます。実際には、TurtleSim は実世界の物理を簡易的にシミュレートするために、いくつかのランダムエラーを生成します。

ROS と TurtleSim が何であるかを理解した上で、なぜそれらを使用したのかというと、2020 年春にコロラド・スクール・オブ・マインズで「Human Centered Robotics」という授業を受講していたからです。この授業は Dr. Hao Zhang が担当していました。授業は 3 つのプロジェクトで構成され、最初のプロジェクトは ROS のセットアップ、ROS の使用方法の習得、そして TurtleSim のカメが M の字を書くようなオープンループまたはクローズループアルゴリズムを実装することでした。元のプロジェクト説明は HERE で確認できます。

授業中に私はオープンループアルゴリズムを実装してこのプロジェクトを完了しました。この解決策は機能しましたが、あまり良くなく、A の字を「十分に」描く程度で「優秀」には程遠いものでした。2020 年 2 月中旬にプロジェクトを提出した後、2021 年 2 月頃まで忘れていました。

Challenge

2021 年 2 月、私はコロラド・スクール・オブ・マインズの Human Centered Robotics (HCR) ラボで研究助手として採用され、Dr. Hao Zhang の指導の下で働き始めました。ラボの目標は「長期間にわたってロボットが動作し適応できるようにすること」を目的とした「生涯協調自律」の研究です。2022 年 9 月 1 日(2022 年 9 月 1 日)現在、ラボはコロラド・スクール・オブ・マインズからマサチューセッツ大学アマースト校へ移転しましたが、私が在籍していた当時はまだコロラドにありました。

HCR ラボでは、私は Triton プロジェクトに従事することになりました。Triton プロジェクトは多数(数十台)のロボットで構成され、Triton と呼ばれる三角形の オムニホイール 地上ロボットでした。その外観は次の通りです:

Triton と共に、地上数フィート上に「八角形配置」で配置された 8 台の IR カメラ(OptiTrack 製)がありました。これらのカメラ、OptiTrack の Motive ソフトウェア、Windows 10 を搭載した PC、そして ROS を組み合わせることで、正確な実世界位置を取得できる 2 メートル × 2 メートル × 2 メートル(x, y, z)の空間が構築されました。

Triton プロジェクトでの最初の課題は、Triton ロボットを特定の実世界位置へ移動させるスクリプトを作成することでした。当時はその方法が分かりませんでしたが、CSCI473 の最初のプロジェクトでクローズループシステムの概念を学んだことを思い出し、クローズループシステム、ひいてはフィードバックシステムについて徹底的に調査し始めました。

Research

調査の過程で、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 の動画 またはこの素晴らしい Wikipedia 記事 を参照してください。

自分の調査と、賢い友人や教授からの助言を得た結果、Triton が特定の座標に到達するためには比例コントローラ(P コントローラ)を使用するのが最適であると判断しました。

Triton は地上ロボットであるため、X と Y の座標だけを考慮すればよいです。これを踏まえて、P コントローラで測定・処理すべき目標値と実測値を決定する必要がありました。調査中に ROS wiki の素晴らしい投稿「Go to Goal」を見つけ、以下のエラーに焦点を当てていることが分かりました:

  • 距離エラー:目標位置 (X, Y) と現在位置 (X, Y) の距離の差。
  • 角度エラー:目標姿勢と現在姿勢の差。

Proposed Solution

以上を踏まえると、Triton を特定の実世界座標へ移動させる解決策は、目標座標と現在座標に対する距離エラーと角度エラーに比例コントローラを適用することです。ただし、実機に実装する前にシミュレーションでアイデアをテストしたいと考え、当時は TurtleSim をシミュレーションとして使用するのが最適だと思いました。

Testing In Simulation

理論的な解決策をまとめた後、実際の環境ではなくシミュレーションでまず検証することにしました。実世界はノイズが多く、解決策の有効性が薄れ、関係のない問題に対処しなければならなくなることがあります。これを認識し、CSCI473 のプロジェクトを再訪し、理論的解決策のテストベッドとして適用しました。

ROS Melodic から ROS Noetic へ移行し、いくつかの反復的改良を加えた結果、提案した解決策を TurtleSim で動作させることに成功しました。その機能デモといくつかのクールな目標座標パスはこのブログ記事の最後にあります。すべてのコードは HERE で確認できます。

Conclusion

要約すると、このプロジェクトを通じて TurtleSim のカメはクローズループシステムを用いて設定座標へ効果的にナビゲートでき、2020 年の初期オープンループシステムを大幅に上回りました。テストに成功した後、私はこの解決策を Triton ロボットに実装しました。しかし、実世界のノイズにより予期せぬ問題が発生し、数週間にわたるデバッグと実地テストが必要となりました。その数週間の作業の後、最終的に TurtleSim でテストした解決策を用いて Triton を特定の実世界座標へ到達させることに成功しました。以下は TurtleSim でテストした手法を用いて Triton が実世界座標へ移動するデモです:

振り返ってみると、実世界の物理をより正確にシミュレートするシミュレーションを使用すべきだったと感じます。TurtleSim は学習には優れていますが、実世界ロボティクスのアイデアをテストするには最適ではありません。当時はシンプルなユースケースには十分だと思っていましたが、後にそれが誤りであることが証明されました。

このブログ記事の主目的は、TurtleSim のカメ、そしてその後の Triton ロボットが指定された目標位置 (X, Y) に正確にナビゲートできるクローズループシステムの構築を概説することでした。この目的は達成されたと考えており、HCR ラボでの私の仕事に対する関心を呼び起こしたかもしれません。今後も HCR ラボでの経験についてさらにブログ記事を書く計画があります…

Moving Turtle (TurtleSim) Demos

This video contains the following demos:

  • Cayley Nodal: A simple Cayley Nodal design
  • Circles: A spider-web like design
  • Inner Circles: A “circles inside of circles” design
  • M: A very simple M design