0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【UnityでROS】ロボットをスポーンする【URDF, TF】

0
Last updated at Posted at 2026-05-17

こちらは「UnityでROS」シリーズの記事になります。


各記事をまとめた目次は

を参照ください。

お疲れ様です。

UnityでROSシリーズ、今回は

  • Unityワールド上に、ロボットを生成する方法

について解説します。


なお、本記事は以下記事の手順を実施済みであることを前提として話を進めます

URDFファイルの作成

最初に、ロボットを生成するために必要な、URDFファイルを作成します。

URDFは、ロボットの構成を記述したファイルのことで、ROSなどで使われます。

参考:ROS講座13 URDFを記述する1


今回は、下図のような「センサ用のリンクが取り付けられたロボット」を使用します。

image.png


上記のロボットは、URDFファイルでは以下のように記述されます。

以下ファイルを「simple_box.urdf」という名前で「Assets/URDFディレクトリ」下に作成してください。

<?xml version="1.0"?>
<robot name="simple_box_robot">

  <!-- #### base_footprintリンクの設定 #### -->
  <link name="base_footprint">
    <!--inertialを設定しないと、Unity上でArticulation Bodyが自動で付与されないので、定義だけしておく-->
    <inertial>
      <!--重さは、他のリンクに影響しないようにもの凄く小さい値に設定-->
      <mass value="0.00000001"/>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <inertia
        ixx="0.0" ixy="0.0" ixz="0.0"
        iyy="0.0" iyz="0.0"
        izz="0.0"/>
    </inertial>
  </link>

  <!-- #### base_linkリンクの設定 #### -->
  <link name="base_link">
    <!-- 見た目の設定 -->
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.5 0.5 0.5"/>
      </geometry>
      <material name="green">
        <color rgba="0.0 1.0 0.0 1.0"/>
      </material>
    </visual>

    <!-- 衝突判定 -->
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.5 0.5 0.5"/>
      </geometry>
    </collision>

    <!-- 慣性設定 -->
    <inertial>
      <mass value="1.0"/>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <inertia
        ixx="0.166" ixy="0.0" ixz="0.0"
        iyy="0.166" iyz="0.0"
        izz="0.166"/>
    </inertial>
  </link>

  <!-- #### base_footprint → base_link を繋ぐジョイントの設定 #### -->
  <joint name="base_footprint_to_base_link" type="fixed">
    <parent link="base_footprint"/>
    <child link="base_link"/>
    <origin xyz="0 0 0.25" rpy="0 0 0"/>
  </joint>

  <!-- #### sensor_linkリンクの設定 #### -->
  <link name="sensor_link">
    <!-- 見た目の設定 -->
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.1 0.1 0.1"/>
      </geometry>
      <material name="blue">
        <color rgba="0.0 0.0 1.0 1.0"/>
      </material>
    </visual>
    
    <!-- 衝突判定 -->
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.1 0.1 0.1"/>
      </geometry>
    </collision>
    
    <!-- 慣性設定 -->
    <inertial>
      <mass value="0.1"/>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <inertia
        ixx="0.0001" ixy="0.0" ixz="0.0"
        iyy="0.0001" iyz="0.0"
        izz="0.0001"/>
    </inertial>
  </link>

  <!-- #### base_link → sensor_link を繋ぐジョイントの設定 #### -->
  <joint name="base_to_sensor" type="fixed">
    <parent link="base_link"/>
    <child link="sensor_link"/>
    <origin xyz="0 0 0.3" rpy="0 0 0"/>
  </joint>

  <!-- #### camera_optical_frame リンクの設定 #### -->
  <link name="camera_optical_frame">
    <inertial>
      <mass value="0.001"/>
      <origin xyz="0 0 0"/>
      <inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001"/>
    </inertial>
  </link>

  <!-- #### sensor_link → camera_optical_frame を繋ぐジョイントの設定 #### -->
  <!-- 標準 ROS 光学フレーム (X=右, Y=下, Z=前方) への変換                   -->
  <joint name="sensor_to_camera_optical" type="fixed">
    <parent link="sensor_link"/>
    <child link="camera_optical_frame"/>
    <origin xyz="0 0 0" rpy="-1.5708 0 -1.5708"/>
  </joint>

</robot>

URDFファイルからロボットをインポート

先ほど作成したurdfファイルをもとに、ロボットをインポートします。


simple_box.urdfを右クリックして、「Import Robot from Selected URDF file」をクリックします。

image.png


「Import URDF」をクリックします。

image.png


simple_box_robotのInspectorを確認すると、デフォルトではControllerスクリプトが有効化されているので、チェックを外します。

image.png

各オブジェクトへのTFの設定

次に、生成したsimple_box_robotにTFを設定します。


TFとは、ロボットのフレーム間の繋がりをツリー状に管理するパッケージ、及びそのツリーそのもの、のことを指します。

TFに関しては、以下記事を参考にしてください。
ROSの座標変換TFについて


今回は、下図のようにTFの各フレームのフレーム名を設定します(一般に、リンクに紐づくフレームは「リンク名=フレーム名」とすることが多いため、ここでもそのように設定しています)。

image.png

TF管理用オブジェクトの作成

最初に、TF管理用の空のGameObjectを「TF Manager」という名前で作成し、Positionを(0, 0, 0)に設定します。

image.png

TF Linkスクリプトのアタッチ

TF Manager, base_footprint, base_link, sensor_linkそれぞれに「TF Linkスクリプト」を追加します。

image.png

Frame_id(フレーム名)の設定

次に、各TFスクリプトのパラメータを設定します。


最初に、Frame_id(=フレーム名)を設定します。

TF ManagerのFrame_id(=フレーム名)を「odom」に設定してください。

image.png


他、残りのオブジェクトについても、同様の手順でFrame_idを以下のように設定します。

  • base_footprint:base_footprint
  • base_link:base_link
  • sensor_link:sensor_link

Children(=子フレーム)の設定

次に、Childrenを設定します。

TF ManagerのChildren(=子フレーム)には「base_footprint」を指定します。

image.png

下図(再掲)を見ればわかるように、「odomの子フレームはbase_footprint」となるため、Childrenには「Frame_idにbase_footprintと設定してあるオブジェクト」を指定すれば良いことがわかります。

image.png

他、残りのオブジェクトに対しても、同様にChildrenを以下のように設定します

  • base_footprint:base_link
  • base_link:sensor_link
  • sensor_link:末端のフレームなので未設定のままでOK

TF配信の設定

ここまでで、ロボットに対してTFを設定することができたため、次は、作成したTFを/tfトピックに配信するための設定を行います。


TF Managerに、「TF Message Msg Publisher」を追加し、以下のように設定します。

  • Topic Name:/tf
  • SerializerのSource:TF Managerを指定
    • 解説:根本のフレーム(今回の場合、odom)が設定してあるオブジェクトを指定
  • Header
    • Source:ROS Clock Managerを指定
      • 解説:ROS Clockが設定してあるオブジェクトを指定
    • Frame_id:odomに設定
      • 解説:根本となるフレームのフレーム名を記載

image.png

TFの確認

シーンを再生すると、下図のように可視化設定用のパネルが表示されます。

ここで、パネルの「Transforms」を選択し、「Axes」「Link」「Lbi」の全てにチェックを入れると、TFが表示されることを確認できます。

image.png


最初想定していた下図の通りにTFが設定されているか、確認してみましょう(初期位置から動かしていないので、odomフレームとbase_footprintは重なっているはずです)。

image.png

例えば、base_footprintのPositionを適当に移動させると、odomからbase_footprintに線が伸びることが確認できます。

image.png

最後に

今回は、URDFを元にしたロボットの生成、TFの設定について解説しました。


次回は、今回作成したロボットに対して、各種センサーを取り付ける方法について解説します。

次回:センサーを使ってみる【カメラ、点群、IMU、GNSS】

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?