예제 #1
0
static int update_pose_3pt(struct frame_type *frame)
{
  if(frame->bloblist.num_blobs < 3){
    return -1;
  }
  if(ltr_int_is_finite(frame->bloblist.blobs[0].x) && ltr_int_is_finite(frame->bloblist.blobs[0].y) &&
      ltr_int_is_finite(frame->bloblist.blobs[1].x) && ltr_int_is_finite(frame->bloblist.blobs[1].y) &&
      ltr_int_is_finite(frame->bloblist.blobs[2].x) && ltr_int_is_finite(frame->bloblist.blobs[2].y)){
  }else{
    return -1;
  }
  if(tracking_dbg_flag == DBG_ON){
    unsigned int i;
    for(i = 0; i < frame->bloblist.num_blobs; ++i){
      ltr_int_log_message("*DBG_t* %d: %g %g %d\n", i, frame->bloblist.blobs[i].x, frame->bloblist.blobs[i].y,
                          frame->bloblist.blobs[i].score);
    }
    ltr_int_log_message("*DBG_t* d1 = %g   d2 = %g   d3 = %g\n",
      two_d_size(frame->bloblist.blobs[0], frame->bloblist.blobs[1]),
      two_d_size(frame->bloblist.blobs[0], frame->bloblist.blobs[2]),
      two_d_size(frame->bloblist.blobs[1], frame->bloblist.blobs[2]));
  }

  linuxtrack_pose_t t;
  linuxtrack_abs_pose_t abs_pose;
  if(!ltr_int_pose_process_blobs(frame->bloblist, &t, &abs_pose, recenter)){
    return -1;
  }
  recenter = false;
  double tmp_angles[3], tmp_translations[3];


  tmp_angles[0] = t.raw_pitch;
  tmp_angles[1] = t.raw_yaw;
  tmp_angles[2] = t.raw_roll;
  tmp_translations[0] = t.raw_tx;
  tmp_translations[1] = t.raw_ty;
  tmp_translations[2] = t.raw_tz;

  if(!ltr_int_is_vector_finite(tmp_angles) || !ltr_int_is_vector_finite(tmp_translations)){
    return -1;
  }

  if(behind){
    tmp_angles[0] *= -1;
    tmp_angles[2] *= -1;
    tmp_translations[0] *= -1;
    tmp_translations[2] *= -1;
  }

  pthread_mutex_lock(&pose_mutex);
  current_pose.pose.raw_pitch = tmp_angles[0];
  current_pose.pose.raw_yaw = tmp_angles[1];
  current_pose.pose.raw_roll = tmp_angles[2];
  current_pose.pose.raw_tx = tmp_translations[0];
  current_pose.pose.raw_ty = tmp_translations[1];
  current_pose.pose.raw_tz = tmp_translations[2];
  current_pose.abs_pose.abs_pitch = abs_pose.abs_pitch;
  current_pose.abs_pose.abs_yaw = abs_pose.abs_yaw;
  current_pose.abs_pose.abs_roll = abs_pose.abs_roll;
  current_pose.abs_pose.abs_tx = abs_pose.abs_tx;
  current_pose.abs_pose.abs_ty = abs_pose.abs_ty;
  current_pose.abs_pose.abs_tz = abs_pose.abs_tz;
  pthread_mutex_unlock(&pose_mutex);
  if(raw_dbg_flag == DBG_ON){
    printf("*DBG_r* yaw: %g pitch: %g roll: %g\n", tmp_angles[0], tmp_angles[1], tmp_angles[2]);
    ltr_int_log_message("*DBG_r* x: %g y: %g z: %g\n",
                        tmp_translations[0], tmp_translations[1], tmp_translations[2]);
  }

  return 0;
}
예제 #2
0
bool ltr_int_postprocess_axes(ltr_axes_t axes, linuxtrack_pose_t *pose, linuxtrack_pose_t *unfiltered)
{
//  printf(">>Pre: %f %f %f  %f %f %f\n", pose->raw_pitch, pose->raw_yaw, pose->raw_roll,
//         pose->raw_tx, pose->raw_ty, pose->raw_tz);
//  static float filterfactor=1.0;
//  ltr_int_get_filter_factor(&filterfactor);
  static float filtered_angles[3] = {0.0f, 0.0f, 0.0f};
  static float filtered_translations[3] = {0.0f, 0.0f, 0.0f};
  //ltr_int_get_axes_ff(axes, filter_factors);
  double raw_angles[3];

  //Single point must be "denormalized"

  raw_angles[0] = unfiltered->pitch = ltr_int_val_on_axis(axes, PITCH, pose->raw_pitch);
  raw_angles[1] = unfiltered->yaw = ltr_int_val_on_axis(axes, YAW, pose->raw_yaw);
  raw_angles[2] = unfiltered->roll = ltr_int_val_on_axis(axes, ROLL, pose->raw_roll);
  //printf(">>Raw: %f %f %f\n", raw_angles[0], raw_angles[1], raw_angles[2]);

  if(!ltr_int_is_vector_finite(raw_angles)){
    return false;
  }

  pose->pitch = clamp_angle(ltr_int_filter_axis(axes, PITCH, raw_angles[0], &(filtered_angles[0])));
  pose->yaw = clamp_angle(ltr_int_filter_axis(axes, YAW, raw_angles[1], &(filtered_angles[1])));
  pose->roll = clamp_angle(ltr_int_filter_axis(axes, ROLL, raw_angles[2], &(filtered_angles[2])));

  double rotated[3];
  double transform[3][3];

  double displacement[3];
  displacement[0] = ltr_int_val_on_axis(axes, TX, pose->raw_tx);
  displacement[1] = ltr_int_val_on_axis(axes, TY, pose->raw_ty);
  displacement[2] = ltr_int_val_on_axis(axes, TZ, pose->raw_tz);
  if(ltr_int_do_tr_align()){
    //printf("Translations: Aligned\n");
    ltr_int_euler_to_matrix(pose->pitch / 180.0 * M_PI, pose->yaw / 180.0 * M_PI,
                            pose->roll / 180.0 * M_PI, transform);
    ltr_int_matrix_times_vec(transform, displacement, rotated);
    if(!ltr_int_is_vector_finite(rotated)){
      return false;
    }
//  ltr_int_print_matrix(transform, "trf");
//  ltr_int_print_vec(displacement, "mv");
//  ltr_int_print_vec(rotated, "rotated");
    unfiltered->tx = rotated[0];
    unfiltered->ty = rotated[1];
    unfiltered->tz = rotated[2];
  }else{
    //printf("Translations: Unaligned\n");
    unfiltered->tx = displacement[0];
    unfiltered->ty = displacement[1];
    unfiltered->tz = displacement[2];
  }

  pose->tx =
    ltr_int_filter_axis(axes, TX, unfiltered->tx, &(filtered_translations[0]));
  pose->ty =
    ltr_int_filter_axis(axes, TY, unfiltered->ty, &(filtered_translations[1]));
  pose->tz =
    ltr_int_filter_axis(axes, TZ, unfiltered->tz, &(filtered_translations[2]));
  //printf(">>Post: %f %f %f  %f %f %f\n", pose->pitch, pose->yaw, pose->roll, pose->tx, pose->ty, pose->tz);
  return true;
}
예제 #3
0
파일: pose.c 프로젝트: uglyDwarf/linuxtrack
bool ltr_int_pose_process_blobs(struct bloblist_type blobs,
                        linuxtrack_pose_t *pose, linuxtrack_abs_pose_t *abs_pose, bool centering)
{
//  double points[3][3];
  double points[3][3] = {{28.35380,    -1.24458,    -0.11606},
                         {103.19049,   -44.13490,   -76.36657},
			 {131.32094,    10.75412,   -50.19649}
  };

/*
  double points[3][3] = {{22.923,   110.165,    28.070},
                         {91.241,    44.781,    91.768},
			 {184.262,    18.075,    47.793}
  };
*/
  if(ltr_int_use_alter()){
    alter_pose(blobs, points, centering);
  }else{
    iter_pose(blobs, points, centering);
  }

  double angles[3];
  double displacement[3];
  double abs_center[3] = {0.0, 0.0, 0.0};
  double abs_angles[3] = {0.0, 0.0, 0.0};
  if(ltr_int_use_oldrot()){
    //printf("Rotations: Old algo\n");
    //ltr_int_print_matrix(points, "points");
    double new_base[3][3];
    double vec1[3];
    double vec2[3];
    ltr_int_make_vec(points[1], points[0], vec1);
    ltr_int_make_vec(points[2], points[0], vec2);
    ltr_int_make_base(vec1, vec2, new_base);

  //  ltr_int_print_matrix(new_base, "new_base");
    if(!ltr_int_is_matrix_finite(new_base)){
      return false;
    }
    if(centering == true){
      ltr_int_assign_matrix(new_base, center_base);
    }

    //all applications contain transposed base
    ltr_int_transpose_in_place(new_base);

    double new_center[3];
    ltr_int_matrix_times_vec(new_base, model_ref, vec1);
    ltr_int_add_vecs(points[0], vec1, new_center);

  //  ltr_int_print_matrix(new_base, "new_base'");
  //  ltr_int_print_vec(model_ref, "model_ref");
  //  ltr_int_print_vec(points[0], "pt0");
  //  ltr_int_print_vec(new_center, "new_center");

    if(centering == true){
      int i;
      for(i = 0; i < 3; ++i){
        center_ref[i] = new_center[i];
      }
    }
    abs_center[0] = new_center[0];
    abs_center[1] = new_center[1];
    abs_center[2] = new_center[2];
    ltr_int_make_vec(new_center, center_ref, displacement);
  //  ltr_int_print_vec(center_ref, "ref_pt");
  //  ltr_int_print_vec(displacement, "mv");

  //  ltr_int_print_matrix(center_base, "center_base");

    double transform[3][3];
    ltr_int_mul_matrix(new_base, center_base, transform);
  //  ltr_int_print_matrix(new_base, "new_base'");
  //  ltr_int_print_matrix(center_base, "center_base");
  //  ltr_int_print_matrix(transform, "transform");
    //double pitch, yaw, roll;
    ltr_int_matrix_to_euler(transform, &(angles[0]), &(angles[1]), &(angles[2]));
  }else{
    //printf("Rotations: New algo\n");
    //ltr_int_print_matrix(points, "points");
    if(centering){
      if(!ltr_int_center(points[0], points[1], points[2], c_base, tr_center, tr_rot)){
        ltr_int_log_message("Couldn't center in new pose!\n");
        return false;
      }
    }
    if(!ltr_int_get_pose(points[0], points[1], points[2], c_base, tr_center,
                         tr_rot, angles, displacement, abs_center, abs_angles)){
      ltr_int_log_message("Couldn't determine the pose in new pose!\n");
      return false;
    }
  }

  ltr_int_mul_vec(angles, 180.0 /M_PI, angles);
  ltr_int_mul_vec(abs_angles, 180.0 /M_PI, abs_angles);

  if(ltr_int_is_vector_finite(angles) && ltr_int_is_vector_finite(displacement)){
    pose->raw_pitch = angles[0];
    pose->raw_yaw = angles[1];
    pose->raw_roll = angles[2];
    pose->raw_tx = displacement[0];
    pose->raw_ty = displacement[1];
    pose->raw_tz = displacement[2];
    abs_pose->abs_pitch = abs_angles[0];
    abs_pose->abs_yaw = abs_angles[1];
    abs_pose->abs_roll = abs_angles[2];
    abs_pose->abs_tx = abs_center[0];
    abs_pose->abs_ty = abs_center[1];
    abs_pose->abs_tz = abs_center[2];
    return true;
  }
  return false;
}