・URDF
<?xml version="1.0"?>
<robot name="tortoisebot">
<link name = "base_link">
<visual>
<geometry>
<box size="0.6 0.3 0.3"/>
</geometry>
</visual>
</link>
<link name="front_caster">
<visual>
<geometry>
<box size="0.1 0.1 0.3"/>
</geometry>
</visual>
</link>
<joint name="front_caster_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="front_caster"/>
<origin rpy="0 0 0" xyz="0.3 0 0"/>
</joint>
<link name="front_wheel">
<visual>
<geometry>
<cylinder length="0.05" radius="0.035"/>
</geometry>
</visual>
</link>
<joint name="front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="front_caster"/>
<child link="front_wheel"/>
<origin rpy="-1.5708 0 0" xyz="0.05 0 -0.15"/>
</joint>
</robot>

上記URDFを以下のコマンドで可視化する。
roslaunch urdf_tutorial display.launch model:=tortoisebot.urdf

・joint
jointのoriginは、先にxyzをparentの軸に沿って移動する。
その後、parentの軸に沿って回転する。

・joint_states
joint_state_publisherが、joint_statesトピックをpublish。
joint_statesトピックは、関節角を保持している。
robot_stete_publisherは、joint_statesトピックをsubscribeし、tfトピックをpublish。

・tf
tfトピックは、リンクの親リンクからの位置姿勢変換を保持している。
rvizで見るとTF名はjoint名ではなく親リンク名となっているが、定義はjointタグで行われる。
上の例では、base_link - front_caster間、front_caster - front_wheel間の変換を保持する。
姿勢はクォータニオンで保持するため、front_caster - front_wheel間のtfでは、n=(1, 0, 0), θ=-π/2より、
 [x, y, z, x] = [sin(-π/4), 0, 0, cos(-π/4)] = [-sqrt(2), 0, 0, sqrt(2)]となる。