複数タスクの実行¶
学習目標¶
このチュートリアルを修了すると、以下の内容を習得できます:
offsetパラメータを使ってタスクのアセットを空間的に配置する方法find_unique_string_name()でプリムパスやオブジェクト名の衝突を回避する方法_task_objectsと_move_task_objects_to_their_frame()を使ったオフセット管理- 同じタスクを複数インスタンス化して並列実行する方法
はじめに¶
前提条件¶
- チュートリアル 5: 複数ロボットの追加 を完了していること
所要時間¶
約 15〜20 分
ソースコードの準備¶
このチュートリアルでは、引き続き Hello World サンプルの hello_world.py を編集していきます。前回のチュートリアルから続けて作業している場合はそのまま進めてください。別の日に作業を再開する場合は、以下の手順でソースコードを開いてください。
- Windows > Examples > Robotics Examples をアクティブにして、Robotics Examples タブを開きます。
- Robotics Examples > General > Hello World をクリックします。
- Open Source Code ボタンをクリックし、Visual Studio Code で
hello_world.pyを開きます。
詳しい手順は Hello World の「サンプルを開く」セクションを参照してください。
注意
STOP → PLAY の操作ではワールドが正しくリセットされない場合があります。シミュレーションをやり直す場合は、RESET ボタンを使用してください。
タスクのパラメータ化¶
前回のチュートリアルでは RobotsPlaying タスクを1つだけ使いましたが、同じタスクを複数配置するには、各タスクのアセットが重ならないように位置をオフセットする必要があります。
BaseTask は offset パラメータをサポートしており、タスク内のすべてのアセットを指定した分だけ平行移動できます。ここでは以下のポイントが重要です:
| 機能 | 説明 |
|---|---|
offset パラメータ |
タスクのコンストラクタに渡し、self._offset として利用可能 |
find_unique_string_name() |
名前やパスの衝突を避けるためにユニークな名前を生成 |
self._task_objects |
タスクが管理するオブジェクトを登録する辞書 |
_move_task_objects_to_their_frame() |
登録されたオブジェクトにオフセットを適用 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | |
set_up_scene 内では、オフセットの適用対象が 2 種類 あることに注意してください:
| 対象 | オフセットの適用方法 | 説明 |
|---|---|---|
| サブタスク内のオブジェクト(Franka, キューブ) | PickPlace に offset を渡す (コンストラクタで実行済み) |
サブタスク自身が _task_objects と _move_task_objects_to_their_frame() でオフセットを適用 |
| 自タスクのオブジェクト(Jetbot) | _task_objects に登録 → _move_task_objects_to_their_frame() (A, C) |
自分で追加したオブジェクトは自分で登録・適用する |
(B) の Franka の位置調整はオフセットとは別の処理で、Jetbot と Franka が重ならないよう X 方向に追加で 1.0 ずらしています。これはサブタスク側でオフセット適用済みの位置に対する追加の調整です。
コードを保存してシミュレーションを確認します:
- Ctrl+S を押して保存し、File > New From Stage Template > Empty → LOAD を実行します。
- PLAY を押すと、Y 軸方向に -1.0 オフセットされた位置でロボットが動作します。
- 原点付近の白いキューブと比較して、タスクのアセットがオフセットされていることを確認できます。
複数タスクの並列実行¶
offset によるパラメータ化ができたので、同じタスクを複数インスタンス化して並列に実行します。ここでは3つの RobotsPlaying タスクを Y 軸方向に並べて配置します。
複数タスクを扱う際の重要なポイント:
- タスクイベントのキー名を一意にする — 複数タスクの観測情報が混ざらないよう、タスク名をプレフィックスとして付ける(
self.name + "_event") - コントローラをリストで管理する — 各タスクに対応するコントローラをリストに格納
world_cleanup()— ホットリロード時にリストを初期化する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | |
events_dt の明示的な指定
チュートリアル 4 で説明した通り、events_dt は PickPlaceController の各ステートの実行速度を制御するリストです。複数の Franka が同時に動作する場合、デフォルト値ではタイミングが合わず動作が不安定になることがあるため、ここでは明示的に値を指定して各ロボットの動作速度を揃えています。
コードを保存してシミュレーションを確認します:
- Ctrl+S を押して保存し、File > New From Stage Template > Empty → LOAD を実行します。
- PLAY ボタンを押して、3組の Jetbot + Franka が並んで同時に動作する様子を確認します。

まとめ¶
このチュートリアルでは以下のトピックを扱いました:
offsetパラメータによるタスクの空間配置find_unique_string_name()による名前衝突の回避_task_objectsと_move_task_objects_to_their_frame()によるオフセット管理- リストを使ったコントローラとタスクの並列管理
world_cleanup()によるホットリロード対応
発展
異なる種類のタスクを組み合わせて実行する例は、Isaac Sim に付属のスタンドアロンサンプル standalone_examples/api/isaacsim.robot.manipulators/universal_robots/multiple_tasks.py を参照してください。
次のステップ¶
次のチュートリアル「属性の追加」に進み、GUI 操作でオブジェクトに物理属性を設定する方法を学びましょう。
注釈
以降のチュートリアルでも主に Extension Workflow を使用して開発を進めます。Standalone Workflow への変換方法は Hello World で学んだ手順と同様です。