Modellieren Sie eine 4-Bar-Kinematik in SDFormat und URDF

Modellieren Sie eine 4-Bar-Kinematik in SDFormat und URDF

Die Modellierung einer 4-Bar-Kinematik in Gazebo kann eine Herausforderung sein, da URDF eine Baumstruktur zur Darstellung von Roboterkinematiken verwendet, die keine geschlossenen Schleifen wie eine 4-Bar-Kinematik zulässt. SDFormat kann geschlossene kinematische Schleifen modellieren, da es eine Graphenstruktur verwendet. Da Gazebo URDF vor dem Laden in SDFormat konvertiert, können wir eine SDFormat-Verbindung innerhalb der <gazebo>-Erweiterungstags verwenden, um die Schleife zu schließen. Diese Verbindung wird nach der Konvertierung in SDFormat dem Modell hinzugefügt.

SDFormat Beispiel einer 4-Bar-Kinematik

Dieses Beispiel zeigt eine 4-Bar-Kinematik, die an beiden Enden mit dem Boden verbunden ist. Sie hat 4 rotatorische Gelenke mit den Bezeichnungen joint_A, joint_B, joint_C und joint_D und 3 Verbindungen namens link_AB, link_BC und link_CD.

4-Bar-Kinematik

Die Modelldateien befinden sich im Ordner “four_bar_sdf”. Um dieses Modell zu verwenden, erstellen Sie einen Ordner ~/.gazebo/models/four_bar_sdf und kopieren Sie die “model.config” und “model.sdf” in diesen Ordner. Sie können dann das Modell mit Hilfe des “Insert”-Panels in der linken Seitenleiste des Gazebo-Clients in eine Simulation einfügen.

Modellparameter

Die Modellparameter sind in einer eingebetteten Ruby-Vorlagendatei namens “model.sdf.erb” codiert. Das Modell “model.sdf” kann aus der Vorlagendatei mit dem Befehl erb -T 1 model.sdf.erb > model.sdf generiert werden. Dadurch können geometrische Parameter an einem Ort definiert werden, zusammen mit einer Hilfsfunktion zur Berechnung des Trägheitsmoments eines gleichmäßigen Kastens.

# Kastenabmessungen
t = 0.02
X = 0.20
Y = 1.5 * X

def box_inertia(dx, dy, dz)
  density = 600
  box = {}
  box[:size] = Vector[dx, dy, dz]
  box[:volume] = dx * dy * dz
  box[:mass] = density * box[:volume]
  box[:ixx] = box[:mass] / 12.0 * (dy**2 + dz**2)
  box[:iyy] = box[:mass] / 12.0 * (dz**2 + dx**2)
  box[:izz] = box[:mass] / 12.0 * (dx**2 + dy**2)
  box[:ixy] = 0.0
  box[:ixz] = 0.0
  box[:iyz] = 0.0
  box
end

Die Verbindungsparameter werden in einem Wörterbuch namens “boxes” gespeichert:

boxes = {}
boxes["AB"] = box_inertia(t, Y, t)
boxes["AB"][:offset] = Vector[-t/2, -Y/2, 0]
boxes["BC"] = box_inertia(X, t, t)
boxes["BC"][:offset] = Vector[X/2, -(Y+t/2), 0]
boxes["CD"] = box_inertia(t, Y, t)
boxes["CD"][:offset] = Vector[X+t/2, -Y/2, 0]

Die Gelenkparameter werden in einem Wörterbuch namens “joints” gespeichert:

joints = {}
joints["A"] = {}
joints["A"][:type] = "revolute"
joints["A"][:parent] = "world"
joints["A"][:child] = "link_AB"
joints["A"][:pose] = Vector[t/2, Y/2, 0, 0, 0, 0]
joints["A"][:axis] = Vector[0, 0, 1]
joints["B"] = {}
joints["B"][:type] = "revolute"
joints["B"][:parent] = "link_AB"
joints["B"][:child] = "link_BC"
joints["B"][:pose] = Vector[-X/2, t/2, 0, 0, 0, 0]
joints["B"][:axis] = Vector[0, 0, 1]
joints["C"] = {}
joints["C"][:type] = "revolute"
joints["C"][:parent] = "link_CD"
joints["C"][:child] = "link_BC"
joints["C"][:pose] = Vector[X/2, t/2, 0, 0, 0, 0]
joints["C"][:axis] = Vector[0, 0, 1]
joints["D"] = {}
joints["D"][:type] = "revolute"
joints["D"][:parent] = "world"
joints["D"][:child] = "link_CD"
joints["D"][:pose] = Vector[-t/2, Y/2, 0, 0, 0, 0]
joints["D"][:axis] = Vector[0, 0, 1]

Ein Modelltemplate wird verwendet, das auf die berechneten Parameter für jede Verbindung und jedes Gelenk verweist:

<sdf version="1.5">
  <model name="four_bar_sdf">
    <pose>0 0 <%= z0 %> 0 0 0</pose>
    <self_collide>true</self_collide>
    <% boxes.keys.each do |k| box = boxes[k] link_name = "link_#{k}" %>
    <link name="<%= link_name %>">
      <pose><%= a_to_s(box[:offset]) %> 0 0 0</pose>
      <inertial>
        <mass><%= box[:mass] %></mass>
        <inertia>
          <ixx><%= box[:ixx] %></ixx>
          <iyy><%= box[:iyy] %></iyy>
          <izz><%= box[:izz] %></izz>
          <ixy><%= box[:ixy] %></ixy>
          <ixz><%= box[:ixz] %></ixz>
          <iyz><%= box[:iyz] %></iyz>
        </inertia>
      </inertial>
      <collision name="box<%= k %>Collision">
        <geometry>
          <box>
            <size><%= a_to_s(box[:size]) %></size>
          </box>
        </geometry>
      </collision>
      <visual name="box<%= k %>Visual">
        <geometry>
          <box>
            <size><%= a_to_s(box[:size]) %></size>
          </box>
        </geometry>
        <material>
          <script>
            <uri>file://media/materials/scripts/gazebo.material</uri>
            <name>Gazebo/Wood</name>
          </script>
        </material>
      </visual>
    </link>
    <% end joints.keys.each do |k| joint = joints[k] joint_name = "joint_#{k}" %>
    <joint name="<%= joint_name %>" type="<%= joint[:type] %>">
      <pose><%= a_to_s(joint[:pose]) %></pose>
      <parent><%= joint[:parent] %></parent>
      <child><%= joint[:child] %></child>
      <axis>
        <xyz><%= a_to_s(joint[:axis]) %></xyz>
      </axis>
    </joint>
    <% end %>
  </model>
</sdf>

Das vollständige Modell wird aus dieser Vorlage erstellt, wie im Codebeispiel gezeigt.

LESEN  Ich erfülle mir meinen Traum als Lehrerin für Pflegeberufe!

Modellierung einer kinematischen Schleife

Eine 4-Bar-Kinematik mit kinematischen Schleifen kann teilweise als Baummodell modelliert werden, indem einige der Schleifen aufgeschnitten werden. Dies kann durch Entfernen eines Gelenks oder durch Aufteilen eines Verbindungselements in der Mitte geschehen. Die Schleife kann wieder geschlossen werden, indem ein zusätzliches Gelenk hinzugefügt wird. Im vorliegenden Beispiel wird das mittlere Verbindungselement in der Mitte geteilt und ein festes Gelenk hinzugefügt, um sie zusammenzuhalten. Es werden die gleichen 4 rotatorischen Gelenke joint_A, joint_B, joint_C und joint_D verwendet, jedoch mit 4 Verbindungen link_AB, link_BE, link_EC, link_CD und einem festen Gelenk joint_E.

Die SDFormat-Modelldateien befinden sich im Ordner “four_bar_split_fixed_sdf”. Um dieses Modell zu verwenden, erstellen Sie einen Ordner ~/.gazebo/models/four_bar_split_fixed_sdf und kopieren Sie die “model.config” und “model.sdf” in diesen Ordner.

4-Bar-Kinematik mit Schleife

Der Unterschied zwischen den Vorlagen der Modelle “four_bar_sdf” und “four_bar_split_fixed_sdf” besteht darin, dass das letztere Modell die Schleife aufgeschnitten und ein festes Gelenk hinzugefügt hat.

Die rotatorischen Gelenke der aufgeschnittenen 4-Bar-Kinematik können in URDF mit dem hinzugefügten festen Gelenk mithilfe eines <gazebo>-Erweiterungstags modelliert werden. Das URDF-Modell befindet sich im Ordner “four_bar_split_fixed_urdf” mit den Dateien “model.config” und “model.urdf” sowie der eingebetteten Ruby-Modellvorlage. Das Modell “model.urdf” kann aus der Vorlage mit dem Befehl erb -T 1 model.urdf.erb > model.urdf generiert werden. Der Vergleich dieses Modells mit dem “four_bar_split_fixed_sdf”-Modell bietet einen nützlichen Vergleich, wie Koordinatensysteme in SDFormat und URDF definiert werden.

Die SDFormat festes Gelenk wird in <gazebo>-Tags spezifiziert:

<!-- SDFormat Gelenke -->
<gazebo>
  <joint name="joint_E" type="fixed">
    <pose>-0.1 -0.01 0 0 0 0</pose>
    <parent>link_BE</parent>
    <child>link_EC</child>
  </joint>
</gazebo>

URDF Modell

Folgen Sie diesen Schritten, um die Modelle in Gazebo zu verwenden und die 4-Bar-Kinematik zu simulieren. Viel Spaß beim Experimentieren mit kinematischen Modellen in Gazebo!

LESEN  Warum du unbedingt bei ALDI arbeiten möchtest!