pepijn223 HF Staff commited on
Commit
2e738fc
·
1 Parent(s): eeeaa65

add URDF assets to public/, fix OpenArm DAE materials, fix lint errors

Browse files
Files changed (46) hide show
  1. .gitignore +2 -1
  2. public/urdf/openarm/assets/body_link0.dae +3 -0
  3. public/urdf/openarm/assets/body_link0.stl +3 -0
  4. public/urdf/openarm/assets/finger.dae +3 -0
  5. public/urdf/openarm/assets/finger.stl +3 -0
  6. public/urdf/openarm/assets/hand.dae +3 -0
  7. public/urdf/openarm/assets/hand.stl +3 -0
  8. public/urdf/openarm/assets/link0.dae +3 -0
  9. public/urdf/openarm/assets/link0.stl +3 -0
  10. public/urdf/openarm/assets/link1.dae +3 -0
  11. public/urdf/openarm/assets/link1.stl +3 -0
  12. public/urdf/openarm/assets/link2.dae +3 -0
  13. public/urdf/openarm/assets/link2.stl +3 -0
  14. public/urdf/openarm/assets/link3.dae +3 -0
  15. public/urdf/openarm/assets/link3.stl +3 -0
  16. public/urdf/openarm/assets/link4.dae +3 -0
  17. public/urdf/openarm/assets/link4.stl +3 -0
  18. public/urdf/openarm/assets/link5.dae +3 -0
  19. public/urdf/openarm/assets/link5.stl +3 -0
  20. public/urdf/openarm/assets/link6.dae +3 -0
  21. public/urdf/openarm/assets/link6.stl +3 -0
  22. public/urdf/openarm/assets/link7.dae +3 -0
  23. public/urdf/openarm/assets/link7.stl +3 -0
  24. public/urdf/openarm/openarm_bimanual.urdf +495 -0
  25. public/urdf/so101/assets/base_motor_holder_so101_v1.stl +3 -0
  26. public/urdf/so101/assets/base_so101_v2.stl +3 -0
  27. public/urdf/so101/assets/motor_holder_so101_base_v1.stl +3 -0
  28. public/urdf/so101/assets/motor_holder_so101_wrist_v1.stl +3 -0
  29. public/urdf/so101/assets/moving_jaw_so101_v1.stl +3 -0
  30. public/urdf/so101/assets/rotation_pitch_so101_v1.stl +3 -0
  31. public/urdf/so101/assets/sts3215_03a_no_horn_v1.stl +3 -0
  32. public/urdf/so101/assets/sts3215_03a_v1.stl +3 -0
  33. public/urdf/so101/assets/under_arm_so101_v1.stl +3 -0
  34. public/urdf/so101/assets/upper_arm_so101_v1.stl +3 -0
  35. public/urdf/so101/assets/waveshare_mounting_plate_so101_v2.stl +3 -0
  36. public/urdf/so101/assets/wrist_roll_follower_so101_v1.stl +3 -0
  37. public/urdf/so101/assets/wrist_roll_pitch_so101_v2.stl +3 -0
  38. public/urdf/so101/so100.urdf +406 -0
  39. public/urdf/so101/so101_new_calib.urdf +453 -0
  40. src/app/[org]/[dataset]/[episode]/episode-viewer.tsx +1 -4
  41. src/app/[org]/[dataset]/[episode]/fetch-data.ts +0 -14
  42. src/components/action-insights-panel.tsx +13 -13
  43. src/components/data-recharts.tsx +1 -1
  44. src/components/filtering-panel.tsx +0 -2
  45. src/components/stats-panel.tsx +1 -6
  46. src/components/urdf-viewer.tsx +5 -5
.gitignore CHANGED
@@ -16,7 +16,8 @@
16
  # next.js
17
  /.next/
18
  /out/
19
- /public
 
20
 
21
  # production
22
  /build
 
16
  # next.js
17
  /.next/
18
  /out/
19
+ /public/*
20
+ !/public/urdf/
21
 
22
  # production
23
  /build
public/urdf/openarm/assets/body_link0.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a05f59379dcf694e5ff336b1ee3a47ea504a2425a2fa774af1b14e096d9a239a
3
+ size 10783948
public/urdf/openarm/assets/body_link0.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7ab0afa9a26bebbf5c6149894c41d96622caa649555ae7c5f0f2548f86148d91
3
+ size 7955034
public/urdf/openarm/assets/finger.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:64492f6a80a551a7a53e3f769facc42ee4a9bce1634ff63300a9d7f5b3628cb0
3
+ size 6021838
public/urdf/openarm/assets/finger.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:25c115c7c55a422f30ad11581dc21576dc8fc4e09e659890772d86fe82ec04d7
3
+ size 432484
public/urdf/openarm/assets/hand.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a7a1ff18be1b603544f36645b50e9842ee1ea94d1ba8cbccdeded50946f4bce7
3
+ size 1549205
public/urdf/openarm/assets/hand.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8e5d373ebbd3fd001b506058644062ad71a68f1ced5ca5d5ed0f6de20137956b
3
+ size 18284
public/urdf/openarm/assets/link0.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:29037f2e51d6b34dbbdbd1eecb557abd900aa1897be4d4a30a7114e649f987b9
3
+ size 5356744
public/urdf/openarm/assets/link0.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c77bdc9419947088e1dfc452e29c6092cc7b02b239ff4f2f5be3d77e393af185
3
+ size 4148234
public/urdf/openarm/assets/link1.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c25937f901a4c15730927e08bf5fd26a072e801c529f0bd9678ba9758330647d
3
+ size 7655919
public/urdf/openarm/assets/link1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2a182c7fd4d25226aff6d9e2dd9d1008a85fce7df8e16525722a5c5053f8b055
3
+ size 5741534
public/urdf/openarm/assets/link2.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5d2a1ec857a22eaa180034e2dcd989c54611abab6ce6659eb4999570c34cc124
3
+ size 6288652
public/urdf/openarm/assets/link2.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:de1b190a56c16dea14546fb8e22c86eccabc2ca5e054819630c1932592381745
3
+ size 4543534
public/urdf/openarm/assets/link3.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:97d73c4bae3f3f7570bf3e28306da719aa99a6bec662060c9e358e5625b11cce
3
+ size 6846210
public/urdf/openarm/assets/link3.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8d47d75d0c47a65021708ba63cb73162bf7c3b1d14e9cfc70dfa47336034ac76
3
+ size 4978834
public/urdf/openarm/assets/link4.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:59eb1cbf44b1250ad9533176b30084179f9164fcb998ee2623d89b48968ec426
3
+ size 6644484
public/urdf/openarm/assets/link4.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8ca8149f2ce8b1b102270ec0b1a4b75c3e6f98c09b084430a450adce808607e1
3
+ size 4944684
public/urdf/openarm/assets/link5.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:96fd3516df16a772a84c268529e5b53b05e6df07da6ccfe850bc091eba947156
3
+ size 9034473
public/urdf/openarm/assets/link5.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:30ea7abfdd3661b315f897bb82a5f34fd966357b358e890e155e928e931ea975
3
+ size 6322984
public/urdf/openarm/assets/link6.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:adcd37741f4e223bd6fe9925625e84191b525c9d27f151f9178b23989de05459
3
+ size 6133097
public/urdf/openarm/assets/link6.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e49f91279f109baecb9ff54f5041eeb4514f757ba6daa65c3ea01fb1991967e4
3
+ size 4818434
public/urdf/openarm/assets/link7.dae ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e0e1d59b1e09c5a73198cdf175dbb94844073ec067d4b491dcab8a9e1a7faade
3
+ size 6288812
public/urdf/openarm/assets/link7.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a91593b67d2dec16d1dfb6f1305df3ddcd214cdef02e97d5aba30bc633e775b2
3
+ size 5114784
public/urdf/openarm/openarm_bimanual.urdf ADDED
@@ -0,0 +1,495 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version='1.0' encoding='utf-8'?>
2
+ <robot name="openarm">
3
+ <link name="world" />
4
+ <joint name="openarm_body_world_joint" type="fixed">
5
+ <parent link="world" />
6
+ <child link="openarm_body_link0" />
7
+ <origin rpy="0 0 0" xyz="0 0 0" />
8
+ </joint>
9
+ <link name="openarm_body_link0">
10
+ <visual name="openarm_body_link0_visual">
11
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.0" />
12
+ <geometry>
13
+ <mesh filename="assets/body_link0.dae" scale="0.001 0.001 0.001" />
14
+ </geometry>
15
+ </visual>
16
+ <collision name="openarm_body_link0_collision">
17
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.0" />
18
+ <geometry>
19
+ <mesh filename="assets/body_link0.dae" scale="0.001 0.001 0.001" />
20
+ </geometry>
21
+ </collision>
22
+ <inertial>
23
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.0" />
24
+ <mass value="13.89" />
25
+ <inertia ixx="1.653" ixy="0.0" ixz="0.0" iyy="1.653" iyz="0.0" izz="0.051" />
26
+ </inertial>
27
+ </link>
28
+
29
+ <!-- ═══ LEFT ARM ═══ -->
30
+ <joint name="openarm_left_openarm_body_link0_joint" type="fixed">
31
+ <parent link="openarm_body_link0" />
32
+ <child link="openarm_left_link0" />
33
+ <origin rpy="-1.5708 0 0" xyz="0.0 0.031 0.698" />
34
+ </joint>
35
+ <link name="openarm_left_link0">
36
+ <visual name="openarm_left_link0_visual">
37
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.0" />
38
+ <geometry>
39
+ <mesh filename="assets/link0.dae" scale="0.001 -0.001 0.001" />
40
+ </geometry>
41
+ </visual>
42
+ <inertial>
43
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0009483362816297526 -0.0001580207020448382 0.03076860287587199" />
44
+ <mass value="1.1432284943239561" />
45
+ <inertia ixx="0.001128" ixy="-4e-06" ixz="-3.3e-05" iyy="0.000962" iyz="-7e-06" izz="0.00147" />
46
+ </inertial>
47
+ </link>
48
+ <link name="openarm_left_link1">
49
+ <visual name="openarm_left_link1_visual">
50
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0 0.0 -0.0625" />
51
+ <geometry>
52
+ <mesh filename="assets/link1.dae" scale="0.001 -0.001 0.001" />
53
+ </geometry>
54
+ </visual>
55
+ <inertial>
56
+ <origin rpy="0.0 0.0 0.0" xyz="0.0011467657911800769 -3.319987657026362e-05 0.05395284380736254" />
57
+ <mass value="1.1416684646202298" />
58
+ <inertia ixx="0.001567" ixy="-1e-06" ixz="-2.9e-05" iyy="0.001273" iyz="1e-06" izz="0.001016" />
59
+ </inertial>
60
+ </link>
61
+ <joint name="openarm_left_joint1" type="revolute">
62
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0625" />
63
+ <parent link="openarm_left_link0" />
64
+ <child link="openarm_left_link1" />
65
+ <axis xyz="0 0 1" />
66
+ <limit effort="40" lower="-3.490659" upper="1.3962629999999998" velocity="16.754666" />
67
+ </joint>
68
+ <link name="openarm_left_link2">
69
+ <visual name="openarm_left_link2_visual">
70
+ <origin rpy="0.0 0.0 0.0" xyz="0.0301 0.0 -0.1225" />
71
+ <geometry>
72
+ <mesh filename="assets/link2.dae" scale="0.001 -0.001 0.001" />
73
+ </geometry>
74
+ </visual>
75
+ <inertial>
76
+ <origin rpy="0.0 0.0 0.0" xyz="0.00839629182351943 2.0145102027597523e-08 0.03256649300522363" />
77
+ <mass value="0.2775092746011571" />
78
+ <inertia ixx="0.000359" ixy="1e-06" ixz="-0.000109" iyy="0.000376" iyz="1e-06" izz="0.000232" />
79
+ </inertial>
80
+ </link>
81
+ <joint name="openarm_left_joint2" type="revolute">
82
+ <origin rpy="-1.57079632679 0 0" xyz="-0.0301 0.0 0.06" />
83
+ <parent link="openarm_left_link1" />
84
+ <child link="openarm_left_link2" />
85
+ <axis xyz="-1 0 0" />
86
+ <limit effort="40" lower="-3.3161253267948965" upper="0.17453267320510335" velocity="16.754666" />
87
+ </joint>
88
+ <link name="openarm_left_link3">
89
+ <visual name="openarm_left_link3_visual">
90
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0 -0.0 -0.18875" />
91
+ <geometry>
92
+ <mesh filename="assets/link3.dae" scale="0.001 -0.001 0.001" />
93
+ </geometry>
94
+ </visual>
95
+ <inertial>
96
+ <origin rpy="0.0 0.0 0.0" xyz="-0.002104752099628911 -0.0005549085042607548 0.09047470545721961" />
97
+ <mass value="1.073863338202347" />
98
+ <inertia ixx="0.004372" ixy="1e-06" ixz="1.1e-05" iyy="0.004319" iyz="-3.6e-05" izz="0.000661" />
99
+ </inertial>
100
+ </link>
101
+ <joint name="openarm_left_joint3" type="revolute">
102
+ <origin rpy="0 0 0" xyz="0.0301 0.0 0.06625" />
103
+ <parent link="openarm_left_link2" />
104
+ <child link="openarm_left_link3" />
105
+ <axis xyz="0 0 1" />
106
+ <limit effort="27" lower="-1.570796" upper="1.570796" velocity="5.445426" />
107
+ </joint>
108
+ <link name="openarm_left_link4">
109
+ <visual name="openarm_left_link4_visual">
110
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 -0.0315 -0.3425" />
111
+ <geometry>
112
+ <mesh filename="assets/link4.dae" scale="0.001 0.001 0.001" />
113
+ </geometry>
114
+ </visual>
115
+ <inertial>
116
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0029006831074562967 -0.03030575826634669 0.06339637422196209" />
117
+ <mass value="0.6348534566833373" />
118
+ <inertia ixx="0.000623" ixy="-1e-06" ixz="-1.9e-05" iyy="0.000511" iyz="3.8e-05" izz="0.000334" />
119
+ </inertial>
120
+ </link>
121
+ <joint name="openarm_left_joint4" type="revolute">
122
+ <origin rpy="0 0 0" xyz="-0.0 0.0315 0.15375" />
123
+ <parent link="openarm_left_link3" />
124
+ <child link="openarm_left_link4" />
125
+ <axis xyz="0 1 0" />
126
+ <limit effort="27" lower="0.0" upper="2.443461" velocity="5.445426" />
127
+ </joint>
128
+ <link name="openarm_left_link5">
129
+ <visual name="openarm_left_link5_visual">
130
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0 -0.0 -0.438" />
131
+ <geometry>
132
+ <mesh filename="assets/link5.dae" scale="0.001 -0.001 0.001" />
133
+ </geometry>
134
+ </visual>
135
+ <inertial>
136
+ <origin rpy="0.0 0.0 0.0" xyz="-0.003049665024221911 -0.0008866902457326625 0.043079803024980934" />
137
+ <mass value="0.6156588026168502" />
138
+ <inertia ixx="0.000423" ixy="-8e-06" ixz="6e-06" iyy="0.000445" iyz="-6e-06" izz="0.000324" />
139
+ </inertial>
140
+ </link>
141
+ <joint name="openarm_left_joint5" type="revolute">
142
+ <origin rpy="0 0 0" xyz="0.0 -0.0315 0.0955" />
143
+ <parent link="openarm_left_link4" />
144
+ <child link="openarm_left_link5" />
145
+ <axis xyz="0 0 1" />
146
+ <limit effort="7" lower="-1.570796" upper="1.570796" velocity="20.943946" />
147
+ </joint>
148
+ <link name="openarm_left_link6">
149
+ <visual name="openarm_left_link6_visual">
150
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0375 -0.0 -0.5585" />
151
+ <geometry>
152
+ <mesh filename="assets/link6.dae" scale="0.001 -0.001 0.001" />
153
+ </geometry>
154
+ </visual>
155
+ <inertial>
156
+ <origin rpy="0.0 0.0 0.0" xyz="-0.037136587005447405 -0.00033230528343419053 -9.498374522309838e-05" />
157
+ <mass value="0.475202773187987" />
158
+ <inertia ixx="0.000143" ixy="1e-06" ixz="1e-06" iyy="0.000157" iyz="1e-06" izz="0.000159" />
159
+ </inertial>
160
+ </link>
161
+ <joint name="openarm_left_joint6" type="revolute">
162
+ <origin rpy="0 0 0" xyz="0.0375 0.0 0.1205" />
163
+ <parent link="openarm_left_link5" />
164
+ <child link="openarm_left_link6" />
165
+ <axis xyz="1 0 0" />
166
+ <limit effort="7" lower="-0.785398" upper="0.785398" velocity="20.943946" />
167
+ </joint>
168
+ <link name="openarm_left_link7">
169
+ <visual name="openarm_left_link7_visual">
170
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 -0.0 -0.5585" />
171
+ <geometry>
172
+ <mesh filename="assets/link7.dae" scale="0.001 -0.001 0.001" />
173
+ </geometry>
174
+ </visual>
175
+ <inertial>
176
+ <origin rpy="0.0 0.0 0.0" xyz="6.875510271106056e-05 -0.01266175250761268 0.06951945409987448" />
177
+ <mass value="0.4659771327380578" />
178
+ <inertia ixx="0.000639" ixy="1e-06" ixz="1e-06" iyy="0.000497" iyz="8.9e-05" izz="0.000342" />
179
+ </inertial>
180
+ </link>
181
+ <joint name="openarm_left_joint7" type="revolute">
182
+ <origin rpy="0 0 0" xyz="-0.0375 0.0 0.0" />
183
+ <parent link="openarm_left_link6" />
184
+ <child link="openarm_left_link7" />
185
+ <axis xyz="0 -1 0" />
186
+ <limit effort="7" lower="-1.570796" upper="1.570796" velocity="20.943946" />
187
+ </joint>
188
+
189
+ <!-- Left hand -->
190
+ <link name="openarm_left_hand">
191
+ <visual name="openarm_left_hand_visual">
192
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 -0.6585" />
193
+ <geometry>
194
+ <mesh filename="assets/hand.dae" scale="0.001 0.001 0.001" />
195
+ </geometry>
196
+ </visual>
197
+ <inertial>
198
+ <origin rpy="0 0 0" xyz="0.0 0.002 0.03" />
199
+ <mass value="0.35" />
200
+ <inertia ixx="0.0002473" ixy="1e-06" ixz="1e-06" iyy="1.763e-05" iyz="1e-06" izz="0.0002521" />
201
+ </inertial>
202
+ </link>
203
+ <joint name="left_openarm_hand_joint" type="fixed">
204
+ <parent link="openarm_left_link7" />
205
+ <child link="openarm_left_hand" />
206
+ <origin rpy="0 0 0" xyz="0 -0.0 0.1001" />
207
+ </joint>
208
+ <link name="openarm_left_hand_tcp">
209
+ <inertial>
210
+ <origin xyz="0 0 0" rpy="0 0 0" />
211
+ <mass value="0.001" />
212
+ <inertia ixx="0.000001" ixy="0.0" ixz="0.0" iyy="0.000001" iyz="0.0" izz="0.000001" />
213
+ </inertial>
214
+ </link>
215
+ <joint name="openarm_left_hand_tcp_joint" type="fixed">
216
+ <origin rpy="0 0 0" xyz="0 -0.0 0.08" />
217
+ <parent link="openarm_left_hand" />
218
+ <child link="openarm_left_hand_tcp" />
219
+ </joint>
220
+ <link name="openarm_left_left_finger">
221
+ <visual name="openarm_left_left_finger_visual">
222
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 -0.05 -0.673001" />
223
+ <geometry>
224
+ <mesh filename="assets/finger.dae" scale="0.001 0.001 0.001" />
225
+ </geometry>
226
+ </visual>
227
+ <inertial>
228
+ <origin rpy="0 0 0" xyz="0.0064528 0.01702 0.0219685" />
229
+ <mass value="0.03602545343277134" />
230
+ <inertia ixx="2.3749999999999997e-06" ixy="1e-06" ixz="1e-06" iyy="2.3749999999999997e-06" iyz="1e-06" izz="7.5e-07" />
231
+ </inertial>
232
+ </link>
233
+ <link name="openarm_left_right_finger">
234
+ <visual name="openarm_left_right_finger_visual">
235
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.05 -0.673001" />
236
+ <geometry>
237
+ <mesh filename="assets/finger.dae" scale="0.001 -0.001 0.001" />
238
+ </geometry>
239
+ </visual>
240
+ <inertial>
241
+ <origin rpy="0 0 0" xyz="0.0064528 -0.01702 0.0219685" />
242
+ <mass value="0.03602545343277134" />
243
+ <inertia ixx="2.3749999999999997e-06" ixy="1e-06" ixz="1e-06" iyy="2.3749999999999997e-06" iyz="1e-06" izz="7.5e-07" />
244
+ </inertial>
245
+ </link>
246
+ <joint name="openarm_left_finger_joint1" type="prismatic">
247
+ <parent link="openarm_left_hand" />
248
+ <child link="openarm_left_right_finger" />
249
+ <origin rpy="0 0 0" xyz="0 -0.006 0.015" />
250
+ <axis xyz="0 -1 0" />
251
+ <limit effort="333" lower="0.0" upper="0.044" velocity="10.0" />
252
+ </joint>
253
+ <joint name="openarm_left_finger_joint2" type="prismatic">
254
+ <parent link="openarm_left_hand" />
255
+ <child link="openarm_left_left_finger" />
256
+ <origin rpy="0 0 0" xyz="0 0.006 0.015" />
257
+ <axis xyz="0 1 0" />
258
+ <limit effort="333" lower="0.0" upper="0.044" velocity="10.0" />
259
+ <mimic joint="openarm_left_finger_joint1" />
260
+ </joint>
261
+
262
+ <!-- ═══ RIGHT ARM ═══ -->
263
+ <joint name="openarm_right_openarm_body_link0_joint" type="fixed">
264
+ <parent link="openarm_body_link0" />
265
+ <child link="openarm_right_link0" />
266
+ <origin rpy="1.5708 0 0" xyz="0.0 -0.031 0.698" />
267
+ </joint>
268
+ <link name="openarm_right_link0">
269
+ <visual name="openarm_right_link0_visual">
270
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.0" />
271
+ <geometry>
272
+ <mesh filename="assets/link0.dae" scale="0.001 0.001 0.001" />
273
+ </geometry>
274
+ </visual>
275
+ <inertial>
276
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0009483362816297526 0.0001580207020448382 0.03076860287587199" />
277
+ <mass value="1.1432284943239561" />
278
+ <inertia ixx="0.001128" ixy="-4e-06" ixz="-3.3e-05" iyy="0.000962" iyz="-7e-06" izz="0.00147" />
279
+ </inertial>
280
+ </link>
281
+ <link name="openarm_right_link1">
282
+ <visual name="openarm_right_link1_visual">
283
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0 0.0 -0.0625" />
284
+ <geometry>
285
+ <mesh filename="assets/link1.dae" scale="0.001 0.001 0.001" />
286
+ </geometry>
287
+ </visual>
288
+ <inertial>
289
+ <origin rpy="0.0 0.0 0.0" xyz="0.0011467657911800769 3.319987657026362e-05 0.05395284380736254" />
290
+ <mass value="1.1416684646202298" />
291
+ <inertia ixx="0.001567" ixy="-1e-06" ixz="-2.9e-05" iyy="0.001273" iyz="1e-06" izz="0.001016" />
292
+ </inertial>
293
+ </link>
294
+ <joint name="openarm_right_joint1" type="revolute">
295
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0625" />
296
+ <parent link="openarm_right_link0" />
297
+ <child link="openarm_right_link1" />
298
+ <axis xyz="0 0 1" />
299
+ <limit effort="40" lower="-1.396263" upper="3.490659" velocity="16.754666" />
300
+ </joint>
301
+ <link name="openarm_right_link2">
302
+ <visual name="openarm_right_link2_visual">
303
+ <origin rpy="0.0 0.0 0.0" xyz="0.0301 0.0 -0.1225" />
304
+ <geometry>
305
+ <mesh filename="assets/link2.dae" scale="0.001 0.001 0.001" />
306
+ </geometry>
307
+ </visual>
308
+ <inertial>
309
+ <origin rpy="0.0 0.0 0.0" xyz="0.00839629182351943 -2.0145102027597523e-08 0.03256649300522363" />
310
+ <mass value="0.2775092746011571" />
311
+ <inertia ixx="0.000359" ixy="1e-06" ixz="-0.000109" iyy="0.000376" iyz="1e-06" izz="0.000232" />
312
+ </inertial>
313
+ </link>
314
+ <joint name="openarm_right_joint2" type="revolute">
315
+ <origin rpy="1.57079632679 0 0" xyz="-0.0301 0.0 0.06" />
316
+ <parent link="openarm_right_link1" />
317
+ <child link="openarm_right_link2" />
318
+ <axis xyz="-1 0 0" />
319
+ <limit effort="40" lower="-0.17453267320510335" upper="3.3161253267948965" velocity="16.754666" />
320
+ </joint>
321
+ <link name="openarm_right_link3">
322
+ <visual name="openarm_right_link3_visual">
323
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0 -0.0 -0.18875" />
324
+ <geometry>
325
+ <mesh filename="assets/link3.dae" scale="0.001 0.001 0.001" />
326
+ </geometry>
327
+ </visual>
328
+ <inertial>
329
+ <origin rpy="0.0 0.0 0.0" xyz="-0.002104752099628911 0.0005549085042607548 0.09047470545721961" />
330
+ <mass value="1.073863338202347" />
331
+ <inertia ixx="0.004372" ixy="1e-06" ixz="1.1e-05" iyy="0.004319" iyz="-3.6e-05" izz="0.000661" />
332
+ </inertial>
333
+ </link>
334
+ <joint name="openarm_right_joint3" type="revolute">
335
+ <origin rpy="0 0 0" xyz="0.0301 0.0 0.06625" />
336
+ <parent link="openarm_right_link2" />
337
+ <child link="openarm_right_link3" />
338
+ <axis xyz="0 0 1" />
339
+ <limit effort="27" lower="-1.570796" upper="1.570796" velocity="5.445426" />
340
+ </joint>
341
+ <link name="openarm_right_link4">
342
+ <visual name="openarm_right_link4_visual">
343
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 -0.0315 -0.3425" />
344
+ <geometry>
345
+ <mesh filename="assets/link4.dae" scale="0.001 0.001 0.001" />
346
+ </geometry>
347
+ </visual>
348
+ <inertial>
349
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0029006831074562967 -0.03030575826634669 0.06339637422196209" />
350
+ <mass value="0.6348534566833373" />
351
+ <inertia ixx="0.000623" ixy="-1e-06" ixz="-1.9e-05" iyy="0.000511" iyz="3.8e-05" izz="0.000334" />
352
+ </inertial>
353
+ </link>
354
+ <joint name="openarm_right_joint4" type="revolute">
355
+ <origin rpy="0 0 0" xyz="-0.0 0.0315 0.15375" />
356
+ <parent link="openarm_right_link3" />
357
+ <child link="openarm_right_link4" />
358
+ <axis xyz="0 1 0" />
359
+ <limit effort="27" lower="0.0" upper="2.443461" velocity="5.445426" />
360
+ </joint>
361
+ <link name="openarm_right_link5">
362
+ <visual name="openarm_right_link5_visual">
363
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0 -0.0 -0.438" />
364
+ <geometry>
365
+ <mesh filename="assets/link5.dae" scale="0.001 0.001 0.001" />
366
+ </geometry>
367
+ </visual>
368
+ <inertial>
369
+ <origin rpy="0.0 0.0 0.0" xyz="-0.003049665024221911 0.0008866902457326625 0.043079803024980934" />
370
+ <mass value="0.6156588026168502" />
371
+ <inertia ixx="0.000423" ixy="-8e-06" ixz="6e-06" iyy="0.000445" iyz="-6e-06" izz="0.000324" />
372
+ </inertial>
373
+ </link>
374
+ <joint name="openarm_right_joint5" type="revolute">
375
+ <origin rpy="0 0 0" xyz="0.0 -0.0315 0.0955" />
376
+ <parent link="openarm_right_link4" />
377
+ <child link="openarm_right_link5" />
378
+ <axis xyz="0 0 1" />
379
+ <limit effort="7" lower="-1.570796" upper="1.570796" velocity="20.943946" />
380
+ </joint>
381
+ <link name="openarm_right_link6">
382
+ <visual name="openarm_right_link6_visual">
383
+ <origin rpy="0.0 0.0 0.0" xyz="-0.0375 -0.0 -0.5585" />
384
+ <geometry>
385
+ <mesh filename="assets/link6.dae" scale="0.001 0.001 0.001" />
386
+ </geometry>
387
+ </visual>
388
+ <inertial>
389
+ <origin rpy="0.0 0.0 0.0" xyz="-0.037136587005447405 0.00033230528343419053 -9.498374522309838e-05" />
390
+ <mass value="0.475202773187987" />
391
+ <inertia ixx="0.000143" ixy="1e-06" ixz="1e-06" iyy="0.000157" iyz="1e-06" izz="0.000159" />
392
+ </inertial>
393
+ </link>
394
+ <joint name="openarm_right_joint6" type="revolute">
395
+ <origin rpy="0 0 0" xyz="0.0375 0.0 0.1205" />
396
+ <parent link="openarm_right_link5" />
397
+ <child link="openarm_right_link6" />
398
+ <axis xyz="1 0 0" />
399
+ <limit effort="7" lower="-0.785398" upper="0.785398" velocity="20.943946" />
400
+ </joint>
401
+ <link name="openarm_right_link7">
402
+ <visual name="openarm_right_link7_visual">
403
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 -0.0 -0.5585" />
404
+ <geometry>
405
+ <mesh filename="assets/link7.dae" scale="0.001 0.001 0.001" />
406
+ </geometry>
407
+ </visual>
408
+ <inertial>
409
+ <origin rpy="0.0 0.0 0.0" xyz="6.875510271106056e-05 0.01266175250761268 0.06951945409987448" />
410
+ <mass value="0.4659771327380578" />
411
+ <inertia ixx="0.000639" ixy="1e-06" ixz="1e-06" iyy="0.000497" iyz="8.9e-05" izz="0.000342" />
412
+ </inertial>
413
+ </link>
414
+ <joint name="openarm_right_joint7" type="revolute">
415
+ <origin rpy="0 0 0" xyz="-0.0375 0.0 0.0" />
416
+ <parent link="openarm_right_link6" />
417
+ <child link="openarm_right_link7" />
418
+ <axis xyz="0 1 0" />
419
+ <limit effort="7" lower="-1.570796" upper="1.570796" velocity="20.943946" />
420
+ </joint>
421
+
422
+ <!-- Right hand -->
423
+ <link name="openarm_right_hand">
424
+ <visual name="openarm_right_hand_visual">
425
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 -0.6585" />
426
+ <geometry>
427
+ <mesh filename="assets/hand.dae" scale="0.001 0.001 0.001" />
428
+ </geometry>
429
+ </visual>
430
+ <inertial>
431
+ <origin rpy="0 0 0" xyz="0.0 0.002 0.03" />
432
+ <mass value="0.35" />
433
+ <inertia ixx="0.0002473" ixy="1e-06" ixz="1e-06" iyy="1.763e-05" iyz="1e-06" izz="0.0002521" />
434
+ </inertial>
435
+ </link>
436
+ <joint name="right_openarm_hand_joint" type="fixed">
437
+ <parent link="openarm_right_link7" />
438
+ <child link="openarm_right_hand" />
439
+ <origin rpy="0 0 0" xyz="0 -0.0 0.1001" />
440
+ </joint>
441
+ <link name="openarm_right_hand_tcp">
442
+ <inertial>
443
+ <origin xyz="0 0 0" rpy="0 0 0" />
444
+ <mass value="0.001" />
445
+ <inertia ixx="0.000001" ixy="0.0" ixz="0.0" iyy="0.000001" iyz="0.0" izz="0.000001" />
446
+ </inertial>
447
+ </link>
448
+ <joint name="openarm_right_hand_tcp_joint" type="fixed">
449
+ <origin rpy="0 0 0" xyz="0 -0.0 0.08" />
450
+ <parent link="openarm_right_hand" />
451
+ <child link="openarm_right_hand_tcp" />
452
+ </joint>
453
+ <link name="openarm_right_left_finger">
454
+ <visual name="openarm_right_left_finger_visual">
455
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 -0.05 -0.673001" />
456
+ <geometry>
457
+ <mesh filename="assets/finger.dae" scale="0.001 0.001 0.001" />
458
+ </geometry>
459
+ </visual>
460
+ <inertial>
461
+ <origin rpy="0 0 0" xyz="0.0064528 0.01702 0.0219685" />
462
+ <mass value="0.03602545343277134" />
463
+ <inertia ixx="2.3749999999999997e-06" ixy="1e-06" ixz="1e-06" iyy="2.3749999999999997e-06" iyz="1e-06" izz="7.5e-07" />
464
+ </inertial>
465
+ </link>
466
+ <link name="openarm_right_right_finger">
467
+ <visual name="openarm_right_right_finger_visual">
468
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.05 -0.673001" />
469
+ <geometry>
470
+ <mesh filename="assets/finger.dae" scale="0.001 -0.001 0.001" />
471
+ </geometry>
472
+ </visual>
473
+ <inertial>
474
+ <origin rpy="0 0 0" xyz="0.0064528 -0.01702 0.0219685" />
475
+ <mass value="0.03602545343277134" />
476
+ <inertia ixx="2.3749999999999997e-06" ixy="1e-06" ixz="1e-06" iyy="2.3749999999999997e-06" iyz="1e-06" izz="7.5e-07" />
477
+ </inertial>
478
+ </link>
479
+ <joint name="openarm_right_finger_joint1" type="prismatic">
480
+ <parent link="openarm_right_hand" />
481
+ <child link="openarm_right_right_finger" />
482
+ <origin rpy="0 0 0" xyz="0 -0.006 0.015" />
483
+ <axis xyz="0 -1 0" />
484
+ <limit effort="333" lower="0.0" upper="0.044" velocity="10.0" />
485
+ </joint>
486
+ <joint name="openarm_right_finger_joint2" type="prismatic">
487
+ <parent link="openarm_right_hand" />
488
+ <child link="openarm_right_left_finger" />
489
+ <origin rpy="0 0 0" xyz="0 0.006 0.015" />
490
+ <axis xyz="0 1 0" />
491
+ <limit effort="333" lower="0.0" upper="0.044" velocity="10.0" />
492
+ <mimic joint="openarm_right_finger_joint1" />
493
+ </joint>
494
+ </robot>
495
+
public/urdf/so101/assets/base_motor_holder_so101_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8cd2f241037ea377af1191fffe0dd9d9006beea6dcc48543660ed41647072424
3
+ size 1877084
public/urdf/so101/assets/base_so101_v2.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bb12b7026575e1f70ccc7240051f9d943553bf34e5128537de6cd86fae33924d
3
+ size 471584
public/urdf/so101/assets/motor_holder_so101_base_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:31242ae6fb59d8b15c66617b88ad8e9bded62d57c35d11c0c43a70d2f4caa95b
3
+ size 1129384
public/urdf/so101/assets/motor_holder_so101_wrist_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:887f92e6013cb64ea3a1ab8675e92da1e0beacfd5e001f972523540545e08011
3
+ size 1052184
public/urdf/so101/assets/moving_jaw_so101_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:785a9dded2f474bc1d869e0d3dae398a3dcd9c0c345640040472210d2861fa9d
3
+ size 1413584
public/urdf/so101/assets/rotation_pitch_so101_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9be900cc2a2bf718102841ef82ef8d2873842427648092c8ed2ca1e2ef4ffa34
3
+ size 883684
public/urdf/so101/assets/sts3215_03a_no_horn_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:75ef3781b752e4065891aea855e34dc161a38a549549cd0970cedd07eae6f887
3
+ size 865884
public/urdf/so101/assets/sts3215_03a_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a37c871fb502483ab96c256baf457d36f2e97afc9205313d9c5ab275ef941cd0
3
+ size 954084
public/urdf/so101/assets/under_arm_so101_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d01d1f2de365651dcad9d6669e94ff87ff7652b5bb2d10752a66a456a86dbc71
3
+ size 1975884
public/urdf/so101/assets/upper_arm_so101_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:475056e03a17e71919b82fd88ab9a0b898ab50164f2a7943652a6b2941bb2d4f
3
+ size 1303484
public/urdf/so101/assets/waveshare_mounting_plate_so101_v2.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e197e24005a07d01bbc06a8c42311664eaeda415bf859f68fa247884d0f1a6e9
3
+ size 62784
public/urdf/so101/assets/wrist_roll_follower_so101_v1.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4b17b410a12d64ec39554abc3e8054d8a97384b2dc4a8d95a5ecb2a93670f5f4
3
+ size 1439884
public/urdf/so101/assets/wrist_roll_pitch_so101_v2.stl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6c7ec5525b4d8b9e397a30ab4bb0037156a5d5f38a4adf2c7d943d6c56eda5ae
3
+ size 2699784
public/urdf/so101/so100.urdf ADDED
@@ -0,0 +1,406 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+
3
+ <!-- Originally Generated using onshape-to-robot -->
4
+ <!-- Onshape
5
+ https://cad.onshape.com/documents/7715cc284bb430fe6dab4ffd/w/4fd0791b683777b02f8d975a/e/826c553ede3b7592eb9ca800 -->
6
+ <robot name="so100">
7
+ <!-- Materials -->
8
+ <material name="green">
9
+ <color rgba="0.06 0.4 0.1 1.0" />
10
+ </material>
11
+ <material name="black">
12
+ <color rgba="0.1 0.1 0.1 1.0" />
13
+ </material>
14
+
15
+ <!-- World link -->
16
+ <link name="world" />
17
+
18
+ <!-- Joint from world to base -->
19
+ <joint name="world_to_base" type="fixed">
20
+ <parent link="world" />
21
+ <child link="base" />
22
+ <origin xyz="0.163038 0.168068 -0.0300817" rpy="0 0 0" />
23
+ </joint>
24
+
25
+ <!-- Link base -->
26
+ <link name="base">
27
+ <inertial>
28
+ <origin xyz="-0.14932 -0.16812 0.065966" rpy="0 0 0" />
29
+ <mass value="0.147" />
30
+ <inertia ixx="0.000114686" ixy="-4.59787e-07" ixz="4.97151e-06" iyy="0.000136117"
31
+ iyz="9.75275e-08" izz="0.000130364" />
32
+ </inertial>
33
+ <!-- Part base_motor_holder_so101_v1 -->
34
+ <visual>
35
+ <origin xyz="-0.169402 -0.168167 0.0300817" rpy="1.5708 -1.67685e-15 1.5708" />
36
+ <geometry>
37
+ <mesh filename="assets/base_motor_holder_so101_v1.stl" />
38
+ </geometry>
39
+ <material name="green" />
40
+ </visual>
41
+ <collision>
42
+ <origin xyz="-0.169402 -0.168167 0.0300817" rpy="1.5708 -1.67685e-15 1.5708" />
43
+ <geometry>
44
+ <mesh filename="assets/base_motor_holder_so101_v1.stl" />
45
+ </geometry>
46
+ </collision>
47
+ <!-- Part base_so101_v2 -->
48
+ <visual>
49
+ <origin xyz="-0.169402 -0.168068 0.0300817" rpy="1.5708 -1.6144e-15 1.5708" />
50
+ <geometry>
51
+ <mesh filename="assets/base_so101_v2.stl" />
52
+ </geometry>
53
+ <material name="green" />
54
+ </visual>
55
+ <collision>
56
+ <origin xyz="-0.169402 -0.168068 0.0300817" rpy="1.5708 -1.6144e-15 1.5708" />
57
+ <geometry>
58
+ <mesh filename="assets/base_so101_v2.stl" />
59
+ </geometry>
60
+ </collision>
61
+ <!-- Part sts3215_03a_v1 -->
62
+ <visual>
63
+ <origin xyz="-0.136702 -0.168068 0.0761817" rpy="-8.21148e-16 7.84513e-18 1.249e-15" />
64
+ <geometry>
65
+ <mesh filename="assets/sts3215_03a_v1.stl" />
66
+ </geometry>
67
+ <material name="black" />
68
+ </visual>
69
+ <collision>
70
+ <origin xyz="-0.136702 -0.168068 0.0761817" rpy="-8.21148e-16 7.84513e-18 1.249e-15" />
71
+ <geometry>
72
+ <mesh filename="assets/sts3215_03a_v1.stl" />
73
+ </geometry>
74
+ </collision>
75
+ <!-- Part waveshare_mounting_plate_so101_v2 -->
76
+ <visual>
77
+ <origin xyz="-0.19402 -0.168267 0.0798817" rpy="1.5708 -1.35493e-14 1.5708" />
78
+ <geometry>
79
+ <mesh filename="assets/waveshare_mounting_plate_so101_v2.stl" />
80
+ </geometry>
81
+ <material name="green" />
82
+ </visual>
83
+ <collision>
84
+ <origin xyz="-0.19402 -0.168267 0.0798817" rpy="1.5708 -1.35493e-14 1.5708" />
85
+ <geometry>
86
+ <mesh filename="assets/waveshare_mounting_plate_so101_v2.stl" />
87
+ </geometry>
88
+ </collision>
89
+ </link>
90
+ <!-- Frame baseframe (dummy link + fixed joint) -->
91
+ <link name="baseframe">
92
+ <origin xyz="0 0 0" rpy="0 -0 0" />
93
+ <inertial>
94
+ <origin xyz="0 0 0" rpy="0 0 0" />
95
+ <mass value="1e-9" />
96
+ <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0" />
97
+ </inertial>
98
+ </link>
99
+ <joint name="baseframe_frame" type="fixed">
100
+ <origin xyz="-0.163038 -0.168068 0.0324817" rpy="1.6144e-15 7.84513e-18 1.33799e-15" />
101
+ <parent link="base" />
102
+ <child link="baseframe" />
103
+ <axis xyz="0 0 0" />
104
+ </joint>
105
+ <!-- Link shoulder -->
106
+ <link name="shoulder">
107
+ <inertial>
108
+ <origin xyz="-0.0307604 -1.66727e-05 -0.0252713" rpy="0 0 0" />
109
+ <mass value="0.100006" />
110
+ <inertia ixx="8.3759e-05" ixy="7.55525e-08" ixz="-1.16342e-06" iyy="8.10403e-05"
111
+ iyz="1.54663e-07" izz="2.39783e-05" />
112
+ </inertial>
113
+ <!-- Part sts3215_03a_v1_2 -->
114
+ <visual>
115
+ <origin xyz="-0.0303992 0.000422241 -0.0417" rpy="1.5708 1.5708 0" />
116
+ <geometry>
117
+ <mesh filename="assets/sts3215_03a_v1.stl" />
118
+ </geometry>
119
+ <material name="black" />
120
+ </visual>
121
+ <collision>
122
+ <origin xyz="-0.0303992 0.000422241 -0.0417" rpy="1.5708 1.5708 0" />
123
+ <geometry>
124
+ <mesh filename="assets/sts3215_03a_v1.stl" />
125
+ </geometry>
126
+ </collision>
127
+ <!-- Part motor_holder_so101_base_v1 -->
128
+ <visual>
129
+ <origin xyz="-0.0675992 -0.000177759 0.0158499" rpy="1.5708 -1.5708 0" />
130
+ <geometry>
131
+ <mesh filename="assets/motor_holder_so101_base_v1.stl" />
132
+ </geometry>
133
+ <material name="green" />
134
+ </visual>
135
+ <collision>
136
+ <origin xyz="-0.0675992 -0.000177759 0.0158499" rpy="1.5708 -1.5708 0" />
137
+ <geometry>
138
+ <mesh filename="assets/motor_holder_so101_base_v1.stl" />
139
+ </geometry>
140
+ </collision>
141
+ <!-- Part rotation_pitch_so101_v1 -->
142
+ <visual>
143
+ <origin xyz="0.0122008 2.22413e-05 0.0464" rpy="-1.5708 2.35221e-33 0" />
144
+ <geometry>
145
+ <mesh filename="assets/rotation_pitch_so101_v1.stl" />
146
+ </geometry>
147
+ <material name="green" />
148
+ </visual>
149
+ <collision>
150
+ <origin xyz="0.0122008 2.22413e-05 0.0464" rpy="-1.5708 2.35221e-33 0" />
151
+ <geometry>
152
+ <mesh filename="assets/rotation_pitch_so101_v1.stl" />
153
+ </geometry>
154
+ </collision>
155
+ </link>
156
+ <!-- Link upper_arm -->
157
+ <link name="upper_arm">
158
+ <inertial>
159
+ <origin xyz="-0.0898471 -0.00838224 0.0184089" rpy="0 0 0" />
160
+ <mass value="0.103" />
161
+ <inertia ixx="4.08002e-05" ixy="-1.97819e-05" ixz="-4.03016e-08" iyy="0.000147318"
162
+ iyz="8.97326e-09" izz="0.000142487" />
163
+ </inertial>
164
+ <!-- Part sts3215_03a_v1_3 -->
165
+ <visual>
166
+ <origin xyz="-0.11257 -0.0155 0.0187" rpy="-3.14159 -5.27356e-16 -1.5708" />
167
+ <geometry>
168
+ <mesh filename="assets/sts3215_03a_v1.stl" />
169
+ </geometry>
170
+ <material name="black" />
171
+ </visual>
172
+ <collision>
173
+ <origin xyz="-0.11257 -0.0155 0.0187" rpy="-3.14159 -5.27356e-16 -1.5708" />
174
+ <geometry>
175
+ <mesh filename="assets/sts3215_03a_v1.stl" />
176
+ </geometry>
177
+ </collision>
178
+ <!-- Part upper_arm_so101_v1 -->
179
+ <visual>
180
+ <origin xyz="-0.065085 0.012 0.0182" rpy="3.14159 -0 -1.30911e-30" />
181
+ <geometry>
182
+ <mesh filename="assets/upper_arm_so101_v1.stl" />
183
+ </geometry>
184
+ <material name="green" />
185
+ </visual>
186
+ <collision>
187
+ <origin xyz="-0.065085 0.012 0.0182" rpy="3.14159 -0 -1.30911e-30" />
188
+ <geometry>
189
+ <mesh filename="assets/upper_arm_so101_v1.stl" />
190
+ </geometry>
191
+ </collision>
192
+ </link>
193
+ <!-- Link lower_arm -->
194
+ <link name="lower_arm">
195
+ <inertial>
196
+ <origin xyz="-0.0980701 0.00324376 0.0182831" rpy="0 0 0" />
197
+ <mass value="0.104" />
198
+ <inertia ixx="2.87438e-05" ixy="7.41152e-06" ixz="1.26409e-06" iyy="0.000159844"
199
+ iyz="-4.90188e-08" izz="0.00014529" />
200
+ </inertial>
201
+ <!-- Part under_arm_so101_v1 -->
202
+ <visual>
203
+ <origin xyz="-0.0648499 -0.032 0.0182" rpy="3.14159 -0 6.67202e-31" />
204
+ <geometry>
205
+ <mesh filename="assets/under_arm_so101_v1.stl" />
206
+ </geometry>
207
+ <material name="green" />
208
+ </visual>
209
+ <collision>
210
+ <origin xyz="-0.0648499 -0.032 0.0182" rpy="3.14159 -0 6.67202e-31" />
211
+ <geometry>
212
+ <mesh filename="assets/under_arm_so101_v1.stl" />
213
+ </geometry>
214
+ </collision>
215
+ <!-- Part motor_holder_so101_wrist_v1 -->
216
+ <visual>
217
+ <origin xyz="-0.0648499 -0.032 0.018" rpy="-3.14159 -2.55351e-15 -2.56146e-31" />
218
+ <geometry>
219
+ <mesh filename="assets/motor_holder_so101_wrist_v1.stl" />
220
+ </geometry>
221
+ <material name="green" />
222
+ </visual>
223
+ <collision>
224
+ <origin xyz="-0.0648499 -0.032 0.018" rpy="-3.14159 -2.55351e-15 -2.56146e-31" />
225
+ <geometry>
226
+ <mesh filename="assets/motor_holder_so101_wrist_v1.stl" />
227
+ </geometry>
228
+ </collision>
229
+ <!-- Part sts3215_03a_v1_4 -->
230
+ <visual>
231
+ <origin xyz="-0.1224 0.0052 0.0187" rpy="-3.14159 -7.88861e-31 -3.14159" />
232
+ <geometry>
233
+ <mesh filename="assets/sts3215_03a_v1.stl" />
234
+ </geometry>
235
+ <material name="black" />
236
+ </visual>
237
+ <collision>
238
+ <origin xyz="-0.1224 0.0052 0.0187" rpy="-3.14159 -7.88861e-31 -3.14159" />
239
+ <geometry>
240
+ <mesh filename="assets/sts3215_03a_v1.stl" />
241
+ </geometry>
242
+ </collision>
243
+ </link>
244
+ <!-- Link wrist -->
245
+ <link name="wrist">
246
+ <inertial>
247
+ <origin xyz="-0.000103312 -0.0386143 0.0281156" rpy="0 0 0" />
248
+ <mass value="0.079" />
249
+ <inertia ixx="3.68263e-05" ixy="1.7893e-08" ixz="-5.28128e-08" iyy="2.5391e-05"
250
+ iyz="3.6412e-06" izz="2.1e-05" />
251
+ </inertial>
252
+ <!-- Part sts3215_03a_no_horn_v1 -->
253
+ <visual>
254
+ <origin xyz="5.55112e-17 -0.0424 0.0306" rpy="1.5708 1.5708 0" />
255
+ <geometry>
256
+ <mesh filename="assets/sts3215_03a_no_horn_v1.stl" />
257
+ </geometry>
258
+ <material name="black" />
259
+ </visual>
260
+ <collision>
261
+ <origin xyz="5.55112e-17 -0.0424 0.0306" rpy="1.5708 1.5708 0" />
262
+ <geometry>
263
+ <mesh filename="assets/sts3215_03a_no_horn_v1.stl" />
264
+ </geometry>
265
+ </collision>
266
+ <!-- Part wrist_roll_pitch_so101_v2 -->
267
+ <visual>
268
+ <origin xyz="0 -0.028 0.0181" rpy="-1.5708 -1.5708 0" />
269
+ <geometry>
270
+ <mesh filename="assets/wrist_roll_pitch_so101_v2.stl" />
271
+ </geometry>
272
+ <material name="green" />
273
+ </visual>
274
+ <collision>
275
+ <origin xyz="0 -0.028 0.0181" rpy="-1.5708 -1.5708 0" />
276
+ <geometry>
277
+ <mesh filename="assets/wrist_roll_pitch_so101_v2.stl" />
278
+ </geometry>
279
+ </collision>
280
+ </link>
281
+ <!-- Link gripper -->
282
+ <link name="gripper">
283
+ <inertial>
284
+ <origin xyz="0.000213627 0.000245138 -0.025187" rpy="0 0 0" />
285
+ <mass value="0.087" />
286
+ <inertia ixx="2.75087e-05" ixy="-3.35241e-07" ixz="-5.7352e-06" iyy="4.33657e-05"
287
+ iyz="-5.17847e-08" izz="3.45059e-05" />
288
+ </inertial>
289
+ <!-- Part sts3215_03a_v1_5 -->
290
+ <visual>
291
+ <origin xyz="0.0077 0.0001 -0.0234" rpy="-1.5708 -5.19179e-17 -1.66533e-16" />
292
+ <geometry>
293
+ <mesh filename="assets/sts3215_03a_v1.stl" />
294
+ </geometry>
295
+ <material name="black" />
296
+ </visual>
297
+ <collision>
298
+ <origin xyz="0.0077 0.0001 -0.0234" rpy="-1.5708 -5.19179e-17 -1.66533e-16" />
299
+ <geometry>
300
+ <mesh filename="assets/sts3215_03a_v1.stl" />
301
+ </geometry>
302
+ </collision>
303
+ <!-- Part wrist_roll_follower_so101_v1 -->
304
+ <visual>
305
+ <origin xyz="0 -0.000218214 0.000949706" rpy="-3.14159 -5.55112e-17 0" />
306
+ <geometry>
307
+ <mesh filename="assets/wrist_roll_follower_so101_v1.stl" />
308
+ </geometry>
309
+ <material name="green" />
310
+ </visual>
311
+ <collision>
312
+ <origin xyz="0 -0.000218214 0.000949706" rpy="-3.14159 -5.55112e-17 0" />
313
+ <geometry>
314
+ <mesh filename="assets/wrist_roll_follower_so101_v1.stl" />
315
+ </geometry>
316
+ </collision>
317
+ </link>
318
+ <!-- Frame gripperframe (dummy link + fixed joint) -->
319
+ <link name="gripperframe">
320
+ <origin xyz="0 0 0" rpy="0 -0 0" />
321
+ <inertial>
322
+ <origin xyz="0 0 0" rpy="0 0 0" />
323
+ <mass value="1e-9" />
324
+ <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0" />
325
+ </inertial>
326
+ </link>
327
+ <joint name="gripperframe_frame" type="fixed">
328
+ <origin xyz="-0.0079 -0.000218121 -0.0981274" rpy="-0 1.5708 0" />
329
+ <parent link="gripper" />
330
+ <child link="gripperframe" />
331
+ <axis xyz="0 0 0" />
332
+ </joint>
333
+ <!-- Link moving_jaw_so101_v1 -->
334
+ <link name="moving_jaw_so101_v1">
335
+ <inertial>
336
+ <origin xyz="-0.00157495 -0.0300244 0.0192755" rpy="0 0 0" />
337
+ <mass value="0.012" />
338
+ <inertia ixx="6.61427e-06" ixy="-3.19807e-07" ixz="-5.90717e-09" iyy="1.89032e-06"
339
+ iyz="-1.09945e-07" izz="5.28738e-06" />
340
+ </inertial>
341
+ <!-- Part moving_jaw_so101_v1 -->
342
+ <visual>
343
+ <origin xyz="-5.55112e-17 0 0.0189" rpy="9.53145e-17 6.93889e-18 1.24077e-24" />
344
+ <geometry>
345
+ <mesh filename="assets/moving_jaw_so101_v1.stl" />
346
+ </geometry>
347
+ <material name="green" />
348
+ </visual>
349
+ <collision>
350
+ <origin xyz="-5.55112e-17 0 0.0189" rpy="9.53145e-17 6.93889e-18 1.24077e-24" />
351
+ <geometry>
352
+ <mesh filename="assets/moving_jaw_so101_v1.stl" />
353
+ </geometry>
354
+ </collision>
355
+ </link>
356
+
357
+ <!-- Joint from base to shoulder -->
358
+ <joint name="Rotation" type="revolute">
359
+ <origin xyz="-0.124202 -0.168068 0.0948817" rpy="3.14159 0 0" />
360
+ <parent link="base" />
361
+ <child link="shoulder" />
362
+ <axis xyz="0 0 1" />
363
+ <limit effort="10" velocity="10" lower="1.22014" upper="5.05986" />
364
+ </joint>
365
+ <!-- Joint from shoulder to upper_arm -->
366
+ <joint name="Pitch" type="revolute">
367
+ <origin xyz="-0.0303992 -0.0182778 -0.0542" rpy="-1.5708 1.5692 0" />
368
+ <parent link="shoulder" />
369
+ <child link="upper_arm" />
370
+ <axis xyz="0 0 1" />
371
+ <limit effort="10" velocity="10" lower="1.39467" upper="4.88692" />
372
+ </joint>
373
+ <!-- Joint from upper_arm to lower_arm -->
374
+ <joint name="Elbow" type="revolute">
375
+ <origin xyz="-0.11257 -0.028 2.09886e-16" rpy="0 0 4.71239" />
376
+ <parent link="upper_arm" />
377
+ <child link="lower_arm" />
378
+ <axis xyz="0 0 1" />
379
+ <limit effort="10" velocity="10" lower="1.39626" upper="4.71239" />
380
+ </joint>
381
+ <!-- Joint from lower_arm to wrist -->
382
+ <joint name="Wrist_Pitch" type="revolute">
383
+ <origin xyz="-0.1349 0.0052 8.44651e-17" rpy="0 0 1.57079" />
384
+ <parent link="lower_arm" />
385
+ <child link="wrist" />
386
+ <axis xyz="0 0 1" />
387
+ <limit effort="10" velocity="10" lower="1.48353" upper="4.79965" />
388
+ </joint>
389
+ <!-- Joint from wrist to gripper -->
390
+ <joint name="Wrist_Roll" type="revolute">
391
+ <origin xyz="2.77556e-16 -0.0611 0.0181" rpy="1.5708 3.1902695 3.14159" />
392
+ <parent link="wrist" />
393
+ <child link="gripper" />
394
+ <axis xyz="0 0 1" />
395
+ <limit effort="10" velocity="10" lower="0.39774" upper="5.9828" />
396
+ </joint>
397
+ <!-- Joint from gripper to moving_jaw_so101_v1 -->
398
+ <joint name="Jaw" type="revolute">
399
+ <origin xyz="0.0202 0.0188 -0.0234" rpy="1.5708 3.315 0" />
400
+ <parent link="gripper" />
401
+ <child link="moving_jaw_so101_v1" />
402
+ <axis xyz="0 0 1" />
403
+ <limit effort="10" velocity="10" lower="3.14" upper="4.88692" />
404
+ </joint>
405
+ </robot>
406
+
public/urdf/so101/so101_new_calib.urdf ADDED
@@ -0,0 +1,453 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generated using onshape-to-robot -->
3
+ <!-- Onshape https://cad.onshape.com/documents/7715cc284bb430fe6dab4ffd/w/4fd0791b683777b02f8d975a/e/826c553ede3b7592eb9ca800 -->
4
+ <robot name="so101_new_calib">
5
+
6
+ <!-- Materials -->
7
+ <material name="3d_printed">
8
+ <color rgba="1.0 0.82 0.12 1.0"/>
9
+ </material>
10
+ <material name="sts3215">
11
+ <color rgba="0.1 0.1 0.1 1.0"/>
12
+ </material>
13
+
14
+ <!-- Link base -->
15
+ <link name="base_link">
16
+ <inertial>
17
+ <origin xyz="0.0137179 -5.19711e-05 0.0334843" rpy="0 0 0"/>
18
+ <mass value="0.147"/>
19
+ <inertia ixx="0.000114686" ixy="-4.59787e-07" ixz="4.97151e-06" iyy="0.000136117" iyz="9.75275e-08" izz="0.000130364"/>
20
+ </inertial>
21
+ <!-- Part base_motor_holder_so101_v1 -->
22
+ <visual>
23
+ <origin xyz="-0.00636471 -9.94414e-05 -0.0024" rpy="1.5708 -1.67685e-15 1.5708"/>
24
+ <geometry>
25
+ <mesh filename="assets/base_motor_holder_so101_v1.stl"/>
26
+ </geometry>
27
+ <material name="3d_printed"/>
28
+ </visual>
29
+ <collision>
30
+ <origin xyz="-0.00636471 -9.94414e-05 -0.0024" rpy="1.5708 -1.67685e-15 1.5708"/>
31
+ <geometry>
32
+ <mesh filename="assets/base_motor_holder_so101_v1.stl"/>
33
+ </geometry>
34
+ </collision>
35
+ <!-- Part base_so101_v2 -->
36
+ <visual>
37
+ <origin xyz="-0.00636471 -8.97657e-09 -0.0024" rpy="1.5708 -2.78073e-29 1.5708"/>
38
+ <geometry>
39
+ <mesh filename="assets/base_so101_v2.stl"/>
40
+ </geometry>
41
+ <material name="3d_printed"/>
42
+ </visual>
43
+ <collision>
44
+ <origin xyz="-0.00636471 -8.97657e-09 -0.0024" rpy="1.5708 -2.78073e-29 1.5708"/>
45
+ <geometry>
46
+ <mesh filename="assets/base_so101_v2.stl"/>
47
+ </geometry>
48
+ </collision>
49
+ <!-- Part sts3215_03a_v1 -->
50
+ <visual>
51
+ <origin xyz="0.0263353 -8.97657e-09 0.0437" rpy="-8.21148e-16 7.84513e-18 1.249e-15"/>
52
+ <geometry>
53
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
54
+ </geometry>
55
+ <material name="sts3215"/>
56
+ </visual>
57
+ <collision>
58
+ <origin xyz="0.0263353 -8.97657e-09 0.0437" rpy="-8.21148e-16 7.84513e-18 1.249e-15"/>
59
+ <geometry>
60
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
61
+ </geometry>
62
+ </collision>
63
+ <!-- Part waveshare_mounting_plate_so101_v2 -->
64
+ <visual>
65
+ <origin xyz="-0.0309827 -0.000199441 0.0474" rpy="1.5708 -1.35493e-14 1.5708"/>
66
+ <geometry>
67
+ <mesh filename="assets/waveshare_mounting_plate_so101_v2.stl"/>
68
+ </geometry>
69
+ <material name="3d_printed"/>
70
+ </visual>
71
+ <collision>
72
+ <origin xyz="-0.0309827 -0.000199441 0.0474" rpy="1.5708 -1.35493e-14 1.5708"/>
73
+ <geometry>
74
+ <mesh filename="assets/waveshare_mounting_plate_so101_v2.stl"/>
75
+ </geometry>
76
+ </collision>
77
+ </link>
78
+
79
+ <!-- Link shoulder -->
80
+ <link name="shoulder_link">
81
+ <inertial>
82
+ <origin xyz="-0.0307604 -1.66727e-05 -0.0252713" rpy="0 0 0"/>
83
+ <mass value="0.100006"/>
84
+ <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"/>
85
+ </inertial>
86
+ <!-- Part sts3215_03a_v1_2 -->
87
+ <visual>
88
+ <origin xyz="-0.0303992 0.000422241 -0.0417" rpy="1.5708 1.5708 0"/>
89
+ <geometry>
90
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
91
+ </geometry>
92
+ <material name="sts3215"/>
93
+ </visual>
94
+ <collision>
95
+ <origin xyz="-0.0303992 0.000422241 -0.0417" rpy="1.5708 1.5708 0"/>
96
+ <geometry>
97
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
98
+ </geometry>
99
+ </collision>
100
+ <!-- Part motor_holder_so101_base_v1 -->
101
+ <visual>
102
+ <origin xyz="-0.0675992 -0.000177759 0.0158499" rpy="1.5708 -1.5708 0"/>
103
+ <geometry>
104
+ <mesh filename="assets/motor_holder_so101_base_v1.stl"/>
105
+ </geometry>
106
+ <material name="3d_printed"/>
107
+ </visual>
108
+ <collision>
109
+ <origin xyz="-0.0675992 -0.000177759 0.0158499" rpy="1.5708 -1.5708 0"/>
110
+ <geometry>
111
+ <mesh filename="assets/motor_holder_so101_base_v1.stl"/>
112
+ </geometry>
113
+ </collision>
114
+ <!-- Part rotation_pitch_so101_v1 -->
115
+ <visual>
116
+ <origin xyz="0.0122008 2.22413e-05 0.0464" rpy="-1.5708 2.35221e-33 0"/>
117
+ <geometry>
118
+ <mesh filename="assets/rotation_pitch_so101_v1.stl"/>
119
+ </geometry>
120
+ <material name="3d_printed"/>
121
+ </visual>
122
+ <collision>
123
+ <origin xyz="0.0122008 2.22413e-05 0.0464" rpy="-1.5708 2.35221e-33 0"/>
124
+ <geometry>
125
+ <mesh filename="assets/rotation_pitch_so101_v1.stl"/>
126
+ </geometry>
127
+ </collision>
128
+ </link>
129
+
130
+ <!-- Link upper_arm -->
131
+ <link name="upper_arm_link">
132
+ <inertial>
133
+ <origin xyz="-0.0898471 -0.00838224 0.0184089" rpy="0 0 0"/>
134
+ <mass value="0.103"/>
135
+ <inertia ixx="4.08002e-05" ixy="-1.97819e-05" ixz="-4.03016e-08" iyy="0.000147318" iyz="8.97326e-09" izz="0.000142487"/>
136
+ </inertial>
137
+ <!-- Part sts3215_03a_v1_3 -->
138
+ <visual>
139
+ <origin xyz="-0.11257 -0.0155 0.0187" rpy="-3.14159 -5.27356e-16 -1.5708"/>
140
+ <geometry>
141
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
142
+ </geometry>
143
+ <material name="sts3215"/>
144
+ </visual>
145
+ <collision>
146
+ <origin xyz="-0.11257 -0.0155 0.0187" rpy="-3.14159 -5.27356e-16 -1.5708"/>
147
+ <geometry>
148
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
149
+ </geometry>
150
+ </collision>
151
+ <!-- Part upper_arm_so101_v1 -->
152
+ <visual>
153
+ <origin xyz="-0.065085 0.012 0.0182" rpy="3.14159 -0 -1.30911e-30"/>
154
+ <geometry>
155
+ <mesh filename="assets/upper_arm_so101_v1.stl"/>
156
+ </geometry>
157
+ <material name="3d_printed"/>
158
+ </visual>
159
+ <collision>
160
+ <origin xyz="-0.065085 0.012 0.0182" rpy="3.14159 -0 -1.30911e-30"/>
161
+ <geometry>
162
+ <mesh filename="assets/upper_arm_so101_v1.stl"/>
163
+ </geometry>
164
+ </collision>
165
+ </link>
166
+
167
+ <!-- Link lower_arm -->
168
+ <link name="lower_arm_link">
169
+ <inertial>
170
+ <origin xyz="-0.0980701 0.00324376 0.0182831" rpy="0 0 0"/>
171
+ <mass value="0.104"/>
172
+ <inertia ixx="2.87438e-05" ixy="7.41152e-06" ixz="1.26409e-06" iyy="0.000159844" iyz="-4.90188e-08" izz="0.00014529"/>
173
+ </inertial>
174
+ <!-- Part under_arm_so101_v1 -->
175
+ <visual>
176
+ <origin xyz="-0.0648499 -0.032 0.0182" rpy="3.14159 -0 6.67202e-31"/>
177
+ <geometry>
178
+ <mesh filename="assets/under_arm_so101_v1.stl"/>
179
+ </geometry>
180
+ <material name="3d_printed"/>
181
+ </visual>
182
+ <collision>
183
+ <origin xyz="-0.0648499 -0.032 0.0182" rpy="3.14159 -0 6.67202e-31"/>
184
+ <geometry>
185
+ <mesh filename="assets/under_arm_so101_v1.stl"/>
186
+ </geometry>
187
+ </collision>
188
+ <!-- Part motor_holder_so101_wrist_v1 -->
189
+ <visual>
190
+ <origin xyz="-0.0648499 -0.032 0.018" rpy="-3.14159 -2.55351e-15 -1.83387e-30"/>
191
+ <geometry>
192
+ <mesh filename="assets/motor_holder_so101_wrist_v1.stl"/>
193
+ </geometry>
194
+ <material name="3d_printed"/>
195
+ </visual>
196
+ <collision>
197
+ <origin xyz="-0.0648499 -0.032 0.018" rpy="-3.14159 -2.55351e-15 -1.83387e-30"/>
198
+ <geometry>
199
+ <mesh filename="assets/motor_holder_so101_wrist_v1.stl"/>
200
+ </geometry>
201
+ </collision>
202
+ <!-- Part sts3215_03a_v1_4 -->
203
+ <visual>
204
+ <origin xyz="-0.1224 0.0052 0.0187" rpy="-3.14159 -7.88861e-31 -3.14159"/>
205
+ <geometry>
206
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
207
+ </geometry>
208
+ <material name="sts3215"/>
209
+ </visual>
210
+ <collision>
211
+ <origin xyz="-0.1224 0.0052 0.0187" rpy="-3.14159 -7.88861e-31 -3.14159"/>
212
+ <geometry>
213
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
214
+ </geometry>
215
+ </collision>
216
+ </link>
217
+
218
+ <!-- Link wrist -->
219
+ <link name="wrist_link">
220
+ <inertial>
221
+ <origin xyz="-0.000103312 -0.0386143 0.0281156" rpy="0 0 0"/>
222
+ <mass value="0.079"/>
223
+ <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"/>
224
+ </inertial>
225
+ <!-- Part sts3215_03a_no_horn_v1 -->
226
+ <visual>
227
+ <origin xyz="8.32667e-17 -0.0424 0.0306" rpy="1.5708 1.5708 0"/>
228
+ <geometry>
229
+ <mesh filename="assets/sts3215_03a_no_horn_v1.stl"/>
230
+ </geometry>
231
+ <material name="sts3215"/>
232
+ </visual>
233
+ <collision>
234
+ <origin xyz="8.32667e-17 -0.0424 0.0306" rpy="1.5708 1.5708 0"/>
235
+ <geometry>
236
+ <mesh filename="assets/sts3215_03a_no_horn_v1.stl"/>
237
+ </geometry>
238
+ </collision>
239
+ <!-- Part wrist_roll_pitch_so101_v2 -->
240
+ <visual>
241
+ <origin xyz="0 -0.028 0.0181" rpy="-1.5708 -1.5708 0"/>
242
+ <geometry>
243
+ <mesh filename="assets/wrist_roll_pitch_so101_v2.stl"/>
244
+ </geometry>
245
+ <material name="3d_printed"/>
246
+ </visual>
247
+ <collision>
248
+ <origin xyz="0 -0.028 0.0181" rpy="-1.5708 -1.5708 0"/>
249
+ <geometry>
250
+ <mesh filename="assets/wrist_roll_pitch_so101_v2.stl"/>
251
+ </geometry>
252
+ </collision>
253
+ </link>
254
+
255
+ <!-- Link gripper -->
256
+ <link name="gripper_link">
257
+ <inertial>
258
+ <origin xyz="0.000213627 0.000245138 -0.025187" rpy="0 0 0"/>
259
+ <mass value="0.087"/>
260
+ <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"/>
261
+ </inertial>
262
+ <!-- Part sts3215_03a_v1_5 -->
263
+ <visual>
264
+ <origin xyz="0.0077 0.0001 -0.0234" rpy="-1.5708 -5.19179e-17 -1.66533e-16"/>
265
+ <geometry>
266
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
267
+ </geometry>
268
+ <material name="sts3215"/>
269
+ </visual>
270
+ <collision>
271
+ <origin xyz="0.0077 0.0001 -0.0234" rpy="-1.5708 -5.19179e-17 -1.66533e-16"/>
272
+ <geometry>
273
+ <mesh filename="assets/sts3215_03a_v1.stl"/>
274
+ </geometry>
275
+ </collision>
276
+ <!-- Part wrist_roll_follower_so101_v1 -->
277
+ <visual>
278
+ <origin xyz="8.32667e-17 -0.000218214 0.000949706" rpy="-3.14159 -5.55112e-17 0"/>
279
+ <geometry>
280
+ <mesh filename="assets/wrist_roll_follower_so101_v1.stl"/>
281
+ </geometry>
282
+ <material name="3d_printed"/>
283
+ </visual>
284
+ <collision>
285
+ <origin xyz="8.32667e-17 -0.000218214 0.000949706" rpy="-3.14159 -5.55112e-17 0"/>
286
+ <geometry>
287
+ <mesh filename="assets/wrist_roll_follower_so101_v1.stl"/>
288
+ </geometry>
289
+ </collision>
290
+ </link>
291
+
292
+ <!-- Gripper frame (dummy link + fixed joint) -->
293
+ <link name="gripper_frame_link">
294
+ <origin xyz="0 0 0" rpy="0 -0 0"/>
295
+ <inertial>
296
+ <origin xyz="0 0 0" rpy="0 0 0"/>
297
+ <mass value="1e-9"/>
298
+ <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
299
+ </inertial>
300
+ </link>
301
+
302
+ <joint name="gripper_frame_joint" type="fixed">
303
+ <origin xyz="-0.0079 -0.000218121 -0.0981274" rpy="0 3.14159 0"/>
304
+ <parent link="gripper_link"/>
305
+ <child link="gripper_frame_link"/>
306
+ <axis xyz="0 0 0"/>
307
+ </joint>
308
+
309
+ <!-- Link moving_jaw_so101_v1 -->
310
+ <link name="moving_jaw_so101_v1_link">
311
+ <inertial>
312
+ <origin xyz="-0.00157495 -0.0300244 0.0192755" rpy="0 0 0"/>
313
+ <mass value="0.012"/>
314
+ <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"/>
315
+ </inertial>
316
+ <!-- Part moving_jaw_so101_v1 -->
317
+ <visual>
318
+ <origin xyz="-5.55112e-17 -5.55112e-17 0.0189" rpy="9.53145e-17 6.93889e-18 1.24077e-24"/>
319
+ <geometry>
320
+ <mesh filename="assets/moving_jaw_so101_v1.stl"/>
321
+ </geometry>
322
+ <material name="3d_printed"/>
323
+ </visual>
324
+ <collision>
325
+ <origin xyz="-5.55112e-17 -5.55112e-17 0.0189" rpy="9.53145e-17 6.93889e-18 1.24077e-24"/>
326
+ <geometry>
327
+ <mesh filename="assets/moving_jaw_so101_v1.stl"/>
328
+ </geometry>
329
+ </collision>
330
+ </link>
331
+
332
+ <!-- Joint from gripper to moving_jaw_so101_v1 -->
333
+ <joint name="gripper" type="revolute">
334
+ <origin xyz="0.0202 0.0188 -0.0234" rpy="1.5708 -5.24284e-08 -1.41553e-15"/>
335
+ <parent link="gripper_link"/>
336
+ <child link="moving_jaw_so101_v1_link"/>
337
+ <axis xyz="0 0 1"/>
338
+ <limit effort="10" velocity="10" lower="-0.174533" upper="1.74533"/>
339
+ </joint>
340
+
341
+ <transmission name="gripper_trans">
342
+ <type>transmission_interface/SimpleTransmission</type>
343
+ <joint name="gripper">
344
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
345
+ </joint>
346
+ <actuator name="motor6">
347
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
348
+ <mechanicalReduction>1</mechanicalReduction>
349
+ </actuator>
350
+ </transmission>
351
+
352
+ <!-- Joint from wrist to gripper -->
353
+ <joint name="wrist_roll" type="revolute">
354
+ <origin xyz="5.55112e-17 -0.0611 0.0181" rpy="1.5708 0.0486795 3.14159"/>
355
+ <parent link="wrist_link"/>
356
+ <child link="gripper_link"/>
357
+ <axis xyz="0 0 1"/>
358
+ <limit effort="10" velocity="10" lower="-2.74385" upper="2.84121"/>
359
+ </joint>
360
+
361
+ <transmission name="wrist_roll_trans">
362
+ <type>transmission_interface/SimpleTransmission</type>
363
+ <joint name="wrist_roll">
364
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
365
+ </joint>
366
+ <actuator name="motor5">
367
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
368
+ <mechanicalReduction>1</mechanicalReduction>
369
+ </actuator>
370
+ </transmission>
371
+
372
+ <!-- Joint from lower_arm to wrist -->
373
+ <joint name="wrist_flex" type="revolute">
374
+ <origin xyz="-0.1349 0.0052 3.62355e-17" rpy="4.02456e-15 8.67362e-16 -1.5708"/>
375
+ <parent link="lower_arm_link"/>
376
+ <child link="wrist_link"/>
377
+ <axis xyz="0 0 1"/>
378
+ <limit effort="10" velocity="10" lower="-1.65806" upper="1.65806"/>
379
+ </joint>
380
+
381
+ <transmission name="wrist_flex_trans">
382
+ <type>transmission_interface/SimpleTransmission</type>
383
+ <joint name="wrist_flex">
384
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
385
+ </joint>
386
+ <actuator name="motor4">
387
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
388
+ <mechanicalReduction>1</mechanicalReduction>
389
+ </actuator>
390
+ </transmission>
391
+
392
+ <!-- Joint from upper_arm to lower_arm -->
393
+ <!-- Note: 5-degree calibration offset applied to joint limits -->
394
+ <joint name="elbow_flex" type="revolute">
395
+ <origin xyz="-0.11257 -0.028 1.73763e-16" rpy="-3.63608e-16 8.74301e-16 1.5708"/>
396
+ <parent link="upper_arm_link"/>
397
+ <child link="lower_arm_link"/>
398
+ <axis xyz="0 0 1"/>
399
+ <limit effort="10" velocity="10" lower="-1.69" upper="1.69"/>
400
+ </joint>
401
+
402
+ <transmission name="elbow_flex_trans">
403
+ <type>transmission_interface/SimpleTransmission</type>
404
+ <joint name="elbow_flex">
405
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
406
+ </joint>
407
+ <actuator name="motor3">
408
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
409
+ <mechanicalReduction>1</mechanicalReduction>
410
+ </actuator>
411
+ </transmission>
412
+
413
+ <!-- Joint from shoulder to upper_arm -->
414
+ <joint name="shoulder_lift" type="revolute">
415
+ <origin xyz="-0.0303992 -0.0182778 -0.0542" rpy="-1.5708 -1.5708 0"/>
416
+ <parent link="shoulder_link"/>
417
+ <child link="upper_arm_link"/>
418
+ <axis xyz="0 0 1"/>
419
+ <limit effort="10" velocity="10" lower="-1.74533" upper="1.74533"/>
420
+ </joint>
421
+
422
+ <transmission name="shoulder_lift_trans">
423
+ <type>transmission_interface/SimpleTransmission</type>
424
+ <joint name="shoulder_lift">
425
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
426
+ </joint>
427
+ <actuator name="motor2">
428
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
429
+ <mechanicalReduction>1</mechanicalReduction>
430
+ </actuator>
431
+ </transmission>
432
+
433
+ <!-- Joint from base to shoulder -->
434
+ <joint name="shoulder_pan" type="revolute">
435
+ <origin xyz="0.0388353 -8.97657e-09 0.0624" rpy="3.14159 4.18253e-17 -3.14159"/>
436
+ <parent link="base_link"/>
437
+ <child link="shoulder_link"/>
438
+ <axis xyz="0 0 1"/>
439
+ <limit effort="10" velocity="10" lower="-1.91986" upper="1.91986"/>
440
+ </joint>
441
+
442
+ <transmission name="shoulder_pan_trans">
443
+ <type>transmission_interface/SimpleTransmission</type>
444
+ <joint name="shoulder_pan">
445
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
446
+ </joint>
447
+ <actuator name="motor1">
448
+ <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
449
+ <mechanicalReduction>1</mechanicalReduction>
450
+ </actuator>
451
+ </transmission>
452
+
453
+ </robot>
src/app/[org]/[dataset]/[episode]/episode-viewer.tsx CHANGED
@@ -99,7 +99,7 @@ function EpisodeViewerInner({ data, org, dataset }: { data: EpisodeData; org?: s
99
  }
100
  return "episodes";
101
  });
102
- const [columnMinMax, setColumnMinMax] = useState<ColumnMinMax[] | null>(null);
103
  const [episodeLengthStats, setEpisodeLengthStats] = useState<EpisodeLengthStats | null>(null);
104
  const [statsLoading, setStatsLoading] = useState(false);
105
  const statsLoadedRef = useRef(false);
@@ -478,8 +478,6 @@ function EpisodeViewerInner({ data, org, dataset }: { data: EpisodeData; org?: s
478
  {activeTab === "statistics" && (
479
  <StatsPanel
480
  datasetInfo={datasetInfo}
481
- episodeId={episodeId}
482
- columnMinMax={columnMinMax}
483
  episodeLengthStats={episodeLengthStats}
484
  loading={statsLoading}
485
  />
@@ -508,7 +506,6 @@ function EpisodeViewerInner({ data, org, dataset }: { data: EpisodeData; org?: s
508
  crossEpisodeLoading={insightsLoading}
509
  episodeLengthStats={episodeLengthStats}
510
  flatChartData={data.flatChartData}
511
- fps={datasetInfo.fps || 30}
512
  onViewFlaggedEpisodes={() => {
513
  setSidebarFlaggedOnly(true);
514
  handleTabChange("episodes");
 
99
  }
100
  return "episodes";
101
  });
102
+ const [, setColumnMinMax] = useState<ColumnMinMax[] | null>(null);
103
  const [episodeLengthStats, setEpisodeLengthStats] = useState<EpisodeLengthStats | null>(null);
104
  const [statsLoading, setStatsLoading] = useState(false);
105
  const statsLoadedRef = useRef(false);
 
478
  {activeTab === "statistics" && (
479
  <StatsPanel
480
  datasetInfo={datasetInfo}
 
 
481
  episodeLengthStats={episodeLengthStats}
482
  loading={statsLoading}
483
  />
 
506
  crossEpisodeLoading={insightsLoading}
507
  episodeLengthStats={episodeLengthStats}
508
  flatChartData={data.flatChartData}
 
509
  onViewFlaggedEpisodes={() => {
510
  setSidebarFlaggedOnly(true);
511
  handleTabChange("episodes");
src/app/[org]/[dataset]/[episode]/fetch-data.ts CHANGED
@@ -301,11 +301,6 @@ async function getEpisodeDataV2(
301
  const filteredColumns = columnNames.filter(
302
  (column) => !excludedColumns.includes(column.key),
303
  );
304
- const filteredColumnNames = [
305
- "timestamp",
306
- ...filteredColumns.map((column) => column.key),
307
- ];
308
-
309
  const columns: ColumnDef[] = filteredColumns.map(({ key }) => {
310
  let column_names: unknown = info.features[key].names;
311
  while (typeof column_names === "object" && column_names !== null) {
@@ -613,15 +608,6 @@ function processEpisodeDataForCharts(
613
  episodeMetadata?: EpisodeMetadataV3,
614
  ): { chartDataGroups: ChartRow[][]; flatChartData: Record<string, number>[]; ignoredColumns: string[] } {
615
 
616
- // Get numeric column features
617
- const columnNames = Object.entries(info.features)
618
- .filter(
619
- ([, value]) =>
620
- ["float32", "int32"].includes(value.dtype) &&
621
- value.shape.length === 1,
622
- )
623
- .map(([key, value]) => ({ key, value }));
624
-
625
  // Convert parquet data to chart format
626
  let seriesNames: string[] = [];
627
 
 
301
  const filteredColumns = columnNames.filter(
302
  (column) => !excludedColumns.includes(column.key),
303
  );
 
 
 
 
 
304
  const columns: ColumnDef[] = filteredColumns.map(({ key }) => {
305
  let column_names: unknown = info.features[key].names;
306
  while (typeof column_names === "object" && column_names !== null) {
 
608
  episodeMetadata?: EpisodeMetadataV3,
609
  ): { chartDataGroups: ChartRow[][]; flatChartData: Record<string, number>[]; ignoredColumns: string[] } {
610
 
 
 
 
 
 
 
 
 
 
611
  // Convert parquet data to chart format
612
  let seriesNames: string[] = [];
613
 
src/components/action-insights-panel.tsx CHANGED
@@ -302,15 +302,14 @@ function ActionVelocitySection({ data, agg, numEpisodes, jerkyEpisodes }: { data
302
  });
303
  }, [data, actionKeys, agg]);
304
 
305
- const stats = (agg && agg.length > 0) ? agg : fallbackStats ?? [];
306
  const isAgg = agg && agg.length > 0;
307
 
308
- if (stats.length === 0) return <p className="text-slate-500 italic">No action data for velocity analysis.</p>;
309
-
310
- const maxBinCount = Math.max(...stats.flatMap(s => s.bins));
311
- const maxStd = Math.max(...stats.map(s => s.std));
312
 
313
  const insight = useMemo(() => {
 
314
  const smooth = stats.filter(s => s.std / maxStd < 0.4);
315
  const moderate = stats.filter(s => s.std / maxStd >= 0.4 && s.std / maxStd < 0.7);
316
  const jerky = stats.filter(s => s.std / maxStd >= 0.7);
@@ -348,6 +347,8 @@ function ActionVelocitySection({ data, agg, numEpisodes, jerkyEpisodes }: { data
348
  return { verdict, lines, tip };
349
  }, [stats, maxStd]);
350
 
 
 
351
  return (
352
  <div className="bg-slate-800/60 rounded-lg p-5 border border-slate-700 space-y-4">
353
  <div>
@@ -462,6 +463,8 @@ function JerkyEpisodesList({ episodes }: { episodes: JerkyEpisode[] }) {
462
  // ─── Cross-Episode Variance Heatmap ──────────────────────────────
463
 
464
  function VarianceHeatmap({ data, loading }: { data: CrossEpisodeVarianceData | null; loading: boolean }) {
 
 
465
  if (loading) {
466
  return (
467
  <div className="bg-slate-800/60 rounded-lg p-5 border border-slate-700">
@@ -485,8 +488,6 @@ function VarianceHeatmap({ data, loading }: { data: CrossEpisodeVarianceData | n
485
  </div>
486
  );
487
  }
488
-
489
- const isFs = useIsFullscreen();
490
  const { actionNames, timeBins, variance, numEpisodes } = data;
491
  const numDims = actionNames.length;
492
  const numBins = timeBins.length;
@@ -918,14 +919,11 @@ const BC_THRESHOLD = 5 / 9;
918
  function MultimodalitySection({ data }: { data: CrossEpisodeVarianceData }) {
919
  const isFs = useIsFullscreen();
920
  const { actionNames, timeBins, multimodality, numEpisodes } = data;
921
- if (!multimodality || multimodality.length === 0) return null;
922
-
923
- const numDims = actionNames.length;
924
- const numBins = timeBins.length;
925
 
926
  const { bimodalPct, verdict } = useMemo(() => {
 
927
  let bimodal = 0, total = 0;
928
- for (const row of multimodality!) for (const v of row) { total++; if (v > BC_THRESHOLD) bimodal++; }
929
  const pct = total > 0 ? (bimodal / total * 100) : 0;
930
 
931
  let v: { label: string; color: string };
@@ -936,6 +934,8 @@ function MultimodalitySection({ data }: { data: CrossEpisodeVarianceData }) {
936
  return { bimodalPct: pct, verdict: v };
937
  }, [multimodality]);
938
 
 
 
939
  const mBaseW = isFs ? 1000 : 560;
940
  const mBaseH = isFs ? 500 : 300;
941
  const cellW = Math.max(6, Math.min(isFs ? 24 : 14, Math.floor(mBaseW / numBins)));
@@ -1168,7 +1168,7 @@ function TrajectoryClusteringSection({ data, numEpisodes }: { data: TrajectoryCl
1168
  width={plotW} height={plotH}
1169
  className="block bg-slate-900/50 rounded cursor-grab active:cursor-grabbing select-none"
1170
  onMouseDown={onMouseDown} onMouseMove={onMouseMove} onMouseUp={onMouseUp}
1171
- onMouseLeave={(ev) => { onMouseUp(); setHoveredEp(null); }}
1172
  >
1173
  {axisLines.map(a => (
1174
  <React.Fragment key={a.label}>
 
302
  });
303
  }, [data, actionKeys, agg]);
304
 
305
+ const stats = useMemo(() => (agg && agg.length > 0) ? agg : fallbackStats ?? [], [agg, fallbackStats]);
306
  const isAgg = agg && agg.length > 0;
307
 
308
+ const maxBinCount = useMemo(() => stats.length > 0 ? Math.max(...stats.flatMap(s => s.bins)) : 0, [stats]);
309
+ const maxStd = useMemo(() => stats.length > 0 ? Math.max(...stats.map(s => s.std)) : 1, [stats]);
 
 
310
 
311
  const insight = useMemo(() => {
312
+ if (stats.length === 0) return null;
313
  const smooth = stats.filter(s => s.std / maxStd < 0.4);
314
  const moderate = stats.filter(s => s.std / maxStd >= 0.4 && s.std / maxStd < 0.7);
315
  const jerky = stats.filter(s => s.std / maxStd >= 0.7);
 
347
  return { verdict, lines, tip };
348
  }, [stats, maxStd]);
349
 
350
+ if (stats.length === 0) return <p className="text-slate-500 italic">No action data for velocity analysis.</p>;
351
+
352
  return (
353
  <div className="bg-slate-800/60 rounded-lg p-5 border border-slate-700 space-y-4">
354
  <div>
 
463
  // ─── Cross-Episode Variance Heatmap ──────────────────────────────
464
 
465
  function VarianceHeatmap({ data, loading }: { data: CrossEpisodeVarianceData | null; loading: boolean }) {
466
+ const isFs = useIsFullscreen();
467
+
468
  if (loading) {
469
  return (
470
  <div className="bg-slate-800/60 rounded-lg p-5 border border-slate-700">
 
488
  </div>
489
  );
490
  }
 
 
491
  const { actionNames, timeBins, variance, numEpisodes } = data;
492
  const numDims = actionNames.length;
493
  const numBins = timeBins.length;
 
919
  function MultimodalitySection({ data }: { data: CrossEpisodeVarianceData }) {
920
  const isFs = useIsFullscreen();
921
  const { actionNames, timeBins, multimodality, numEpisodes } = data;
 
 
 
 
922
 
923
  const { bimodalPct, verdict } = useMemo(() => {
924
+ if (!multimodality || multimodality.length === 0) return { bimodalPct: 0, verdict: { label: "", color: "" } };
925
  let bimodal = 0, total = 0;
926
+ for (const row of multimodality) for (const v of row) { total++; if (v > BC_THRESHOLD) bimodal++; }
927
  const pct = total > 0 ? (bimodal / total * 100) : 0;
928
 
929
  let v: { label: string; color: string };
 
934
  return { bimodalPct: pct, verdict: v };
935
  }, [multimodality]);
936
 
937
+ if (!multimodality || multimodality.length === 0) return null;
938
+
939
  const mBaseW = isFs ? 1000 : 560;
940
  const mBaseH = isFs ? 500 : 300;
941
  const cellW = Math.max(6, Math.min(isFs ? 24 : 14, Math.floor(mBaseW / numBins)));
 
1168
  width={plotW} height={plotH}
1169
  className="block bg-slate-900/50 rounded cursor-grab active:cursor-grabbing select-none"
1170
  onMouseDown={onMouseDown} onMouseMove={onMouseMove} onMouseUp={onMouseUp}
1171
+ onMouseLeave={() => { onMouseUp(); setHoveredEp(null); }}
1172
  >
1173
  {axisLines.map(a => (
1174
  <React.Fragment key={a.label}>
src/components/data-recharts.tsx CHANGED
@@ -1,6 +1,6 @@
1
  "use client";
2
 
3
- import { useEffect, useState, useCallback } from "react";
4
  import { useTime } from "../context/time-context";
5
  import {
6
  LineChart,
 
1
  "use client";
2
 
3
+ import { useEffect, useState } from "react";
4
  import { useTime } from "../context/time-context";
5
  import {
6
  LineChart,
src/components/filtering-panel.tsx CHANGED
@@ -247,7 +247,6 @@ interface FilteringPanelProps {
247
  crossEpisodeLoading: boolean;
248
  episodeLengthStats: EpisodeLengthStats | null;
249
  flatChartData: Record<string, number>[];
250
- fps: number;
251
  onViewFlaggedEpisodes?: () => void;
252
  }
253
 
@@ -315,7 +314,6 @@ const FilteringPanel: React.FC<FilteringPanelProps> = ({
315
  crossEpisodeLoading,
316
  episodeLengthStats,
317
  flatChartData,
318
- fps,
319
  onViewFlaggedEpisodes,
320
  }) => {
321
  return (
 
247
  crossEpisodeLoading: boolean;
248
  episodeLengthStats: EpisodeLengthStats | null;
249
  flatChartData: Record<string, number>[];
 
250
  onViewFlaggedEpisodes?: () => void;
251
  }
252
 
 
314
  crossEpisodeLoading,
315
  episodeLengthStats,
316
  flatChartData,
 
317
  onViewFlaggedEpisodes,
318
  }) => {
319
  return (
src/components/stats-panel.tsx CHANGED
@@ -1,17 +1,14 @@
1
  "use client";
2
 
3
- import React, { useState } from "react";
4
  import type {
5
  DatasetDisplayInfo,
6
- ColumnMinMax,
7
  EpisodeLengthStats,
8
  CameraInfo,
9
  } from "@/app/[org]/[dataset]/[episode]/fetch-data";
10
 
11
  interface StatsPanelProps {
12
  datasetInfo: DatasetDisplayInfo;
13
- episodeId: number;
14
- columnMinMax: ColumnMinMax[] | null;
15
  episodeLengthStats: EpisodeLengthStats | null;
16
  loading: boolean;
17
  }
@@ -83,8 +80,6 @@ const Card: React.FC<{ label: string; value: string | number }> = ({ label, valu
83
 
84
  const StatsPanel: React.FC<StatsPanelProps> = ({
85
  datasetInfo,
86
- episodeId,
87
- columnMinMax,
88
  episodeLengthStats,
89
  loading,
90
  }) => {
 
1
  "use client";
2
 
3
+ import React from "react";
4
  import type {
5
  DatasetDisplayInfo,
 
6
  EpisodeLengthStats,
7
  CameraInfo,
8
  } from "@/app/[org]/[dataset]/[episode]/fetch-data";
9
 
10
  interface StatsPanelProps {
11
  datasetInfo: DatasetDisplayInfo;
 
 
12
  episodeLengthStats: EpisodeLengthStats | null;
13
  loading: boolean;
14
  }
 
80
 
81
  const StatsPanel: React.FC<StatsPanelProps> = ({
82
  datasetInfo,
 
 
83
  episodeLengthStats,
84
  loading,
85
  }) => {
src/components/urdf-viewer.tsx CHANGED
@@ -13,7 +13,7 @@ import { LineMaterial } from "three/examples/jsm/lines/LineMaterial.js";
13
  import { LineGeometry } from "three/examples/jsm/lines/LineGeometry.js";
14
  import type { EpisodeData } from "@/app/[org]/[dataset]/[episode]/fetch-data";
15
  import { fetchEpisodeChartData } from "@/app/[org]/[dataset]/[episode]/actions";
16
- import { isOpenArmRobot } from "@/lib/so101-robot";
17
 
18
  const SERIES_DELIM = " | ";
19
  const DEG2RAD = Math.PI / 180;
@@ -21,12 +21,12 @@ const DEG2RAD = Math.PI / 180;
21
  function getRobotConfig(robotType: string | null) {
22
  const lower = (robotType ?? "").toLowerCase();
23
  if (lower.includes("openarm")) {
24
- return { urdfUrl: "/urdf/openarm/openarm_bimanual.urdf", scale: 3, isDualArm: true };
25
  }
26
  if (lower.includes("so100") && !lower.includes("so101")) {
27
- return { urdfUrl: "/urdf/so101/so100.urdf", scale: 10, isDualArm: false };
28
  }
29
- return { urdfUrl: "/urdf/so101/so101_new_calib.urdf", scale: 10, isDualArm: false };
30
  }
31
 
32
  // Detect unit: servo ticks (0-4096), degrees (>6.28), or radians
@@ -348,7 +348,7 @@ export default function URDFViewer({
348
  const { datasetInfo, episodes } = data;
349
  const fps = datasetInfo.fps || 30;
350
  const robotConfig = useMemo(() => getRobotConfig(datasetInfo.robot_type), [datasetInfo.robot_type]);
351
- const { urdfUrl, scale, isDualArm } = robotConfig;
352
 
353
  // Episode selection & chart data
354
  const [selectedEpisode, setSelectedEpisode] = useState(data.episodeId);
 
13
  import { LineGeometry } from "three/examples/jsm/lines/LineGeometry.js";
14
  import type { EpisodeData } from "@/app/[org]/[dataset]/[episode]/fetch-data";
15
  import { fetchEpisodeChartData } from "@/app/[org]/[dataset]/[episode]/actions";
16
+
17
 
18
  const SERIES_DELIM = " | ";
19
  const DEG2RAD = Math.PI / 180;
 
21
  function getRobotConfig(robotType: string | null) {
22
  const lower = (robotType ?? "").toLowerCase();
23
  if (lower.includes("openarm")) {
24
+ return { urdfUrl: "/urdf/openarm/openarm_bimanual.urdf", scale: 3 };
25
  }
26
  if (lower.includes("so100") && !lower.includes("so101")) {
27
+ return { urdfUrl: "/urdf/so101/so100.urdf", scale: 10 };
28
  }
29
+ return { urdfUrl: "/urdf/so101/so101_new_calib.urdf", scale: 10 };
30
  }
31
 
32
  // Detect unit: servo ticks (0-4096), degrees (>6.28), or radians
 
348
  const { datasetInfo, episodes } = data;
349
  const fps = datasetInfo.fps || 30;
350
  const robotConfig = useMemo(() => getRobotConfig(datasetInfo.robot_type), [datasetInfo.robot_type]);
351
+ const { urdfUrl, scale } = robotConfig;
352
 
353
  // Episode selection & chart data
354
  const [selectedEpisode, setSelectedEpisode] = useState(data.episodeId);