1. はじめに
Isaac simについて
Isaac Sim とは、2019年にNvidiaから発表された新しいシミュレーションソフトウェアになります。
ロボット開発における既存のシミュレーションソフトは、gazeboなどがメジャーですが、Isaac Simは、それらと比べて
- リッチなシミュレーション画面
- 他Nvidiaが提供するソフトウェア+AI(物体検出,セグメンテーションなど)との親和性の高さ
- シミュレーションツールとして必要なものは一通り(というかほぼ全て)揃っている、フルスタックなシミュレーションツール
が特徴としてあるように思います。
動かせる環境が限定されていることと、それに加えて新しいソフトであるため、参考文献がほとんどないのが、残念なところです。
ROS2はご存知のようにロボット制御のためのミドルウェアです。
今回、Isaac Simが2021年10月のリリースでROS2に対応したとのことで、ROS2 + Isaac Sim のトレンディな組み合わせで、シミュレーションを試してみます。
ちなみにシミュレーションといっても、ちょっと動かせたレベルですので、ご了承の上で見ていただければと思います。
2. 要件
最小が↑になります。GPUはAMDのRadeonシリーズは対応していません。
筆者の環境は↑の最小要件でしたが、遅延&処理落ちが多発しました。本格的に使いたい人は、余裕のあるスペックを用意してください。
3. 環境構築
Nvidiaの公式チュートリアルに従って行けば、基本的にはいけるのですが、説明が少なくわかりにくいので、少し記録を残します。
公式チュートリアル:
docs.omniverse.nvidia.com
↓も検索するとヒットしますが、こちらは使いませんでした。
https://docs.nvidia.com/isaac/isaac/doc/getting_started.htmldocs.nvidia.com
3.1 Isaac simの環境構築
- そもそもNvidiaのドライバーをインストールしていないという人は、公式から最新のドライバーをダウンロードしておきます。
nvidia toolkit, Docker もない人はインストールします。
ダウンロードができたら、↓URLより、ランチャーアプリを適当なディレクトリにダウンロードします。
ダウンロードの際、Nvidiaのメンバー登録(無料)が必要です。
www.nvidia.com
ダウンロードしたら、パーミッションを変更して、実行します。
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
今回他に何人かの先生にも褒められました!
正直そんなに大したことはしていないですが、 嬉しかったです。
終わり