Stelling van Pythagoras?

Moderators: dirkwb, Xilvo

Berichten: 463

Re: Stelling van Pythagoras?

Voor elke tijdtik bepaal ik de positie van het blok (hier in 2D alleen blockx en blocky, in jouw 3D frame moet daar nog blockz bij komen).

Bij de instructie grid->drawDot() aangekomen is de positie van het blok op het huidige tijdstip bekend.
In mijn voorbeeld hoef ik met deze instructie nu alleen een blauw of rood blokje op het beeldscherm te tekenen,
in de cable robot is dit het moment om met de nu bekende positie (en de hoekpunten van het blok) de bijbehorende nieuwe kabellengtes te berekenen (zoals we eerder gedaan hebben) en deze te updaten.

Het grid is bij mij het 2D rooster (het plaatje), met daarin de coordinaten waarin ik dat puntje moet plaatsen, bij jou is dat het 3D rooster van het frame.

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

moet ff goed denken hoe ik dit er in ga bouwen....
want ik geloof dat ik het snap....

eerst maar eens 2D...

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

toch nog een vraagje....

ik had nu , kon ik via de seriele monitor een new x , of Y of z geven.....
dan werden de lengtes berekend.... en in stappen gehakt....
dan werd dat uit gevoerd.... als alle kabels hun lengte hadden bereikt, werd er een bitje geset...

en met dat bitje, las ik de volgende coordinaten.....

maar nu met dat lineTo ... ehhh heb ik dat bitje dan nog nodig?
pfff vind het echt ff moeilijk.....

want ik heb nu natuurlijk een verhaal, dat ik de 8 lengtes bereken.... en dan... een verdelen in stappen....
die kabel die het meest moet veranderen, krijgt zeg maar 100% van de pulsen...
en de kortere, bijvoorbeeld als er 1 bij zit die maar half zo lang moet worden, die krijgt dan 50% van de pulsen...

heb ik dat deel nog nodig.....

sorry hoor....

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

ik heb even het hele verhaal te download gezet....
(is gewoon in het kladblok te openen....)


https://www.dropbox.com/s/89o61lipx3mxj ... n.zip?dl=0

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

Ik ben toch maar weer aan het kijken of ik het er allemaal in gerommeld krijg.... Ik kan het niet hebben om iets niet voor elkaar te krijgen... :-) zeker met internet, en alle hulp ....

maar voor ik het er lekker in kan krijgen, moet ik het eerst zien te begrijpen, hoe het zou moeten werken......

dus ik zit eerst te kijken naar je functie "LineTo" (en laten we het verlopig maar even in het platte (x,y) vlak houden....

ik zie, dat je die functie aan roep, en 3 variabele mee geef. een x,y en een speed...

Die X en Y zijn zeg maar de wanted positie, dus waar je wil dat het centrum van het frame heen gaat....
speed, snelheid van het bewegen... maar mag niet te groot zijn, want dan schieten de magneetjes los....

dan zie ik , in de functie, ga je dmv de stelling van Pythagoras de verplaatsing uit rekenen....
zoals ik het begrijp, zijn blockX en BlockY de huidig X en Y coördinaten van het object....

Dus we hebben een wanted x en Y, en een huidige X en Y....
en rekenen dus eerst uit hoelang die schuine line is tussen die 2....

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

hmm (ik had edit gedaan en nog een heel verhaal er bij gezet... doe ik opslaan, krijg ik een melding dat ik het bericht niet kan wijzigen.... fijn dat je die waarschuwing krijg aan het eind... :-) )

maar dan die steptime=steplength/speed

die step lenght is een getal... en als ik het goed begrijp, is dat de afstand, wat 1 draad nog moet kunnen bewegen tov de andere 7 draden, voordat deze losschiet....

dus als ik 1 draad beweeg, en 7 draden staan stil, na hoeveel stappen zou het magneetje dan los springen....
Ik doe 250 stappen per milimeter.... dus ik denk dat getal tussen de 50 a 125 kom te zitten... kwart millimeter tot een halve millimeter?

nu snap ik die speed even niet die ik mee geef naar de functie.... is dat een getal hoelang de totale move mag duren? of hoe lang elke stap duren.....?

maar de steptime, stel dat ik als speed 10 mee geeft, dan is de steptime=100/10, is dus 10

stel object hangt op 0,0 en ik wil hem sturen naar 30,50

DX=30-0
DY=50-0

L= sqrt(30x30+50x50)
L=sqrt(900+2500)
L=sqrt(3400)
L=58,3095

dx=DX*steplength/L
dx=30*100/58,3095
dx=51.444

dy=DY*100/58,3095
dy=85,749

pfff weet niet meer wat ik nu zit uit te rekenen....

want als ik nu die nstep uitreken, krijg ik 58,3095/100
en dat zouden het totaal aantal stappen zijn om die afstand af te leggen... en dat zou dan 0,5830 worden....

dus ergens doe ik volgens mij wat fout.....
ik denk dat die 100 voor steplength niet goed is...

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

Onderstaand filmpje was met de Arduino Due



En nu eindelijk alles weer aan de gang met een andere Micro Controller.....
De Nucleo F446RE.....
Dat scheelt wel een beetje... :-)



en nu zat er nog een Delay in... want op volle snelheid werd ik er bang van...

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

RedCat schreef: ma 29 nov 2021, 07:53 Mooi! Ziet er degelijk uit, ik verwacht dat die katrolwielen minder kabelslijtage zullen geven dan eenvoudige gaatjes. Bovendien kan je als toeschouwer door die wielen de kabelbewegingen beter volgen. Leuk om het geheel in werking te zien.

Nog een kleinigheid:
In je code heb je datatypen long en float. Vanuit programmeertaal C ken ik die als gehele resp. drijvende-komma getallen.
In je berekeningen zoals
long XCorner1 = -(LengthFrame / 2);
zullen de resultaatwaarden afgerond worden naar beneden, bv 9/2 geeft als antwoord 4
Is het niet beter je hele berekening uit te voeren met float getallen?
Dat voorkomt (eventueel herhaalde) afrondingsfouten.

Het eindantwoord kan je dan indien nodig wel afronden tot geheel getal:
long result = (fresult + 0.5)
waarbij fresult dan de float versie van result is,
en result de op gebruikelijke wijze afgeronde waarde van fresult (<.5 naar beneden, ≥.5 naar boven).
Je motor krijgt dan steeds een geheel getal aangeboden, maar in je berekeningen kan in alle volgende stappen doorgaan met de nauwkeuriger float versie van dat getal.
Deze micro controller Nucleo F446RE ( STM32) schijnt veel sneller te zijn met float getallen... dus ik ben nu alles aan het na lopen, en bijna van alles float getallen aan het maken....

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

https://www.dropbox.com/s/l0551h5tquc5z ... g.png?dl=0

dit snap ik alleen niet...
100.0/6562=0,015239

maar de serial print laat 0,02 zien?

Berichten: 463

Re: Stelling van Pythagoras?

zie https://www.arduino.cc/reference/en/lan ... l/println/:
Serial.println(val, format)

Voor floats zou je het aantal decimalen kunnen instellen via een extra parameter format:
als je je regel 461 uitbreidt tot
Serial.println(Procent100, 6)
zou je Procent100 dus te zien moeten krijgen met 6 decimalen achter de komma.

Werkt dit ook bij jou?

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

ga ik vanavond controleren....

maar dan zal dat wel alleen bij de serial print zijn, in het programma zal wel de juiste waarde gebruikt worden?

ik ben ff aan het uitzoeken wat ik toen ook alweer gemaakt heb... :-)

want hij gaat nu wel eens stuk sneller, maar ergens gaan er dingen nog niet goed...
motors zijn ook niet tegelijk klaar?

Ik weet op gegeven moment, de actuele lengte van de 8 draden, en ik weet de wanted lengte...

dan weet ik dus hoeveel elke draad veranderen moet....

dus dan heb ik 8 verplaatsingen.... die sorteer ik op lengte... de grootste boven aan, de kleinste onderaan....

dan deel ik 100 door de langste... die krijgt dus 100% van de pulsen...

dus stel de langste was 1000 -> 100/1000 = 0,1

en stel dat de kortste verplaatsing 500 is 500*0,1=50, dus die krijgt 50% van de pulsen....

Code: Selecteer alles

void Motor1() {
  Pulse1 = 0;
  if (Mot1On == 1)
  {
    if (Pulse == 1)
    {
      if (Mot1WantedLength != Mot1ActualLength) {

        if (Mot1PulseCounter >= (StepSpeed / Mot1PulseProcent) )
       {
          Pulse1 = 1;
          Mot1PulseCounter = 0;

          if (Mot1Direction == 1)
          {
            Mot1ActualLength = Mot1ActualLength + 1;
          }
          else
          {
            Mot1ActualLength = Mot1ActualLength - 1;
          };
        };
      };

      Mot1PulseCounter = Mot1PulseCounter + 1;

      digitalWrite(oDir1, Mot1Direction);
      digitalWrite(oStep1, Pulse1);
    };
  };
};
en dit heb ik voor elke motor....
Mot1PulseProcent is dus 100 bij de langste verplaatsing
en dus 50 bij de 2de verplaatsing

stel dat die StepSpeed 200 is...

Die Pulse is dus een bitje , welke in de hoofdlus , dmv pulse=pulse xor 1 geinverteerd wordt..

dus als die pulse is hoog, en de draden zijn nog niet even lang...
dan de eerste keer is Mot1PulseCounter nog 0, en StepSpeed/Mot1PulseProcent= 200/100=2

dus elke 2de pulse geeft 1 step op de motor...

by die van 50% is het dus 200/50= 4 dus die geeft elke 4de pulse door aan de motor...

dus ik snap even niet zo goed waarom de motors niet gelijk klaar zijn...
er zit dus ergens iets niet goed... en het lijkt heel erg op afrondings fout...

en ik denk in (stepSpeed/MotorPulseProcent)...

want als ik bijvoorbeeld een 93% verplaatsing heb... krijg ik 200/93= 2,15
maar omdat het een vergelijking is met een int vraag ik me af of dat wel goed gaat...

dus of hij doet niets met die ,15? of omdat er staat >= doet hij pas iets bij 3?
ik weet ook ff niet hoe ik dit oplos...

moet ik nog eens goed over denken....
misschien ken jij me een duwtje in de goede richting geven :-)

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

Dus eigenlijk is dus de vraag, hoe ga ik die 8 lengtes nu zo verdelen dat ze allemaal de goede hoeveelheid pulsen krijgen....

het gaat natuurlijk met getallen 100 en 50 en 25 enzo gaat het al gauw goed...

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

Ik had een klein hoopje dat jij met iets slims kwam... :-)

Gebruikersavatar
Berichten: 96

Re: Stelling van Pythagoras?

Ik denk dat ik vaker moet rekenen?
nu aan het begin van de move, reken ik uit hoeveel elke draad moet veranderen...
en dat voer ik dan in 1 keer helemaal uit....

ik denk dat ik de gewenste waarde ergens moet bewaren, en dan elke cyclus moet gaan rekenen....( of in ieder geval vaker)

denk dat ik dan , niet alle afrondingsfouten bij elkaar tel....?

Technicus
Berichten: 1.151

Re: Stelling van Pythagoras?

Ik denk dat je sowieso vrij vaak zult moeten rekenen. Want de lengteverschillen tijdens een beweging zijn niet lineair verdeeld.

Neem als voorbeeld een simpeler model: een blokje (A) aan slechts 2 touwtjes. De touwtjes lopen over katrollen (1) en (2).
2rollen.jpg
Stel je wil het blokje A naar positie B brengen, in een rechte lijn.
De makkelijkste oplossing lijkt: Bereken de lengte van de oranje en blauwe touwen op positie A, bereken de lengte op positie B. En doe lineair de lengte aanpassen.

Je ziet al snel dat de lengte van oranje voor A en B gelijk is, dus het oranje touw doe je niks mee.
Halverwege de beweging zou je eigenlijk op positie c1 moeten zijn. Maar omdat je oranje touw nog steeds even lang is, zit je werkelijk op positie c2. En wijk je dus af van de rechte baan die je wilde.

Stel je voor wat er nu met 4 touwen gebeurt: tussendoor zullen er ineens touwen slap hangen, of juist zo strak komen dat ze breken.

Reageer