-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclear_stop_demo.py
More file actions
133 lines (106 loc) · 4.41 KB
/
clear_stop_demo.py
File metadata and controls
133 lines (106 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python3
"""
Clear demonstration of mechanical stop engagement points.
"""
import mujoco
import numpy as np
import os
# Load the permanent visualization model
viz_path = os.path.join(os.path.dirname(__file__), 'ezgripper_permanent_visualization.xml')
model = mujoco.MjModel.from_xml_path(viz_path)
data = mujoco.MjData(model)
print("="*80)
print("MECHANICAL STOP ENGAGEMENT DEMONSTRATION")
print("="*80)
print("\nThis will show EXACTLY when mechanical stops engage:")
print("🔵 BLUE spheres = Palm stops (fixed reference)")
print("🔴 RED spheres = Finger stops (move with fingers)")
print("✅ COLLISION = When RED and BLUE spheres overlap")
print("\nWatch for contact detection messages...")
# Get IDs
f1_palm_id = model.joint('F1_palm_knuckle').id
f2_palm_id = model.joint('F2_palm_knuckle').id
# Get collision geometry IDs
palm_lower_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "palm_stop_f1_lower")
palm_upper_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "palm_stop_f1_upper")
finger_lower_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "f1l1_stop_lower")
finger_upper_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "f1l1_stop_upper")
print(f"\nCollision geometry IDs:")
print(f" Palm lower: {palm_lower_id}")
print(f" Palm upper: {palm_upper_id}")
print(f" Finger lower: {finger_lower_id}")
print(f" Finger upper: {finger_upper_id}")
# Test specific angles where stops should engage
test_angles = [-90, -80, -70, -60, -50, -40, -30, -20, -10, 0, 10, 20, 25, 30]
print(f"\n{'Angle':>6} {'Lower_Stop':>11} {'Upper_Stop':>11} {'Contacts':>9} {'Status'}")
print("-" * 50)
for angle in test_angles:
# Set joint angle
data.qpos[f1_palm_id] = np.radians(angle)
data.qpos[f2_palm_id] = np.radians(angle)
# Forward kinematics
mujoco.mj_forward(model, data)
# Check distances between stop pairs
palm_lower_pos = data.geom_xpos[palm_lower_id]
palm_upper_pos = data.geom_xpos[palm_upper_id]
finger_lower_pos = data.geom_xpos[finger_lower_id]
finger_upper_pos = data.geom_xpos[finger_upper_id]
dist_lower = np.linalg.norm(finger_lower_pos - palm_lower_pos)
dist_upper = np.linalg.norm(finger_upper_pos - palm_upper_pos)
# Check for actual collisions
lower_collides = dist_lower < 0.01
upper_collides = dist_upper < 0.01
# Count contacts
contacts = data.ncon
# Determine status
if lower_collides and upper_collides:
status = "⚠️ BOTH STOPS!"
elif lower_collides:
status = "⬇️ LOWER STOP"
elif upper_collides:
status = "⬆️ UPPER STOP"
elif contacts > 0:
status = "🔗 OTHER CONTACT"
else:
status = " No contact"
print(f"{angle:6d}° {dist_lower:11.4f} {dist_upper:11.4f} {contacts:9d} {status}")
print("\n" + "="*80)
print("STOP ENGAGEMENT ANALYSIS:")
print("="*80)
# Find actual engagement points
print("\nTesting fine-grained angles around expected limits:")
# Test lower limit (-90°)
print("\n🔍 Testing LOWER LIMIT (-90°):")
for angle in range(-95, -84):
data.qpos[f1_palm_id] = np.radians(angle)
mujoco.mj_forward(model, data)
palm_lower_pos = data.geom_xpos[palm_lower_id]
finger_lower_pos = data.geom_xpos[finger_lower_id]
dist_lower = np.linalg.norm(finger_lower_pos - palm_lower_pos)
if dist_lower < 0.01:
print(f" ✅ Lower stop engages at {angle}° (distance: {dist_lower:.4f})")
break
# Test upper limit (+25°)
print("\n🔍 Testing UPPER LIMIT (+25°):")
for angle in range(20, 31):
data.qpos[f1_palm_id] = np.radians(angle)
mujoco.mj_forward(model, data)
palm_upper_pos = data.geom_xpos[palm_upper_id]
finger_upper_pos = data.geom_xpos[finger_upper_id]
dist_upper = np.linalg.norm(finger_upper_pos - palm_upper_pos)
if dist_upper < 0.01:
print(f" ✅ Upper stop engages at {angle}° (distance: {dist_upper:.4f})")
break
print("\n" + "="*80)
print("EXPECTED vs ACTUAL STOP BEHAVIOR:")
print("="*80)
print("Expected:")
print(" Lower stop should engage at -90°")
print(" Upper stop should engage at +25°")
print("\nActual:")
print(" Based on the distances above, check if stops engage at these angles")
print(" If not, the stop positions need to be corrected")
print("\n🎯 TO FIX: Update finger stop positions to:")
print(" Lower: pos='0.0130 0.0000 -0.1000'")
print(" Upper: pos='-0.0071 0.0000 -0.1000'")
print("\n" + "="*80)