8.1K Views
November 15, 21
スライド概要
安価なマニピュレータとして有名になりつつあるmyCobotを使いながら、UnityとROSの連携方法について説明します。Unityと実機が動くデモを示しながら、苦労した点など共有したいと思います。
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
がある生活 UnityとROS接続編 2021.10.19 Unity道場 ロボティクス 秋のLT祭り 2021 株丹 亮 Kabutan Ryo1
- 2017 九州工業大学 西田研究室 産業用ロボットのためのパスプランニングアルゴリズムの研究に従事。 株丹 亮 Kabutan Ryo 2017 – 現在 株式会社 安川電機 株式会社 エイアイキューブ 出向中 産業用ロボットのためのプランニング技術、最適化、異常検知などの知能化技術の開発に従事。 個人で ROS (Robot Operating System) Japan Users Groupでたまに発表しています。 主にMoveItというロボットアーム向けライブラリの解説など。 上記資料のURL: https://www.slideshare.net/RyoKabutan 今日はこの続編 2
今日のLTの内容 • ロボット開発ではシミュレータが必須。 • ROSを使ったロボット開発をする場合、Gazeboと呼ばれるシミュレータを 使う場合が多い。 • しかしGazebo 11が最終バージョン(2025年まで)。Ignitionという新しい シミュレータに移行することになっているが、まだまだ発展途上。 日本での活用事例はあまり聞いたことがない。 “ NVIDIAとOpen Roboticsが連携 「Ignition Gazebo」「NVIDIA Isaac Sim」 の相互運用を目指し、ROSコミュニティのAI開発を強化 https://robotstart.info/2021/09/28/nvidia-open-robotics.html まだ何かありそう!これから楽しみ!! • そこでUnityが活用できないか。myCobotを題材に説明。 3
ROS (MoveIt)を使ったら何ができる? • ロボットアームの経路を自動で作ることができる。 • センサで障害物を検知しながら、複雑な障害物回避動作が生成できる。 (自動ピッキングシステム等のアプリが比較的簡単に作成できる。) 3次元距離センサ myCobot 障害物 MoveItの画面 4
前ページのデモからわかること Good! myCobotの登場により自宅でも簡単にシステムが構築できるようになった。 Bad! • それでもロボットアーム8万円、3次元センサ3万円、合計11万円。 購入するには少し勇気が必要。 • 開発途中のソフトをそのまま実機で実験するのは、少し怖い。 思わぬ動きをして机や周りの物にぶつけてヒヤヒヤ。煙は出したくない。 Unityを使って実物のmyCobotがなくても、 MoveItで遊べるような環境を作ることが今回の目標。 5
実際にやってみたこと STEP 1 STEP 2 STEP 3 完成 ロボットモデルをUnity上に登場させる URDFで定義したmyCobotをUnityにインポートする。 Unity公式ツール「URDF Importer」使用。 ros_control経由でUnity上のmyCobotを動かす Unity用のインターフェースを作る。 Unity公式ツール「ROS-TCP Connector」使用。 MoveItの障害物情報をUnity上にも反映させる MoveItのplanning_sceneをUnityにpublishする。 Unity公式ツール「ROS-TCP Connector」使用。 実際に動作させた結果を紹介 6
ロボットモデルをUnity上に登場させる • ROSで使用されるロボット定義ファイル(URDF)を使って3D Objectを追加。 • URDF Importerが問題なく使用できた。 Good! インポートするだけで、 各リンクごとにAirticulation Body を自動で定義してくれる。 7
ros_control経由でUnity上のmyCobotを動かす ros_control? : ROSの制御用フレームワーク。簡単に言うと… この枠組でドライバを実装しておけば、どのロボットアームでも同じ司令で動作可能。 つまり実機用のドライバ、シミュレータ用のドライバと2つ用意しておけば、 それ以外の実装はそのまま共通で使うことができる どのようにros_control対応のドライバを書けばよいか。 まず実機の例を示す。 実機 myCobotの場合 ① インターフェースを継承する 実機 myCobot用のクラス作成。 ② ロボット制御のための実装をする myCobotはシリアル通信で制御可能。 API公開もされているので、 これを活用すれば良い。 左のコメントアウト部分に シリアル通信の命令を実装する。 • readは現在の関節角度を取る命令。 • writeは任意の関節角度に動かす命令。 ここがUnityになればよい! 8
ros_control経由でUnity上のmyCobotを動かす UnityのmyCobotの場合 ① インターフェースを継承する UnityのmyCobot用の固有のクラス作成 ②ロボット制御のための実装をする(ROS側) ROSのTopicに乗せてUnityとROS間の 通信を行う。 左のコメントアウト部分にPub/Sub通信を 行う実装を書く。 • readはUnity側の現在関節角度を Subscribeする実装を書く。 • writeは目標の関節角度をPublishする 実装を書く。 ③ロボット制御のための実装をする(Unity側) Unity公式ツールのROS-TCP Connectorを 使う。 完成! ②、③の接続イメージ 位置 現在位置 司令 取得 • 目標の関節角度を受け取り ArticulationBodyに角度を反映するノード • 現在の関節角度をPublishするノード を実装する。 実際の動きを確認 ArticulationBody から現在位置を取得 ros_control ArticulationBody に司令位置を反映 9
MoveItの障害物情報をUnityの世界にも反映させる MoveItでは障害物情報がplanning_sceneというTopicで管理されている。 障害物をMoveIt上から追加したあと、「Publish」ボタンを 押下すると右の情報がPublishされる。 これをUnity側でSubscribeすればUnity世界にも、 障害物を出現させることができるはず!! primitives: - type: 1 dimensions: - 0.2 - 0.2 - 0.2 primitive_poses: - position: x: 0.18 y: 0.21 z: 0.11 orientation: x: -0.04242791 y: 0.166670639 z: 0.246320621 w: 0.953806542 10
MoveItの障害物情報をUnity上にも反映させる • Unity側でplanning_sceneをSubscribeするscriptを作成。 • Subscribeした情報をもとにGameObject(基本モデル、Primitive)を追加する。 Good! ROSとUnityで座標系が異なることが悩みのタネだったが、簡単に変換できるので 実装がかなり楽だった。 11
実際に動作させた結果を紹介 12
まとめ ROSと連携できるシミュレータとしてUnityを活用した事例を紹介。 今後の課題 • Unity上でのセンサを用意する。例えば仮想的なRealsenseをUnity上で作成し、 MoveItの障害物情報としたい。 • ros_controlでUnityとの通信がROSのPub/Sub経由で行われているので、 余計な通信が発生している。できれば変更したい。 もし良いアプローチがありましたらコメントお願いします。 13
ご静聴ありがとうございました。 質問があれば、お気軽にどうぞ!! 14