こちらは「UnityでROS」シリーズの記事になります。
各記事をまとめた目次は
を参照ください。
お疲れ様です。
UnityでROSシリーズ、今回は
- Unityワールド上に、ロボットを生成する方法
について解説します。
なお、本記事は以下記事の手順を実施済みであることを前提として話を進めます
URDFファイルの作成
最初に、ロボットを生成するために必要な、URDFファイルを作成します。
URDFは、ロボットの構成を記述したファイルのことで、ROSなどで使われます。
今回は、下図のような「センサ用のリンクが取り付けられたロボット」を使用します。
上記のロボットは、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」をクリックします。
「Import URDF」をクリックします。
simple_box_robotのInspectorを確認すると、デフォルトではControllerスクリプトが有効化されているので、チェックを外します。
各オブジェクトへのTFの設定
次に、生成したsimple_box_robotにTFを設定します。
TFとは、ロボットのフレーム間の繋がりをツリー状に管理するパッケージ、及びそのツリーそのもの、のことを指します。
TFに関しては、以下記事を参考にしてください。
ROSの座標変換TFについて
今回は、下図のようにTFの各フレームのフレーム名を設定します(一般に、リンクに紐づくフレームは「リンク名=フレーム名」とすることが多いため、ここでもそのように設定しています)。
TF管理用オブジェクトの作成
最初に、TF管理用の空のGameObjectを「TF Manager」という名前で作成し、Positionを(0, 0, 0)に設定します。
TF Linkスクリプトのアタッチ
TF Manager, base_footprint, base_link, sensor_linkそれぞれに「TF Linkスクリプト」を追加します。
Frame_id(フレーム名)の設定
次に、各TFスクリプトのパラメータを設定します。
最初に、Frame_id(=フレーム名)を設定します。
TF ManagerのFrame_id(=フレーム名)を「odom」に設定してください。
他、残りのオブジェクトについても、同様の手順でFrame_idを以下のように設定します。
- base_footprint:base_footprint
- base_link:base_link
- sensor_link:sensor_link
Children(=子フレーム)の設定
次に、Childrenを設定します。
TF ManagerのChildren(=子フレーム)には「base_footprint」を指定します。
他、残りのオブジェクトに対しても、同様に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に設定
- 解説:根本となるフレームのフレーム名を記載
- Source:ROS Clock Managerを指定
TFの確認
シーンを再生すると、下図のように可視化設定用のパネルが表示されます。
ここで、パネルの「Transforms」を選択し、「Axes」「Link」「Lbi」の全てにチェックを入れると、TFが表示されることを確認できます。
最初想定していた下図の通りにTFが設定されているか、確認してみましょう(初期位置から動かしていないので、odomフレームとbase_footprintは重なっているはずです)。











