ferroscope-motion 0.1.3

The SO-101 under real dynamics: a ferromotion rollout recorded with a determinism receipt, an actuation rail computed from joint torques, and a production note. The run is produced and certified by the same stack that renders it.
<?xml version="1.0"?>
<!--
  SO-101, the LeRobot 5-DOF arm with a gripper, as a ferroscope demo device.

  Kinematics and inertials are verbatim from the published calibrated SO-101 description
  (TheRobotStudio SO-ARM100 / LeRobot, Apache-2.0, generated by onshape-to-robot): every
  joint origin, rpy, axis, limit, effort and velocity, and every link mass, centre of mass
  and inertia tensor is the number that description carries.

  What is NOT verbatim: the upstream visuals are STL meshes of the printed parts, which are
  separate binary files under their own licence. This file substitutes boxes sized to the
  real link extents. So the arm moves exactly like an SO-101 and does not look like one -
  the shapes are stand-ins, and are labelled here rather than left for you to discover.
  Point ferroscope at the upstream description with its meshes to draw the real parts.
-->
<robot name="so101">

  <link name="base_link">
    <inertial>
      <origin xyz="0.0137179 -5.19711e-05 0.0334843" rpy="0 0 0"/>
      <mass value="0.147"/>
      <inertia ixx="0.000114686" ixy="-4.59787e-07" ixz="4.97151e-06" iyy="0.000136117" iyz="9.75275e-08" izz="0.000130364"/>
    </inertial>
    <visual>
      <origin xyz="0.02 0 0.031" rpy="0 0 0"/>
      <geometry><box size="0.075 0.075 0.062"/></geometry>
      <material name="base_link_mat"><color rgba="0.16 0.17 0.20 1.0"/></material>
    </visual>
    <collision>
      <origin xyz="0.02 0 0.031" rpy="0 0 0"/>
      <geometry><box size="0.075 0.075 0.062"/></geometry>
    </collision>
  </link>

  <link name="shoulder_link">
    <inertial>
      <origin xyz="-0.0307604 -1.66727e-05 -0.0252713" rpy="0 0 0"/>
      <mass value="0.100006"/>
      <inertia ixx="8.3759e-05" ixy="7.55525e-08" ixz="-1.16342e-06" iyy="8.10403e-05" iyz="1.54663e-07" izz="2.39783e-05"/>
    </inertial>
    <visual>
      <origin xyz="-0.03 -0.009 -0.027" rpy="0 0 0"/>
      <geometry><box size="0.055 0.045 0.07"/></geometry>
      <material name="shoulder_link_mat"><color rgba="1.0 0.82 0.12 1.0"/></material>
    </visual>
    <collision>
      <origin xyz="-0.03 -0.009 -0.027" rpy="0 0 0"/>
      <geometry><box size="0.055 0.045 0.07"/></geometry>
    </collision>
  </link>

  <link name="upper_arm_link">
    <inertial>
      <origin xyz="-0.0898471 -0.00838224 0.0184089" rpy="0 0 0"/>
      <mass value="0.103"/>
      <inertia ixx="4.08002e-05" ixy="-1.97819e-05" ixz="-4.03016e-08" iyy="0.000147318" iyz="8.97326e-09" izz="0.000142487"/>
    </inertial>
    <visual>
      <origin xyz="-0.056 -0.014 0.01" rpy="0 0 0"/>
      <geometry><box size="0.125 0.045 0.04"/></geometry>
      <material name="upper_arm_link_mat"><color rgba="1.0 0.82 0.12 1.0"/></material>
    </visual>
    <collision>
      <origin xyz="-0.056 -0.014 0.01" rpy="0 0 0"/>
      <geometry><box size="0.125 0.045 0.04"/></geometry>
    </collision>
  </link>

  <link name="lower_arm_link">
    <inertial>
      <origin xyz="-0.0980701 0.00324376 0.0182831" rpy="0 0 0"/>
      <mass value="0.104"/>
      <inertia ixx="2.87438e-05" ixy="7.41152e-06" ixz="1.26409e-06" iyy="0.000159844" iyz="-4.90188e-08" izz="0.00014529"/>
    </inertial>
    <visual>
      <origin xyz="-0.067 0.003 0.012" rpy="0 0 0"/>
      <geometry><box size="0.145 0.04 0.04"/></geometry>
      <material name="lower_arm_link_mat"><color rgba="1.0 0.82 0.12 1.0"/></material>
    </visual>
    <collision>
      <origin xyz="-0.067 0.003 0.012" rpy="0 0 0"/>
      <geometry><box size="0.145 0.04 0.04"/></geometry>
    </collision>
  </link>

  <link name="wrist_link">
    <inertial>
      <origin xyz="-0.000103312 -0.0386143 0.0281156" rpy="0 0 0"/>
      <mass value="0.079"/>
      <inertia ixx="3.68263e-05" ixy="1.7893e-08" ixz="-5.28128e-08" iyy="2.5391e-05" iyz="3.6412e-06" izz="2.1e-05"/>
    </inertial>
    <visual>
      <origin xyz="0 -0.031 0.014" rpy="0 0 0"/>
      <geometry><box size="0.042 0.072 0.042"/></geometry>
      <material name="wrist_link_mat"><color rgba="1.0 0.82 0.12 1.0"/></material>
    </visual>
    <collision>
      <origin xyz="0 -0.031 0.014" rpy="0 0 0"/>
      <geometry><box size="0.042 0.072 0.042"/></geometry>
    </collision>
  </link>

  <link name="gripper_link">
    <inertial>
      <origin xyz="0.000213627 0.000245138 -0.025187" rpy="0 0 0"/>
      <mass value="0.087"/>
      <inertia ixx="2.75087e-05" ixy="-3.35241e-07" ixz="-5.7352e-06" iyy="4.33657e-05" iyz="-5.17847e-08" izz="3.45059e-05"/>
    </inertial>
    <visual>
      <origin xyz="0 0 -0.03" rpy="0 0 0"/>
      <geometry><box size="0.04 0.042 0.075"/></geometry>
      <material name="gripper_link_mat"><color rgba="0.16 0.17 0.20 1.0"/></material>
    </visual>
    <collision>
      <origin xyz="0 0 -0.03" rpy="0 0 0"/>
      <geometry><box size="0.04 0.042 0.075"/></geometry>
    </collision>
  </link>

  <link name="gripper_frame_link">
    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="1e-9"/>
      <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
    </inertial>
  </link>

  <link name="moving_jaw_so101_v1_link">
    <inertial>
      <origin xyz="-0.00157495 -0.0300244 0.0192755" rpy="0 0 0"/>
      <mass value="0.012"/>
      <inertia ixx="6.61427e-06" ixy="-3.19807e-07" ixz="-5.90717e-09" iyy="1.89032e-06" iyz="-1.09945e-07" izz="5.28738e-06"/>
    </inertial>
    <visual>
      <origin xyz="-0.002 -0.03 0.019" rpy="0 0 0"/>
      <geometry><box size="0.012 0.05 0.04"/></geometry>
      <material name="moving_jaw_so101_v1_link_mat"><color rgba="0.85 0.30 0.20 1.0"/></material>
    </visual>
    <collision>
      <origin xyz="-0.002 -0.03 0.019" rpy="0 0 0"/>
      <geometry><box size="0.012 0.05 0.04"/></geometry>
    </collision>
  </link>

  <joint name="gripper_frame_joint" type="fixed">
    <parent link="gripper_link"/>
    <child link="gripper_frame_link"/>
    <origin xyz="-0.0079 -0.000218121 -0.0981274" rpy="0 3.14159 0"/>
  </joint>

  <joint name="gripper" type="revolute">
    <parent link="gripper_link"/>
    <child link="moving_jaw_so101_v1_link"/>
    <origin xyz="0.0202 0.0188 -0.0234" rpy="1.5708 -5.24284e-08 -1.41553e-15"/>
    <axis xyz="0 0 1"/>
    <limit lower="-0.174533" upper="1.74533" effort="10" velocity="10"/>
  </joint>

  <joint name="wrist_roll" type="revolute">
    <parent link="wrist_link"/>
    <child link="gripper_link"/>
    <origin xyz="5.55112e-17 -0.0611 0.0181" rpy="1.5708 0.0486795 3.14159"/>
    <axis xyz="0 0 1"/>
    <limit lower="-2.74385" upper="2.84121" effort="10" velocity="10"/>
  </joint>

  <joint name="wrist_flex" type="revolute">
    <parent link="lower_arm_link"/>
    <child link="wrist_link"/>
    <origin xyz="-0.1349 0.0052 3.62355e-17" rpy="4.02456e-15 8.67362e-16 -1.5708"/>
    <axis xyz="0 0 1"/>
    <limit lower="-1.65806" upper="1.65806" effort="10" velocity="10"/>
  </joint>

  <joint name="elbow_flex" type="revolute">
    <parent link="upper_arm_link"/>
    <child link="lower_arm_link"/>
    <origin xyz="-0.11257 -0.028 1.73763e-16" rpy="-3.63608e-16 8.74301e-16 1.5708"/>
    <axis xyz="0 0 1"/>
    <limit lower="-1.69" upper="1.69" effort="10" velocity="10"/>
  </joint>

  <joint name="shoulder_lift" type="revolute">
    <parent link="shoulder_link"/>
    <child link="upper_arm_link"/>
    <origin xyz="-0.0303992 -0.0182778 -0.0542" rpy="-1.5708 -1.5708 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-1.74533" upper="1.74533" effort="10" velocity="10"/>
  </joint>

  <joint name="shoulder_pan" type="revolute">
    <parent link="base_link"/>
    <child link="shoulder_link"/>
    <origin xyz="0.0388353 -8.97657e-09 0.0624" rpy="3.14159 4.18253e-17 -3.14159"/>
    <axis xyz="0 0 1"/>
    <limit lower="-1.91986" upper="1.91986" effort="10" velocity="10"/>
  </joint>
</robot>