private void createLimbInstance(
      Skeleton skeleton, int limb, int[] limb_about, List<Attribute> limb_att) {
    int att = 1;
    Instance ist = new DenseInstance((SPATIAL_COORD * limb_about.length) + 1);

    limb_att = classifier.getLimbFeatureDataSet(limb);

    for (int i = 0; i < limb_about.length; i++) {
      if (limb_about[i] != TORSO) {
        /*
         * il punto di riferimento per tutti i joint (meno che per il
         * TORSO), ossia il centro degli assi che descrivono lo spazio
         * in cui si possono muovere è il TORSO stesso.
         */
        Point3D<Float> joint = skeleton.getJoint(SKELETON_JOINT(limb_about[i])).getPosition();

        ist.setValue((Attribute) limb_att.get(att), (joint.getX() - x_torso));
        ist.setValue((Attribute) limb_att.get(att + 1), (joint.getY() - y_torso));
        ist.setValue((Attribute) limb_att.get(att + 2), (joint.getZ() - z_torso));

        att += 3;
      } else {
        /*
         * il punto di riferimento per il BODY invece è il punto con
         * coordinate (0, -Ytorso, 0), e cioè, il punto sul pavimento
         * esattamente perpendicolare al TORSO stesso
         */
        Point3D<Float> left_foot = skeleton.getJoint(JointType.LEFT_FOOT).getPosition();
        Point3D<Float> right_foot = skeleton.getJoint(JointType.RIGHT_FOOT).getPosition();

        // save the two probably torso's new coordinates
        float torso_footSX = y_torso - left_foot.getY();
        float torso_footDX = y_torso - right_foot.getY();

        float y_torso_rifFoot = (torso_footSX > torso_footDX) ? torso_footSX : torso_footDX;

        ist.setValue((Attribute) limb_att.get(att), 0);
        ist.setValue((Attribute) limb_att.get(att + 1), y_torso_rifFoot);
        ist.setValue((Attribute) limb_att.get(att + 2), 0);

        att += 3;
      }
    }

    skeletonIstances.add(ist);
  }
  private void createSkeletonInstances(UserData user) throws Exception {

    skeletonIstances = new ArrayList<Instance>();

    Skeleton skeleton = user.getSkeleton();
    double torso_conf = skeleton.getJoint(JointType.TORSO).getPositionConfidence();

    if (torso_conf >= TORSO_CONF) {
      // se TORSO rilevato correttamente : IMPORTANTE per la correttezza
      // delle distanze dei vari limb

      Point3D<Float> torso_pos = skeleton.getJoint(JointType.TORSO).getPosition();

      // save origin's coordinates
      x_torso = (Float) torso_pos.getX();
      y_torso = (Float) torso_pos.getY();
      z_torso = (Float) torso_pos.getZ();

      createLimbInstance(skeleton, TRACKER_HEAD_LIMB, HEAD_ABOUT, head_att);

      createLimbInstance(skeleton, TRACKER_BODY_UPRIGHT_LIMB, BODY_UPRIGHT_ABOUT, body_upright_att);
      createLimbInstance(
          skeleton,
          TRACKER_BODY_STAN_SLANTING_LIMB,
          BODY_STAN_SLANTING_ABOUT,
          body_stan_slanting_att);
      createLimbInstance(
          skeleton, TRACKER_BODY_SIT_SLANTING_LIMB, BODY_SIT_SLANTING_ABOUT, body_sit_slanting_att);

      createLimbInstance(skeleton, TRACKER_LEFT_ARM_LIMB, LEFT_ARM_ABOUT, left_arm_att);
      createLimbInstance(skeleton, TRACKER_RIGHT_ARM_LIMB, RIGHT_ARM_ABOUT, right_arm_att);
      createLimbInstance(skeleton, TRACKER_LEFT_LEG_LIMB, LEFT_LEG_ABOUT, left_leg_att);
      createLimbInstance(skeleton, TRACKER_RIGHT_LEG_LIMB, RIGHT_LEG_ABOUT, right_leg_att);

      sendInstance();
    }
  }