Welcome to Mashykom WebSite
Unity を用いた ROS ロボットのシミュレーション
Unity(Unity3D)は、2004年にデンマークで設立されたOver the Edge Entertainment (OTEE)が2005年に公開したゲーム開発ツールで、2007年に社名がUnity Technologiesに変更された。
現在、Unity は Unity Technologies(日本法人はユニティ・テクノロジーズ・ジャパン株式会社)が開発・販売している、IDEを内蔵するゲーム作成用エンジンです。ゲームエンジンは、3Dや2Dの描画、サウンド再生、データ管理、作成ツールなど「ゲームを開発するために必要な環境を備えたもの」になります。したがって、Unityはゲーム開発用のソフトウェアでありプラットフォームです。
Unityはゲームエンジンの中で特に人気が高く、多くのRPGや位置情報ゲームがUnityによって作られています。またVR開発にも使用されています。PC(Windows、macOS、Linux)だけでなくモバイル機器(iOS、Android)やウェブブラウザ(WebGL)、家庭用ゲーム機(PlayStation 4、Xbox One、Nintendo Switch等)といったクロスプラットフォームに対応しており、VR/AR/MR機器向けのコンテンツ開発にも対応しています。最近では、個人が開発したゲーム、通称インディーゲームもUnityを使って作られるのが一般的となっています。Unityを使ってゲームやコンテンツを開発したアクティブユーザー数は世界で28億人を越えたと言われています。
Unityでは、主に、C#を用いたプログラミングでコンテンツの開発をします。C# 言語は Microsoft が開発したオブジェクト指向プログラミング言語です。基本的な文法はC言語をベースにしています。Unity上でC#スクリプトをビルドする時に使用されるC#のコンパイラーはUnityが製作したコンパイラーとなります。このページでの説明はC#の知識を必要としません。
一方、ロボット開発の分野では、ロボットのAI化だけでなく、現実世界をデジタル世界でリアルタイムに可視化してシミュレーションするディジタルツイン、あるいは、メタバースと呼ばれる手法が注目されています。このシミュレーションをする上で、よりリアルな周辺環境やロボットの動きの再現を追求する課題において、Unity を活用することが重要視され始めています。ちなみに、Unityでのロボットシミュレーション用のツール、チュートリアル、リソース、およびドキュメントの情報をまとめたリポジトリ、「Unity Robotics Hub」が開発されています。シミュレーションはロボットの開発において重要な役割を果たしており、ロボット開発者たちがこれらのシミュレーションでUnityを使用できる環境が整備されてきました。
当然のことながら、産業用ロボットから個人向けのロボットまで、ロボットを動かすためには、そのためのシステムが搭載されていることが必須です。このロボット操作のためのシステムを提供する代表的なミドルウエアがROS(Robot Operating System)と言われるソフトウエアです。ROSはOpen Source Robotics Foundationによって開発されたオープンソースのロボット・フレームワークです。ROSは様々なロボットを操作するための汎用ミドルウエアですが、サポートしているOSは主にLinuxなので、コンピュータのOSとしてLinux系Ubuntuをインストールすることが便利です。ROSにはROS1とROS2の2系統がありますが、このページでは主としてROS2を取り上げます。ROS2の使用法に関する解説は、Jetson NanoでROS2を用いたロボット操作のページを 読んでください。
このページでは、ROSをプラットフォームとしたロボットの操作シミュレーションをUnityを活用して実行する手続きについて説明します。Unity で ROS を利用するとき、ROS を Docker でインストールする必要があります。Docker の基礎知識が必要です。Docker のインストール及び初心者向け解説はDocker 入門のページを 参考にしてください。なお、Unity からのスクリプト作成には Visual Studio Code が必要です。Visual Studio Code は、公式サイトのVisual Studio.microsoftのページ からダウンロードできます。
Last updated: 2022.7.29
Unity のインストールについて説明します。Unity Technologies のホームページ からダウンロードします。「プランと価格を確認」から「individual」から個人向けのバージョンを選択します。「Download the Unity Hub」の中から、自身の使用しているOSに対応した Unity Hub をダウンロードします。特定のバージョンをダウンロードするときは、「Choose your Unity version」のページにいきます。ここでは、インストールしたバージョンは「Unity editor 2021.3.36f1」です。
Unityの簡単な使い方を説明します。プロジェクトを作成するには、以下の操作を行います。
Unity Hubを起動します。既に起動している場合はメニューバーの File から New Project を選択します。 右上の New を選択します。
プロジェクトダイアログが表示されますので、Project Name に作成するゲーム名を入力します。今回は "Roll-a-Ball" とします。
Location にプロジェクトを保存するフォルダを指定します。
今回は 3D のゲームを作成しますので、3D を設定します。
最後に Create Project をクリックしてプロジェクトを作成します。
次にシーンを保存します。 シーンを作成するには、以下の操作を行います。
File→New Scene を選択します。
File→Save を選択します。
新規保存の場合は、project ウインドウでシーン名を指定します。今回は stage01 とします。Assetsの配下に「stage01」と表示されます
操作が完了後、シーンの情報を保存したシーンファイル(stage01.unity)が作成されます。
ゲーム作成を行う時には、エディターの UI 表示を統一することが便利です。そのために、以下の操作をします。
右上の Layout(Default) をクリックし、2 by 3を選択します。
Game タブを選択し、Free Aspect を選択、16:9 へ変更します。
以下のような画面に変更されます。
Unity エディターの画面構成と、各ビューの名称
各要素は以下のとおりです。
シーン(Scene)ビュー:
シーンビューには製作中のゲーム世界(シーン)が表示され、自由な位置・角度から眺めることができます。
ゲーム(Game)ビュー:
ゲームビューはゲーム画面です。 ゲームプレイヤーは基本的にこの画面を見ながらゲームをプレイします。 また UI 等の操作はこの画面で行います。
インスペクター(Inspector)ビュー:
シーンの中で選択肢中のオブジェクトが持つ属性を表示・編集するためのビューです。 属性には座標やメッシュといった外見上のものから、衝突判定や物理制御に関するパラメーターなどもあり、その他ユーザー定義のものもここに表示されます。
ヒエラルキー(Hierarchy)ビュー:
シーン内に存在するオブジェクトの一覧が表示されます。 編集中のシーン内でオブジェクトをコピー/ペーストしたり、適切な名前をつけて整理することもできます。
プロジェクト(Project)ブラウザー:
製作中のプロジェクト(ゲーム全体)に含まれるシーン、スクリプト、グラフィックやサウンドなどのデータ、その他のリソースがファイル単位で表示されます。ここに出来合いのスクリプトセット、アートアセット、シェーダーなどを「パッケージ」単位でインポートすることもできます。
物理的対象をゲームに登場させてみましょう。立体モデルを作成します。ヒエラルキービューで 「+」をクリックし、「3D Object」から Cube を選択して、作成します。Scene に Cube が登場します。この後に、Scene で以下の操作ができます。
マウスホイール:Sceneビューの拡大・縮小
右クリックを押しながらドラッグ:視点を回転
真ん中クリックを押しながらドラッグ:Sceneビューの平行移動
オブジェクトをダブルクリック:指定のオブジェクトにフォーカス
パッケージのimport は次のように行います。メニューから Window → Asset Store を開きます。
Asset Store のブラウザが開くので、Bolt と検索します。無料のBolt の Download を行います。Open in Unity をクリックします。Unity 画面に Package Manager が開くので、Download をクリックして、ダウンロードされたら右下のImport ボタンをクリックします。Boltを開くwizardが表示されるので、「Programmer Naming」を選択して、generate します。Assets の配下に Bolt が表示されます。
Unity の使用法の詳しい入門的解説は公式サイトにあるunity-tutorials-for-beginners-jp を参照ください。
--- To be conitued ----
Unity-ROS を活用したロボット操作のシミュレーションを解説した記事はwebサイトにいくつかあります。主要なものの一つは、Raspberry Pi Mouseをシミュレーション用ロボットに設定したUnityとROSで移動ロボット入門 です。英文では、Unity Robotics Hub の使い方 があります。書籍では、布留川英一 著『Unityではじめる ROS・人工知能 ロボットプログラミング実践入門』が入門者向けです。ロボットプログラミングでは、慣性モーメントの計算などの運動力学の知識が必要とされますが、このページの説明では、それを前提としません。
ここでは、布留川英一 著『Unityではじめる ROS・人工知能 ロボットプログラミング実践入門』を参考にして、Unity-ROSによるロボットシミュレーションを始めるための環境構築の方法について説明します。特に、ROS2-Unity間通信の実行について説明します。ROS2-Unity間通信に関係したweb バージョンは、 ROS入門 (41) - ROS2-Unity間のトピックによる通信 だろうと思われます。
最初に、ROS2-foxy のDocker インストールを実行します。ホストでのワーキングディレクトリをros2_ws、dockerでのディレクトリを/home/ubuntu/colcon_ws とします。
$ docker run -v ~/ros2_ws:/home/ubuntu/colcon_ws -p 6080:80 --shm-size=512m tiryoh/ros2-desktop-vnc:foxy
my_topic というパッケージを作成します。PCのブラウザから VNCのアドレス「http://127.0.0.1:6080/」にアクセスします。webブラウザのターミナルを起動します。
ブラウザ上の環境にコピー&ペーストする際は 画面右側の三角のアイコンをクリックし、 クリップボードアイコンを選択して表示されるテキストボックスに入力することでペーストできるようになります。
$ cd colcon_ws/src
$ ros2 pkg create --build-type ament_python my_topic --dependencies rclpy
$ cd my_topic
$ vim setup.py
# 'console_scripts'の中を以下のように修正
'console_scripts': [
'my_publisher_node = my_topic.my_publisher_node:main',
'my_subscriber_node = my_topic.my_subscriber_node:main',
],
ソースコードを作成します。
$ cd my_topic
$ vim my_publisher_node.py
$ vim my_subscriber_node.py
パッケージをビルドします。
$ cd ~/colcon_ws
$ colcon build
topic メッセージの実行をするために、二つのターミナルが必要です。
# 1つ目のターミナルで
$ source ~/colcon/install/setup.bash
$ ros2 run my_topic my_publisher_node
# 2つ目のターミナルで
$ source ~/colcon/install/setup.bash
$ ros2 run my_topic my_subscriber_node
1つ目のターミナルが「Hello World!」を配信し、2つ目のターミナルで、「Hello World!」を受信します。
以上が、Docker コンテナを用いた ROS2 のトピックメッセージの配信と受信をするための設定の仕方です。
次に、Unity-ROS間の通信の仕組みについて説明します。
ROS2側での準備:ROS-TCP-Endpoint をインストールします。ROS2 のDocker コンテナを起動して、webブラウザのターミナルから
$ cd ~/colcon_ws/src
$ git clone -b main-ros2 https://github.com/Unity-Technologies/ROS-TCP-Endpoint
$ cd ..
$ colcon build
$ source ~/colcon_ws/install/setup.bash
と打ちます。
Unity側での準備:Unityを起動して、「Project」->「New roject」を開いて、 MyTopic というプロジェクトを作成します。「importing」に1分ほどかかります
ROS-TCP-Connectorをインストールします。Unityのメニュー「Window → Package Manager」で「Package Manager」を開き、「+ → Add package from git URL....」で以下のURLを入力します。
https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector
「Add」ボタンを押すと、version 0.7.0 がインストールされます。
(1) Node の作成:Hierarchyウィンドウの「+ 」→ 「Create Empty」で空のGameObjectを作成し、「Node」と名前を修正します。「Node」に新しいスクリプト「MyPublisher」を追加します。HierarchyウィンドウのNodeをクリックして、inspector ウインドウで「add component」、 「New Script」を作成し、名前を「MyPublisher」 とします。Project ビューの Assets 配下に表示される「# MyPublisher」表示をダブルクリックすると、VS Code で中身が自動的に開きます。VS Code でファイルの中身を編集します。
MyPublisherの内容:
(2)「Node」に新規スクリプト「MySubscriber」を追加(Add Component)し、以下のように編集します。
MySubscriberの内容は以下の通りです。
実行手順は、次のとおりです。ROS2から配信するケースでは、ROS2側で以下のコマンドを打ちます。
$ docker run -v ~/ros2_ws:/home/ubuntu/colcon_ws -p 10000:10000 -p 6080:80 --shm-size=512m tiryoh/ros2-desktop-vnc:foxy
ROS2 のDocker コンテナを起動したら、webブラウザのターミナルを開き、エンドポイントを実行します。
$ source ~/colcon_ws/install/setup.bash
$ ros2 run ros_tcp_Endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0
二つ目のターミナルを開き、パブリッシャーを起動します。
$ source ~/colcon_ws/install/setup.bash
$ ros2 run my_topic my_publisher_node
Unity側:Unity Hubを起動して、MyTopic を開きます。メニューの「Robotics Setting」で「ROS2」を選択し、Hierarchy ビューの「Node」をクリックして Inspector 画面に表示される「MySubscriber」にチェック(✔️)がある状態、「MyPublisher」にチェックが付いてない状態にします。
play ボタンをクリックします。console に「Subscribe: Hello World!」という受信が表示されます。
Unityから配信するケースでは、ROS2側では以下の通りします。
# 1つ目のターミナルで
$ source ~/colcon_ws/install/setup.bash
$ ros2 run ros_tcp_Endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0
# 2つ目のターミナルで
$ source ~/colcon_ws/install/setup.bas
$ ros2 run my_topic my_subscriber_node
Unity側では、メニューの「Robotics Setting」で「ROS2」を選択し、「Node」に 「MyPublisher」にチェック(✔️)がある状態、「MySubscriber」にチェックがついてない状態にします。playボタンをクリックします。
ROS2の受信用ターミナルで以下のような受信が表示されます。
[INFO] [1657700879.158877337] [my_subscriber_node]: Subscribe : Hello Unity!
[INFO] [1657700880.157553949] [my_subscriber_node]: Subscribe : Hello Unity!
[INFO] [1657700881.158711807] [my_subscriber_node]: Subscribe : Hello Unity!
[INFO] [1657700882.166471918] [my_subscriber_node]: Subscribe : Hello Unity!
[INFO] [1657700883.168753841] [my_subscriber_node]: Subscribe : Hello Unity!
[INFO] [1657700884.169540389] [my_subscriber_node]: Subscribe : Hello Unity!
[INFO] [1657700885.173939068] [my_subscriber_node]: Subscribe : Hello Unity!
以上のような Unity-ROS 間の通信を用いて、ロボットのシミュレーションをUnity のゲーム画面上で実行することができます。このUnity-ROS 間の通信を行うためには、Unity 側の ROS-TCP-Connector パッケージと ROS側の ROS-TCP-Endpoint パッケージをインストールする必要があります。 また、Unity でメッセージの発信と受信を行うための Node を GameObjectとして作成し、ROS側で、発信と受信用のノードを作成します。例えば、Unity 側で発信したトピックメッセージは ROS-TCP-Connector と ROS-TCP-Endpoint を介して、ROSの受信用ノードで受信されます。
当然ながら、Unity-ROS 間の通信では、トピックメッセージだけでなく、サービス型やアクション型という通信も必要になります。これらについては、後日、改めて書きます。
Unity Robotics Hub を用いたシミュレーション
ロボットシミュレーション用のUnityのツールを使用すると、ユーザーはUnityをROSベースのワークフローと統合できます。Unityのロボティクスツールは、URDFファイルのインポートとROSとUnity間のメッセージの送受信をサポートできます。以下では、UnityエディターでのURDFのインポートの仕方、URDFを使用したシーンの作成、Niryo One ロボットの操作の仕方、MoveIt軌道計画を使用したピックアンドプレースタスクの実行など、ROSをUnityと統合するために必要な手順を説明します。最終的目標は、以下の画像のように(Niryo One ロボットの)ピックアンドプレースを実行するシミュレーションの実現です。
Niryo One ロボットのピックアンドプレース
上記の目的を実現するために、Unity-Robotics-Hub-Tutorial に沿って、Unity-Robotics-Hub の利用方法を順次説明します。これらすべてを習得するには、相当の根気が必要でしょう。
最初に、Unity-Robotics-Hub をダウロードします。
$ git clone --recurse-submodules https://github.com/Unity-Technologies/Unity-Robotics-Hub.git
ここでは、Docker を利用します。
$ cd Unity-Robotics-Hub/tutorials/pick_and_place
$ git submodule update --init --recursive
$ docker build -t unity-robotics:pick-and-place -f docker/Dockerfile .
ダウンロードに数分かかります。ここで用いた Dockerfile は ROS Melodic base Image です。このイメージをビルドすると、必要なパッケージをインストールし、、ROS パッケージ及び submodulesをコンテナにコピーしして、 catkin workspace をビルドします。Docker コンテナを作成します。
$ docker run -it --rm -p 10000:10000 unity-robotics:pick-and-place /bin/bash
root@8d88ed579657:/catkin_ws#
これで、ROS 使用の準備が完了しました。
次に、Unity のセットアップをします。 Unity Hub を起動して、「Open」をクリックして、ダウンロードしたUnity-Robotics-Hubの中の「PickAndPlaceProject」(/tutorials/pick_and_place/PickAndPlaceProject/)ディレクトリを選択します。Fileを開くで、Emptyscene を開くといいでしょう。
Project ウインドウで、Assets/Prefabs に行き、Table prefab を選択します。これをHierarchy ウインドウにクリック&ドラッグします。Table が Scene ビューに現れます。Target 及び TargetPlacement も同様にします。
Hierarchy ウインドウの Main Camera を選択して、ロボットがよく見えるように調整します。Inspector ウインドウで、Main Camera's Position を (0, 1.4, -0.7)、 Rotation を (45, 0, 0)に設定します。
ロボットを登場させましょう。クレーン型のマニピュレーターです。
メニューから、Edit > Project Settings > Physics とクリックして、Solver Type を Temporal Gauss Seidel にセットします。これで、ジョイントのエラー動作を防止します。
この操作では、LayoutをDefault に変更します。Project ウインドウで、Assets/URDF/niryo_one/niryo_one と移動して、右クリックします。Import Robot from URDF を選択し、Import menu に表示されるSelect Axis Type で Y Axis 、 mesh decomposer で VHACD として、Import URDF をクリックします。 ロボットがシーンに登場します。niryo_oneがHierarchy ウインドウに表示されます。
Hierarchy ウインドウで、niryo_one を選択して、Inspector ウインドウのController (Script) componentをみて、
Stiffness 10000
Damping 100
Force Limit 1000
Speed 30
Torque 100
Acceleration 10
とセットします。
Hierarchy ウインドウで、「niryo_one」の左の矢印をクリックして、niryo_one > world > base_link と移動します。Inspecutor ウインドウで、
Immovable にチェックを入れる。
Unity Editor のメニューの「play」ボタンをクリックします。設定が正常であれば、エラーは起きません。
操作方法は、以下のとおりです。操作する関節を選択するために、キーボードの左右キーを使用します。関節を回転させるには、上下キーを使用します。Game Scene を拡大するには、Layout を Tall にして、Game のウインドウに切り替えてください。
詳しくは、公式サイトのTutorials を読んでください。
完成したSceneは Assets/Scene/Part1DoneScene にあります。Unity Editor のFileメニューからSceneを開くを選択して、PickAndPlaceProjectの「Asets」->「Scene」-> 「Part1DoneScene」を開きます。「play」ボタンをクリックすれば、ロボットを操作できます。左右キーで関節を選択すると、選択した関節の色が赤色に変化します。
ROSとUnityとの間の通信を行う段階にきました。Unityでは、Unity-ROS間通信を行うために、「ROS TCP Connector」を使います。メニュー「Window → Package Manager」を開き、「ROS TCP Connector」がインポートされていることを確認します。
始めに、ROSのメッセージとサービスのC#クラススクリプトを作成します。
Unityのメニューで、「Robotics -> Generate ROS Messages」を選択します。「ROS message path」の「Browse」をクリックし、「Unity-Robotics-Hub/tutorials/pick_and_place/ROS/」を選択します。以下のように、msgファイルとsrvファイルの一覧が表示されます。
moveit_msgs
niryo_moveit
niryo_one_ros
niryo_one_urdf
ros_tcp_endpoint
moveit_msgs の中身をドロップダウンして、「msg」 -> 「RobotTrajectory.msg」 と移動して、 「RobotTrajectory.msg」 の 「Build msg」 ボタンをクリックします。
Assets/RosMessages/Moveit/msg ディレクトリに、C#スクリプトが作成されます。
次に、niryo_moveit の中身をドロップダウンして、「msg -> Build 2 msgs」 をクリックします。
・niryo_moveit/msg/NiryoMoveitJointsMsg.msg
・niryo_moveit/msg/NiryoTrajectoryMsg.msg
が追加されます。Assets/RosMessages/NiryoMoveit/msg ディレクトリに、2つのC#スクリプトが作成されます。
最後に、サービス用のスクリプトを生成する必要があります。ROS Message Browser ウインドウで、 ROS/src/niryo_moveit/srv のディレクトリを拡張して 「srv -> Build 1 srv」 をクリックします。Assets/RosMessages/NiryoMoveit/srv ディレクトリに MoverServiceRequest と MoverServiceResponse の2つのC#スクリプトが作成されます。
Unity の画面から離れて、git clone した Unity-Robotics-Hub/tutorials/pick_and_plac ディレクトリに行きます。scripts ディレクトリの中身を PickAndPlaceProject の Assets/Scripts ディレクトリにコピーします。SourceDestinationPublisher、 TrajectoryPlanner という2つのC#ファイルです。
再度、Unity Editor の画面に戻ります。
Hierarchy ウィンドウを右クリックし、[Create Empty]を選択して、新しい空のゲームオブジェクトを追加します。「 Publisher 」という名前を付けます。「Publisher」を選択し、Inspector ウインドウで「Add Component」をクリックし、「SourceDestinationPublisher」と入力します。 表示されたらこのコンポーネントを選択します。
「SourceDestinationPublisher」の中は空なので、以下のように中身を埋めます。Hierarchy ウインドウの Target object を選択して、Publisher の Target field にコピー(drag & drop)します。同じように、TargetPlacement object を TargetPlacement field にコピし、 niryo_one を Niryo One field にコピーします。
パブリッシャーボタンを追加します。Hierarchyウィンドウを右クリックして、「+ → UI → Button」でボタンを追加します。これは new Canvas parent を生成します。Game ビューの画面内にボタンが表示されます。
Button object を選択して、Inspectorで内容を見ます。OnClick() header の + ボタンをクリックして、新しいイベントを追加します。まず、Hierarchy ウインドウで Publisher を選択し、それをOnClick() の No Function(none)にドラッグします。No Function のところを dropdown して、SourceDestinationPublisher > Publish() と選択します。Positionに(-200, -200, 0)を指定すると、ボタンが見えやすいです。
Hierarchy ビューで、 Button -> Text に行き、Inspector ウインドウで、Textに associated component、例えば、「Publish」を指定します。
Unity-ROS間の通信を行うために、ROS側では、ROSのDocker コンテナを起動します。
$ docker run -it --rm -p 10000:10000 unity-robotics:pick-and-place /bin/bash
:/catkin_ws#
:/catkin_ws# source devel/setup.bash
ROS parameters の設定、 server endpointの起動、 trajectory subscriberの起動などを行います。
# roslaunch niryo_moveit part_2.launch
このlaunch ファイルの中身は以下の通りです。
Unity側で、play ボタンをクリックして、Game ビューでUIボタン「Publish」をクリックします。roslaunch を起動したターミナルで、以下のような表示が出てきます。
started roslaunch server http://5335e5f3504c:41717/
SUMMARY
========
PARAMETERS
* /rosdistro: melodic
* /rosversion: 1.14.13
* /server_endpoint/tcp_ip: 0.0.0.0
* /server_endpoint/tcp_port: 10000
NODES
/
server_endpoint (ros_tcp_endpoint/default_server_endpoint.py)
trajectory_subscriber (niryo_moveit/trajectory_subscriber.py)
auto-starting new master
process[master]: started with pid [228]
ROS_MASTER_URI=http://localhost:11311
setting /run_id to e4567eac-0b09-11ed-ac37-0242ac110002
process[rosout-1]: started with pid [239]
started core service [/rosout]
process[server_endpoint-2]: started with pid [242]
process[trajectory_subscriber-3]: started with pid [247]
[INFO] [1658636412.119882]: Starting server on 0.0.0.0:10000
[INFO] [1658636491.804754]: Connection from 172.17.0.1
[INFO] [1658636491.875808]: RegisterSubscriber(/tf, ) OK
[INFO] [1658636491.924929]: RegisterPublisher(/niryo_joints, ) OK
[INFO] [1658636491.935377]: RegisterPublisher(/niryo_joints, ) OK
[INFO] [1658636496.069824]: /trajectory_subscriberI heard:
joints: [-1.290967884415295e-05, -0.007198998238891363, -0.0011190696386620402, 0.0023578740656375885, 0.0001172167612821795, 1.7199181456817314e-05]
pick_pose:
position:
x: -0.157005697489
y: -0.216008037329
z: 0.643718481064
orientation:
x: -1.49643722125e-06
y: -0.707106769085
z: 1.49643722125e-06
w: -0.707106769085
place_pose:
position:
x: -0.699999988079
y: -0.0
z: 1.39999997616
orientation:
x: -0.499999970198
y: -0.499999970198
z: 0.499999970198
w: -0.499999970198
[INFO] [1658636559.127782]: Connection from 172.17.0.1
[INFO] [1658636559.136172]: Connection from 172.17.0.1
...
詳しい説明は、公式サイトのtutorials/pick_and_place/2_ros_tcp.md を読んでください。続きは、pick_and_place/3_pick_and_place.md に沿って説明します。
TrajectoryPlannerを追加します。TrajectoryPlannerの追加手順は、次のとおりです。
Hierarchyウィンドウで「Publisher」を選択し、Add Componentをクリックして、「TrajectoryPlanner」を入力します。
「TrajectoryPlanner」を選択して、「Niryo One」「Target」「TargetPlacement」の空欄にHierarchyウィンドウの「niryo_one」「Target」「TargetPlacement」をドラッグ&ドロップします。
Hierarchyウィンドウで「Button」を選択し、Inspectorの「On Click()」の下をdropdownして、「SourceDestinationPublisher」の代わりに「TrajectoryPlanner → PublishJoints()」を選択します。
Pick-and-Placeのシミュレーションを実行するために、まず、ROS コンテナを起動し、launch ファイルを実行します。
$ docker run -it --rm -p 10000:10000 unity-robotics:pick-and-place /bin/bash
# source devel/setup.bash
# roslaunch niryo_moveit part_3.launch
このlaunch ファイルは、・エンドポイントノードの起動、・moverノードの起動、および、・demo.launchの起動を実行します。
Unity側で、UnityエディタでPlayボタンを押す。そして、Publishボタンを押します。
Niryo One ロボットが自動的に動き始めて、「Target」のキューブを「TargetPlacement」の場所まで運びます。
UnityとROSで走行ロボットのシミュレーション
Unity社とアールティ社が共同で開発したUnityとROSを組み合わせたロボット入門者向け教材 がGitHubに公開されています。本教材で扱う内容は以下の事項を含むと説明されています。
DockerによるROS、Gazebo(シミュレータ)の環境構築
ロボットモデルの表示
フィールドモデルの表示
ロボット操作用ボタンの作成と速度指令値の送信
ロボット位置姿勢の可視化
オドメトリの可視化
LiDARデータの可視化
カメラ映像の可視化
すでに、既知の事項となりましたが、ROSで操作されるロボットのシミュレーションをUnityで実行するためには、まず、Unity 側の ROS-TCP-Connector パッケージと ROS側の ROS-TCP-Endpoint パッケージをインストールする必要があります。また、ロボットモデルのURDFファイルをUnityにインポートすることが必要です。この目的のために、Unity-Technologies/URDF Importer というパッケージが必要ですので、これをUnityにインポートします。
UnityとROSの間の情報通信をするための発信・受信用のノードをUnityとROSの両サイドに作成することが必要です。ROSロボットをUnityから操作するためには、操作用のGameObjectも作成します。
Raspberry Pi ロボットを用いたシミュレーションをUnityで実行するために、以上の環境構築を以下の手順で行います。上記の教材の 説明に沿っていきましょう。
1-1. GitHub から「走行ロボットのシミュレーション用」ファイル一式を取得します。GitHub からパッケージ一式を複製(clone)します。
$ git clone https://github.com/unity3d-jp/Unity-ROS-MobileRobot-UI-Tutorial.git
1-2. 作業フォルダに移動します。
$ cd Unity-ROS-MobileRobot-UI-Tutorial
1-3. ROS-TCP-Endpoint の取り込み。以下のコマンドを使って、ROS-TCP-Endpoint を取り込みます。
$ git submodule update --init --recursive
以上で、必要なファイル一式が Unity-ROS-MobileRobot-UI-Tutorial フォルダの中に格納されました。
ターミナルで以下のコマンドを実行することで、ROSのDockerのビルドを実施します。
$ cd ros
$ docker build -t raspimouse-unity:latest .
これで、ROSの Docker イメージが作成されます。ただ、デフォルトのDockerfileのままですと、ros-melodic バージョンです。Dockerfile を修正して、ros2-foxy にすることもできます。
Unityを起動して、「open」をクリックして、リストから Unity-ROS-MobileRobot-UI-Tutorial/MobileRobotUITutorialProject を選択します。Assets/Scenes/Step1 を開いてください。以下の手順でシミュレーションのための環境構築を行います。
1. パッケージマネージャからURDF-Importerをインストールします。メニューバーのWindow -> Package Manager と進み、左上の+ボタンからAdd package from git URLをクリックします。以下のURDF-ImporterのGitリポジトリのURLのタグを指定して入力し、Addをクリックします。
https://github.com/Unity-Technologies/URDF-Importer.git?path=/com.unity.robotics.urdf-importer
2. RT社製Raspberry Pi Mouse のURDFモデルをダウンロードし、Unityプロジェクト内のAssets/URDFフォルダへ配置します。このURDFモデルは「Unity-ROS-MobileRobot-UI-Tutorial」の中にダウンロードされています。UnityのProjectパネルで、Assetsを右クリックして、「Create」->「Folder」で URDF というフォルダ名前にします。
3. Assets/URDF フォルダーの中に、Raspberry Pi Mouse のURDFモデルをコピーします。コピーの方法はUnityの画面上でなくてもできます。例えば、macOSの場合、FinderでダウンロードしたパッケージUnity-ROS-MobileRobot-UI-Tutorial を開き、/ROS/src/配下の「raspimouse_description」を、MobileRobotUITutorialProject/Assets/URDF/の中にコピーします。さらに、raspimouse_description フォルダ内のurdf/raspimouse_with_urg.urdfを Assets/URDFの中にコピーします。つまり、Assets/URDF/の中には、raspimouse_description フォルダーと raspimouse_with_urg.urdf ファイルの2つがあります。UnityのProject ウインドウで確認してください。
4. このURDFモデルをUnityにインポートします。Assets/URDF内の raspimouse_with_urg.urdf を右クリックして Import Robot from Selected URDF file をクリックします。URDF Import Settingsパネルが表示されますので、Axis Type を Y axisに、Mesh Decomposer を VHACD に設定して、Import URDF をクリックします。正常にインポートできれば Scene ビューに Raspberry Pi Mouse が表示されるずです。
5. URDF-Importerで読み込んだロボットモデルはUnity上で物理シミュレーションができるように Articulation Bodyが適用されます。物理シミュレーションはGazeboで行い、UnityはUI開発に使用するため、Hierarchy ウインドウで、raspimouse の中に配置された以下の GameObject の Articulation Body を無効にします。
base_link
right_wheel_link
left_wheel_link
urg_mount_link
lidar_link
さらに、Hierarchy ウインドウで raspimouse を選択して、Inspector ウインドウに表示される Controller スクリプトのチェックマークを無効にしておきます。以上で、URDF のインポートは完了です。
6. 次に、Worldデータの中のCOLLADAファイルをUnityプロジェクト内のAssets/Modelsフォルダへ配置します。UnityのProject ウインドウで、Assets を右クリックして、「Create」「Folder」と進んで、Assetsの下に Models フォルダを作成します。そして、ROS/src/raspimouse_sim/raspimouse_gazebo/models/cheeze_maze_a/meshes フォルダ内の maze.dae を Models フォルダへコピーします。
7. WorldデータをUnityにインポートします。Assets/Models内の maze.dae を Hierarchy ウィンドウにドラッグ&ドロップして、GameObjectとして配置します。Game ビューに迷路が表示されます。Hierarchy ウィンドウのmazeを選択して、InspectorでのTransformのデフォルト値のうち、Rotation Y -90 と修正します。raspimouse を選択して、Inspector での Position X 0.3 と修正します。raspimouse の位置が迷路から離れます。
8. Gameビューを調整するためにカメラのアングルを調整します。Main Cameraのビューを確認しながらMain CameraのPositionとRotationを調整します。以下が参考値です。
Position
X, Y, Z: 1, 2.1, -0.5
Rotation
X, Y, Z: 70, -35, 0
以上で、ロボットのURDF ファイルおよびWorldデータのUnityへのインポートとカメラのアングル調整は終了です。残っている課題は、ロボット操作用のパネルの作成です。この作業は若干複雑なので、この解説 を読んでください。ロボット操作用のパネルの作成も完了したとして、話を進めます。
「File」->「Open Scene」を選択してAssets/ScenesのStep3のファイルを開きましょう。Raspberry Pi Mouse のurdfファイルもUnityにインポートされているので、Unity の Game ビューにロボットの姿が表示されています。上述の手順がすべて完了しているので、Unity の UI ボタンで操作できる環境が構築されています。
ロボット操作のシミュレーションは以下の手順で行います。
ROS側の設定:ターミナルで以下を実行してDockerコンテナを起動します。
$ docker run --rm -it -p 10000:10000 -p 5005:5005 -p 6080:80 --shm-size=512m raspimouse-unity:latest
Webブラウザを開き http://127.0.0.1:6080 にアクセスします。
Unity側の設定:Unityで再生ボタン▶️を押し、ゲームの再生モードで実行します。再生モード中の画面表示が小さい場合は、GameビューのLow Resolution Aspect Ratiosのチェックを外して下さい。scaleも1以上にします。
webブラウザの画面で、Gazeboシミュレータを起動します。WebブラウザでLXTerminalを2つ起動します。1枚目のLXTerminalで以下のコマンドを実行します。Gazebo の表示が登場するまで相当の時間がかかります。
$ roslaunch raspimouse_gazebo raspimouse_with_cheeze_maze.launch
2枚目のLXTerminalで以下のコマンドを実行します。
$ roslaunch ros_tcp_endpoint endpoint.launch
ブラウザ上の環境にコピー&ペーストする際は 画面右側の三角のアイコンをクリックし、 クリップボードアイコンを選択して表示されるテキストボックスに入力することでペーストできるようになります。
Unityで再生モードのボタンをクリックしたのち、Gameビュー上で「forward, backward」などのボタンを押すと移動指令が送信され、Gazebo上のロボットが移動します。ロボットの動きは相当に遅いです。
このとき、Unity上のロボットは動きません。
Unity 上のロボットもROSと同期して移動させるためには、Unity にSubscriber のオブジェクトを作成する必要があります。
Hierarchyウィンドウを右クリックしてCreate Emptyを選択し、SubscriberとしてGameObjectを作成します。
作成したSubscriberオブジェクトに、Project ウインドウにあるAssets/Scripts/TfSubscriber.csスクリプトをドラッグして、アタッチします。
Hierarchy ウインドウのTfSubscriber を選択して、InspectorウィンドウでTfSubscriberコンポーネントのMobile Robotの欄に、raspimouseオブジェクトをドラッグして、指定します。
これで、ROSから配信されるロボットの位置姿勢を受信してUnity上のロボットに反映させることができます。Scenes/Step4.unity を開いてください。ロボット操作のシミュレーションの手順を実行します。Unity 画面でPlay ボタンをクリックして、Game ビュー上のボタンを押すとUnity上でロボットが移動します。ロボットの移動速度が非常に遅いので、Publisher のCmd_Velの値を大きくすれば速くできます。
ーーーー To be continued ーーーー
このページのトップへ
Jetson Nano へのROS1のインストール
Jetson Nano Mouse ロボットの操作
トップページに行く