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

UnityとROSの連携について