Isaac Sim で TurtleBot3 の操作を試す
「Isaac Sim」で「TurtleBot3」の操作を試したのでまとめました。
・Isaac Sim 5.1
1. はじめに
「Isaac Sim」では、ロボットのURDFを読み込んでシミュレーション上に配置できます。今回は、「TurtleBot3」のURDFを「Isaac Sim」にインポートし、物理シミュレーションを試します。
2. URDF の準備
2-1. URDF
「URDF」は、簡単に言うとロボットの設計図です。ロボットは、ボディ、車輪、センサー、関節など、いくつもの部品でできています。URDFには、それぞれの部品について、
・どんな形をしているか
・どこにつながっているか
・どの関節が動くか
・重さや慣性はどうなっているか
といった情報が書かれています。
Isaac Simは、このURDFを読み込むことで、ロボットの構造をシミュレーション上に再現できます。
2-2. TurtleBot3 のURDFの準備
(1) ROS環境を読み込んだターミナルを開く。
(2) xacroのインストール。
sudo apt install ros-jazzy-xacro(3) TurtleBot3のパッケージの取得。
git clone -b $ROS_DISTRO https://github.com/ROBOTIS-GIT/turtlebot3.git turtlebot3(4) 「turtlebot3_burger.urdf」を xacro で前処理。
「turtlebot3_burger.urdf」内の xacro記述を展開して、Isaac Simが読み込みやすいURDF「tb3_burger_processed.urdf」に変換しています。
cd turtlebot3/turtlebot3_description/urdf
namespace=""
xacro ./turtlebot3_burger.urdf "namespace:=${namespace:+$namespace/}" > tb3_burger_processed.urdf4. URDF のインポート
(1) Isaac Sim を起動。
(2) メニュー「Create → Environments → Simple Room」を選択。
(3) メニュー「File → Import」で「tb3_burger_processed.urdf」を選択し、以下のようにオプションを設定し、「Import」をクリック。
・Model : Referenced Model
・Links : Moveable Base
・wheel_left_joint - target : Velocity
・wheel_right_joint - target : Velocity

(4) urdfからusdへの変換の確認ダイアログで「Yes」をクリック。

(5) 左端のPlayボタン (▶) を押す。
タイヤのがテーブルに着地することを確認します。

5. Action Graph の準備
(1) メニュー「Window > Graph Editors > Action Graph」で新しい「Action Graph」を作成し、以下のようにノードをつなげる。

「Make Array」のarraySizeは2を指定して、2つの値を入力できるようにします。

5-1. On Playback Tick
シミュレーションが「Playing」、つまり再生中のときにTickを出すノードです。このノードからTickを受け取ったノードは、シミュレーションの各ステップごとに計算処理を実行します。
5-2. ROS2 Context
指定されたDomain IDを持つROS2コンテキストを作成します。デフォルトではDomain IDは 0 です。
5-3. ROS2 Subscribe Twist
Twistメッセージをサブスクライブするノードです。デフォルトのトピック名 は「cmd_vel」です。
5-4. Scale To/From Stage Unit
アセットや入力値を、Isaac Simのステージ単位に変換するノードです。シミュレーション空間の単位に合わせて、速度や距離などの値を調整するために使います。
5-5. Break 3-Vector
「Twist Subscriber」の出力は、linear と angular の速度です。どちらも3次元ベクトルです。
linear.x
linear.y
linear.z
angular.x
angular.y
angular.z
一方で、「Differential Controller」が必要とする入力は、「前進速度」と「z軸まわりの回転速度」だけです。
TurtleBot3では主に次の値を使います。
linear.x
angular.z5-6. Differential Controller
ロボット全体の目標速度を受け取り、左右の車輪速度を計算します。計算には「車輪半径」「左右の車輪間の距離」が必要です。また、オプションで速度制限を設定し、車輪速度が大きくなりすぎないようにできます。
Propertyで次の値を入力します。
・Max Angular Speed : 1.0
ロボットが回転できる最大角速度です。
値が大きいほど速く旋回できます。
・Max Linear Speed : 0.22
ロボットが前後に移動できる最大速度です。
TurtleBot3 Burgerの最大並進速度に合わせた値です。
・Wheel Distance : 0.16
左右の車輪の間隔です。
この値をもとに、旋回時の左右の車輪速度が計算されます。
・Wheel Radius : 0.025
車輪の半径です。
この値をもとに、ロボットの移動速度から車輪の回転速度が計算されます。

5-7. Articulation Controller
対象となるロボットに対して、指定したジョイントを動かすためのノードです。動かしたいジョイント名、またはジョイントのインデックスを指定し、次のいずれかのコマンドで関節を動かします。今回は、Velocity Commands を使います。
・Position Commands
・Velocity Commands
・Effort Commands
Propertyで次の値を入力します。
・rootPath : /World/turtlebot3_burger/base_footprint

Articulation Controllerも On Playback Tick で実行されます。これにより、新しいTwistメッセージが届いていない場合でも、前回受け取ったコマンドを実行し続けます。
5-8. Constant Token
Propertyで次の値を入力します。
・Inputs/Value : wheel_left_joint

・Inputs/Value : wheel_right_joint

6. TurtleBot3 の操作
(1) ROS 2環境を読み込んだ別のターミナルを開く。
(2) トピックの確認。
ros2 topic list/cmd_vel(2) ROS 2から /cmd_vel にTwistメッセージを送信。
・前進
ros2 topic pub /cmd_vel geometry_msgs/Twist "{'linear': {'x': 0.2, 'y': 0.0, 'z': 0.0}, 'angular': {'x': 0.0, 'y': 0.0, 'z': 0.0}}"・停止
ros2 topic pub /cmd_vel geometry_msgs/Twist "{'linear': {'x': 0.0, 'y': 0.0, 'z': 0.0}, 'angular': {'x': 0.0, 'y': 0.0, 'z': 0.0}}"(3) teleop_twist_keyboard を使ってキーボードで操作。
sudo apt-get install ros-$ROS_DISTRO-teleop-twist-keyboardros2 run teleop_twist_keyboard teleop_twist_keyboard【おまけ】 ロボットの調整
URDFを読み込むと、見た目やリンク構造、関節情報などは自動的にインポートされます。しかし、すべての物理パラメータが完全に正しく変換されるとは限りません。
・タイヤが滑りすぎる
・ロボットが変な揺れ方をする
・関節の動きが遅い
・車輪が期待通りに回らない
これは、URDF側の情報とIsaac Sim側の物理エンジンの設定が完全には一致しない場合があるためです。必要に応じて摩擦、質量、慣性、関節パラメータを調整する必要があります。
(1) 摩擦
車輪が滑る場合は、車輪や床の摩擦係数を調整します。移動ロボットでは、タイヤと床の摩擦がとても重要です。摩擦が小さすぎると、車輪が空回りして前に進みにくくなります。
(2) 質量と慣性
URDFに明示的な質量や慣性が書かれていない場合、Isaac Simの物理エンジンが形状から推定します。ただし、推定値が実際のロボットに合っているとは限りません。調整したい場合は、対象リンクのprimを探し、Propertyで「Physics > Rigid Body」や「Mass」を確認します。Massがなければ、Propertyの「+Add」から「Physics > Mass」を追加できます。
(3) 関節のStiffnessとDamping
関節の動きがおかしい場合は、「Stiffness」と「Damping」を確認します。
・Stiffness:目標値にどれくらい強く向かうか
・Damping:動きをどれくらいなめらかに抑えるか
Position制御ではStiffnessを高めに、Dampingを低めにすることがあります。一方で、Velocity制御の場合は、Stiffnessを0にし、Dampingを0以外にする必要があります。
