<!--
  Pulcino — modello MuJoCo (MJCF) fedele a SPEC.md §3.
  Unità SI: metri, kg, radianti, secondi. Frame robot: x avanti, y sinistra, z su.

  Quote in piedi (tutti i giunti a 0), suola a z = 0:
    suola piede ........ z = 0.000  (spessore 4 mm → centro box a z = 0.002)
    asse caviglia ...... z = 0.014  (suola 14 mm sotto l'asse)
    asse hip_pitch ..... z = 0.082  (gamba "a trampolo" 68 mm)
    asse hip_roll ...... z = 0.104  (22 mm sopra hip_pitch)
    fondo torso ........ z = 0.110  (hip_roll 6 mm sotto il fondo)
    centro torso ....... z = 0.146,  cima torso z = 0.182  (altezza totale 182 mm)

  Convenzione dei segni (SPEC §3, semantica speculare) tradotta negli assi fisici:
    hip_pitch  +  => piede in avanti (+x)       : asse (0,-1,0) per entrambe le gambe
    ankle_pitch + => punta del piede in su      : asse (0,-1,0) per entrambe le gambe
    hip_roll   +  => piede verso l'esterno      : sinistra asse (+1,0,0), destra asse (-1,0,0)
  Verificato numericamente da test_segni.py.

  Servo MG90S: attuatore "position" con kp alto, coppia saturata a ±0.2 N·m (forcerange),
  kv = 0.2/8 = 0.025 N·m·s/rad che imita la forza contro-elettromotrice del motore
  (a 8 rad/s la coppia disponibile va a zero), armature = inerzia del rotore riflessa dal
  riduttore. Il limite di velocità del setpoint, la banda morta e la latenza sono simulati
  in env.py (modello servo "senza feedback").

  Collisioni: solo piedi↔pavimento e torso↔pavimento (i piedi non collidono tra loro: a
  giunti a zero si toccano esattamente sul bordo interno, 2×22 mm = 44 mm; env.py penalizza
  l'incrocio dei piedi).
-->
<mujoco model="pulcino">
  <compiler angle="radian" autolimits="true"/>
  <option timestep="0.004" integrator="implicitfast" gravity="0 0 -9.81"/>

  <default>
    <joint armature="0.0005" damping="0.002" frictionloss="0.002" limited="true"/>
    <!-- di base nessuna collisione: la attiviamo solo dove serve -->
    <geom contype="0" conaffinity="0" rgba="0.62 0.66 0.72 1"/>
    <position kp="5.0" kv="0.025" forcerange="-0.2 0.2" forcelimited="true" ctrllimited="true"/>
    <default class="roll">
      <joint range="-0.35 0.35"/>
      <position ctrlrange="-0.35 0.35"/>
    </default>
    <default class="pitch">
      <joint range="-0.80 0.80"/>
      <position ctrlrange="-0.80 0.80"/>
    </default>
  </default>

  <asset>
    <texture name="grid" type="2d" builtin="checker" rgb1="0.16 0.18 0.22" rgb2="0.22 0.25 0.30" width="256" height="256"/>
    <material name="grid" texture="grid" texrepeat="8 8" reflectance="0.1"/>
  </asset>

  <visual>
    <global offwidth="1280" offheight="720"/>
  </visual>

  <worldbody>
    <light pos="0 0 1.5" dir="0 0 -1" directional="true"/>
    <!-- pavimento: contype=1, conaffinity=1 -->
    <geom name="floor" type="plane" size="0 0 0.05" material="grid" friction="0.8 0.005 0.0001"
          contype="1" conaffinity="1"/>

    <body name="torso" pos="0 0 0.146">
      <freejoint name="root"/>
      <!-- corpo 56×84×72 mm, 230 g (batterie, elettronica, 2 servo hip_roll) -->
      <geom name="torso" type="box" size="0.028 0.042 0.036" mass="0.230"
            rgba="0.55 0.62 0.75 1" contype="4" conaffinity="1"/>
      <!-- "faccia" solo estetica -->
      <geom type="box" size="0.002 0.030 0.020" pos="0.029 0 0.010" mass="0" rgba="0.2 0.25 0.35 1"/>
      <!-- MPU6050 al centro sul fondo del torso -->
      <site name="imu" pos="0 0 -0.034" size="0.004"/>

      <!-- ===================== GAMBA SINISTRA ===================== -->
      <body name="L_hip" pos="0 0.022 -0.042">
        <joint name="L_hip_roll" class="roll" axis="1 0 0"/>
        <!-- staffa_anca + servo hip_pitch: 16 g -->
        <geom type="box" size="0.012 0.010 0.014" pos="0 0 -0.011" mass="0.016"/>
        <body name="L_leg" pos="0 0 -0.022">
          <joint name="L_hip_pitch" class="pitch" axis="0 -1 0"/>
          <!-- gamba + servo ankle (in basso): 20 g, baricentro spostato verso la caviglia -->
          <geom type="box" size="0.008 0.010 0.030" pos="0 0 -0.042" mass="0.020"/>
          <body name="L_foot" pos="0 0 -0.068">
            <joint name="L_ankle_pitch" class="pitch" axis="0 -1 0"/>
            <!-- piede 76×44×4 mm, 12 g, centro +6 mm in x, suola 14 mm sotto l'asse -->
            <geom name="L_foot" type="box" size="0.038 0.022 0.002" pos="0.006 0 -0.012" mass="0.012"
                  friction="0.8 0.005 0.0001" contype="2" conaffinity="1" rgba="0.85 0.70 0.25 1"/>
            <site name="L_toe" pos="0.044 0 -0.014" size="0.003"/>
          </body>
        </body>
      </body>

      <!-- ===================== GAMBA DESTRA ======================= -->
      <body name="R_hip" pos="0 -0.022 -0.042">
        <joint name="R_hip_roll" class="roll" axis="-1 0 0"/>
        <geom type="box" size="0.012 0.010 0.014" pos="0 0 -0.011" mass="0.016"/>
        <body name="R_leg" pos="0 0 -0.022">
          <joint name="R_hip_pitch" class="pitch" axis="0 -1 0"/>
          <geom type="box" size="0.008 0.010 0.030" pos="0 0 -0.042" mass="0.020"/>
          <body name="R_foot" pos="0 0 -0.068">
            <joint name="R_ankle_pitch" class="pitch" axis="0 -1 0"/>
            <geom name="R_foot" type="box" size="0.038 0.022 0.002" pos="0.006 0 -0.012" mass="0.012"
                  friction="0.8 0.005 0.0001" contype="2" conaffinity="1" rgba="0.85 0.70 0.25 1"/>
            <site name="R_toe" pos="0.044 0 -0.014" size="0.003"/>
          </body>
        </body>
      </body>
    </body>
  </worldbody>

  <!-- Ordine degli attuatori = indici SPEC (0..5) -->
  <actuator>
    <position name="L_hip_roll"    joint="L_hip_roll"    class="roll"/>
    <position name="L_hip_pitch"   joint="L_hip_pitch"   class="pitch"/>
    <position name="L_ankle_pitch" joint="L_ankle_pitch" class="pitch"/>
    <position name="R_hip_roll"    joint="R_hip_roll"    class="roll"/>
    <position name="R_hip_pitch"   joint="R_hip_pitch"   class="pitch"/>
    <position name="R_ankle_pitch" joint="R_ankle_pitch" class="pitch"/>
  </actuator>

  <sensor>
    <gyro name="gyro" site="imu"/>
    <accelerometer name="accel" site="imu"/>
    <framequat name="torso_quat" objtype="site" objname="imu"/>
  </sensor>
</mujoco>
