Unity が ROS 2 を公式にサポートすることになりました。シミュレーションと結びついた ROS 2 の強固なフレームワークが、無数の新しいユースケースを生み出します。
ROS(Robot Operating System)は、2007 年から開発が始められた、ロボットアプリケーション開発の分野で人気のあるフレームワークです。ROS は元々ロボット工学の研究のために設計されたシステムでしたが、世に出るとすぐに産業・商業向けロボット工学分野で幅広く応用されるようになりました。
ROS 2 では、ROS の信頼性の高いフレームワークをベースに、マルチロボットシステム、リアルタイムシステム、生産環境など、現代的な用途のサポートも改善されています。Unity は、ROS エコシステムの公式サポートの範囲を ROS 2 にまで拡大しています。
現代のロボット工学は、「自律性」をキーワードに、人間が厳密なルールを定義しなくても意思決定を行うことのできるアルゴリズムの研究開発に軸足を移しつつあります。シミュレーションは、実世界で実験を行う場合に比べて高い柔軟性や迅速さをもって実験を行えるようにすることで、この移行をサポートします。
私たちは Robotics-Nav2-SLAM というサンプルを開発しました。これは Unity と ROS 2 を使って、SLAM(Simultaneous Localization and Mapping、自己位置推定と地図構築の同時実行)のシミュレーションと自律移動ロボット(AMR)のためのナビゲーションを始める方法を示すためのサンプルになっています。
ROS はロボットのプロトタイピングを行うための優れたフレームワークではありますが、その役割を終えつつあります。プロトタイピングを越えて、ロボットシステムの本格的な生産・展開につなげるために必要な機能をいくつか欠いているのです。
ROS 2 の技術ロードマップは、業界のベテランで構成された委員会によって、ROS 2 がロボット工学に関わるエンドユーザーにとって使いやすいフレームワークとなることを前提とした明確な方針のもとに定められ、保守されています。 ROS 2 は、ROS よりも多くの OS や通信プロトコルをサポートし、より分散化した環境でも使用できるように設計されています。
ROS 2 の新たなユースケースの多くは、自律性に焦点を当てています。自律性を導入するということは、ロボットの意思決定とその結果が、多くの産業用ロボットでやっているようなステートマシンと数式の組み合わせだけではきちんと予測が行えなくなるということです。産業用ロボットに比べて、自律型ロボットが置かれる可能性のある動作環境のバリエーションは指数関数的に増大します。入力の組み合わせは、制御された実験室の環境ではとても再現しきれません。自律型ロボットが期待通りの動作をするかどうかを完全に検証するには、時間的な制約は考慮せずに、ありとあらゆる現象を同時に把握できるような箱庭の宇宙の中にロボットを置いて検証を行うか、次善の策として、適切な堅牢性をもったシミュレーションを行うことが必要となります。
ロボットに環境を認識させたい場合は、シミュレーションされた環境におけるトポロジーおよび物理計算の精度に関して妥協することなく、それらのセンサーを正確にモデル化することが求められます。その環境に他のエージェント、つまり人間や他のロボットがいる場合、センサーシミュレーション、トポロジー表現、物理モデリングの精度を維持したまま、エージェントの行動をモデル化できなければなりません。
ロボットが遭遇する可能性があるすべてのシナリオを想定してロボットを訓練するには、このようなシミュレーションを何度も何度も行う必要があります。つまり、自律型ロボットを支えるシミュレーションには、産業用ロボットではあまり必要とされない、柔軟性、拡張性、スケーラビリティ、そして現実世界の再現度という 4 つの要素を、性能を犠牲にすることなく実現することが求められるのです。Unity はこれらの要求項目を兼ね備えています。これが、私たちが自律型ロボットの開発をサポートするための機能を充実させている理由です。
Unity の Robotics パッケージを使って、ROS や ROS 2 とのやり取りを容易にするために私たちがこれまで構築してきたインターフェースを利用することができます。Unity の URDF Importer を使用して、既存のロボットの構成を URDF ファイルから直接インポートすることができます。また、Unity の高品質かつ高効率なレンダリングパイプラインと、高性能かつ正確な物理シミュレーションを使って、ロボットの訓練を開始することができます。
ロボットのための特定の環境やタスクをモデル化するための環境や小道具を追加したい場合は、Unity のアセットストアを探してすでに出来上がったものを多数見つけることができます。数回のクリックで、組み立てたシミュレーションをビルドし、Windows 10、Mac OS、Linux など、主要な OS に配布することができます。
C# スクリプティング、Bolt ビジュアルスクリプティング、アセットストアで提供されている多くのスクリプティングツールキットやユーティリティツールキットを使用して、特定のユースケースに合わせてシミュレーションの機能をカスタマイズすることができます。
Unity プロジェクトの ROS 2 への移行は簡単に行えます。ROS-TCP-Connector パッケージでは、ROS と ROS 2 のいずれを統合するかに合わせてパッケージを切り替えることができるドロップダウンメニューを追加しました。プロトコルを変更すると、Unity は自動的に選択したメッセージ定義とシリアライズプロトコルに合わせてパッケージを再コンパイルします。これを試すには、自分のプロジェクトにこの変更を加えるか、Unity で用意したサンプルレポジトリ Robotics-Nav2-SLAM をダウンロードしてください。このレポジトリには、Nav2 Navigating while Mapping チュートリアルのセンサーとオドメトリ情報のシミュレーションのソースとして Unity を使用できるようにするために必要なコンポーネントが含まれています。
このサンプルプロジェクトでは、ROS 2 で動作するナビゲーションシステムを Unity を使ってシミュレートする方法を示します。ナビゲーションの概念は単純で、自律型ロボットの文脈においてもあまり変わりません。ナビゲーションのアルゴリズムは、ロボット現在地から、目的地までの経路を見つけることを目的としています。しかし、現在地から目的地に向かうためには、まず SLAM を行う必要があります。
SLAM は「今自分はどこにいて、これまでどこにいたのか」という問いに答えるために作られたアルゴリズムの集合体です。人間は、感覚と脳の間の処理パイプラインに内在するものとして、常に SLAM を実行しています。
自律型ロボットにとって、正確な SLAM を実行することは、ほとんどの実世界の環境ではまだ難しい課題です。自律走行型ロボットが、これまでに行ったことのある場所から、自分がどこにいるのかを常に把握するためには具体的に何が必要なのかについてはまだはっきりしておらず、活発に研究が行われている問題です。特定のユースケースに絞ってこの質問に本気で答えようとするなら、さまざまなもの(センサー、アルゴリズムなど)を試してみて、どれが上手く行くか見極めるしかありません。
私たちのサンプルでは、シンプルな倉庫環境、LIDAR とモーターコントローラーのシミュレーションが搭載された組み立て済み Turtlebot3 モバイルロボットのモデル、シミュレーションに向けて Nav2 と slam_toolbox スタックの訓練を行うために必要なすべての ROS 2 依存関係を含むイメージのビルドに使用される Dockerfileが含まれています。
ROS 2 を使ったことがない、あるいは SLAM アルゴリズムを扱ったことがない方は、Nav2 のチュートリアルを段階を追ってみていくことで、有用な情報を得ることができます。プロジェクトを実行してこのサンプルを Unity で実行するための手順を最初からすべて説明したガイドが私たちのレポジトリに用意されています。
Robotics-Nav2-SLAM は、Unity に慣れていないロボット工学の研究者の方や、ロボット工学に知見のない Unity 開発者の方でも、ROS 2 統合を試して、自律的なナビゲーションをやってみることができるサンプルになっています。これは、Unity のロボット工学向けツールと、Unity が提供する他の多くの強力なパッケージを統合することで、どのようなものが作れるかのほんの一例にすぎません。こうしたサンプルの提供のほかに、Unity Robotics チームは一般的なロボット工学のユースケースをサポートする機能の開発とリリースを継続的に行います。
Unity は今年の ROSCon で、役割分担して特定のタスクを達成する複数のロボットをサポートするように Nav2-SLAM-Example を拡張するワークショップを開催する予定です。