Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MODSERIAL biquadFilter mbed
Fork of Kinematics by
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);
}
}
