-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrun_corrected_planes.py
More file actions
181 lines (145 loc) Β· 7.74 KB
/
run_corrected_planes.py
File metadata and controls
181 lines (145 loc) Β· 7.74 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#!/usr/bin/env python3
"""
Run the corrected plane visualization with proper 2D plane orientations.
"""
import mujoco
import numpy as np
import os
# Load the corrected plane visualization model
viz_path = os.path.join(os.path.dirname(__file__), 'ezgripper_corrected_planes.xml')
try:
model = mujoco.MjModel.from_xml_path(viz_path)
data = mujoco.MjData(model)
print("="*60)
print("CORRECTED 2D PLANE VISUALIZATION")
print("="*60)
print("\nπ¦ BLUE planes: Palm stop planes (fixed, perpendicular)")
print("π₯ RED planes: Current finger stop planes (move with fingers)")
print("π© GREEN planes: Correct stop positions (ghost planes)")
print("\nβ
OVERLAP = STOP ENGAGEMENT")
print("Watch as red planes rotate and overlap with blue planes!")
# Try to launch visual window
viewer_launched = False
# Method 1: Try mujoco.viewer
try:
import mujoco.viewer
with mujoco.viewer.launch_passive(model, data) as viewer:
viewer_launched = True
print("β 3D Viewer launched with corrected 2D planes!")
# Set camera for good view of planes
mujoco.mjv_defaultFreeCamera(model, viewer.cam)
viewer.cam.distance = 0.25
viewer.cam.azimuth = 45
viewer.cam.elevation = -30
viewer.cam.lookat = np.array([0.08, 0.03, 0.05])
# Run simulation with plane overlap demonstration
step = 0
phase = 0 # 0=open, 1=close, 2=hold
print("\n㪠Starting corrected plane overlap demonstration...")
print("Watch for RED and BLUE plane overlap at stop points!")
while viewer.is_running():
# Cycle through angles to show plane overlap
if step % 150 == 0:
phase = (phase + 1) % 3
if phase == 0: # Opening to -90Β°
target_angle = -90
phase_name = "OPENING TO LOWER STOP"
elif phase == 1: # Closing to +25Β°
target_angle = 25
phase_name = "CLOSING TO UPPER STOP"
else: # Hold at 0Β°
target_angle = 0
phase_name = "NEUTRAL POSITION"
# Smooth motion
current_angle = np.degrees(data.qpos[model.joint('F1_palm_knuckle').id])
angle_diff = target_angle - current_angle
data.qpos[model.joint('F1_palm_knuckle').id] += np.radians(angle_diff * 0.02)
data.qpos[model.joint('F2_palm_knuckle').id] += np.radians(angle_diff * 0.02)
# Check plane overlap (stop engagement)
if step % 30 == 0:
# Calculate distances between planes
palm_lower_pos = data.geom_xpos[mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "palm_stop_f1_lower")]
finger_lower_pos = data.geom_xpos[mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "f1l1_stop_lower")]
dist_lower = np.linalg.norm(finger_lower_pos - palm_lower_pos)
palm_upper_pos = data.geom_xpos[mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "palm_stop_f1_upper")]
finger_upper_pos = data.geom_xpos[mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "f1l1_stop_upper")]
dist_upper = np.linalg.norm(finger_upper_pos - palm_upper_pos)
lower_engaged = dist_lower < 0.01
upper_engaged = dist_upper < 0.01
print(f" {phase_name}: Angle={current_angle:6.1f}Β° | Lower={dist_lower:.4f} {'β
' if lower_engaged else 'β'} | Upper={dist_upper:.4f} {'β
' if upper_engaged else 'β'}")
# Step physics and update viewer
mujoco.mj_forward(model, data)
mujoco.mj_step(model, data)
viewer.sync()
step += 1
except Exception as e:
print(f"β Viewer failed: {e}")
# Method 2: Try mujoco_py
if not viewer_launched:
try:
import mujoco_py
viewer = mujoco_py.MjViewer(model)
print("β MuJoCo_Py viewer launched!")
step = 0
phase = 0
while True:
if step % 150 == 0:
phase = (phase + 1) % 3
if phase == 0:
target_angle = -90
elif phase == 1:
target_angle = 25
else:
target_angle = 0
current_angle = np.degrees(data.qpos[model.joint('F1_palm_knuckle').id])
angle_diff = target_angle - current_angle
data.qpos[model.joint('F1_palm_knuckle').id] += np.radians(angle_diff * 0.02)
data.qpos[model.joint('F2_palm_knuckle').id] += np.radians(angle_diff * 0.02)
mujoco.mj_step(model, data)
viewer.render()
step += 1
except ImportError:
print("β MuJoCo_Py not available")
except Exception as e:
print(f"β MuJoCo_Py failed: {e}")
if not viewer_launched:
print("\nβ No visual viewer available in this environment.")
print("The XML file contains correctly oriented 2D planes for use with any MuJoCo viewer.")
print("\nπ Running text-based plane overlap analysis...")
# Text-based plane overlap demonstration
test_angles = [-90, -45, 0, 25]
print(f"\n{'Angle':>6} {'Lower_Dist':>11} {'Upper_Dist':>11} {'Planes_Overlap'}")
print("-" * 50)
for angle in test_angles:
data.qpos[model.joint('F1_palm_knuckle').id] = np.radians(angle)
data.qpos[model.joint('F2_palm_knuckle').id] = np.radians(angle)
mujoco.mj_forward(model, data)
palm_lower_pos = data.geom_xpos[mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "palm_stop_f1_lower")]
finger_lower_pos = data.geom_xpos[mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "f1l1_stop_lower")]
dist_lower = np.linalg.norm(finger_lower_pos - palm_lower_pos)
palm_upper_pos = data.geom_xpos[mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "palm_stop_f1_upper")]
finger_upper_pos = data.geom_xpos[mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, "f1l1_stop_upper")]
dist_upper = np.linalg.norm(finger_upper_pos - palm_upper_pos)
lower_overlap = dist_lower < 0.01
upper_overlap = dist_upper < 0.01
if lower_overlap and upper_overlap:
overlap_status = "β οΈ BOTH"
elif lower_overlap:
overlap_status = "β¬οΈ LOWER"
elif upper_overlap:
overlap_status = "β¬οΈ UPPER"
else:
overlap_status = " NONE"
print(f"{angle:6d}Β° {dist_lower:11.4f} {dist_upper:11.4f} {overlap_status}")
except Exception as e:
print(f"Error loading model: {e}")
print("\n" + "="*60)
print("CORRECTED PLANE VISUALIZATION COMPLETE")
print("="*60)
print("\nπ― The corrected 2D planes now show:")
print(" β
Planes are perpendicular to finger movement")
print(" β
When RED and BLUE planes overlap = STOP ENGAGED")
print(" β When planes are separate = NO STOP ENGAGEMENT")
print(" π© GREEN planes show where RED planes SHOULD be positioned")
print("\nπ§ To fix: Move RED planes to GREEN plane positions")
print("="*60)