【研究室】Isaac SimのロボットモデルをROS2で制御する

1. はじめに

Isaac simについて

Isaac Sim とは、2019年にNvidiaから発表された新しいシミュレーションソフトウェアになります。

ロボット開発における既存のシミュレーションソフトは、gazeboなどがメジャーですが、Isaac Simは、それらと比べて

  1. リッチなシミュレーション画面
  2. Nvidiaが提供するソフトウェア+AI(物体検出,セグメンテーションなど)との親和性の高さ
  3. シミュレーションツールとして必要なものは一通り(というかほぼ全て)揃っている、フルスタックなシミュレーションツール

が特徴としてあるように思います。 動かせる環境が限定されていることと、それに加えて新しいソフトであるため、参考文献がほとんどないのが、残念なところです。

ROS2はご存知のようにロボット制御のためのミドルウェアです。

今回、Isaac Simが2021年10月のリリースでROS2に対応したとのことで、ROS2 + Isaac Sim のトレンディな組み合わせで、シミュレーションを試してみます。

ちなみにシミュレーションといっても、ちょっと動かせたレベルですので、ご了承の上で見ていただければと思います。

2. 要件

最小が↑になります。GPUAMDRadeonシリーズは対応していません。

筆者の環境は↑の最小要件でしたが、遅延&処理落ちが多発しました。本格的に使いたい人は、余裕のあるスペックを用意してください。

3. 環境構築

Nvidiaの公式チュートリアルに従って行けば、基本的にはいけるのですが、説明が少なくわかりにくいので、少し記録を残します。
公式チュートリアル:

docs.omniverse.nvidia.com

↓も検索するとヒットしますが、こちらは使いませんでした。

https://docs.nvidia.com/isaac/isaac/doc/getting_started.htmldocs.nvidia.com

3.1 Isaac simの環境構築

  1. そもそもNvidiaのドライバーをインストールしていないという人は、公式から最新のドライバーをダウンロードしておきます。
    nvidia toolkit, Docker もない人はインストールします。
  2. ダウンロードができたら、↓URLより、ランチャーアプリを適当なディレクトリにダウンロードします。
    ダウンロードの際、Nvidiaのメンバー登録(無料)が必要です。 www.nvidia.com

  3. ダウンロードしたら、パーミッションを変更して、実行します。

cd [インストールしたディレクトリ] &&
sudo chmod +x omniverse-launcher-linux.AppImage &&
./omniverse-launcher-linux.AppImage

うまく立ち上がると、以下のような画面になります。
ここまでで、Isaac simのセットアップは完了です。

3.2 ROS2の環境構築

Dockerコンテナ上に構築します。

github.com

を参照します。
他サイトにもROS2の環境構築のチュートリアルはありますが、後に他コンポーネントと連携する際に↑のURLで提供されているDockerコンテナが必須になります。
githubのReadmeの通りに動かします。

git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common
scripts/run_dev.sh <path to workspace>

↑のpath to workspaceですが、指定しなくても実行はできますが、指定した方が色々楽です。

スクリプトを実行すると、以下のようにシェルに入れます。

最後にシェルから以下のコマンド実行すれば、完了です。

colcon build && . install/setup.bash

4. ロボットモデルを生成

環境構築ができたら、Isaacsimを起動してみます。 今回はFrankaを使用します。 Create -> Robots -> From Library -> Maniplations -> Franka の順に選択し、ロボットを生成します。
これをROS2で動かします。
生成されたロボットに対して、Create->ROS->Jointstateと進み、ROS_Jointstateをアタッチします。

また、ROS2で動かすため、Windows -> extentions より、ROSを無効化し、ROS2 Bridgeを有効化します。 これでIsaac sim側の準備は完了です。

5. Publisherを作成

公式にはROS1向けのサンプルコードしかないので、今回をROS2向けに書き換えました。
書き換えたコードは以下になります。

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import JointState
import numpy as np
import time
import math

class Talker(Node):
    def __init__(self):
            super().__init__("ros_simu")
            self.count = 0
            self.time_start = time.time()
            self.pub = self.create_publisher(JointState, "/joint_command",0)
            self.time_period = 1.0
            self.tmr = self.create_timer(self.time_period, self.callback)

    def callback(self):
        self.count += 1

        joint_state = JointState()
        num_joints = len(joint_state.name)

        default_joints = [0.0, -1.16, -0.0, -2.3, -0.0, 1.6, 1.1, 0.4, 0.4]
        max_joints = np.array(default_joints) + 0.5
        min_joints = np.array(default_joints) - 0.5

        joint_state.name = [
        "panda_joint1",
        "panda_joint2",
        "panda_joint3",
        "panda_joint4",
        "panda_joint5",
        "panda_joint6",
        "panda_joint7",
        "panda_finger_joint1",
        "panda_finger_joint2",
        ]

        joint_state.position = (np.sin(time.time() - self.time_start) * (max_joints - min_joints) * 0.5 + default_joints).astype(np.float32).tolist()
        self.pub.publish(joint_state)

def main():

    rclpy.init()
    node = Talker()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

↑のjoint_state.positionなどのパラメータは適当です。また、Franka向けに書いているので、違うモデルを使う人は、ジョイントの数などを適宜書き換えてください。

6. 制御してみる

端末を2つ起動し、

scripts/run_dev.sh <path to workspace> 
colcon build && . install/setup.bash

を実行して、 それぞれシェルに入ります。1つ目のシェルで、↑のPublisherを実行します。 2つ目の端末で以下コマンドで、動作の様子を確認します。

ROS2 echo /joint_states

また、ファイアウォールを設定して、コンテナとIsaac sim 間でやりとりができるようにしておきます。

youtube.com

動きました↑。右下端末の出力により動作のパラメータの変化が確認できます。

7. 感想

↑の動画ですが、PCの負担を少しでも軽くするため、ロボットのみのシミュレーション環境でやっています。 これ以上、すこしでも背景やロボットを追加すると、スペックが足りず筆者の環境では動かなくなってしまいました。↑の動画のように動かすだけでもすでにPCファンが爆音です。

もしリソース余裕ある人いたら、↓のモデル動かしてみると、もっと面白いんじゃないかと思いました。
【物体認識】 https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_dnn_inference
【セグメンテーション】 https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_image_segmentation


今回他に何人かの先生にも褒められました!
正直そんなに大したことはしていないですが、 嬉しかったです。

終わり