Exemplo n.º 1
0
int main(void) {
	char c;
	
	init_robot();
	fflush(stdin);
	
	printf("Usage: %c to exit, %c to move forward, %c to move backward, %c to rotate to left, %c to rotate to right!\n\n", EXIT_S, MF_S, MB_S, RL_S, RR_S);

    print_world();
	scanf("%c", &c);
	
	while(c != EXIT_S) {
		switch(c) {
			case MF_S:
				move_robot(MOVE_FWD);
				print_world();
				break;
			case MB_S:
				move_robot(MOVE_BWD);
				print_world();
				break;
			case RL_S:
				rotate_90_left();
				print_world();
				break;
			case RR_S:
				rotate_90_right();
				print_world();
				break;
		}
		scanf("%c", &c);
	}
	
	return 0;
} 
Exemplo n.º 2
0
// Initialise the software
TICK_COUNT appInitSoftware(TICK_COUNT loopStart){
	init_robot();
	init_error_list();
	init_map();
	init_rct_set();
	uartAttach(UART3, &lbRcv);
	return 0;
}
Exemplo n.º 3
0
/*!
 @brief Program entry point
 */
int main (void) {
	struct MagnetInit magnetInit;
	struct ServoInit boomServoInit, crowdServoInit, swingServoInit;
	struct RobotInit robotInit;
	
	magnetInit.periph = RCC_AHB1Periph_GPIOD;
	magnetInit.GPIOx = GPIOD;
	magnetInit.pin = GPIO_Pin_15;
	
	boomServoInit.CCR = 1;
	boomServoInit.maxPosition = BOOM_ANGLE_MAX;
	boomServoInit.minPosition = BOOM_ANGLE_MIN;
	
	crowdServoInit.CCR = 2;
	crowdServoInit.maxPosition = CROWD_ANGLE_MAX;
	crowdServoInit.minPosition = CROWD_ANGLE_MIN;
	
	swingServoInit.CCR = 3;
	swingServoInit.maxPosition = SWING_ANGLE_MAX;
	swingServoInit.minPosition = SWING_ANGLE_MIN;
	
	robotInit.boomServo = &boomServo;
	robotInit.crowdServo = &crowdServo;
	robotInit.swingServo = &swingServo;
	
	osThreadId tid_armThread;
	osThreadId tid_ledThread;

	init_TIM4(1 / SERVO_DUTY_CYCLE_STEP, SERVO_FREQUENCY);
	init_LEDS_PWM();
	init_LEDS();
	
	init_servo(&boomServo, &boomServoInit);
	init_servo(&crowdServo, &crowdServoInit);
	init_servo(&swingServo, &swingServoInit);
	init_robot(&robot, &robotInit);
	init_magnet(&magnet, &magnetInit);
	init_receiver(&receiver);
	
	tid_armThread = osThreadCreate(osThread(armThread), NULL);
	tid_ledThread = osThreadCreate(osThread(ledThread), NULL);
	
	osDelay(osWaitForever);
}
Exemplo n.º 4
0
void main_init() {

    int i;
    float starting_speed = 0.0;
    init_robot();
    flag = 0;
    robot_state = malloc(sizeof (float) *3);

    for (i = 0; i < LEN_PIC_BUFFER; i++) {
        set_vel_2_array(pic_buffer[i], starting_speed, starting_speed);
    }

    write(pic_fd, pic_message_reset_steps_acc, PACKET_TIMING_LENGTH + 1);
    tcflush(pic_fd, TCOFLUSH);
    sync();
    steps_anomaly = 0;

#ifdef TEST_KALMAN
float v=0;
float w=0;
set_robot_speed(&v,&w);
#endif

#ifdef OB_AV
	init_probstavoid_module();
#endif

#ifdef CARTESIAN_REGULATOR
	viapoints[0][0]=38;
	viapoints[0][1]=119;
	viapoints[0][2]=0;

	viapoints[1][0]=98;
	viapoints[1][1]=161;
	viapoints[1][2]=0;


	viapoints[2][0]=187;
	viapoints[2][1]=179;
	viapoints[2][2]=0;

	viapoints[3][0]=158;
	viapoints[3][1]=238;
	viapoints[3][2]=0;

	viapoints[4][0]=187;
	viapoints[4][1]=268;
	viapoints[4][2]=0;
	curr_via=0;
	via_done=0;

#endif

#ifdef HOKUYO
	init_urg_laser(&urg,ON_DEMAND);
#endif

#ifdef JOYSTICK
	init_joystick();
#endif
	
#ifdef EKF_LOC	
	load_map("ekf_map.txt");
        init_ekf();

#ifdef HOKUYO_SENSOR
    for (i=0; i< NUM_SENS; i++){
        ANGLE_IDX[i]=urg_rad2index(urg,ANGLE_H[i]);
        printf("angle: %f   \tidx: %d\n",ANGLE_H[i],urg_rad2index(urg,ANGLE_H[i]));
    }
#endif
	
        xpost.x=50;
	xpost.y=45;
	xpost.th=M_PI/2;	
	
	xpred.x=0;
	xpred.y=0;
	xpred.th=0;
	
#endif	
	
}
Exemplo n.º 5
0
int main(int argc, char** argv)
{
  init_robot(&robot);

  struct coord *destination;

  destination = new_coord(0, 0);

  destination->x = 0;
  destination->y = 0;

  pthread_mutex_init(&state.frame_lock, NULL);
  pthread_cond_init(&state.has_frame, NULL);

  robot.dest = destination;

  gpioSetMode(4, PI_OUTPUT);
  gpioSetMode(24, PI_OUTPUT);
  gpioSetMode(5, PI_OUTPUT);
  gpioSetMode(14, PI_OUTPUT);

  //870 for at the ground, 

//  gpioServo(24,1380);
//  gpioServo(4, 2100);

  pthread_t range_thread, render_thread, cv_thread;

  pthread_create(&range_thread, NULL, &range_read, &robot);
  pthread_create(&render_thread, NULL, &render_task, NULL);
//  pthread_create(&cv_thread, NULL, &find_circles, &state);

  gpioWrite(5, 0);
  gpioWrite(14, 0);

  start_control_panel(&robot, &state);

  pthread_t this_thread = pthread_self();

  //set_thread_priority(this_thread, 0);
  //set_thread_priority(robot.server->serve_thread, 1);
  //set_thread_priority(range_thread, 2);

  read(robot.encoder_handle, robot.sensor_data, sizeof(robot.sensor_data));

  getQuaternion(&robot.position.orientation, robot.sensor_data);

  robot.position.last_left = *((int *) (robot.sensor_data + 42));
  robot.position.last_right = *((int *) (robot.sensor_data + 46));

  struct robot_task *position_task, *point_task, *remote_task,
    *spin_task, *move_task, *adjust_task, *stand_up_task, *fly_task,
      *avoid_task, *stay_task;

  position_task = (struct robot_task *)malloc(sizeof(*position_task));

  position_task->task_func = &update_position2;

  fly_task = (struct robot_task *)malloc(sizeof(*fly_task));

  fly_task->task_func = &buzz;

  point_task = (struct robot_task *)malloc(sizeof(*point_task));

  robot.turret.target.x = 500;
  robot.turret.target.y = 0;
  robot.turret.target.z = 0;

  point_task->task_func = &pointer;

  remote_task = (struct robot_task *)malloc(sizeof(*remote_task));

  remote_task->task_func = &remote;

  avoid_task = (struct robot_task *)malloc(sizeof(*avoid_task));

  avoid_task->task_func = &stay_away;

  stay_task = (struct robot_task *)malloc(sizeof(*stay_task));

  stay_task->task_func = &stay_within;

  move_task = (struct robot_task *)malloc(sizeof(*move_task));

  move_task->task_func = &move;

  struct waypoint the_point;

  the_point.point.x = 1000;
  the_point.point.y = 0;
  the_point.point.z = -40;

  INIT_LIST_HEAD(&the_point.list_entry);

//  list_add(&the_point.list_entry, &robot.waypoints);

  adjust_task = (struct robot_task *)malloc(sizeof(*adjust_task));

  adjust_task->task_func = &adjust_speeds;

  stand_up_task = (struct robot_task *)malloc(sizeof(*stand_up_task));

  stand_up_task->task_func = &stand_up;

  INIT_LIST_HEAD(&position_task->list_item);
  INIT_LIST_HEAD(&fly_task->list_item);
  INIT_LIST_HEAD(&point_task->list_item);
  INIT_LIST_HEAD(&remote_task->list_item);
  INIT_LIST_HEAD(&avoid_task->list_item);
  INIT_LIST_HEAD(&stay_task->list_item);
  INIT_LIST_HEAD(&move_task->list_item);
  INIT_LIST_HEAD(&adjust_task->list_item);
  INIT_LIST_HEAD(&stand_up_task->list_item);

  list_add_tail(&position_task->list_item, &robot.task_list);
//  list_add_tail(&fly_task->list_item, &robot.task_list);
  list_add_tail(&point_task->list_item, &robot.task_list);
  list_add_tail(&remote_task->list_item, &robot.task_list);
//  list_add_tail(&avoid_task->list_item, &robot.task_list);
//  list_add_tail(&stay_task->list_item, &robot.task_list);
  list_add_tail(&move_task->list_item, &robot.task_list);
  list_add_tail(&adjust_task->list_item, &robot.task_list);
  list_add_tail(&stand_up_task->list_item, &robot.task_list);

  get_sensor_data(&robot.position2, robot.sensor_data);

  init_position(&robot.position2);

 //Variables for Kalman filter
  struct matrix_2x2 A, B, H, Q, R, current_prob_estimate;

  float current_state_estimate[2];

  current_state_estimate[0] = 0;
  current_state_estimate[1] = 0;

  A.elements[0][0] = 1;
  A.elements[0][1] = 0;
  A.elements[1][0] = 0;
  A.elements[1][1] = 1;

  Q.elements[0][0] = 0.01;
  Q.elements[0][1] = 0;
  Q.elements[1][0] = 0;
  Q.elements[1][1] = 0.01;

  R.elements[0][0] = 0.4;
  R.elements[0][1] = 0;
  R.elements[1][0] = 0;
  R.elements[1][1] = 0.4;

  current_prob_estimate.elements[0][0] = 1;
  current_prob_estimate.elements[0][1] = 0;
  current_prob_estimate.elements[1][0] = 0;
  current_prob_estimate.elements[1][1] = 1;

  static int look_wait = 0;

  while(1)
  {
    read(robot.encoder_handle, robot.sensor_data, sizeof(robot.sensor_data));

    get_sensor_data(&robot.position2, robot.sensor_data);

//    fprintf(stderr, "%i, %i\n", robot.position2.left, robot.position2.right);

    if (!((robot.position2.orientation.x == robot.position2.orientation.y) &&
      (robot.position2.orientation.x == robot.position2.orientation.z) &&
      (robot.position2.orientation.x == robot.position2.orientation.w)))
    {
      do_robot_tasks(&robot);
    }

    state.roll = robot.turret.roll * 180 / M_PI;

    static struct vect sightings[3];

    int has_dest = list_empty(&robot.waypoints);

    int is_spinning = list_empty(&fly_task->list_item);

//    fprintf(stderr, "%i, %i\n", has_dest, is_spinning);

//Prediction Step
    float predicted_state_estimate[2];

    mat_mult_2xv(predicted_state_estimate, &A, current_state_estimate);

    struct matrix_2x2 predicted_prob_estimate;

    mat_add_2x2(&predicted_prob_estimate, & current_prob_estimate, &Q);

    if (!isnan(state.x_pos) && state.set_target >= 1)
    {
      float x_in_vid = (state.x_pos - .5) * -2;
      float y_in_vid = (state.y_pos - .5) * -2;

// Get obervation.
      screen_to_world_vect(&robot, &sightings[0], x_in_vid, y_in_vid);

      float observation[2];

      observation[0] = sightings[0].x;
      observation[1] = sightings[0].y;

      float innovation[2];

      innovation[0] = observation[0] - predicted_state_estimate[0];
      innovation[1] = observation[1] - predicted_state_estimate[1];

      float innovation_magnitude = sqrtf((innovation[0] * innovation[0]) + (innovation [1] * innovation[1]));

      //fprintf(stderr, "%f, %f, %f, %f, %f, %f, %f, %f\n", innovation_magnitude, robot.turret.yaw, robot.turret.pitch,  x_in_vid, y_in_vid, sightings[0].x, sightings[0].y, sightings[0].z);

      struct matrix_2x2 innovation_covariance;

      mat_add_2x2(&innovation_covariance, &predicted_prob_estimate, &R);

// Update

      struct matrix_2x2 kalman_gain, inv_innovation_covariance;
  
      mat_inverse_2x2(&inv_innovation_covariance, &innovation_covariance);

      mat_mult_2x2(&kalman_gain, &predicted_prob_estimate, &inv_innovation_covariance);

      float step[2];

      mat_mult_2xv(step, &kalman_gain, innovation);

      current_state_estimate[0] = step[0] + predicted_state_estimate[0];
      current_state_estimate[1] = step[1] + predicted_state_estimate[1];

      struct matrix_2x2 intermediate;

      intermediate.elements[0][0] = 1 - kalman_gain.elements[0][0];
      intermediate.elements[0][1] = 0 - kalman_gain.elements[0][1];
      intermediate.elements[1][0] = 0 - kalman_gain.elements[1][0];
      intermediate.elements[1][1] = 1 - kalman_gain.elements[1][1];

      mat_mult_2x2(&current_prob_estimate, &intermediate, &predicted_prob_estimate);

      //fprintf(stderr, "%f, %f\n", current_state_estimate[0], current_state_estimate[1]);

      if (innovation_magnitude < 800)
      {
        look_wait = 300;

        list_del_init(&fly_task->list_item);

        if (innovation_magnitude < 100)
        {
          if (list_empty(&robot.waypoints))
          {
            list_add(&the_point.list_entry, &robot.waypoints);
          }

          robot.turret.target.x = current_state_estimate[0];
          robot.turret.target.y = current_state_estimate[1];
          robot.turret.target.z = -40;

          the_point.point.x = current_state_estimate[0];
          the_point.point.y = current_state_estimate[1];
          the_point.point.z = -40; 
          //fprintf(stderr, "time to stop spinning\n");
        }

        //fprintf(stderr, "%f, %f, %f\n", current_state_estimate[0], current_state_estimate[1], innovation_magnitude);
      }     

/*      if (fabs(state.x_pos) > .25 || fabs(state.y_pos) > .25)
      {
        robot.turret.target = temp;
        the_point.point = temp;
      }
      else
      {
        the_point.point = temp;
      }

      if (list_empty(&robot.waypoints))
      {
        list_del_init(&fly_task->list_item);  

        list_add_tail(&the_point.list_entry, &robot.waypoints);
      }*/

//      fprintf(stderr, "%f, %f\n", state.x_pos, state.y_pos);
//      fprintf(stderr, "%f, %f, %f\n", temp.x, temp.y, temp.z);
      state.set_target = 0;
    }

    if (look_wait > 0)
    {
      look_wait--;
    }

    if (list_empty(&robot.waypoints) && list_empty(&fly_task->list_item) && look_wait == 0)
    {
      list_add_tail(&fly_task->list_item, &robot.task_list);
//      fprintf(stderr, "I should spin\n");
    }
//    fprintf(stderr, "%i, %i\n", robot.position2.left, robot.position2.right);

    float distance = get_expected_distance(&robot);

//    fprintf(stderr, "%f, %f\n", distance, robot.range);
//    fprintf(stderr, "%f, %f, %f\n", robot.turret.target.x, robot.turret.target.y, robot.turret.target.z);
 //   screen_to_world_vect(&robot, &robot.turret.target, 0, 0);

//    fprintf(stderr, "%f, %f, %f\n", robot.turret.target.x, robot.turret.target.y, robot.turret.target.z);

    struct timeval now, then;

//    printf("%f, %f, %f, %f, %f, %f\n", robot.position2.position.x, robot.position2.position.y, robot.turret.target.x, robot.turret.target.y, robot.dest->x, robot.dest->y);

    gettimeofday(&now, NULL);    

/*    fprintf(stderr, "%ld.%06ld, %f, %f, %f, %f, %i, %i, %f\n", now.tv_sec, now.tv_usec,
      robot.position2.orientation.x, robot.position2.orientation.y,
        robot.position2.orientation.z, robot.position2.orientation.w, 
      robot.position2.left, robot.position2.right, robot.position2.heading);
*/
    //printf("%f\n", robot.range);

    //printf("%f, %f, %f\n", robot.position2.position.x, robot.position2.position.y, robot.position2.tilt);



//    fprintf(stderr, "%f, %f, %f, %i, %i\n", robot.position2.position.x, robot.position2.position.y, robot.position2.heading, robot.position2.left, robot.position2.right);
  }
}
Exemplo n.º 6
0
Arquivo: BA.c Projeto: kaisert/kilobot
int main(void)
{
  init_robot();
  main_program_loop(user_program);
  return 0;
}
Exemplo n.º 7
0
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
	if(nrhs!=3) {
		mexErrMsgIdAndTxt("kindyn:nrhs","3 inputs required: angles[28], anglesd[28], anglesdd[28] ");
	}

  int j, i;
  KIN_DYN r[ N_LINKS ];
  KIN_DYN lleg[ LLEG_LINKS ];
  KIN_DYN rleg[ RLEG_LINKS ];
  double q[4];
  double g_vector[3] = { 0.0, 0.0, 9.81 };
  double root_force_w[3];
  double root_torque_w[3];
  double v1[3];
  double w[3];

  init_kin_dyn();

  init_robot( r );
  init_lleg( lleg );
  init_rleg( rleg );


	double *input_angle;
	double *input_angled;
	double *input_angledd;
	input_angle = mxGetPr(prhs[0]);
	input_angled = mxGetPr(prhs[1]);
	input_angledd = mxGetPr(prhs[2]);

	/*
	double *pelvis_pos;
	double *pelvis_quat;
	pelvis_pos = mxGetPr(prhs[3]);
	pelvis_quat = mxGetPr(prhs[4]);
	*/

  for ( i = 0; i < 3; i++ )
    {
      r[0].position_w[i] = 0;
      r[0].angular_velocity_b[i] = 0;
      r[0].angular_acceleration_b[i] = 0;
      r[0].joint_acceleration_b[i] = 0;
      r[0].link_acceleration_b[i] = 0;
    }

  // default state for rest of robot
  for ( i = 0; i < N_LINKS; i++ )
    {
      r[i].angle = input_angle[i];
      r[i].angled = input_angled[i];
      r[i].angledd = input_angledd[i];
    }
  // set up ground joint
  //r[0].position_w[XX] = -0.0484;
  //r[0].position_w[YY] = 0;
  //r[0].position_w[ZZ] = 0.9271;


	// Put left foot on the ground and go up to find the pelvis
	lleg[0].angle = 0;
  lleg[0].angle = 0;
  lleg[0].sine = 0;
  lleg[0].cosine = 1;
  m3_identity( lleg[0].orientation );
  lleg[0].angled = 0;
  lleg[0].angledd = 0;
  lleg[0].position_w[XX] = 0;
  lleg[0].position_w[YY] = 0.089;
  lleg[0].position_w[ZZ] = 0;

	for(i=1; i < LLEG_JOINTS; i++){
		lleg[i].angle = r[11-i].angle;
		lleg[i].angled = r[11-i].angled;
		lleg[i].angled = r[11-i].angled;
		lleg[i].sine = sin( lleg[i].angle );
		lleg[i].cosine = cos( lleg[i].angle );
	}
	//FK
	forward_kinematics(lleg, LLEG_LINKS);

	double pelvis_offset[3];
	pelvis_offset[0] = 0;
	pelvis_offset[1] = -0.089;
	pelvis_offset[2] = 0;

	mv3_multiply(lleg[6].orientation,pelvis_offset,r[0].position_w);

	for(i=0;i<3;i++)
		r[0].position_w[i] += lleg[6].position_w[i];

	for(i=0;i<3;i++)
		for(j=0;j<3;j++)
			r[0].orientation[i][j] = lleg[6].orientation[i][j];

  r[0].angle = 0;
  r[0].sine = 0;
  r[0].cosine = 1;


  for ( i = 1; i < N_LINKS; i++ ){
		r[i].sine = sin( r[i].angle );
		r[i].cosine = cos( r[i].angle );
	}
  
  forward_kinematics( r, N_LINKS );

  //printf( "COM\n" );
	double total_com[3];
	double total_mass;
	total_com[XX] = 0;	total_com[YY] = 0;	total_com[ZZ] = 0;
	total_mass = 0;

  for ( i = 0; i < N_LINKS; i++ ){
    //printf( "%d: %g %g %g\n", i, r[i].com_w[XX], r[i].com_w[YY],r[i].com_w[ZZ] );
		total_com[XX] += (r[i].mass*r[i].com_w[XX]);
		total_com[YY] += (r[i].mass*r[i].com_w[YY]);
		total_com[ZZ] += (r[i].mass*r[i].com_w[ZZ]);
		total_mass += r[i].mass;
	}

	total_com[XX] = total_com[XX]/total_mass;
	total_com[YY] = total_com[YY]/total_mass;
	total_com[ZZ] = total_com[ZZ]/total_mass;

	/*
  for ( i = 0; i < N_LINKS; i++ )
    {
      printf( "%d: %g %g %g\n", i, r[i].orientation[0][0],
	      r[i].orientation[0][1], r[i].orientation[0][2] );
      printf( "    %g %g %g\n", r[i].orientation[1][0],
	      r[i].orientation[1][1], r[i].orientation[1][2] );
      printf( "    %g %g %g\n", r[i].orientation[2][0],
	      r[i].orientation[2][1], r[i].orientation[2][2] );
    }
	*/

  // implement gravity
  mtv3_multiply( r[0].orientation, g_vector, r[0].joint_acceleration_b );
  v3_copy( r[0].joint_acceleration_b, r[0].link_acceleration_b );

  inverse_dynamics( r );
	/*
  printf( "Angular Velocity\n" );
  for ( i = 0; i < N_LINKS; i++ )
    {
      v3_copy( r[i].angular_velocity_b, v1 );
      // mv3_multiply( r[i].orientation, r[i].angular_velocity_b, v1 );
      printf( "%d: %g %g %g\n", i, v1[XX], v1[YY], v1[ZZ] );
    }

  printf( "Angular Acceleration\n" );
  for ( i = 0; i < N_LINKS; i++ )
    {
      v3_copy( r[i].angular_acceleration_b, v1 );
      // mv3_multiply( r[i].orientation, r[i].angular_acceleration_b, v1 );
      printf( "%d: %g %g %g\n", i, v1[XX], v1[YY], v1[ZZ] );
    }
	*/
  mv3_multiply( r[0].orientation, r[0].joint_force_b, root_force_w );
  mv3_multiply( r[0].orientation, r[0].joint_torque_b, root_torque_w );

	/*
  printf( "joint_force: %g %g %g\n", r[0].joint_force_b[0], r[0].joint_force_b[1],
	  r[0].joint_force_b[2] );
  printf( "joint torque: %g %g %g\n", r[0].joint_torque_b[0], r[0].joint_torque_b[1],
	  r[0].joint_torque_b[2] );

  printf( "root_force: %g %g %g\n", root_force_w[0], root_force_w[1],
	  root_force_w[2] );
  printf( "root torque: %g %g %g\n", root_torque_w[0], root_torque_w[1],
	  root_torque_w[2] );
	*/
	/*
  printf( "Torques\n" );
  for ( j = 1; j < N_JOINTS; j++ )
    printf( "%d: %g\n", j, r[j].the_joint_torque );
	*/

	// Each leg inv dyn w/ added pelvis forces

	//r/l leg:
	//0 = ground
	//6 = l_leg_uhz

	//rleg:
	//11 = r_leg_uhz
	//16 = r_leg_lax 

	//body:
	//5  = l_leg_uhz
	//10 = l_leg_lax

	
	lleg[0].angle = 0;
  lleg[0].angle = 0;
  lleg[0].sine = 0;
  lleg[0].cosine = 1;
  m3_identity( lleg[0].orientation );
  lleg[0].angled = 0;
  lleg[0].angledd = 0;
  lleg[0].position_w[YY] = 0.089;
	for(i=0;i<3;i++){
		lleg[0].angular_velocity_b[i] = 0.0;
		lleg[0].angular_acceleration_b[i] = 0.0;
		lleg[0].joint_acceleration_b[i] = 0.0;
		lleg[0].link_acceleration_b[i] = 0.0;
	}

	for(i=1; i < LLEG_JOINTS; i++){
		lleg[i].angle = r[11-i].angle;
		lleg[i].angled = r[11-i].angled;
		lleg[i].angled = r[11-i].angled;
		lleg[i].sine = sin( lleg[i].angle );
		lleg[i].cosine = cos( lleg[i].angle );
	}

	rleg[0].angle = 0;
  rleg[0].angle = 0;
  rleg[0].sine = 0;
  rleg[0].cosine = 1;
  m3_identity( rleg[0].orientation );
  rleg[0].angled = 0;
  rleg[0].angledd = 0;
  rleg[0].position_w[YY] = -0.089;
	for(i=0;i<3;i++){
		rleg[0].angular_velocity_b[i] = 0.0;
		rleg[0].angular_acceleration_b[i] = 0.0;
		rleg[0].joint_acceleration_b[i] = 0.0;
		rleg[0].link_acceleration_b[i] = 0.0;
	}

	for(i=1; i < RLEG_JOINTS; i++){
		rleg[i].angle = r[17-i].angle;
		rleg[i].angled = r[17-i].angled;
		rleg[i].angled = r[17-i].angled;
		rleg[i].sine = sin( rleg[i].angle );
		rleg[i].cosine = cos( rleg[i].angle );
	}

	//FK
	forward_kinematics(lleg, LLEG_LINKS);
	forward_kinematics(rleg, RLEG_LINKS);

	/*
	printf("\nlleg[6].position:\n %f %f %f\n\n",lleg[6].position_w[0],lleg[6].position_w[1],lleg[6].position_w[2]);

	printf("lleg[6].orientation:\n%f %f %f\n%f %f %f\n%f %f %f\n",lleg[6].orientation[0][0],lleg[6].orientation[0][1],lleg[6].orientation[0][2],lleg[6].orientation[1][0],lleg[6].orientation[1][1],lleg[6].orientation[1][2],lleg[6].orientation[2][0],lleg[6].orientation[2][1],lleg[6].orientation[2][2]);

	printf("\nrleg[6].position:\n %f %f %f\n\n",rleg[6].position_w[0],rleg[6].position_w[1],rleg[6].position_w[2]);

	printf("rleg[6].orientation:\n%f %f %f\n%f %f %f\n%f %f %f\n\n",rleg[6].orientation[0][0],rleg[6].orientation[0][1],rleg[6].orientation[0][2],rleg[6].orientation[1][0],rleg[6].orientation[1][1],rleg[6].orientation[1][2],rleg[6].orientation[2][0],rleg[6].orientation[2][1],rleg[6].orientation[2][2]);
	*/

	
	// put force on the pelvis - for now we'll just try an equal split
	// no gravity because these legs are massless

	double split_force[3];
	double split_torque[3];
	for (i=0;i<3;i++){
		split_force[i] = root_force_w[i]/2.0;
		split_torque[i] = root_torque_w[i]/2.0;
	}

	lleg[0].link_acceleration_b[ZZ] = 9.81;
	lleg[0].joint_acceleration_b[ZZ] = 9.81;

	rleg[0].link_acceleration_b[ZZ] = 9.81;
	rleg[0].joint_acceleration_b[ZZ] = 9.81;

	
	lleg_id(lleg,split_force,split_torque);
	rleg_id(rleg,split_force,split_torque);

	for(i=1; i < RLEG_JOINTS; i++){
		r[17-i].the_joint_torque = rleg[i].the_joint_torque;
	}

	for(i=1; i < LLEG_JOINTS; i++){
		r[11-i].the_joint_torque = lleg[i].the_joint_torque;
	}



	
	double *output_torques;
	plhs[0] = mxCreateDoubleMatrix(1,N_LINKS,mxREAL);
	output_torques = mxGetPr(plhs[0]);

	for (i=0; i<N_LINKS;i++){
		output_torques[i] = r[i].the_joint_torque;
	}

	double *output_pos;
	plhs[1] = mxCreateDoubleMatrix(3,N_LINKS,mxREAL);
	output_pos = mxGetPr(plhs[1]);	

	for (i=0; i<N_LINKS;i++){
		for (j=0; j<3; j++){
			output_pos[(3*i)+j] = r[i].position_w[j];
		}
	}

	double *output_l_force;
	plhs[2] = mxCreateDoubleMatrix(1,3,mxREAL);
	output_l_force = mxGetPr(plhs[2]);	
	mv3_multiply( lleg[0].orientation, lleg[0].joint_force_b, output_l_force );

	double *output_l_torque;
	plhs[3] = mxCreateDoubleMatrix(1,3,mxREAL);
	output_l_torque = mxGetPr(plhs[3]);	
	mv3_multiply( lleg[0].orientation, lleg[0].joint_torque_b, output_l_torque );


	double *output_r_force;
	plhs[4] = mxCreateDoubleMatrix(1,3,mxREAL);
	output_r_force = mxGetPr(plhs[4]);	
	mv3_multiply( rleg[0].orientation, rleg[0].joint_force_b, output_r_force );

	double *output_r_torque;
	plhs[5] = mxCreateDoubleMatrix(1,3,mxREAL);
	output_r_torque = mxGetPr(plhs[5]);	
	mv3_multiply( rleg[0].orientation, rleg[0].joint_torque_b, output_r_torque );

	/*
	double *l_torques;
	plhs[6] = mxCreateDoubleMatrix(1,7,mxREAL);
	l_torques = mxGetPr(plhs[6]);	
	for (i=0; i < LLEG_JOINTS ;i++){
			l_torques[i] = lleg[i].the_joint_torque;
	}

	double *r_torques;
	plhs[7] = mxCreateDoubleMatrix(1,7,mxREAL);
	r_torques = mxGetPr(plhs[7]);	
	for (i=0; i < RLEG_JOINTS ;i++){
			r_torques[i] = rleg[i].the_joint_torque;
	}
	*/
	double *r_orientation;
	plhs[6] = mxCreateDoubleMatrix(3,3,mxREAL);
	r_orientation = mxGetPr(plhs[6]);	
	for (i=0;i<3;i++){
		for(j=0;j<3;j++){
			r_orientation[(3*i)+j] = r[16].orientation[i][j];
		}
	}

	double *l_orientation;
	plhs[7] = mxCreateDoubleMatrix(3,3,mxREAL);
	l_orientation = mxGetPr(plhs[7]);	
	for (i=0;i<3;i++){
		for(j=0;j<3;j++){
			l_orientation[(3*i)+j] = r[10].orientation[i][j];
		}
	}

	double *com_ret;
	plhs[8] = mxCreateDoubleMatrix(1,3,mxREAL);
	com_ret = mxGetPr(plhs[8]);	
	for(j=0;j<3;j++){
		com_ret[j] = total_com[j];
	}


	//  return 0;
}