Good Jacobian and code Not been tested

Dependencies:   MODSERIAL biquadFilter mbed

Fork of Kinematics by Ramon Waninge

main.cpp

Committer:
Ramonwaninge
Date:
2018-10-31
Revision:
11:256e84fea925
Parent:
10:2b965defcde5
Child:
12:8d3bc1fa2321

File content as of revision 11:256e84fea925:

#include "mbed.h"
#include <math.h>
#include <cmath>
#include "MODSERIAL.h"  
#define PI 3.14159265

MODSERIAL pc(USBTX, USBRX);  // connecting to pc
DigitalIn button1(SW3);      // defining testbutton NEEDS TO BE REMOVED
DigitalOut ledr(LED1);      // Only for testing 
//DigitalOut led2(LED2);      // Only for testing
InterruptIn button2(SW2);   //Only for testing

// nog te verwijderen/ aan te passen, zijn dubbel gedefinieerd
double theta11;

//Joe dit zijn de inputsignalen (en tussenvariabelen)
double theta10;                //vorige theta
double theta1;                  // huidige/nieuwe theta
double theta40;
double theta4; 
bool emg1; 
bool emg2; 
bool emg3; 
double thetaflip = 0;
double omega1; 
double omega4; 
double prefx;
double prefy;
double deltat = 0.01;
//Joe dit zijn de constantes 
double ll = 200.0; 
double lu = 170.0; 
double lb = 10.0; 
double le = 79.0; 
double xbase = 340;


//forward kinematics, Check mathematica! Omdat mbed in paniek raakt met meerdere wortels, hebben we de vergelijking opgedeeld in 3 stukken
//check void forward voor de berekeningen
//First define the position equation of x
double xendsum;
double xendsqrt1;
double xendsqrt2;
double xend;
//Now define the pos. eq. of y
double yendsum;
double yendsqrt1;
double yendsqrt2;
double yend;


//Hier definieren we de functies en tickers
Ticker emgcheck;
Ticker emgcheck2;
Ticker emgcheck3; 


//Joe, hieronder staan de functies die door de tickers aangeroepen worden
void forward(){        //dit is de ticker die zegt, als button=0, theta 1 wordt groter. dan worden x en y doorgerekend
                        // hieronder moet veranderd worden naar if button1 == 0, x = x+eenbeetje
                         //maar daar moet eerst inverse kinematics voor gebeuren.
    /*if (button1 == 0){                          //als emg1==voorbij treshold, komt waarschijnlijk in de inverse functie
        theta1 = PI*(theta1/PI + 0.1);          
     hij is geblokt omdat ik de knop nodig heb
    //default = als x = xbase/2... break, okee dit moet hier niet, maar weet niet waar wel...
    }
    else {theta1 = theta1;}*/
    //hieronder komen de doorrekeningen van de hoeken naar de coordinaten, check de mathematicafile voor de afleiding
    xendsum = lb + xbase +ll*(cos(theta1) - cos(theta4));
    xendsqrt1 = 2*sqrt(-xbase*xbase/4 + lu*lu + ll*(xbase*(cos(theta1)+cos(theta4))/2) -ll*(1+ cos(theta1+theta4)))*(-sin(theta1)+sin(theta4));
    xendsqrt2 = sqrt(pow((-xbase/ll+cos(theta1)+cos(theta4)),2)+ pow(sin(theta1) - sin(theta4),2));
    xend = (xendsum + xendsqrt1/xendsqrt2)/2;
    
    yendsum = -le + ll/2*(sin(theta1)+sin(theta4));
    yendsqrt1 = (-xbase/ll + cos(theta1)+cos(theta4))*sqrt(-xbase*xbase/4 + lu*lu + ll/2*(xbase*(cos(theta1)+cos(theta4))- ll*(1+cos(theta1+theta4)))); 
    yendsqrt2 = sqrt(pow((-xbase/ll + cos(theta1)+ cos(theta4)),2)+ pow((sin(theta1)-sin(theta4)),2));
    yend = (yendsum + yendsqrt1/yendsqrt2);
    
        
        
        
        
    }//end van if xend !=xend
}
void demomode(){}       //Komt nog... 
                    //Alleen nodig in de 
                   //als emg2 == voorbij treshold,
                    //double theta1 -> plus counts (emg*richting)
                    //double theta4 -> plus counts (emg*richting)
                    //reken y door
                    //default = als y = default... break
                    //end
/*void flip(){
    if(button2==0){thetaflip = PI*(thetaflip/PI+0.5);} // button2==0 moet veranderd naar emg3>= treshold
}*/ //suppressed omdat ik button 2 nodig heb...

// de beweging voor de xcoordinaat!
void inverse(){
    /*
    qn = qn-1 + (jacobian^-1)*dPref/dt *deltaT
    ofwel 
    thetai+1 = thetai +(jacobian)^-1*vector(deltaX, DeltaY)
    waar Pref = emg signaal
    */
    emg1 = false;                               
    if(theta10 == 0){             //als de hoek voor de beweging niet bekend is
        theta10 = PI*0.5;        //Definieer de hoek als half pi !!DIT KAN OOK ERGENS IN DEFAULT STAAN.
        theta1 = theta10;
    }
    if(button2 == 0){emg1 = true;
    
        if(emg1 == true){
            prefx = 1;                                                          //derivative of Preference = 1 (needs to be adjusted)
                theta1 = theta10 +/*inverse jacobian keer*/prefx*deltat;        //theta nieuw = oud +jacob*deltax
                theta10 = theta1;
        } 
    }//sluit van if emg1=true
    
    
    
}//sluit van void inverse

//dit is voor de ycoordinaat
void inverse2(){
    emg2 = false;                            //emg is het inputsignaal van de biceps
    if(theta40 == 0){
        theta40 = PI*0.5; 
        theta4 = theta40;
    }
    if(button1 == 0){ 
        emg2 = true;
        if(emg2 == true){
            prefy = 1;
                theta4 = theta40 + /*inverse jacobian keer*/prefy*deltat;        //theta nieuw = oud +jacob*deltax
                theta40 = theta4;
        }  //sluit van if emg2==true    
    }

}


int main()
{
    
    pc.baud(115200);
    //default = theta1 = theta4 = pi/2 
    emgcheck3.attach(forward, 0.1);
    emgcheck2.attach(inverse2, 0.1);
    emgcheck.attach(inverse, 0.1);
    ledr=1;
    pc.printf("%f", theta10);
    while(true){
        
        
           pc.printf("\n\r %f %f \n\r %f %f", theta4,theta1, xend, yend);
           wait(0.5);
           
    
    }
}