Search Unity

「1、2 の 3!」で簡単に出来る、Unity でのロボティクスシミュレーション

, 11月 19, 2020

ロボット開発のワークフローは、テストやトレーニングのためのシミュレーションに依存しています。今回は、ロボット開発者が Unity を使ってロボティクスシミュレーションを行う方法を紹介したいと思います。新シリーズの 1 本目となるこのブログ記事では、一般的なロボット開発のワークフローについて説明します。さらに、Unity でのロボティクスシミュレーションをより速く、より効果的に、より簡単にする新しいツールセットをご紹介します。

ロボティクスを使った Unity の活用方法

実際のロボットを使ったアプリケーションの開発やテストにはコストと時間がかかるため、シミュレーションはロボティクスアプリケーション開発においてますます重要な要素となってきています。ロボットにデプロイする前にシミュレーションでアプリケーションを検証することで、潜在的な問題を早期に発見することができ、反復修正にかかる時間を短縮することができます。また、シミュレーションを行うことで、現実世界では危険すぎてテストできないようなエッジケースやシナリオのテストも容易になります。

効果的なロボティクスシミュレーションにとって重要な要素として、ロボットの物理的特性、ロボットが動作するシーンや環境、および現実世界においてロボット上で動作するソフトウェアが挙げられます。シミュレーションにおいて、これら 3 つの要素を可能な限り実世界に近づけることが、有効なテストやトレーニングに不可欠です。

ロボットソフトウェア開発のための最も一般的なフレームワークの 1 つが、ロボットオペレーティングシステム(ROS)です。ROS は、世界中の何千人ものロボット技術者が使用するロボットの記述、メッセージ、データ型のための標準フォーマットを提供しており、産業用組み立てロボット、自動運転車、さらにはエンターテイメント向けロボットに至るまで、様々な場面で活用されています。活気あるユーザーコミュニティは、新しいシステムの開発を促進するための共通機能を提供する多くのオープンソースパッケージを提供しています。

ロボット技術者は多くの場合、ロボットアプリケーションを ROS ノードをモジュールとして組み合わせたセットとして構築し、実際のロボットやシミュレーターとのやり取りをするコンピューターの両方にデプロイすることができます。シミュレーションでは、開発者は、実際のロボットのターゲットとなるユースケースを反映したバーチャルな世界を構築します。このシミュレートされたエコシステムでテストを行うことで、ユーザーは現実世界でテストを行い、最終的に製品にデプロイする前に、迅速に設計に反復修正をかけることができます。

 

一般的なロボット開発のワークフロー。実世界でテストを行う前に、シミュレーションでのテストが行われる。

 

このブログ記事では、シンプルなピックアンドプレース(物体をつまみ上げて別の場所に置く)操作タスクを例に、ユーザーがこのシミュレーションワークフローに Unity をどのように活用できるかを説明します。

1:ロボットのタスクを定義する

上記のワークフローに沿って、ある物体をつまみ上げて所定の場所に配置するのがロボットの仕事だとします。ロボットアームとして、6 軸の教育用ロボット「Niryo One」を使用します。環境は、誰もいない部屋、ロボットが座るテーブル、キューブ(対象物)という最小限のものです。タスクの動作計画部分を遂行するために、MoveIt と総称される動作計画 ROS パッケージの一般的なセットを使用します。タスクを開始する準備ができたら、シミュレーターから MoveIt にプランニングリクエストを送信します。リクエストには、すべてのロボットのジョイントの姿勢、キューブの姿勢、キューブの目標位置が含まれています。その後、MoveIt は動作計画を計算し、この計画を実行するためにシミュレーターに送り返します。

 

問題の設定ができたので、このシミュレーションワークフローで Unity を使用する方法を説明します。

2:ロボットをシミュレーションに投入する

ロボティクスシミュレーションは、今回の例のような基本的な部屋、あるいはやや複雑なものとしてコンベアベルト、ゴミ箱、工具、部品などを備えた工場のフロアのような環境など、何らかのバーチャル環境を設定し、この環境に訓練やテストを行うロボットのバーチャル表現を追加することで構成されています。Unity エディターを使すれば、無限にバーチャル環境を作成することができます。しかし、どのようにすればロボットをこれらの環境に入れることができるのでしょうか。

 

シミュレーションでロボットをモデル化する際には、視覚的なメッシュ、衝突メッシュ、物理的な特性を表現する必要があります。視覚的なメッシュは、ロボットをリアルにレンダリングするために必要です。衝突メッシュは、ロボットの「リンク」と呼ばれる、関節を接続する剛体のメンバーと、環境内の他のオブジェクト、およびロボット自身との間の衝突を計算するために必要です。衝突メッシュは通常、計算量の多い衝突チェックを高速化するために、視覚的なメッシュよりも複雑ではありません。最後に、慣性、接触係数、関節ダイナミクスなどの物理的特性が、正確な物理シミュレーションを行うため、すなわち、リンクにかかる力が、姿勢、速度、加速度などのロボットの状態をどのように変化させるかを計算するために必要です。

 

幸いなことに、ROS の開発ワークフローを使用している場合は、これらすべてのプロパティを記述するための標準化された方法が存在します。それが、統一ロボット記述フォーマット(URDF)です。URDF ファイルは XML ファイルなので、人間が読めるマークアップ言語で視覚的、衝突的、物理的なプロパティを指定することができることになります。URDF ファイルには、複雑な形状を指定するためのメッシュファイルを含めることもできます。以下の例は、Niryo One の URDF ファイルからの抜粋です。

 

Niryo One ロボットの URDF

 

ロボットの Unity へのインポートをより簡単にするために、この度、URDF ファイルを使ってロボットを Unity シーンにインポートするためのオープンソースの Unity パッケージ、URDF Importer をリリースします。このパッケージは、PhysX 4.1 の改良により Unity で新たにサポートされた「アーティキュレーション」を活用しています。このアップデートにより、ロボットの物理的特性を正確にモデル化して、よりリアルな運動学的シミュレーションを実現できるようになりました。

 

Unity エディターにインストールされている場合、このパッケージを使用して、ユーザーは URDF ファイルを選択してインポートすることができます。このパッケージは、裏で XML ファイルを解析し、リンクとジョイントを適切な C# クラスに格納します。次に、ゲームオブジェクトの階層が作成されます。この階層内の各ゲームオブジェクトはロボット内の特定のリンクを表す ArticulationBody コンポーネントです。そして、URDF から読み込んだプロパティを ArticulationBody の対応するフィールドに割り当てます。ユーザーがロボットを Unity に追加すると、URDF Importer は自動的に基本的なキーボードジョイントコントローラーを作成します。ユーザーはこのコントローラーを、ArticulationBody API を使ってカスタムコントローラーに置き換えることができます。

 

例えば、上記の URDF ファイルをインポートして作成した Niryo One Unity アセットは以下のようになります。

URDF Importer を介してインポートされた、Unity 内のバーチャル Niryo One ロボット

3:ROS にシミュレーションを接続する

ロボットを Unity エディターに取り込んだので、ROS ノードのセットの中で動作する動作計画アルゴリズムをテストしてみましょう。これをサポートするために、Unity と ROS 間の通信インターフェースを設定する必要があります。Unity は、計画リクエストをムーバサービスに送ると共に、ロボットの姿勢、ターゲットとなるオブジェクト、ターゲットの位置などの状態情報を含むメッセージを ROS に渡す必要があります。一方、ROS は、動作計画(すなわち、ピックアンドプレースタスクを完了するために必要な関節位置のシーケンス)に対応する軌跡メッセージを Unity に返す必要があります。

 

2 つの新しい ROS-Unity Integration パッケージにより、Unity と ROS を簡単に接続できるようになりました。これらのパッケージにより、ROS ノードと Unity の間で ROS メッセージを低レイテンシで渡すことができます。1 台のマシンでテストしたところ、シンプルなテキストベースのメッセージを Unity から ROS サブスクライバーへ転送するタスクは数ミリ秒で、1036 x 1698 のサイズの画像の転送は数百ミリ秒で完了しました。

 

ROS での通信は Pub/Sub モデルを使用するため、ROS-Unity 通信における第 1 の要件は、ROS メッセージタイプに対応する Unity 内のクラスです。ROS-TCP-Connector Unity パッケージを Unity エディターに追加すると、MessageGeneration プラグインを使用して、ROS の.msg ファイルと.srv ファイルからシリアライズおよびデシリアライズ関数を含む C#クラスを生成することができます。ROS-TCP-Connector パッケージには、Unity から ROS トピックにメッセージを発行したり、Unity で ROS トピックのメッセージを購読したり、ROS サービスのリクエストとレスポンスを作成したりするためにユーザーが拡張できるスクリプトも含まれています。ROS 側では、ROS-TCP-Endpoint と呼ばれる ROS パッケージでこれらの ROS-TCP-Connector スクリプトを使用して、ROS ノードと Unity シーン間の通信を可能にするエンドポイントを作成することができます。

 

それでは、これらの ROS-Unity Integration パッケージを手元のタスクにどのように使うかを見てみましょう。まず、ROS-Unity Integration パッケージを使用して、Unity でパブリッシャーを作成し、TCP で ROS に姿勢データを送信します。ROS 側では、これらの姿勢メッセージを購読するために ROS-TCP-Endpoint をセットアップする必要があります。

 

次に、OnClick コールバックと一緒に Unity シーンに「Publish」ボタンを作成します。このコールバック関数は MoveIt 動作プランナーにサービスリクエストを行います。サービスリクエストには、ロボットの現在の姿勢、ターゲットとなるオブジェクトの姿勢、ターゲットの位置が含まれます。MoveIt は計画リクエストを受け取ると、動作計画の計算を試みます。成功した場合、サービスは計画、すなわち関節位置のシーケンスを返し、Unity スクリプトは ArticulationBody API を使用して軌跡に沿った動作を実行します。そうでない場合は、失敗メッセージを返します。

 

下の GIF 動画は、Niryo One アームがピックアンドプレースタスクを成功させたときの Unity シミュレーションの様子を示しています。

 

ROS と MoveIt を動作計画に用いた、Unity による Niryo One ロボットのピックアンドプレースタスクのシミュレーション

 

この例はほんの始まりに過ぎません。開発者はこのデモを土台にして、より複雑なUnityシーンを作成したり、さまざまなロボットを追加したり、他のROSパッケージを統合したりすることができます。今後の記事では、コンピュータービジョンや機械学習指向のタスクをロボットシミュレーションフレームワークに統合する方法を紹介します。

結論

これらのツールは、シミュレーションにおける次世代のテストとトレーニングの基礎を築き、ロボティクスシミュレーションにおいて、Unity をより簡単に使用できるようにするものです。私たちのチームは、ロボティクスのための機械学習トレーニング、センサモデリング、大規模なテストなど、次世代のユースケースを実現するために懸命に取り組んでいます。次回のブログ記事では、ピックアンドプレースタスクでターゲットのオブジェクトの姿勢を推定するためのビジョンベースの機械学習モデルのトレーニング方法をご紹介します。

次のステップ

Unity のロボティクスシミュレーションツールは無料でご利用いただけます。GitHub でピックアンドプレースのチュートリアルをご覧ください。

 

その他のロボットプロジェクトについては、GitHub の Unity Robotics Hub をご覧ください。コンピュータービジョンチームが Unity を使ってどのように知覚システムのトレーニングを容易にしているかについては、知覚システムに関するブログシリーズをお読みください。ロボティクスシミュレーションのニーズを満たすために Unity を使用する方法の詳細については、ロボティクスに関する Unity の公式ページをご覧ください。

ご質問、ご意見、ご提案など、弊社チームに直接お問い合わせいただく場合は、unity-robotics@unity3d.com までメールでご連絡ください。

7 replies on “「1、2 の 3!」で簡単に出来る、Unity でのロボティクスシミュレーション”

Hi ! This looks quite nice. However, I have a few question regarding the structure used to generate robots from urdfs. I don’t really understand why the links are created with a “Visuals” and “Collisions” child object. I get that it clearly reflects how the robot is defined in the URDF, but I find it to be a very unidiomatic way to create objects in Unity, as they is no real need to have separate gameobjects to do this. The root object for each link could contain both the mesh and collider associated, as it is usually the case in Unity.
Would it be possible to have some information regarding the way choices were made for the overall architecture of the importer ?

Sounds good. How does it compare to ROSSharp + ROSBridge? Reading through the post it looks pretty similar.

This package forks ROS#, and replaces ROSBridge with our own package, ROS-TCP-Endpoint. The major difference here is that ROS# serializes C# messages as json objects, which ROSBridge then has to deserialize and reserialize as a ROS message. In our implementation, we pack the bytes in the same order that the ROS serializer does, which means 1) we don’t pay the compute cost for generic json serialization, and 2) the ROS-TCP-Endpoint does not need to de/reserialize the message before passing it to/from the ROS nodes. We haven’t done extensive A/B testing yet between these implementations, but our initial tests suggest at least a 10x reduction in message transport times.

This is awesome, I work with virtual robotics environments like Vexcode VR and Robot Mesh and this can be helpful

It’s is a 3D simulation, it will be helpful nowadays. Machines are taking over men’s jobs and in many other professions like artificial intelligence and many more. Robots are more efficient and having 1% error chances. As a wise man said, “Man is a statue of mistakes”

Comments are closed.