-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Suche Algorhitmus für Kreisbogen.....

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685

    Suche Algorhitmus für Kreisbogen.....

    Anzeige

    Moin!
    Ich überarbeite grad meine Fräsensteuerung (jetzt mit Beschleuniguns- und Bremsrampen und variabler Geschwindigkeit), nun würde ich gern meinem Atmel auch beibringen, wie man Kreisbögen fräst, aber ich krieg es nicht hin.
    Bei Google habe ich folgendes gefunden :
    http://www.mikrocontroller.net/topic/42447
    aber erstens raff ich es irgendwie nicht, und zweitens habe ich das ganze mal spaßeshalber nach C# portiert (geht fast per copy and paste ), aber da kriege ich irgendwie nur einen Viertelkreis hin.....
    Kann mir da jemand helfen???

    MfG
    Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551

    Re: Suche Algorhitmus für Kreisbogen.....

    Hallo Volker,

    Zitat Zitat von vklaffehn
    ... Atmel ... beibringen, wie man Kreisbögen fräst ... aber da kriege ich irgendwie nur einen Viertelkreis hin ...
    Der Kreis ist, mathematisch gesehen, eine dämliche Figur. Strenggenommen ist er nämlich nicht sooo einfach als Funktion darstellbar: in karthesischen Koordinaten gibt es ja für einen x-Wert zwei mögliche y-Werte. Diese Doppeldeutigkeit ist bei Funktionen nicht erlaubt. Daher trickst man gelegentlich und phantasiert sich eine abschnittweise definierte Funktion zurecht: den Viertel- oder Halbkreis (...siehste!). In sehr ähnlichen Fällen von Mehrdeutigkeit hatte ich mich schon mit recht gutem Erfolg durch eine Parameterisierung der Funktion aus der Patsche gerettet - das ist aber dann schon ein recht eigenes Thema.

    Es gibt ja reichlich viel Möglichkeiten einen Kreis formelmäßig darzustellen. Eine übliche Art erinnert an den alten Pythagoras:

    x2 + y2 = r2 und daraus die für positive y-Werte darstellbare Funktion:

    y = wurzel(r2-x2)

    Natürlich ist das für Deine Arbeit kein brauchbarer Zusammenhang. Ich habe leider vom Programmieren für CNCMaschinen keine Ahnung, aber ich kann mir vorstellen, dass die Lösung für einen Kreis aus drei Punkten (auf seinem Umfang) recht praktisch wäre: Anfangspunkt, Endpunkt und ein Punkt irgendwo dazwischen. Dazu gibt es beispielsweise hier eine hübsche Darstellung.

    Übrigens bin ich bei mikrocontroller.net auch über diesen Thread gestolpert (habe den aber nicht ganz durchgelesen). Dann gibts noch diese Diskussion um Kreise mit CNC-Maschinen. Diese Site bzw. den vielversprechenden Link, der ganz unten, nach längerem Scrollen erreichbar ist, habe ich nicht weiter angesehen. Diese Site gibt eine gewisse Hilfe wo´s langgeht: "...Bei der Programmierung des Kreises wird zwischen der Mittelpunkt- oder Radiusprogrammierung unterschieden..." Schließlich: kennst Du das da? (Anm.: für die sprachliche Darstellung der verlinkten Seite übernimmt der Autor dieser Zeilen keinerlei Verantwortung.)

    Langer Rede kurzer Sinn: ich verstehe Dein Problem, aber ich fürchte, dass ich nicht wirklich helfen kann.
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Bei der CNC will man meistens den Kreis mit annähernd konstanter Geschwindigkeit abfahren. Die logische methode wäre also nicht eine Funktion für die eine korodinate als funktion der anderen, sondern mit mit dem Winkel als parameter zu arbeiten. Dann hat man 2 Funktionen für die x und y Koordinate in abhängigkeit von Radius und Winkel.
    Ganz nebenbei ist man auch das Problem mit den 2 Werten los.

    Das einzige Problem was man noch hat, ist das man dazu sinus und cosinusfunktion braucht. Die sind beide relativ langsam in der Berechnung. Da die Mechanik ja oft auch nicht so schnell ist sollte es aber noch reichen. Wenns unbedingt schneller gehen muß, gibt es da noch ein Möglichkeit das über eine Drehmatrix zu realiesieren. Da hat man aber eventuell Probleme mit Rundungsfehlern und für eine wirkliche Schnelle lösung müßte man Festkommaarithmetik nutzen, was die meisten Compiler nicht so direkt unterstützen.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Moin!
    @Oberallgeier:
    Vielen Dank für die Mühe! Link 1 ist evtl. ein Ansatz, der mir weiterhilft, Link2 habe ich auch schon gefunden und komplett durch Wie meine G-Codes aussehen, habe ich nach ein wenig Herumprobieren schon herausgefunden :
    Code:
    G00 X20 Y10
    G01 Z-5
    G03 X10 Y10 I-5 J0
    fährt an Position 20,10
    5 mm runter
    Kreisbogen von 20,10 zu 10,10. Mittelpunkt bei 15,10

    @Besserwessi:
    Geschwindigkeit ist bei meiner Fräse eher zweitrangig, da sie eh im Prinzip schon zu langsam ist
    Ich müsste also quasi den Startwinkel und Endwinkel anhand des Mittelpunktes sowie der Endpunkte ermitteln und dann einmal abfahren.... Ich könnte ja dann zwischen den Punkten Linien fräsen, das reduziert den Rechenaufwand, und wenn die Kreise in 1/10 mm Schritten z.B. gerastert sind, wäre mir das ja egal
    So als Stichwort würde ich also mal nach
    Umrechnen zwischen karthesischen und Polarkoordinaten
    schauen?
    Da werd ich jetzt noch einmal bei Licht drüber nachdenken, sobald ich die Minifernsteuerautos meiner Neffen (und meins natürlich!) etwas gepimpt habe, damit sie statt mit Batterien auch mit Akkus laufen

    MfG
    Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.12.2008
    Beiträge
    1.418
    um die kreispunkte zu erechnen hab ich bisher das hier genommen (ist aber basic)

    For winkel= start winkel to endwinkel
    xpunktkreis = Cos(winkel * 22 / 7 / 180) * radius + xmittelpunkt
    ypunktkreis = Sin(winkel * 22 / 7 / 180) *radius+ ymittelpunkt
    next winkel

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Ich selbst habe ja Mal angefangen, eine CNC-Firmware für AVR zu entwickeln, die auch die Rasterungs- und Motorsteuerungsaufgaben selbst übernehmen soll.
    Der Teil, der die Kreisberechnungen durchführt, ist zwar noch eine Baustelle, funktioniert aber schon relativ gut, auf einem ATMega168 mit 20Mhz kommt meine Implementierung auf ~82000 Schritte/Sekunde bei Kreisradien < 10000 Einheiten und auf ~50000 Schritte/Sekunde bei Kreisradien > 10000.
    Ich habe dabei Bresenhams Algorithmus verwendet, leicht modifiziert, um Viertelkreise zu berechnen und schalte dann in jedem Quadranten immer die Richtung um.
    Bei jedem Funktionsaufruf wird immer ein struct mit Richtungsdaten (-1, 0, 1) für die erste und die zweite Achse zurückgegeben.
    Es sind damit also nur ebene Kreisbewegungen notwendig, mehr lässt der G-Code-Standard zu Glück nicht zu, spiralförmige Bewegungen können einfach durch überlagern mit einer linearen Bewegung auf der dritten Achse erzeugt werden.

    Bei Interesse kann ich den Sourcecode mal einstellen.

    mfg
    Markus

    PS: Einige Details zu den Tests: Die Kreisberechnungen wurden eine Sekunde lange durchgeführt und die Ergebnisse in einem FiFo gepuffert, war dieser voll, wurde er entleert. Die reine Rechenzeit für den Algorithmus dürfte vermutlich noch etwas geringer sein.
    Der FiFo ist ebenfalls eine Eigenimplementierung von mir.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Moin!
    @markusj: An Deinem Quellcode wäre ich SEHR interessiert Ich brauch auch nur den Krei in einer Ebene.
    MfG
    Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.01.2004
    Alter
    29
    Beiträge
    121
    Moin, ich arbeite im Moment auch an einer Frässteuerung für einen Atmel.
    Hab dazu allerdings das ganze erstmal mit einem Java Programm "simuliert", da hab ich auch längere Zeit an dieser eigentlich doch recht simplen Kreisfunktion geschrieben. Hier mal der Quellcode, ist zwar für Java, aber der Syntax ist eigentlich wie C, könnte man also mit kleinen änderungen direkt auf den µC portieren. Ist denk ich recht leicht zu durchschauen. Zuerst werden die Winkel berechnet bei denen der Kreisbogen anfängt und wo er aufhört. Dann fährt er vom Anfangswinkel zum Endwinkel den Kreisbogen ab. Ich verwende dort ein Funktion distance() die mir die Distanz zwischen zwei punkten berechnet und die funktion MoveTo welche die Fräse (ohne interpolation) zu den angegeben Koordinaten fährt. Die Funktion getposY() bzw. getposX() liefert die Aktuelle Position des Fräsers.
    Der rest erschließt sich denke ich so.
    x1, y1 gibt beim Funktionsaufruf den Zielpunkt an, xmid / ymid den Mittelpunkt und d die Richtug (1 CW, -1 CCW). Der Startpunkt ergibt sich ja aus der aktuellen Position des Fräsers.

    Code:
    	void arc (int x1, int y1, int xmid, int ymid, int d) {
    		  int 	i;
    		  int	X0 = x1,
    					Y0 = y1,
    					r = distance(X0, Y0, xmid, ymid);
    		  
    		  
    		  d=-d;
    		  
    		  double alpha, w1, w2;
    		  int dx, dy;
    		  
    		  //calcualtion of starting Angle w1****************************************
    		  dy = getposY() - ymid;
    		  dx =	getposX() - xmid;
    		  if (dx == 0) {
    			  if (dy >0) {
    				  w1 = 90;
    			  }
    			  else {
    				  w1 = 270;
    			  }
    		  }
    		  else if (dy == 0) {
    			  if (dx >0) {
    				  w1 = 0;
    			  }
    			  else {
    				  w1 = 180;
    			  }
    		  }
    		  else {
    			  alpha = Math.atan((double)dy / dx) * bg;
    
    			  if ((dx >0) && (dy < 0)) {	//4. quadrant
    				  w1 = 360+alpha; 
    			  }
    			  else	if ((dx< 0) && (dy < 0)) { //3. Quadrant
    				  w1 = 180+alpha; 
    			  }
    			  else	if ((dx <0) && (dy > 0)) { //2. Quadrant
    				  w1 = 180+alpha; 
    			  }
    			  else {	//1. Quadrant
    				  w1 = alpha;
    			  }
    		  }
    
    		  // Calculation of end Angle w2
    		  dy = y1 - ymid;
    		  dx =	x1 - xmid;
    		  if (dx == 0) {
    			  if (dy >0) {
    				  w2 = 90;
    			  }
    			  else {
    				  w2 = 270;
    			  }
    		  }
    		  else if (dy == 0) {
    			  if (dx >0) {
    				  w2 = 0;
    			  }
    			  else {
    				  w2 = 180;
    			  }
    		  }
    		  else {
    			  
    			  alpha = Math.atan((double)dy / dx) * bg;
    
    			  if ((dx >0) && (dy < 0)) {	//4. quadrant
    				  w2 = 360+alpha; 
    			  }
    			  else	if ((dx< 0) && (dy < 0)) { //3. Quadrant
    				  w2 = 180+alpha; 
    			  }
    			  else	if ((dx <0) && (dy > 0)) { //2. Quadrant
    				  w2 = 180+alpha; 
    			  }
    			  else {	//1. Quadrant
    				  w2 = alpha;
    			  }
    		  }
    
    		  
    		  if ((w2 < (w1)) && (d >0)) {
    			  w2+=360;
    		  }
    		  if ((w2 > (w1)) && (d <0)) {
    			  w2-=360;
    		  }
    
    		  //plot Circle
    		  for (i = (int) w1 ; i != (int) w2; i+=d)
    		  {
    		   X0 = (int) (xmid + r * Math.cos((double)i / bg));
    			     
    		   Y0 = (int) (ymid + r * Math.sin((double)i / bg));
    
    		   moveTo(X0, Y0, getposZ());
    
    
    		  }
    		  moveTo(x1, y1, getposZ());
    
    	}
    Ich wäre sehr interessiert daran wie du die Fräsgeschwindigkeit regeln willst, mir ist da noch nicht die richtige idee gekommen.
    Vielleicht könnte man ja auch mal ein Gemeinschaftsprojekt zur Cnc Steuerung mit Atmel aufstellen. Ist ja irgendwie auch blöd wenn jeder alles neu erfinden muss. Oder gibts sowas schon?

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Moin!
    Danke, da werd ich mich mal durchwursteln Die Geschwindigkeit wird bei mir nicht geregelt sondern stammt vom F-Kommando aus den GCode Dateien. Ich werte nicht präzise aus, sondern nur 'irgendwie', so dass F30 langsam ist und F300 10 mal schneller. Ist einfach über die Verzögerung zwischen den Steps der Schrittmotoren realisiert.

    Ich fände es auch ganz nett, wenn man CNC Softwarelösungen mal öffentlich macht, werd ich mit meinem Programm auch machen, wenn die Z-Achse wieder richtig rum fährt

    MfG
    Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.01.2004
    Alter
    29
    Beiträge
    121
    Hallo,
    bisher mache ich das mit der Geschwindigkeit auch nur so grob.
    Das heißt für geringen Vorschub eine Größere Wartezeit zwischen den Schritten.
    Problem dabei ist aber das ja je nach Fahrtrichtung mal mehr und mal weniger Schritte für die selbe Wegstrecke benötigt werden. Das müsste man dann ja irgenwie in die Berechnung der Verzögerung zwischen den Schritten mit einplanen, wenn man in jede Richtung eine konstante Geschwindigkeit haben möchte. Nur wie?!
    Naja meine Maschine ist eh nicht so schnell von daher spielt das eigentlich auch erstmal keine so große Rolle, geht ja auch etwas am eigentlichen Thema vorbei.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •