Enhance mujoco_server.py to include joint targets in state broadcasting and update UI synchronization
Browse files- Added joint targets retrieval in the broadcast_state function to improve control feedback.
- Updated the UI to synchronize joint sliders with joint targets instead of actual positions.
- Modified target position synchronization to reflect target values rather than actual end-effector positions, enhancing clarity in user controls.
- mujoco_server.py +30 -13
mujoco_server.py
CHANGED
|
@@ -173,6 +173,7 @@ def broadcast_state():
|
|
| 173 |
target_euler = env.get_target_orientation()
|
| 174 |
gripper = env.get_gripper()
|
| 175 |
joint_pos = env.get_joint_positions()
|
|
|
|
| 176 |
control_mode = env.get_control_mode()
|
| 177 |
use_orientation = env.get_use_orientation()
|
| 178 |
|
|
@@ -186,6 +187,7 @@ def broadcast_state():
|
|
| 186 |
'target_orientation': {'roll': float(target_euler[0]), 'pitch': float(target_euler[1]), 'yaw': float(target_euler[2])},
|
| 187 |
'gripper': float(gripper),
|
| 188 |
'joint_positions': [float(j) for j in joint_pos],
|
|
|
|
| 189 |
'control_mode': control_mode,
|
| 190 |
'use_orientation': use_orientation,
|
| 191 |
'steps': int(steps)
|
|
@@ -941,27 +943,42 @@ def index():
|
|
| 941 |
((255 - data.gripper) / 255 * 100).toFixed(0) + '% open';
|
| 942 |
document.getElementById('arm_step_val').innerText = data.steps;
|
| 943 |
|
| 944 |
-
// Update joint position display
|
| 945 |
if (data.joint_positions) {
|
| 946 |
const jp = data.joint_positions;
|
| 947 |
document.getElementById('joint_pos_display').innerText =
|
| 948 |
jp.map(j => j.toFixed(2)).join(', ');
|
| 949 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 950 |
for (let i = 0; i < 6; i++) {
|
| 951 |
-
document.getElementById('joint_' + i).value =
|
| 952 |
-
document.getElementById('joint_' + i + '_val').innerText =
|
| 953 |
}
|
| 954 |
}
|
| 955 |
|
| 956 |
-
// Sync IK target sliders with actual EE
|
| 957 |
-
if (data.
|
| 958 |
-
const
|
| 959 |
-
document.getElementById('target_x').value =
|
| 960 |
-
document.getElementById('target_x_val').innerText =
|
| 961 |
-
document.getElementById('target_y').value =
|
| 962 |
-
document.getElementById('target_y_val').innerText =
|
| 963 |
-
document.getElementById('target_z').value =
|
| 964 |
-
document.getElementById('target_z_val').innerText =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 965 |
}
|
| 966 |
|
| 967 |
// Update control mode display
|
|
|
|
| 173 |
target_euler = env.get_target_orientation()
|
| 174 |
gripper = env.get_gripper()
|
| 175 |
joint_pos = env.get_joint_positions()
|
| 176 |
+
joint_targets = env.get_joint_targets()
|
| 177 |
control_mode = env.get_control_mode()
|
| 178 |
use_orientation = env.get_use_orientation()
|
| 179 |
|
|
|
|
| 187 |
'target_orientation': {'roll': float(target_euler[0]), 'pitch': float(target_euler[1]), 'yaw': float(target_euler[2])},
|
| 188 |
'gripper': float(gripper),
|
| 189 |
'joint_positions': [float(j) for j in joint_pos],
|
| 190 |
+
'joint_targets': [float(j) for j in joint_targets],
|
| 191 |
'control_mode': control_mode,
|
| 192 |
'use_orientation': use_orientation,
|
| 193 |
'steps': int(steps)
|
|
|
|
| 943 |
((255 - data.gripper) / 255 * 100).toFixed(0) + '% open';
|
| 944 |
document.getElementById('arm_step_val').innerText = data.steps;
|
| 945 |
|
| 946 |
+
// Update joint position display (actual positions)
|
| 947 |
if (data.joint_positions) {
|
| 948 |
const jp = data.joint_positions;
|
| 949 |
document.getElementById('joint_pos_display').innerText =
|
| 950 |
jp.map(j => j.toFixed(2)).join(', ');
|
| 951 |
+
}
|
| 952 |
+
|
| 953 |
+
// Sync joint sliders with joint targets (not actual positions)
|
| 954 |
+
if (data.joint_targets) {
|
| 955 |
+
const jt = data.joint_targets;
|
| 956 |
for (let i = 0; i < 6; i++) {
|
| 957 |
+
document.getElementById('joint_' + i).value = jt[i];
|
| 958 |
+
document.getElementById('joint_' + i + '_val').innerText = jt[i].toFixed(2);
|
| 959 |
}
|
| 960 |
}
|
| 961 |
|
| 962 |
+
// Sync IK target sliders with target position (not actual EE)
|
| 963 |
+
if (data.target) {
|
| 964 |
+
const target = data.target;
|
| 965 |
+
document.getElementById('target_x').value = target.x;
|
| 966 |
+
document.getElementById('target_x_val').innerText = target.x.toFixed(2);
|
| 967 |
+
document.getElementById('target_y').value = target.y;
|
| 968 |
+
document.getElementById('target_y_val').innerText = target.y.toFixed(2);
|
| 969 |
+
document.getElementById('target_z').value = target.z;
|
| 970 |
+
document.getElementById('target_z_val').innerText = target.z.toFixed(2);
|
| 971 |
+
}
|
| 972 |
+
|
| 973 |
+
// Sync orientation sliders with target orientation
|
| 974 |
+
if (data.target_orientation) {
|
| 975 |
+
const ori = data.target_orientation;
|
| 976 |
+
document.getElementById('target_roll').value = ori.roll;
|
| 977 |
+
document.getElementById('target_roll_val').innerText = ori.roll.toFixed(2);
|
| 978 |
+
document.getElementById('target_pitch').value = ori.pitch;
|
| 979 |
+
document.getElementById('target_pitch_val').innerText = ori.pitch.toFixed(2);
|
| 980 |
+
document.getElementById('target_yaw').value = ori.yaw;
|
| 981 |
+
document.getElementById('target_yaw_val').innerText = ori.yaw.toFixed(2);
|
| 982 |
}
|
| 983 |
|
| 984 |
// Update control mode display
|