Arie,
Ik heb geprobeerd wat je in je laatste post voorstelde.
Als ik de bekomen formule ingeef op
http://www.wolframalpha.com/ constateer ik echter dat mijn formule wellicht te lang is. Het betreft deze eindformule :
{{168070000000000.000000,240100000000.000000,343000000.000000,490000.000000,700.000000},{168070001200500.000000,240100001372.000000,343000001.470000,490000.001400,700.000001},{168070002401000.000000,240100002744.000000,343000002.940000,490000.002800,700.000002},{1000000010000000.000000,1000000008000.000000,1000000006.000000,1000000.004000,1000.000002},{1000000005000000.000000,1000000004000.000000,1000000003.000000,1000000.002000,1000.000001},{1000000000000000.000000,1000000000000.000000,1000000000.000000,1000000.000000,1000000.000000}}^-1 *{{600.000000},{ 600.000001},{600.000002},{1000.000002},{1000.000001},{1000.000000}}
Ik heb voordien geprobeerd met de eerst voorgestelde vergelijkingen waarbij positie van de slave (y) een functie is van de masterpositie (x). Hierbij is yt, vt en at respectievelijk positie, snelheid en acceleratie van de slave op het einde, en y0, vo en a0 hetzelfde voor de slave aan het begin.
Voor de master wordt dan xt, vt, at, x0, v0 en a0 gebruikt.
yt = A(xt -x0)5 + B(xt -x0)4 + C(xt -x0)3 + ½ a0 (xt -x0)2 + v0 (xt -x0) + y0
vt = 5A(xt -x0)4 + 4B(xt -x0)3 + 3C(xt -x0)2 + a0 (xt -x0) + v0
at = 20A(xt -x0)3 + 12B(xt -x0)2 + 6C(xt -x0) + a0
Bovenstaande kan ik uiteindelijk oplossen, maar het resultaat lijkt niet correct.
Ik heb namelijk formules gevonden van de motion controller fabrikant waarmee de uiteindelijk bewegingen (die gebruik maken van de xy-curves) worden uitgevoerd.
In bijlage deze functie.
Ik zou echter zelf een dergelijke functie willen opstellen, omdat ik dan weet waar alles vandaan komt en ik de functie kan aanpassen naar eigen verwachtingen en eisen. Ik had dus toch graag naar een eigen werkend resulaat gekomen.
Je laatste stelling dat de slave positie in functie is van de masterpositie was in ieder geval correct.
Hieronder de gevonden functie :
FUNCTION FCCalcCamPoly5Order : ARRAY[0..5] OF LREAL
VAR_INPUT
leadingRangeStartPoint : LREAL; //leading value at range start point
leadingRangeEndPoint : LREAL; //leading value at range end point
followingRangeStartPoint : LREAL; //following value at range start point
followingRangeEndPoint : LREAL; //following value at range end point
followingRangeStartDerivation1 : LREAL; //velocity at range start point
followingRangeEndDerivation1 : LREAL; //velocity at range end point
followingRangeStartDerivation2 : LREAL; //acceleration at range start point
followingRangeEndDerivation2 : LREAL; //acceleration at range end point
END_VAR
VAR
xa : LREAL;
xe : LREAL;
xae : LREAL;
ya : LREAL;
ye : LREAL;
va : LREAL;
ve : LREAL;
aa : LREAL;
ae : LREAL;
xe2 : LREAL;
xe3 : LREAL;
xe4 : LREAL;
xe5 : LREAL;
xa2 : LREAL;
xa3 : LREAL;
xa4 : LREAL;
xa5 : LREAL;
xae5 : LREAL;
END_VAR;
xa := leadingRangeStartPoint;
xe := leadingRangeEndPoint;
ya := followingRangeStartPoint;
ye := followingRangeEndPoint;
va := followingRangeStartDerivation1;
ve := followingRangeEndDerivation1;
aa := followingRangeStartDerivation2;
ae := followingRangeEndDerivation2;
xae := xa-xe;
xae5 := xae * xae * xae * xae * xae;
xe2 := xe * xe;
xe3 := xe2 * xe;
xe4 := xe3 * xe;
xe5 := xe4 * xe;
xa2 := xa * xa;
xa3 := xa2 * xa;
xa4 := xa3 * xa;
xa5 := xa4 * xa;
IF (leadingRangeStartPoint <> leadingRangeEndPoint) THEN
FCCalcCamPoly5Order[0] := -1/2*(2*xa5*xe*ve-2*xa*va*xe5-10*ya*xe4*xa+2*ya*xe5+20*ya*xa2*xe3+xa2*aa*xe5+10*xa2*va*xe4+xa4*xe3*aa-20*xa3*xe2*ye-2*xa5*ye-xa5*xe2*ae-10*xa4*xe2*ve+10*xa4*xe*ye+2*xa4*xe3*ae+8*xa3*xe3*ve-xa3*xe4*ae-2*xa3*xe4*aa-8*xa3*xe3*va)/xae5;
FCCalcCamPoly5Order[1] := 1/2*(16*xa2*xe3*va+10*xa*xe4*va-xa2*xe4*aa-4*xe3*xa3*aa-16*xe2*xa3*ve+xe2*xa4*ae+4*xe3*xa3*ae-10*xe*xa4*ve-24*xe2*xa3*va+3*xe2*xa4*aa-2*xe*xa5*ae+60*xa2*xe2*ya-60*xa2*xe2*ye+2*xa*xe5*aa-3*xa2*xe4*ae+24*xa2*xe3*ve-2*xe5*va+2*xa5*ve)/xae5;
FCCalcCamPoly5Order[2] := -1/2*(-60*xe2*xa*ye+60*xe2*xa*ya+36*xe3*xa*va+4*xe4*xa*aa-3*xe4*xa*ae+24*xe3*xa*ve-24*xa3*xe*va+8*xa3*xe2*ae-36*xa3*xe*ve+12*xa2*xe2*ve-8*xa2*xe3*aa+60*xa2*xe*ya-60*xa2*xe*ye-12*xa2*xe2*va-xa5*ae+3*xa4*xe*aa-4*xa4*xe*ae+xe5*aa)/xae5;
FCCalcCamPoly5Order[3] := 1/2*(xa4*aa-3*xa4*ae-8*xa3*va-12*xa3*ve+4*xa3*xe*aa-28*xa2*xe*ve-32*xa2*xe*va-8*xa2*xe2*aa+8*xa2*xe2*ae+20*xa2*ya-20*xa2*ye+32*xa*xe2*ve+80*xa*xe*ya-4*xa*xe3*ae-80*xa*xe*ye+28*xa*xe2*va-20*xe2*ye+20*xe2*ya+12*xe3*va-xe4*ae+8*xe3*ve+3*xe4*aa)/xae5;
FCCalcCamPoly5Order[4] := -1/2*(-3*xa3*ae+2*xa3*aa-14*xa2*va-16*xa2*ve-xa2*xe*aa+4*xa2*xe*ae-30*xa*ye+30*xa*ya-2*xa*xe*va-4*xa*xe2*aa+xa*xe2*ae+2*xa*xe*ve+14*xe2*ve+3*xe3*aa+16*xe2*va+30*xe*ya-2*xe3*ae-30*xe*ye)/xae5;
FCCalcCamPoly5Order[5] := 1/2*(-12*ye+12*ya-xa2*ae-6*xa*ve+2*xa*xe*ae+xe2*aa+6*xe*va+xa2*aa-6*xa*va+6*xe*ve-2*xe*xa*aa-xe2*ae)/xae5;
ELSE
FCCalcCamPoly5Order[0] := 0;
FCCalcCamPoly5Order[1] := 0;
FCCalcCamPoly5Order[2] := 0;
FCCalcCamPoly5Order[3] := 0;
FCCalcCamPoly5Order[4] := 0;
FCCalcCamPoly5Order[5] := 0;
END_IF;
END_FUNCTION