diff --git a/web/pose_3d.js b/web/pose_3d.js index 8a03061..98930f8 100644 --- a/web/pose_3d.js +++ b/web/pose_3d.js @@ -94,13 +94,18 @@ function checkWorkspace(side, position_m) { // Posizioni torso e spalle hardcoded (riferimento visivo, non IK) const TORSO_POS = new THREE.Vector3(0, 0, 0.40); -// Posizione approssimata delle spalle del G1 in base frame (zero-joint pose -// dell'URDF). Usato come fallback visivo quando /state e' offline e per il -// workspace check (raggiungibilita'). +// Posizioni di riferimento del G1 in base frame (feet on floor convention, +// URDF alzato di 0.793m). Costanti approssimate, non vengono usate per IK +// vera ma per: (1) workspace check (centro = spalla, raggio = braccio teso), +// (2) fallback delle sfere polso quando /state e' offline (posa zero-joint). const SHOULDER = { right: new THREE.Vector3(0.0, -0.18, 1.05), left: new THREE.Vector3(0.0, 0.18, 1.05), }; +const WRIST_ZERO_POSE = { + right: new THREE.Vector3(0.0, -0.18, 0.45), // braccia giu', polso ~45cm sopra il suolo + left: new THREE.Vector3(0.0, 0.18, 0.45), +}; const ARM_MAX_REACH_M = 0.62; // braccio teso G1 (upper+forearm+palm ~10+25+25 cm) // ----- URDF loader ----- @@ -133,7 +138,9 @@ async function loadG1Urdf(scene) { loader.load( '/static/vendor/g1/g1.urdf', (robot) => { - // G1 URDF uses Z-up too (Unitree convention) so no rotation needed + // G1 URDF uses Z-up (Unitree convention). Pelvi e' all'origine, + // alziamo il robot di ~0.793m cosi' i piedi toccano la griglia Z=0. + robot.position.z = 0.793; scene.add(robot); console.log('[pose_3d] G1 URDF caricato:', robot.name || 'g1'); resolve(robot); @@ -189,7 +196,7 @@ function initScene() { // Arms for (const side of ['right', 'left']) { const wrist = makeWristMarker(side === 'right' ? 0x4da3ff : 0xff5e7e); - wrist.position.copy(SHOULDER[side]); // posizione di partenza, sarà aggiornata dal polling + wrist.position.copy(WRIST_ZERO_POSE[side]); // posizione fallback "braccia giù" wrist.userData.side = side; scene.add(wrist); state.arms[side] = wrist;