Biorobotics / Robot-Software

Dependencies:   HIDScope MODSERIAL QEI biquadFilter mbed Servo

help_functions/kinematics.h

Committer:
MaikOvermars
Date:
2018-10-25
Branch:
bla
Revision:
17:1f93c83e211f
Parent:
16:0280a604cf7e
Child:
22:31065a83d9e8

File content as of revision 17:1f93c83e211f:

#include "mbed.h"

double L1 = 0.5;
double L2 = 0.7;
double x01 = 0.0;
double y01 = 0.2;

void forwardkinematics_function(double& q1, double& q2, double& x, double& y) {
    // input are joint angles, output are x and y position of end effector
    
    x = x01 + L1*cos(q1) - L2*cos(q2);
    y = y01 + L1*sin(q1) - L2*sin(q2);    
}

void inversekinematics_function(double &x, double &y, const double &T, double &qref1, double &qref2, double &q1, double &q2, double &des_vx, double &des_vy) {
    // input is desired x and y velocity, output reference angles
    // reference angle spees are calculated using the inverse of jacobian
    // from the reference angle speeds the reference angles are computed

    double q1_star_des; // desired joint velocity of q1_star
    double q2_star_des; // same as above but then for q2_star

    // The calculation below assumes that the end effector position is calculated before this function is executed
    // In our case the determinant will not equal zero, hence no problems with singularies I think.
    q1_star_des = 1/(L1*(-x*sin(q1)-(-y+y01)*cos(q1)))*(-1*(-x+L1*cos(q1))*des_vx-x*des_vy);
    q2_star_des = 1/(L1*(-x*sin(q1)-(-y+y01)*cos(q1)))*(-1*(-y+y01+L1*sin(q1))*des_vx+1*(-y+y01)*des_vy);
    
    qref1 = q1+T*q1_star_des; // Yet to adapt all these equations
    qref2 = q2+T*(q2_star_des - q1_star_des);    
}