E.R.I.C.'s first attempt to walk

Dependencies:   mbed AX12_Hardware

FK_Engine.cpp

Committer:
ms523
Date:
2011-10-16
Revision:
0:8a7c1e92d067

File content as of revision 0:8a7c1e92d067:

#include "FK.h"

void FK_Engine(float *pos){

// Read the ax-12+ Servos and translate into joint angles α, θ and φ for each leg
    float fore_right_alpha = Fore_Right_Hip_Lateral.GetPosition() - 135;
    float fore_right_theta = 355 - Fore_Right_Hip.GetPosition();
    float fore_right_phi = 305 - Fore_Right_Knee.GetPosition();
    float fore_left_alpha = 165 - Fore_Left_Hip_Lateral.GetPosition();
    float fore_left_theta = Fore_Left_Hip.GetPosition() + 55;
    float fore_left_phi = Fore_Left_Knee.GetPosition() + 5;   
    float hind_right_alpha = 165 - Hind_Right_Hip_Lateral.GetPosition();
    float hind_right_theta = 340 - Hind_Right_Hip.GetPosition();
    float hind_right_phi = 320 - Hind_Right_Knee.GetPosition();
    float hind_left_alpha = Hind_Left_Hip_Lateral.GetPosition() - 135;
    float hind_left_theta = Hind_Left_Hip.GetPosition() + 40;
    float hind_left_phi = Hind_Left_Knee.GetPosition() + 20;      
    float temp;                             // used to store maths
    
// Convert into radians for maths
    hind_right_alpha = hind_right_alpha * PI / 180;
    hind_right_theta = hind_right_theta  * PI / 180;
    hind_right_phi = hind_right_phi * PI / 180;
    hind_left_alpha = hind_left_alpha * PI / 180;
    hind_left_theta = hind_left_theta  * PI / 180;
    hind_left_phi = hind_left_phi * PI / 180;
    fore_right_alpha = fore_right_alpha * PI / 180;
    fore_right_theta = fore_right_theta  * PI / 180;
    fore_right_phi = fore_right_phi * PI / 180;
    fore_left_alpha = fore_left_alpha * PI / 180;
    fore_left_theta = fore_left_theta  * PI / 180;
    fore_left_phi = fore_left_phi * PI / 180;

// Next calculate point 1 for all legs
    // Start with right fore leg
    float x1_fore_right = sin(fore_right_alpha);
    x1_fore_right = x1_fore_right * B;
    float y1_fore_right = 0;
    float z1_fore_right = cos(fore_right_alpha);
    z1_fore_right = z1_fore_right * B;
    // Then left fore leg
    float x1_fore_left = sin(fore_left_alpha + PI);  //Add PI to invert to get the sign correct
    x1_fore_left = x1_fore_left * B;            
    float y1_fore_left = 0;
    float z1_fore_left = cos(fore_left_alpha);
    z1_fore_left = z1_fore_left * B;
    // Then hind right leg
    float x1_hind_right = sin(hind_right_alpha);
    x1_hind_right = x1_hind_right * B;
    float y1_hind_right = 0;
    float z1_hind_right = cos(hind_right_alpha);
    z1_hind_right = z1_hind_right * B;
    // Finally hind left leg
    float x1_hind_left = sin(hind_left_alpha + PI);  //Add PI to invert to get the sign correct
    x1_hind_left = x1_hind_left * B;            
    float y1_hind_left = 0;
    float z1_hind_left = cos(hind_left_alpha);
    z1_hind_left = z1_hind_left * B;

// Now calculate point 2 
    // Aagain start with the fore right leg..
    float x2_fore_right = cos(fore_right_theta + PI);
    x2_fore_right = x2_fore_right * ULNA;
    temp = cos(fore_right_alpha);
    x2_fore_right = x2_fore_right * temp;
    x2_fore_right = x1_fore_right + x2_fore_right;
    float y2_fore_right = sin(fore_right_theta);
    y2_fore_right = y2_fore_right * ULNA;
    y2_fore_right = y2_fore_right + y1_fore_right;
    float z2_fore_right = cos(fore_right_theta);
    z2_fore_right = z2_fore_right * ULNA;
    temp = sin(fore_right_alpha);
    z2_fore_right = z2_fore_right * temp;
    z2_fore_right = z1_fore_right + z2_fore_right;
    // Then the fore left leg
    float x2_fore_left = cos(fore_left_theta + PI);  
    x2_fore_left = x2_fore_left * ULNA;
    temp = cos(fore_left_alpha + PI);       //Add PI to invert to get the sign correct
    x2_fore_left = x2_fore_left * temp;
    x2_fore_left = x1_fore_left + x2_fore_left;
    float y2_fore_left = sin(fore_left_theta);
    y2_fore_left = y2_fore_left * ULNA;
    y2_fore_left = y2_fore_left + y1_fore_left;
    float z2_fore_left = cos(fore_left_theta);
    z2_fore_left = z2_fore_left * ULNA;
    temp = sin(fore_left_alpha);
    z2_fore_left = z2_fore_left * temp;
    z2_fore_left = z1_fore_left + z2_fore_left;
    // Then the hind right leg
    float x2_hind_right = cos(hind_right_theta + PI);
    x2_hind_right = x2_hind_right * FEMUR;
    temp = cos(hind_right_alpha);
    x2_hind_right = x2_hind_right * temp;
    x2_hind_right = x1_hind_right + x2_hind_right;
    float y2_hind_right = sin(hind_right_theta);
    y2_hind_right = y2_hind_right * FEMUR;
    y2_hind_right = y2_hind_right + y1_hind_right;
    float z2_hind_right = cos(hind_right_theta);
    z2_hind_right = z2_hind_right * FEMUR;
    temp = sin(hind_right_alpha);
    z2_hind_right = z2_hind_right * temp;
    z2_hind_right = z1_hind_right + z2_hind_right;
    // Finally the hind left leg...
    float x2_hind_left = cos(hind_left_theta + PI);  
    x2_hind_left = x2_hind_left * FEMUR;
    temp = cos(hind_left_alpha + PI);       //Add PI to invert to get the sign correct
    x2_hind_left = x2_hind_left * temp;
    x2_hind_left = x1_hind_left + x2_hind_left;
    float y2_hind_left = sin(hind_left_theta);
    y2_hind_left = y2_hind_left * FEMUR;
    y2_hind_left = y2_hind_left + y1_hind_left;
    float z2_hind_left = cos(hind_left_theta);
    z2_hind_left = z2_hind_left * FEMUR;
    temp = sin(hind_left_alpha);
    z2_hind_left = z2_hind_left * temp;
    z2_hind_left = z1_hind_left + z2_hind_left;

// Finally calculate point 3 
    // Again start with the fore right leg
    float x3_fore_right = cos(fore_right_theta - fore_right_phi);
    x3_fore_right = x3_fore_right * RADIUS;
    temp = cos(fore_right_alpha);
    x3_fore_right = x3_fore_right * temp;
    x3_fore_right = x2_fore_right + x3_fore_right;
    float y3_fore_right = sin(fore_right_theta + PI - fore_right_phi);
    y3_fore_right = y3_fore_right * RADIUS;
    y3_fore_right = y2_fore_right + y3_fore_right;
    float z3_fore_right = cos(fore_right_theta + PI - fore_right_phi);
    z3_fore_right = z3_fore_right * RADIUS;
    temp = sin(fore_right_alpha);
    z3_fore_right = z3_fore_right * temp;
    z3_fore_right = z2_fore_right + z3_fore_right;
    // Then the fore left leg
    float x3_fore_left = cos(fore_left_theta - fore_left_phi);
    x3_fore_left = x3_fore_left * RADIUS;
    temp = cos(fore_left_alpha + PI);           //Add PI to invert to get the sign correct
    x3_fore_left = x3_fore_left * temp;
    x3_fore_left = x2_fore_left + x3_fore_left;
    float y3_fore_left = sin(fore_left_theta + PI - fore_left_phi);
    y3_fore_left = y3_fore_left * RADIUS;
    y3_fore_left = y2_fore_left + y3_fore_left;
    float z3_fore_left = cos(fore_left_theta + PI - fore_left_phi);
    z3_fore_left = z3_fore_left * RADIUS;
    temp = sin(fore_left_alpha);
    z3_fore_left = z3_fore_left * temp;
    z3_fore_left = z2_fore_left + z3_fore_left;    
    // Then the hind right leg..
    float x3_hind_right = cos(hind_right_theta - hind_right_phi);
    x3_hind_right = x3_hind_right * TIBIA;
    temp = cos(hind_right_alpha);
    x3_hind_right = x3_hind_right * temp;
    x3_hind_right = x2_fore_right + x3_hind_right;
    float y3_hind_right = sin(hind_right_theta + PI - hind_right_phi);
    y3_hind_right = y3_hind_right * TIBIA;
    y3_hind_right = y2_hind_right + y3_hind_right;
    float z3_hind_right = cos(hind_right_theta + PI - hind_right_phi);
    z3_hind_right = z3_hind_right * TIBIA;
    temp = sin(hind_right_alpha);
    z3_hind_right = z3_hind_right * temp;
    z3_hind_right = z2_hind_right + z3_hind_right;
    // Finally the hind left leg
    float x3_hind_left = cos(hind_left_theta - hind_left_phi);
    x3_hind_left = x3_hind_left * TIBIA;
    temp = cos(hind_left_alpha + PI);           //Add PI to invert to get the sign correct
    x3_hind_left = x3_hind_left * temp;
    x3_hind_left = x2_hind_left + x3_hind_left;
    float y3_hind_left = sin(hind_left_theta + PI - hind_left_phi);
    y3_hind_left = y3_hind_left * TIBIA;
    y3_hind_left = y2_hind_left + y3_hind_left;
    float z3_hind_left = cos(hind_left_theta + PI - hind_left_phi);
    z3_hind_left = z3_hind_left * TIBIA;
    temp = sin(hind_left_alpha);
    z3_hind_left = z3_hind_left * temp;
    z3_hind_left = z2_hind_left + z3_hind_left;  
    
    
    // Now updtae the array...   
    pos[0] = x3_fore_right;
    pos[1] = y3_fore_right;
    pos[2] = z3_fore_right;
    pos[3] = x3_fore_left;
    pos[4] = y3_fore_left;
    pos[5] = z3_fore_left;
    pos[6] = x3_hind_right;
    pos[7] = y3_hind_right;
    pos[8] = z3_hind_right;
    pos[9] = x3_hind_left;
    pos[10] = y3_hind_left;
    pos[11] = z3_hind_left;
}