VSCodeでURDFの作成と表示その2(ROS2-Foxy)

ROS2
スポンサーリンク
スポンサーリンク

はじめに

前回の記事では、VSCodeのインストールや拡張機能、URDFのタグの説明をしました。

今回の記事では実際に車を記述していきます。

前提条件

前提条件は、以下の通りです。

  • VSCodeがインストールされている
  • VSCodeの拡張機能がインストールされている

URDFで車輪の記述

早速、車輪を記述していきます。
前回作成したfirst_robot.urdfを開き、中身を消して以下のコードを入力してください。

<?xml version="1.0" ?>
<robot name="rover">
    <!-- main center object -->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.4 0.35 0.075"/>
            </geometry>
            <material name="gray">
                <color rgba="0.2 0.2 0.2 1"/>
            </material>
        </visual>
        <inertial>
            <mass value="2"/>
            <inertia ixx="0.04" ixy="0.0" ixz="0.0" iyy="0.17" iyz="0.0" izz="0.25" />
        </inertial>
        <collision>
            <geometry>
                <box size="0.4 0.35 0.1"/>
            </geometry>
        </collision>
    </link>

    <!-- Robot Footprint -->
    <link name="base_footprint"/>

    <joint name="base_joint" type="fixed">
        <parent link="base_link"/>
        <child link="base_footprint"/>
        <origin xyz="0.0 0.0 -0.075" rpy="0 0 0"/>
    </joint>

    <!-- front right wheel object -->
    <link name="wheel_front_right">
        <inertial>
            <mass value="2"/>
            <inertia ixx="1e-3" ixy="0.0" ixz="0" iyy="1e-3" iyz="0" izz="1e-3"/>
        </inertial>
        <visual>
            <geometry>
                <cylinder radius="0.075" length="0.05"/>
            </geometry>
            <material name="whtie">
                <color rgba="1 1 1 1"/>
            </material>
        </visual>

        <collision>
            <geometry>
                <cylinder radius="0.075" length="0.05"/>
            </geometry>
            <contact_coefficients mu="1" kp="1e+13" kd="1.0"/>
        </collision>
    </link>
    <!-- front right wheel joint -->
    <joint name="wheel_front_right_joint" type="continuous">
        <origin xyz="0.125 0.2 0.0" rpy="1.57 0.0 0.0"/>
        <parent link="base_link"/>
        <child link="wheel_front_right"/>
        <axis xyz="0.0 0.0 1.0"/>
    </joint>

</robot>

コード入力後、ctrl + shift + p でコマンドパレットを開き、URDFと入力してURDF Previewをクリックしてください。

このように、表示されていればOKです。

コードの詳細を説明します。

<geometry>
  <cylinder radius="0.075" length="0.05"/>
</geometry>

こちらは、半径0.075 m 高さ0.05 m の円柱を示しています。
今回の車では車輪の半径の分だけbase_linkが上昇するので、

<joint name="base_joint" type="fixed">
  <parent link="base_link"/>
  <child link="base_footprint"/>
  <origin xyz="0.0 0.0 -0.075" rpy="0 0 0"/>
</joint>

このように、<origin xyz=”0.0 0.0 -0.075″>とすることで、base_linkをz軸方向に0.075m上昇させておきます。

次に、<collision>タグです。

<collision>
  <geometry>
    <cylinder radius="0.075" length="0.05"/>
  </geometry>
  <contact_coefficients mu="1" kp="1e+13" kd="1.0"/>
</collision>

新しく<contact_coefficients>タグが登場しました。こちらは、ROSの公式サイトに説明があります通り、接触係数を表します。

  • mu  摩擦係数
  • kp   剛性係数
  • kd   減衰係数

摩擦係数0で進むのかといったテストは別の記事で用意します。

最後に、<joint>タグについて説明します。

<joint name="wheel_front_right_joint" type="continuous">
  <origin xyz="0.125 0.2 0.0" rpy="1.57 0.0 0.0"/>
  <parent link="base_link"/>
  <child link="wheel_front_right"/>
  <axis xyz="0.0 0.0 1.0"/>
</joint>

車輪の回転に制限はないのでtype=”continuous”とします。
新しく<axis>タグが登場しました。type=”fixed”以外の結合タイプは回転方向を設定する必要があります。後に登場する「Rviz」というソフトを使用して回転方向を確認することができます。

URDFで二輪+補助輪の三輪車を描画

車輪と回転の説明をしたので、三輪車を描画します。コード全文を掲載します。

<?xml version="1.0" ?>
<robot name="rover">
    <!-- main center object -->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.4 0.35 0.075"/>
            </geometry>
            <material name="gray">
                <color rgba="0.2 0.2 0.2 1"/>
            </material>
        </visual>
        <inertial>
            <mass value="2"/>
            <inertia ixx="0.04" ixy="0.0" ixz="0.0" iyy="0.17" iyz="0.0" izz="0.25" />
        </inertial>
        <collision>
            <geometry>
                <box size="0.4 0.35 0.1"/>
            </geometry>
        </collision>
    </link>

    <!-- Robot Footprint -->
    <link name="base_footprint"/>

    <joint name="base_joint" type="fixed">
        <parent link="base_link"/>
        <child link="base_footprint"/>
        <origin xyz="0.0 0.0 -0.075" rpy="0 0 0"/>
    </joint>

    <!-- front right wheel object -->
    <link name="wheel_front_right">
        <inertial>
            <mass value="2"/>
            <inertia ixx="1e-3" ixy="0.0" ixz="0" iyy="1e-3" iyz="0" izz="1e-3"/>
        </inertial>
        <visual>
            <geometry>
                <cylinder radius="0.075" length="0.05"/>
            </geometry>
            <material name="whtie">
                <color rgba="1 1 1 1"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="0.075" length="0.05"/>
            </geometry>
            <contact_coefficients mu="1" kp="1e+13" kd="1.0"/>
        </collision>
    </link>
    <!-- front right wheel joint -->
    <joint name="wheel_front_right_joint" type="continuous">
        <origin xyz="0.125 0.2 0.0" rpy="1.57 0.0 0.0"/>
        <parent link="base_link"/>
        <child link="wheel_front_right"/>
        <axis xyz="0.0 0.0 1.0"/>
    </joint>

    <!-- front left wheel object -->
    <link name="wheel_front_left">
        <inertial>
            <mass value="2"/>
            <inertia ixx="1e-3" ixy="0.0" ixz="0" iyy="1e-3" iyz="0" izz="1e-3"/>
        </inertial>
        <visual>
            <geometry>
                <cylinder radius="0.075" length="0.05"/>
            </geometry>
            <material name="whtie">
                <color rgba="1 1 1 1"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="0.075" length="0.05"/>
            </geometry>
            <contact_coefficients mu="1" kp="1e+13" kd="1.0"/>
        </collision>
    </link>

    <!-- front left wheel joint -->
    <joint name="wheel_front_left_joint" type="continuous">
        <origin xyz="0.125 -0.2 0.0" rpy="1.57 0.0 0.0"/>
        <parent link="base_link"/>
        <child link="wheel_front_left"/>
        <axis xyz="0.0 0.0 1.0"/>
    </joint>

    <!-- Caster Wheel -->
    <link name="front_caster" type="fix">
        <visual>
        <geometry>
            <sphere radius="0.075"/>
        </geometry>
        <material name="Cyan">
            <color rgba="0 1.0 1.0 1.0"/>
        </material>
        </visual>
        <collision>
            <geometry>
                <sphere radius="0.075"/>
            </geometry>
        </collision>
    </link>

    <joint name="caster_joint" type="fixed">
        <parent link="base_link"/>
        <child link="front_caster"/>
        <origin xyz="-0.15 0.0 0" rpy="0 0 0"/>
    </joint>

</robot>

first_robot.urdfへ上記コードを貼付し、保存してからURDF Previewで表示すると以下のようになります。

これで三輪車の形状は完成です。

ユニットを追加

これだけでは走ることしかできないので、少し形状を追加します。
first_robot.urdfの</robot>より上の行に以下を追加してください。

<joint name="caster_joint" type="fixed">
  <parent link="base_link"/>
  <child link="front_caster"/>
  <origin xyz="-0.15 0.0 0" rpy="0 0 0"/>
</joint>

<!-- add camera object -->
<link name="camera_link">
  <inertial>
    <mass value="0.5"/>
    <inertia ixx="0.01" ixy="0.0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
  </inertial>
  <visual>
    <geometry>
      <box size="0.05 0.25 0.1"/>
    </geometry>
    <material name="blue">
      <color rgba="0 0 1 1"/>
    </material>
  </visual>
</link>

<!-- add camera joint -->
<joint name="camera_joint" type="fixed">
  <origin xyz="-0.175 0 0.1" rpy="0 0.0 3.14"/>
  <parent link="base_link"/>
  <child link="camera_link"/>
  <axis xyz="0.0 0.0 1.0"/>
</joint>

<!-- add lidar object -->
<link name="lidar_link">
  <inertial>
    <mass value="0.5"/>
    <inertia ixx="0.01" ixy="0.0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
  </inertial>
  <visual>
    <geometry>
      <cylinder radius="0.05" length="0.05"/>
    </geometry>
    <material name="red">
      <color rgba="1 0 0 0.7"/>
    </material>
  </visual>
</link>

<!-- add lidar joint -->
<joint name="lidar_joint" type="fixed">
  <origin xyz="-0.215 0 0.0" rpy="0 0.0 1.57"/>
  <parent link="base_link"/>
  <child link="lidar_link"/>
  <axis xyz="0.0 0.0 1.0"/>
</joint>

<!-- add imu object -->
<link name="imu_link">
  <visual>
    <inertial>
      <mass value="0.3"/>
      <inertia ixx="0.01" ixy="0.0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
    </inertial>
    <geometry>
      <box size="0.05 0.05 0.05"/>
    </geometry>
    <material name="green">
      <color rgba="0 1 0 0.7"/>
    </material>
  </visual>
  <collision>
    <geometry>
      <box size="0.05 0.05 0.05"/>
    </geometry>
  </collision>
</link>

<!-- add imu joint -->
<joint name="imu_joint" type="fixed">
  <origin xyz="0 0 0.075" rpy="0 0 0"/>
  <parent link="base_link"/>
  <child link="imu_link"/>
  <axis xyz="0 0 1.0"/>
</joint>

正常に追加できていれば、次のような表示になります。

IMU、LIDAR、カメラの詳しい説明は次回にします。

おわりに

URDFで胴体、車輪、カメラ、IMU、LIDARを描画しました。
特にIMUとLIDARは車体のコントロールに必要になってきますので忘れずに追記をお願いします。

次回はRviz2への表示とGazeboプラグインの解説までできればと考えております。

コメント

タイトルとURLをコピーしました