PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Delta Roboter



Brantiko
01.02.2009, 00:19
Hallo!
Hat schonmal Jemand versucht einen Delta Robot (http://www.youtube.com/watch?v=foTE0Mau5a8) selber zu bauen?
Heißen die Dinger wirklich so? Ich denke die Regelung von den Dingern ist das größte Problem?


Gruss
Brantiko

the_Ghost666
01.02.2009, 09:53
Moin.
Ich kenne die Dinger unter dem Namen Hexapod, aber die meisten hier werden darunter wohl einen Roboter mit 6 Beinen verstehen.
Ist n interessantes Konzept, weil du damit jeden Raumpunkt anfahren kannst, dabei entweder die Orientierung beibehälst oder auch diese sehr dynamisch ändern kannst. Die Geschwindigkeit in dem Video ist schon beeindruckend, du hast am Greifer extrem wenig Masse. Jeder der sechs Arme (deswegen Hexapod) ist in seiner Länge verstellbar und mit hoher Bewegungsfreiheit gelagert. Wenn du die passenden Linearachsen hast, fehlt noch ein Sensorsystem für die lineare Erfassung, da gibt es sehr kleine Reflexlichtschranken von Avago, ich habe mit denen gearbeitet. Schaffen 35µm Positionsauflösung, brauchst dafür dann noch ein Gitter, welches Streifen hat, 70µm schwarz, 70µm verspiegelt. Wenn weniger Rechenleistung da ist, gibts die auch in größerer Bauweise.
Dann einen Kaskadenregler, der Motorstrom, Verfahrgeschwindigkeit und Position erfasst, wie er in Industrierobotern eingesetzt wird, wohl gemerkt für jede der sechs Linear-Achsen. Und dann stimm ich dir zu, ist das Einstellen der Regelung wohl das schwerste. Danach muss aber noch das Programm her, was die Bewegungen erzeugt, dh du brauchst n Tool, was einen karthesischen Punkt + seine Orientierung im Raum in eine Bewegungsanweisung der Achsen wandelt, hier ist viel Rechenzeit und die Kenntnis der kinematischen Gleichungen von dem Ding gefragt.

Das hier ist auch n interessantes Video, weil man die Antriebe sieht:
http://de.youtube.com/watch?v=Du2f-EUDqio&feature=related
Hier anstatt Längenänderung ne Drehbewegung mit Hebelarm.

Und dieser von Physical Instruments, so wie ich ihn auf der Hannovermesse gesehen habe. http://de.youtube.com/watch?v=Q_bisi0IjpA&feature=related

Brantiko
01.02.2009, 12:54
Moin,
Du schreibst dass jeder der Arme verstellbar ist - die meisten Geräte dieser sorte arbeiten allerdings mit drei Motoren + Hebelarm.
Auf der Hannover Messe habe ich auch das Ding Fotografiert welches im Anhang zu sehen ist. Da erkennt man dass nur drei Motoren vorhanden sind.

Den Hexapod auf dem Video hab ich glaube ich auch auf der Messe gesehen - oben drauf rollten zwei kleine Kugeln im Kreis.

the_Ghost666
01.02.2009, 15:36
Sorry, ich meinte damit, dass jeder frei gelagert sein muss, wenn man das mit nur 3 starren Armen macht, dann bekommt man einige Kombinationen aus Position und Orientierung nicht hin. Das Teil von PI hat ja z.B. 6 individuelle Antriebe.
Wenn du an einen selbstbau denkst, würde ich mir mal die Scara -Roboter angucken. Die haben zwei Drehachsen hintereinander in Drehrichtung um die Vertikale und am Ende noch eine Linearstufe, die ebenfalls vertikal verfahren kann. Das reduziert den Koordinatentransformationsaufwand auf 2 polare Koordinatensysteme + Z-Achse. Diese Roboter werden dann auch gerne für Pick&Place oder Montagearbeiten genutzt.

Brantiko
01.02.2009, 15:45
Hallo!
Die dinger sind langweilig - mich reizt die parallel Kinematik :-)

Bensch
02.02.2009, 14:08
Hallo,

interessant, das ich grade jetzt so einen Fred hier finde. Ich habe nämlich vor etwa 3 Tagen beschlossen, so einen Nachbau zu wagen. Mein Kumpel hat das RN-Control Board mit AtMega32, damit wollen wir es versuchen.
Die Mechanik an sich ist ja relativ einfach, wir wollten 6mm-Kohlefaserstäbe aus dem Drachenbau nehmen, und die unteren Teile des Arms (wo je 2 parallel ausgeführt sind) über Kugelgelenke an beiden enden befestigen.
Was ich aber als größtes Problem bei der Realisierung sehe ist die ansteuerung. Um einen Punkt im Raum anzufahren, muss man ja die 3 Achsen oben an den Armen in eine bestimmte Position bringen. Das ist lineare Algebra at its best ;)
Bei den Dingern ist übrigens durch die mechanik sichergestellt, dass das Werkzeug immer parallel zum Boden ist, was ich sehr faszinierend finde.

Wir haben vor, das ganze erstmal mit 3 Servos zu machen. Sollte das was werden, kann man die Präzision und Kraft evtl durch ne andere Antriebsart bewerkstelligen. Aber da hab ich als blutiger Robotik-Anfänger noch keine Ahnung von ;)

Brantiko
03.02.2009, 00:51
Moin!
Das klingt interessant. Woher kommst du? vielleicht kann man sich zusammentun :-)
Für einen Test sind Servos bestimmt eine gute Wahl - wenn es funktioniert kann man immer noch auf Schrittmotoren + Hebel umsteigen.


Bei den Dingern ist übrigens durch die mechanik sichergestellt, dass das Werkzeug immer parallel zum Boden ist, was ich sehr faszinierend finde.

Stimmt! Allerdings find ich sowas (http://www.youtube.com/watch?v=kS9oxp0mlw8&feature=related) auch klasse. ;-)

radbruch
03.02.2009, 01:09
Hallo

Diese Deltaparallelenhexadinger sind ja echt genial. Das versuche ich auch mal. Die Mechanik scheint ja eher simpel wenn man über genügend Kugelgelenke verfügt. Auch die Ansteuerung eines Servomodels scheint mir machbar, aber die Mathematik *kopfkratz* das wird wohl nichts. Vielleicht kann man irgendwie geteachte Positionen abklappern..

Richtig klasse finde ich übrigends den hier: http://www.youtube.com/watch?v=quN37YskoaM

Das ist zwar kein Delta, zeigt aber wie feinfühlig man Servos ansteuern kann.

Schöne Nacht noch

mic

Brantiko
03.02.2009, 01:57
Evtl sollte man sich dieses (http://www.amazon.de/Effiziente-Algorithmen-Steuerung-Werkzeugmaschinen-Hexapod-Kinematik/dp/3826595823) Buch kaufen.

Ein Zitat daraus:

Die Umsetzung, z.B einer orthogonalen Translation oder Rotation des Hexapods in Längenänderung der einzelnen Stäbe, übersteigt das menschliche Vorstellungsvermögen.


Das macht einem Mut! ;-)

Bensch
03.02.2009, 02:24
Moin!
Das klingt interessant. Woher kommst du? vielleicht kann man sich zusammentun :-)
Für einen Test sind Servos bestimmt eine gute Wahl - wenn es funktioniert kann man immer noch auf Schrittmotoren + Hebel umsteigen.
Ich studiere in Düsseldorf. Und du?
Ja die Servos sollten für tests genügen, die Bewegte Masse wird ja sehr gering bleiben. Und das macht es auch nicht gleich so teuer.


Hallo

Diese Deltaparallelenhexadinger sind ja echt genial. Das versuche ich auch mal. Die Mechanik scheint ja eher simpel wenn man über genügend Kugelgelenke verfügt. Auch die Ansteuerung eines Servomodels scheint mir machbar, aber die Mathematik *kopfkratz* das wird wohl nichts. Vielleicht kann man irgendwie geteachte Positionen abklappern..

Richtig klasse finde ich übrigends den hier: http://www.youtube.com/watch?v=quN37YskoaM

Das ist zwar kein Delta, zeigt aber wie feinfühlig man Servos ansteuern kann.

Schöne Nacht noch

mic
Die Ansteuerung ist über lineare algebra lösbar, das sollte jeder abiturient können...naja...sollte :D
Ich denke ich krieg das hin, es geht eigentlich immer nur darum, schnittlinien von Kugeln und Kreisen im Raum und so Späße zu finden. Man sollte vll der Form des Roboters entsprechend kein Kartesisches, sondern vll ein Kugelkoordinatensystem wählen, mit nullpunkt oben zwischen den "Armen"...mal sehen. Aber wie immer bei Software ist ja das schöne: Einmal Programmieren und dann hat man ruhe vor der Mathe ;)
Was mich wirklich interessiert ist, wie schnell und wie präzise man so eine steuerung als laie hinkriegt.

Gruß und gute Nacht,

Benjamin

i_make_it
03.02.2009, 06:52
Gib mal in Google "Flugsimulator Hexapod" da stammen die ursprünglich her.
Ich habe bei der LH-Flight Training hier 16 Stück für die Cockpit Simulatoren Rumstehen.
Die werden allerdings mit Servohydraulik angesteuert.
An der Uni Darmstadt hatte man in den 90ern die erste Hexapod Fräse entwickelt. Entsprechende Diplom und Doktorarbeiten lassen sich dort einsehen.
Es gibt mittlerweile massenhaft komerzielle Anbieter Bsp.:
http://www.faulhaber-group.com/sprache2/n217841/n.html

Für einen Universalroboter ist mir der Arbeitsraum zu klein für den mechanischen Aufwand der zu treiben ist. Im Vergleich mit: Scara, 5/6 Achs-vertikal Knickarm.
Für eine Fräse fehlt im Eigenbau die Steifigkeit bzw. ist nur zu unverhältnissmäsigen Kosten zu erreichen.
Wer Allerdings Freiformflächen wie an Autokarosserien oder Tragflächen herstellen will hat damit ein nahezu ideales Werkzeug gefunden.

MeckPommER
03.02.2009, 09:10
... Die Umsetzung, z.B einer orthogonalen Translation oder Rotation des Hexapods in Längenänderung der einzelnen Stäbe, übersteigt das menschliche Vorstellungsvermögen. ...

Immer diese fantasielosen Buchautoren ^^

Also irgendwie sehe ich das mathematische Problem nicht. Ich gehe von Position und Winkel des Hexapod-Arms aus, die er haben soll und errechne mir die Entfernung zum jeweils antreibenden Servo. Daraus kann man die Servowinkel berechnen. Ist doch nichts anderes als die Beinsteuerung eines Hexapods.
Der kann auch an einer Stelle stehen und sich dabei drehen und wenden und in der Höhe variieren.

Gruß MeckPommER

ähM_Key
03.02.2009, 11:06
Ihr solltet Delta-Roboter und Hexapoden nicht verwechseln.

Die Rückwärtskinematik beim Hexapod ist garnicht so schwer, das sind bloß paar Formeln.
Vorwärtskinematik ist da schon spannender, da muss man iterativ rangehen und braucht die 6x6 Jacobi-Matrix.

Problematisch sind da v.A. auch Singularitäten, also Totpunkte und der komisch aussehende Arbeitsraum ;)

MeckPommER
03.02.2009, 12:13
@ ähM_Key

für einen "einfachen Aufbau" sollte es da dennoch nicht viele Unterschiede geben und eine Positionierung identisch sein. Delta-Roboter und Hexapod entsprechen sich doch insofern, als das ein Hexapod ein auf dem Kopf stehender Delta-Roboter ist, oder?

Iterativ? Das stelle ich mir bei den bisherigen Industrierobotern so vor, da durch die Vielzahl an Gelenken jeder Punkt durch eine mehr oder weniger begrenzte Anzahl von Gelenkstellungen erreichbar ist - deshalb ja auch Singularitäten.

(Nebenbei habe ich diese Singularitäten als Nichtkenner so verstanden, das minimal voneinander entfernte Zielpunkte eines Roboters komplett unterschiedliche Gelenkwinkel erfordern können und so selbst eine langsame Zielpunk-Geschwindigkeit eine unendlich hohe Geschwindigkeit der Robotermechanik erfordern würde->jeht nich. ist das ungefähr richtig?)

So aus dem Bauch heraus stelle ich mir den Arbeitsraum ellipsoid vor *kopfkratz* ...

Eigentlich ist die Mathematik eines Delta-Roboters noch ein wenig einfacher als die eines Hexapods, da ich mich um einige Winkel überhaupt nicht kümmern muss, wenn die Antriebe zum Arbeitskopf hin beweglich gelagert sind.

Vielleicht gehe ich auch einfach nur so hemdsärmlig auf diese Problematik ein, da mir der "studiziöse" Hintergrund fehlt ^^

Gruß MeckPommER

ähM_Key
03.02.2009, 12:29
Nein, es gibt auch Hexapoden die an der Decke hängen, Unterschied sind die 3 bzw. 6 angetriebenen Getriebeglieder.

Hm, nein bei dem Verfahren geht es darum aus den Längen der Beine (jetzt beim Hexapod) die Position und Winkel der Arbeitsplattform im Raum rauszubekommen.

Joa, problematisch sind auch die Stellen, wo die Beinwinkel umschlagen, d.h. gleiches Problem wie bei einem gestreckten Kniehebel.

Ellipsoid müsste sogar stimmen, allerdings mit Einschränkungen bei den erreichbaren Winkeln.

Aber frag mich jetzt bitte nicht genauer, wir haben das auch nur kurz angerissen und beschäftigen uns meistens mit serieller Kinematik ;)

Gruß, MK

MeckPommER
03.02.2009, 13:33
Nun ja, wenn ich meinen Hexapod an die Decke klebe, dann habe ich eine Arbeitsplattform, deren Position und Winkel ich frei bestimmen kann - ok, im Rahmen des Arbeitsraumes natürlich ;-)

Aus den Längen der Beine die Position und Winkel der Arbeitsplattform im Raum bestimmen? Wozu braucht man das? Bitte entschuldige die vielleicht dumme Frage, aber gerade die umgedrehte Richtung ist doch eigentlich nur interessant, also die Berechnung nötigen Beinlängen um eine gewünschte Position und Winkel der Plattform zu erreichen.

Das mit den umschlagenden Beinwinkeln ist mir noch nicht ganz einleuchtend. Da kann doch eigentlich nichts umschlagen, denn jeder gestreckte Kniehebel begrenzt doch den Arbeitsraum *kopfkratz* oder verstehe ich da grade was falsch? *kopfkratz* Die 6 Beine haben doch nur eine Länge als variablen Wert, die Ausrichtung im Raum erfolgt einzig und allein durch das Zusammenspiel der Längen.

Nach bzw. während meines Marvin-Projektes wollte ich mal ganz vorsichtig einen humanoiden, mit sensoren bestückten Kopf bauen, welcher nach genau dieser Methode, also 6 Servos auf seinen Schultern ruhen soll. Alle anderen Möglichkeiten der beweglichen Montage eines Kopfes erschienen mir von den Bewegungsmöglichkeiten her als zu naturfern.

Gruß MeckPommER

ähM_Key
03.02.2009, 16:16
Aus den Längen der Beine die Position und Winkel der Arbeitsplattform im Raum bestimmen? Wozu braucht man das?

Stell dir vor du hast z.B. nur Absolutwertgeber in den Beinen und möchtest nun wissen wo du bist um z.B. in Arbeitskoordinaten zu regeln...


Das mit den umschlagenden Beinwinkeln ist mir noch nicht ganz einleuchtend.
Stell dir vor der Kniehebel ist gestreck. Nun verlängerst du das Bein...knickt das nach rechts oder nach links weg?


Nach bzw. während meines Marvin-Projektes wollte ich mal ganz vorsichtig einen humanoiden, mit sensoren bestückten Kopf bauen, welcher nach genau dieser Methode, also 6 Servos auf seinen Schultern ruhen soll. Alle anderen Möglichkeiten der beweglichen Montage eines Kopfes erschienen mir von den Bewegungsmöglichkeiten her als zu naturfern.
Also ich kann meinen Kopf nicht in 6 FHG bewegen ;)
Zumindest nicht, wenn die Wirbelsäule still bleibt. Denke für so einen einfachen Kopf reichen auch 3 FHG oder so...alle 3 Winkel.

MK

Bensch
03.02.2009, 18:21
Nach bzw. während meines Marvin-Projektes wollte ich mal ganz vorsichtig einen humanoiden, mit sensoren bestückten Kopf bauen, welcher nach genau dieser Methode, also 6 Servos auf seinen Schultern ruhen soll. Alle anderen Möglichkeiten der beweglichen Montage eines Kopfes erschienen mir von den Bewegungsmöglichkeiten her als zu naturfern.
Also ich kann meinen Kopf nicht in 6 FHG bewegen ;)
Zumindest nicht, wenn die Wirbelsäule still bleibt. Denke für so einen einfachen Kopf reichen auch 3 FHG oder so...alle 3 Winkel.

MK
Mit dem Hexapoden-Antrieb braucht man ja auch mehr Servos als FHG, eben weil's eine Parallelkinematik ist.

Also der Beitrag von MeckPommER ein wenig höher im Fred hat mir die erleuchtung gebracht, was die ansteuerung von Koordinaten angeht. Einfach die Entfernung zum Servo berechnen, dann hat man zusammen mit dem Arm ein Dreieck, von dem man 3 Seiten kennt. Daraus kann man dann den Winkel am Servo bestimmen. Dann beschränkt sich die lineare Algebra auf das bestimmen des Abstandes. Da muss man ja noch den Versatz einberechnen, der zwischen dem anzusteuernden Punkt und der tatsächlichen Befestigung des Arms ist. Aber das ist ne Konstante, weil die Werkzeugplatform ja nur translation, keine rotation erfährt.
Ihr redet hier immer von Vorwärts- und Rückwärtskinematik...was ist das? Ich kenne wohl die einschlägigen Begriffe noch nciht, sry :)

Grüße,
Benjamin

ähM_Key
03.02.2009, 19:04
Mit dem Hexapoden-Antrieb braucht man ja auch mehr Servos als FHG, eben weil's eine Parallelkinematik ist.


Äh nein. Ein Hexapod hat genau 6 FHG und braucht somit auch genau 6 unabhängige Antriebe.

Aber Threadtitel ist ja Delta-Roboter, vl. ist deshalb die Verwirrung aufgekommen?

Vorwärstkinematik: Beinlängen bekannt -> Pose der Arbeitsplattform berechnen
Rückwärtskinematik: Pose der AP bekannt -> Beinlängen berechnen

Bensch
03.02.2009, 19:20
ja stimmt hab das was durcheinander gebracht. Vll sollten wir uns hier auf den Delta konzentrieren, und wer mag kann für den Hexapod nen eigenen fred aufmachen.
Danke für die Erklärung mit der Vorwärts/Rückwärtskinematik.

Grüße,
Benjamin

GeoBot
03.02.2009, 19:24
Ich hoffe ich bin nicht zu unpräzise:

Kinematik ist die rein geometrische Beschreibung von Bewegungen.
Mit ihr werden die Beziehungen zwischen den Winkeln und Längen der Gelenke und den damit verküpften Bewegungen einzelner Punkte der Struktur abgebildet.

Nehmen wir diese Parallelstabkinematik http://www.prsco.com/rotopod.html als Beispiel.

Wir wollen wissen wo der Mittelpunkt der Plattform ist und dazu die
Neigungwinkel und den Rotationswinkel der Plattform. Gegeben ist
die Position der Gelenke unten auf dem Ring. Das wird als "direktes
kinematisches Problem" bezeichnet und die Lösung wird "Vorwärtstransformation" genannt.

Wollen wir umgekehrt nun zu einer Plattformposition und Lage die Stellungen der Gelenke ermitteln, ist das das "inverse Kinematische Problem". Und dessen Lösung heißt "Rückwärtstransformation".

GeoBot
03.02.2009, 19:39
MeckPommER: "Aus den Längen der Beine die Position und Winkel der Arbeitsplattform im Raum bestimmen? Wozu braucht man das?"

z.B. um den Arbeitsraum auszulegen.

Was mir da auch noch Einfällt ist die Kalibrierung. Mal schauen da hatte
ich auch noch einen Link zu.

http://tu-dresden.de/die_tu_dresden/fakultaeten/fakultaet_maschinenwesen/iwm/forschung/kalibirierung_parallelkin

Bensch
03.02.2009, 20:12
Hallo GeoBot,

Danke für die Erklärung. Was ich laienhaft als "Ansteuerung" bezeichnet habe wäre also die Rückwärtstransformation, also eine Lösung zu "Ich will an den Punkt X, wie muss ich die Gelenke stellen?", richtig?
Ich rechne grade ein bischen dran rum, wenn was brauchbares dabei rum kommt scan ich es ein und stells hier ein.
Grüße,
Benjamin

GeoBot
03.02.2009, 20:43
@ Bensch : Ja.

Hier noch ein Link aus meiner Sammlung.
Für die die richtig einsteigen (lesen) wollen.
Da hat es auch entsprechende Software.
http://www-sop.inria.fr/members/Jean-Pierre.Merlet//merlet_eng.html

Bensch
03.02.2009, 23:39
Soooo,

wie ihr wisst versuche ich grade, eine Rückwärtstransformation für den Delta zu berechnen. Und es ist leider doch nicht sooo einfach, wie ich dachte. Das Problem war/ist ein Denkfehler meinerseits. Ich habe versucht, für einen gegebenen Montagepunkt des Bots und gegebene Lage des anzufahrenden Punktes den Winkel zu berechnen, den der obere Teil des Armes mit der Geraden bildet, die durch Anfang und Ende des Armes führt. Das klappt zwar, bringt aber nichts 8-[ ...

Ich habe jetzt folgendes vor (mach ich aber erst morgen, weil ich da vermutlich teilweise selbsts nochmal nachlesen muss):
Gegeben ist der Montagepunkt des Bots und der Punkt, der angefahren werden soll, sowie die Maße des Bots.

1) Funktion erstellen die aus dem Montagepunkt und der Geometrie des Bots den Punkt berechnet, an dem der Arm beginnt (das ist dann genau in der Achse des Servos). Punkt = AA

2) Funktion erstellen, die aus dem anzufahrenden Punkt den Punkt berechnet, an dem der Arm enden muss. Punkt = AE

3) Um AE eine Kugel mit Radius = Länge des unteren Armteils legen

4) Um AA einen Kreisring legen mit Radius = Länge des oberen Armteils. Der Kreisring muss in der Ebene liegen, die der Obere Armteil bei seiner Bewegung aufspannt.

5) Schnittpunkte zwischen der Kugeloberfläche und dem Kreisring berechnen (Müssten 2 sein, ausser der Arm ist voll gestreckt, dann nur 1. Wenn Punkt nicht erreichbar 0)

6) Von diesen Schnittpunkten jenen identifizieren, der "Weiter aussen", also weiter weg vom Montagepunkt des Arms, liegt. Dieser Punkt ist der Gelenkpunkt des Arms = AG

7) Mit Kenntnis von AA und AG den Winkel zwischen der Ebene, auf der der Bot montiert ist und der Geraden durch AA und AG berechnen. Das ist der Winkel, den der Servo steuern muss.

Ist alles nur lineare Algebra, aber Kugeln im Raum und deren Schnittpunkte mit irgendwas anderem muss ich mir nochmal anschauen.

Brantiko
04.02.2009, 01:33
Schnittpunkte zwischen der Kugeloberfläche und dem Kreisring berechnen (Müssten 2 sein)

Der Kreis liegt in der Kugel da der obere Arm am Servo doch deutlich kleiner ist als der lange Hebelarm? :-k

radbruch
04.02.2009, 13:10
Hallo

Da ich nur mittlere Reife besitze und kein Französisch kann werde ich wohl beim Taechen der Positionen bleiben müssen. Um mal ein Gefühl für die Technik zu bekommen habe ich mir ein kleines Funktionsmodel gebastelt:

http://radbruch.roboterbastler.de/rp6/delta/deltatest1_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltatest1.jpg) http://radbruch.roboterbastler.de/rp6/delta/deltatest2_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltatest2.jpg) http://radbruch.roboterbastler.de/rp6/delta/deltatest3_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltatest3.jpg)

http://i4.ytimg.com/vi/7fpQXlaJN80/2.jpg (http://www.youtube.com/watch?v=7fpQXlaJN80)
http://www.youtube.com/watch?v=7fpQXlaJN80

Freihändig mit viel Heißkleber zusammengeklebt sind die Fertigungtoleranzen unter aller Sau. Aber trotzdem kann man erkennen, was mit besserer Mechanik machbar ist. Die Schubstangen sind aus Trinkhalmen gefertigt, die Scharniere ersetzen die sonst üblichen Kugelgelenke. Ich denke, mein Ansatz ist schon mal vielversprechend.

Gruß

mic

Bensch
04.02.2009, 13:53
Schnittpunkte zwischen der Kugeloberfläche und dem Kreisring berechnen (Müssten 2 sein)

Der Kreis liegt in der Kugel da der obere Arm am Servo doch deutlich kleiner ist als der lange Hebelarm? :-k
Der Kreis hat einen kleineren Radius als die Kugel, aber Kreis und Kugel haben nicht den gleichen Mittelpunkt. Deshalb können die sich schneiden.

Hey das sieht ja schonmal sehr gut aus, mic. Dass sich der Teller oben schief stellt, liegt an den Toleranzen? Weil wenn nicht müsste ich das Konzept nochmal überdenken...

Gruß,
Benjamin

MeckPommER
04.02.2009, 14:04
@ Bensch,

also wenn ich im Geiste mir den Delta-Roboter mit 6 Servos baue, dann brauche ich die gewünschte Position und Winkel der Arbeitsplattform im Raum und den daraus resultierenden absoluten Positionen der Montagepunkte der Servo/Schubstangen/Sonstwie-Antriebe. Und ich brauche die fixen Positionen der Halterungen der Antriebsarme. Daraus ergeben sich 6 Entfernungen, die nur umgesetzt zu werden brauchen. Mir will bis jetzt nicht einleuchten, wozu ich da irgendwelche Winkel bräuchte. Für Servos errechne ich mir die einfach mit dem Kosinussatz aus der Entfernung und der Länge meiner Hebel an den Servos.
Gut ist nur, wenn mir diesbezüglich jemand den Kopf wäscht (falls ich falschliege), damit ich mich nicht in Falsches verrenne, bis mein Halsgelenk fertig ist und nicht funzt ^^

@ähM_Key

du hast recht, natürlich ist unser "Halsgelenk" nicht so flexibel, wie ein Hexapod. Aber dadurch, das wir mit den oberen Halswirbeln stets bei jeder Kopfbewegung auch aktiv sind, erscheint es mir sinnvoll, die Beweglichkeit des Gelenks sowie die Beweglichkeit der oberen Halswirbel mit einem Hexapod-Konstrukt nachzubilden.

@ radbruch

Gaiol :) Das Video gefällt echt! So eine Konstruktion hatte ich zwischenzeitlich mal als Bein für einen Hexapod in Betracht gezogen, aber man kommt ja zu nix ^^
Die Idee, das erstmal mit Trinkröhrchen und scharnieren zu realisieren, finde ich klasse, darauf bin ich bisher nicht gekommen. Ich hatte mir schon die Kugelgelenke ausgesucht und mich beim Preis gegruselt *g*
Bitte versorge uns mit weiterem Material, wenn deine Tests fortschreiten.

Gruß MeckPommER

radbruch
04.02.2009, 14:13
Hallo

Das Kippen der Platte liegt an den Fertigungstoleranzen und den lockeren Schrauben an den Scharnieren. Die Arme, Servos und Festpunkte an der Platte sind nicht wirklich symetrisch zusammengeklebt. Es ist erstmal nur eine Studie. Bevor ich mich richtig draufstürze wollte ich mal testen was da auf mich zukommt. Ich schätze, dass man da auch mit schmalem Geldbeutel viel Funktion rausholen kann. Ich bastle grad 'ne zweite Version zusammen, mechanisch etwas stabiler und anspruchsvoller.

Gruß

mic

Bensch
04.02.2009, 14:31
@ Bensch,

also wenn ich im Geiste mir den Delta-Roboter mit 6 Servos baue, dann brauche ich die gewünschte Position und Winkel der Arbeitsplattform im Raum und den daraus resultierenden absoluten Positionen der Montagepunkte der Servo/Schubstangen/Sonstwie-Antriebe. Und ich brauche die fixen Positionen der Halterungen der Antriebsarme. Daraus ergeben sich 6 Entfernungen, die nur umgesetzt zu werden brauchen. Mir will bis jetzt nicht einleuchten, wozu ich da irgendwelche Winkel bräuchte. Für Servos errechne ich mir die einfach mit dem Kosinussatz aus der Entfernung und der Länge meiner Hebel an den Servos.
Gut ist nur, wenn mir diesbezüglich jemand den Kopf wäscht (falls ich falschliege), damit ich mich nicht in Falsches verrenne, bis mein Halsgelenk fertig ist und nicht funzt ^^

Gruß MeckPommER

Ich versuche, dir mal den Kopf zu waschen ;) Ich habe diesen Denkfehler gestern auch gemacht, alles komplett durchgerechnet und erst am ende gemerkt, dass es nichts bringt. Also:
Mit deinem Ansatz berechnet man sich ja ein Dreieck bestehend aus dem beiden Armteilen und dem Abstand vom Armanfang zum Armende. Aus diesem Dreieck kann man nun alle Winkel berechnen, die mit dem Dreieck zu tun haben, so zB auch den winkel am oberen Armteil. Das Problem ist aber folgendes: Der Servo stellt nicht den winkel des oberen Armteils relativ zu der gedachten Grade "Armanfang<->Armende", sondern den Winkel des oberen Armteils relativ zur Montageplatform des Roboters ein. Und diesen kann man aus dem Dreieck nicht ableiten, weil man nicht weiß, wie es im Raum orientiert ist.
Ist das so verständlich? Ansonsten versuche ich es gerne nochmal!

Gruß,
Benjamin

MeckPommER
04.02.2009, 16:14
Ich versuche, dir mal den Kopf zu waschen ;) Ich habe diesen Denkfehler gestern auch gemacht, alles komplett durchgerechnet und erst am ende gemerkt, dass es nichts bringt. Also:
Mit deinem Ansatz berechnet man sich ja ein Dreieck bestehend aus dem beiden Armteilen und dem Abstand vom Armanfang zum Armende. Aus diesem Dreieck kann man nun alle Winkel berechnen, die mit dem Dreieck zu tun haben, so zB auch den winkel am oberen Armteil. Das Problem ist aber folgendes: Der Servo stellt nicht den winkel des oberen Armteils relativ zu der gedachten Grade "Armanfang<->Armende", sondern den Winkel des oberen Armteils relativ zur Montageplatform des Roboters ein. Und diesen kann man aus dem Dreieck nicht ableiten, weil man nicht weiß, wie es im Raum orientiert ist.
Ist das so verständlich? Ansonsten versuche ich es gerne nochmal!

Gruß,
Benjamin

Irgendwie fühlen sich meine Haare noch trocken an ^^

Aber vielleicht liegt das auch nur daran, das wir jeder vielleicht ein anderes Bild vor Augen haben. Ich versuche mal meine Gedanken besser zu formulieren, damit du mir meinen etwaiger Fehler leichter aufzeigen kannst.

Jeder der 6 Servos stellt durch seinen Winkel die Entfernung von Armanfang zu Armende ein, indem er zwischen den beiden Arm-Enden einen Winkel aufspannt.

Welchen Winkel Armanfang oder Armende zum Rest der Welt oder zur Montageplattform haben ist absolut unwichtig (kugelgelenke an beiden Seiten) denn mit den 6 Armlängen bestimmen wir ja die eindeutige, gewünschte Position.

Jede Position der Arbeitsplattform nach Ort und Winkel wird eindeutig referenziert durch die 6 Entfernung der Kugelgelenk-Armhalterungen an der Arbeitsplattform zu den Montagepunkten der Arme eines gedachten Rahmens.

Stellt man nun die 6 Servoarme auf diese 6 Entfernungen ein, so ergibt sich die gewünschte Position, OHNE das wir die Winkel der Arme zum Rahmen oder zur Arbeitsplattform kennen.

Zum Servo: der sitzt pro Arm nicht an der Arbeitsplattform oder dem Rahmen, sondern in der Mitte der beiden Armteile. Er spannt also wirklich nur eine Entfernung auf, unabhängig von den Winkeln zu Arbeitsplattform oder Montagerahmen, da die beiden Enden jedes Arms an Kugelgelenken sitzen.

Gruß MeckPommER

radbruch
04.02.2009, 18:13
Hallo

Wie geplant habe ich nun die Drinkhalme durch solides Messingrohr ersetzt:

http://radbruch.roboterbastler.de/rp6/delta/deltatest4_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltatest4.jpg) http://radbruch.roboterbastler.de/rp6/delta/deltatest5_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltatest5.jpg) http://radbruch.roboterbastler.de/rp6/delta/deltatest6_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltatest6.jpg) http://radbruch.roboterbastler.de/rp6/delta/deltatest7_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltatest7.jpg)

Schon recht hübsch. Höhere Fertigungsgenauigkeit zahlt sich aus wie man am Blick durch die aufgereihten Stangen sieht. Das sind übrigens 4mm Messingröhrchen:

http://i4.ytimg.com/vi/WLFXLWqfrl4/default.jpg (http://www.youtube.com/watch?v=WLFXLWqfrl4)
http://www.youtube.com/watch?v=WLFXLWqfrl4

Das selbe Demo wie oben, allerdings mit etwas geänderter Geometrie. Gegen Ende des Videos werden die Schrauben lockerer. Ich brauche dringend 3er Stoppmuttern :)

Gruß

mic

Bensch
04.02.2009, 18:37
MackPommER:
Du hast recht. Ich war davon ausgegangen, dass die Servos an den Angang des Arms sollen. Wenn man die in die Armmitte macht, funktioniert es natürlich so, wie du es machen willst

MeckPommER
04.02.2009, 19:44
Ist genauso wie in radbruchs seeeehr schönem Video, nur mit dem Unterschied, das jede der Stangen separat gesteuert wird, womit die Arbeitsplatte nicht nur im Ort sondern auch im Winkel steuerbar wird.
Damit sich die Servehebel nicht in die Quere kommen, müßten die natürlich etwas weiter voneinander entfernt sein.
Wenn ich mir das Video von Radbruch anschaue, dann wird mir auch wieder deutlich, das man sich die Geschwindigkeit der Arbeitsplattform durch Genauigkeitsverlust erkauft.

Brantiko
04.02.2009, 20:47
Geil was man aus "Schrott" alles machen kann. Ich hab schon wieder an CAD und Teile Fräsen lassen geadacht :-)
Bei www.igus.de kann man Muster bestellen. Ich hab mir direkt mal 12 Kugelgelenke M3 bestellt :-) MeinD elta Bot kommt dann auch irgendwann.

Gruß

Alex

GeoBot
05.02.2009, 09:40
Hast du zu den 12 Kugelgelenken eine Bestellnummer?

Brantiko
05.02.2009, 11:31
Nein lässt sich auf der Homepage nachsehen.

Bensch
06.02.2009, 23:41
Hallo zusammen,

ich kaue immernoch an der Ansteuerung...verzeihung, an der Rückwärtskinematik *g* des "Deltas" rum.
Wie gesagt, es wäre einfach zu berechnen, wenn man die Servos in die Armmitte machen würde, aber das würde die Armmechanik unnötig kompliziert machen. Ich möchte eigentlich nicht die Mechanik ändern, um ein Softwareproblem zu lösen. Meint ihr, wir schaffen es gemeinsam, das Problem zu lösen? Einen Idee, wie man zum Ziel kommt, habe ich schon. Aber mir fehlt's an der Mathe, und vielleicht auch an der anschließenden Umsetzung in eine Programmiersprache, um das umzusetzen.
Vielleicht sollten wir dazu auch einen Fred in einem anderen Unterforum (Open Source Software ?) eröffnen.

Grüße,
Benjamin

MeckPommER
07.02.2009, 09:02
Die beiden Armlängen und die Entfernung der Endpunkte zueinander ergeben ein Dreieck von dem du alle Längen kennst. Die Armlängen können hierbei auch problemlos unterschiedlich sein. Wo du den Servo hinpackst ist einerlei, denn du kannst dir aus den Längen jeden Winkel berechnen den der Servo einstellen müßte. Cosinussatz nennt sich das Zauberwort, wenn ich nicht irre. Du kannst also den Servo auch in Rumpfnähe einsetzen. Wichtig ist nur, das die komplette Armkonstruktion beweglich gelagert ist und nirgendwo starr montiert ist.

Gruß MeckPommER

radbruch
07.02.2009, 22:07
Hallo

Inzwischen habe ich meine Konstuktion etwas geändert. Die Servos sind nicht mehr tragendes Element und können so schneller ersetzt werden. Durch die Untersetzung wird der Drehbereich der Servos (~180°) besser an die Drehbereiche des Deltaarms (~120°) angepasst:

http://radbruch.roboterbastler.de/rp6/delta/deltamini1_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltamini1.jpg)

http://radbruch.roboterbastler.de/rp6/delta/deltamini2_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltamini2.jpg) http://radbruch.roboterbastler.de/rp6/delta/deltamini3_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltamini3.jpg) http://radbruch.roboterbastler.de/rp6/delta/deltamini4_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltamini4.jpg) http://radbruch.roboterbastler.de/rp6/delta/deltamini5_klein.jpg (http://radbruch.roboterbastler.de/rp6/delta/deltamini5.jpg)

Ein bisschen FT erleichtert das Testen verschiedener Aufbauversionen :) Rechts die freihändig gefertigten Oberarmstreben.

Das Filmchen dazu:
http://i4.ytimg.com/vi/7bQRXfLwBgU/2.jpg (http://www.youtube.com/watch?v=7bQRXfLwBgU)
http://www.youtube.com/watch?v=7bQRXfLwBgU

Obwohl ich mit der Antriebslösung noch nicht wirklich zufrieden bin plane ich jetzt einen "Greifer" und eine kleine Aufgabe. Das ist schon eine sehr geniale Roboterarmtechnik ;)

Gruß

mic

the_Ghost666
07.02.2009, 22:58
Ich kann nur sagen, respect, es ist toll zu sehen, wie du auf die schnelle was zusammenbaust, weiterentwickelst und immer weiter probierst. Dafür, dass der Thread erst vor einigen Tagen gestartet wurde, machst du ja riesige Fortschritte, wenns bei mir auch so laufen würde.

Bensch
07.02.2009, 23:15
Mensch radbruch,
das sieht ja wirklich seeeehr fein aus. auch das Verhältnis von Geschwindigkeit zu Genaueigkeit ist ja schon vieeeeel besser! Wird nur ein bisserl instabil, wenn alle Arme durchgestreckt sind. Aber das liegt wohl an der Konstruktionsart an sich, nicht an deiner Umsetzung, denke ich.

Welches Verhältnis von Antriebsseitigem zu Antriebsfernem Armteil-Länge hast du da cirka? Ich wollte so in Richtung 1:2,5 - 1:3 gehen.

Nach einem sehr erhellenden PN-Austausch mit MeckPommER haben wir jetzt auch unsere Mißverständnisse aus dem Weg geräumt und sind nun auf einem Nenner. Er wird die Sache etwas anders realisieren, als es in radbruchs Bot gemacht ist.

radbruch, hast du schon eine idee zur Rückwärtskinematik? Ich habe bisher folgenden Ansatz:

1. Um die Punkte "Armanfang" und "Armende" eine Kugel legen, deren r = der Armteil-Länge des jew. angrenzenden Armteils ist.
2. Schnittkreis der Kugeln = Mögliche Positionen des Arm-Gelenkes
3. Ebene, auf der der Antriebsseitige Armteil sich bewegt, festlegen (ist ein Fixwert)
4. Schnittpunkte des Kreises aus 2. mit der Ebene aus 3. = Mögliche Punkte des Arm-Gelenks (sollten zwei sein).
5. Jenen Punkt wählen, der weiter weg ist von der Mitte des nicht bewegten Teil des Roboters.
6. Von der Ebene, auf der der Bot steht ein Lot auf den Punkt aus 5. fällen.
7. das Lot, die Strecke (Lot-Fußpunkt - Punkt aus 5.) und (Punkt aus 5. - Armfixpunkt) Bilden ein Dreieck, in dem der gesuchte Winkel liegt (Cosinussatz bzw. Skalarprodukt anwenden)

Das ganze dann natürlich für jeden Arm einzeln. Wenn man 4 Arme hat, kann man auch den Greifer (oder sonst was) drehen, siehe hier (http://www.youtube.com/watch?v=0-Kpv-ZOcKY) von 1:05 bis 1:20. Dazu sollte man, wenn man obige idee umgesetzt hat, nur die Armendpunkt ändern müssen.

Hat jemand Lust, obiges mal in Bascom umzusetzen :-# ?

Beste Grüße,

Benjamin

radbruch
07.02.2009, 23:55
Hallo

Es freut mich dass euch die Spielerei gefällt. Leider flutschen bei mir nur die Projekte die mich interessieren, viele andere eigentlich sehr wichtige Dinge erledige ich dagegen eher schleppend. Und keines meiner Projekte habe ich bisher wirklich beendet :(

Das Verhältniss der Armlängen ist bei meinem Modell 6cm zu 13cm. Das hat sich aus Bauchgefühl und vorhandenem Messingrohr eher zufällig so ergeben. Am Ende der Hubbewegung werden die Unterschiede der Servostellungen besonders deutlich weil nicht alle Servos gleichzeitig die Endlage erreichen. Der nutzbare Arbeitsbereich ist kleiner als das maximal machbare.

Servos sind auch nicht wirklich ideal weil man ihre Stellgeschwindigkeit nicht gut steuern kann. Besser ist natürlich ein Getriebemotor (ich liebäugle mit kleinen Akkuschraubern), der erfordert allerdings einen erheblichen Aufwand beim Ansteuern. Ausserdem benötigt man dann auch eine Wegmessung an den Antriebwellen. Damit wären sicher auch sehr feinfühlige Bewegungen möglich (plotten/schreiben?), mit Servos kann mal eigentlich nur Positionen anfahren ohne dabei die Wege genau festzulegen.

Den mathematischen Ansatz verdränge ich weiterhin energisch und bleibe vorerst bei der Teachlösung. Selbst wenn es mir gelingen würde die erforderlichen Servowinkel auszurechen, ich wüsste nicht, wie ich diese dann in Servoimpulslängen umrechnen sollte. Zudem sind meine Billigservo alles andere als liniar.

Schönen Abend noch

mic

Bensch
08.02.2009, 00:45
Das Umrechnen Servowinkel -> Impulslänge ist eine einfache lineare Zuordnung. Wenn du mir eine Formel für die Servowinkel lieferst, mach ich dir den Rest :D
Nein mal im Ernst: Ich finde, dass bei dieser Bauart gerade die Ansteuerung der Witz an der Sache ist. Ohne diese ist es nur eine mechanische Spielerei, man kann sich an der immerwährenden Parallelität der bewegten Plattform freuen, aber wirklich nützlich ist das so nicht. Man kann nicht einmal eine lineare Bewegung der Plattform erzeugen. Ich würde deshalb wirklich gerne eine elegante Ansteuerung, verzeihung: Rückwärtskinematik für den Delta entwickeln.

MeckPommER
08.02.2009, 02:20
... Damit wären sicher auch sehr feinfühlige Bewegungen möglich (plotten/schreiben?), mit Servos kann mal eigentlich nur Positionen anfahren ohne dabei die Wege genau festzulegen...

Nun ja, du hast eine Position, die du anfahren willst, schickst diese an die Servos und ScHwUpS nimmt der Arm die Position ein. Die Kunst besteht meiner Meinung nach darin, eben diese Position "oft und flüssig" an die Steuerung weiterzugeben.

Wenn ich zwei entfernte Punkte ansteuern will und diese ohne errechnete Zwischenpunkte anfahre, dann ergeben sich mit Sicherheit unschöne Bewegungen.

Wenn ich aber eine steuerungstechnische Zwischenstufe einfüge, die mir aus meinen Ansteuerungspunkten zunächst eine Reihe von Zwischenpunkte errechnet, die ich so schnell als möglich anfahre, dann habe ich auch geschmeidige Bewegungen ohne Gezappel :)

Eben diese Zwischenstufe muss realisieren können, wie schnell die Mechanik ist. Je weiter der Weg ist, desto höher muss sie diese Bahn auflösen können.

Gruß MeckPommER

radbruch
08.02.2009, 21:41
Hallo

Mit lausig geteachten Positionen (zwei Stunden Arbeit, ich muss mir wohl ein kleines Tool schreiben) sieht das Ergebniss recht nett aus:

http://i2.ytimg.com/vi/QeY_KkZRlDc/2.jpg (http://www.youtube.com/watch?v=QeY_KkZRlDc)
http://www.youtube.com/watch?v=QeY_KkZRlDc

Ehrlich, das Demo lief minutenlang ohne Probleme. Aber für das Filmchen musste ich ja unbedingt noch die Akkus laden. Naja, der Kater hat seinen Spass dabei.

Dass die Wiederholgenauigkeit der Billigservos ziemlich schlecht ist wußte ich schon seit den Dominosteinen. Ohne eine getrennte Wegmessung direkt an den Armen wird das wohl nichts werden.

"Hat schonmal jemand versucht einen Delta Robot selber zu bauen?" Ja, habe ich und das macht Spaß! *lol*

Gruß

mic

Bensch
09.02.2009, 01:21
find ich super. wie hast du die Positionen geteacht? du hast doch gar keine Sensorik?!
Ich code Grad eine Ansteuerung, hier mein Stand der Dinge:
Leider fehlt noch alles, was kompliziert ist :-# :-# :-#



'
' Alle Berechnungen gehen von Folgendem aus:
' Der Bot ist an einer Ebene befestigt, die parallel zur xy-Ebene liegt
' Der Arm 1 liegt in y-Richtung.
' Der Arm 2 liegt, von oben gesehen, 120° links gedreht (Negative y- und x-Richtung).
' Der Arm 3 liegt, von oben gesehen, 120° rechts gedreht (Negative y-, positive x-Richtung).
' Alle Werte für Längen, Abstände und Positionen werden in Nanometern (nm) angegeben!
'


Declare Function Tastenabfrage() As Byte
Declare Sub Eins()
Declare Sub Zwei()
Declare Sub Drei()
Declare Sub Vier()
Declare Sub Fuenf()


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000 'Quarzfrequenz
$baud = 9600

Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein

Dim Taste As Byte

' Deklaration der Variablen, die die Proportionen des Roboters beschreiben
' Alle Angaben in nm und als "Long" (32bit genauigkeit)
' Zulässig sind Werte zwischen -2147483648 und +2147483647

Print
Print "= = = = Delta-Steuerung = = = ="
Print
Print "Lade Konstruktionsparameter..."

' Fixer Befestigungspunkt B im Raum
Dim B_x As Long
Dim B_y As Long
Dim B_z As Long
B_x = 0
B_y = 0
B_z = 0


' Länge des Servoseitigen Armteils ("Oberer Armteil" -> Oa)
Dim Oa As Long
Oa = 100000000 '=10cm


' Länge des Servofernen Armteils ("Unterer Armteil" -> Ua)
Dim Ua As Long
Ua = 200000000 '=20cm


' Abstand der Armservoachsen vom Befestigungspunkt B auf der xy-Ebene
Dim Abst_b_aa_xy As Long
Abst_b_aa_xy = 70000000 '=7cm


' Abstand der Armservoachsenvom von der xy-Ebene
Dim Abst_b_aa_z As Long
Abst_b_aa_z = 30000000 '=3cm


' Abstand der Armenden vom Tool auf der xy-Ebene
Dim Abst_t_ae_xy As Long
Abst_t_ae_xy = 40000000 '=4cm

' Abstand der Armenden von der xy-Ebene
Dim Abst_t_ae_z As Long
Abst_t_ae_z = 10000000 '=1cm

Print "Konstruktionsparameter geladen"
Print
Print "Montagepunkt = (" ; B_x ; "," ; B_y ; "," ; B_z ; ")"
Print "Armanfangs-Versatz:"
Print Abst_b_aa_xy ; "nm vom Montagepunkt in xy-Ebene"
Print "und " ; Abst_b_aa_z ; "nm in z-Richtung"
Print "Armende-Versatz:"
Print Abst_t_ae_xy ; "nm vom Toolpunkt in xy-Ebene"
Print "und " ; Abst_t_ae_z ; "nm in z-Richtung"
Print
Print "Berechne Konstruktionsabhaengige Fixwerte"

' Arm-Anfangspunkte:
' Arm1: (Der von oben gesehen hintere Arm, genau in y-Richtung)
Dim A1a_x As Long
Dim A1a_y As Long
Dim A1a_z As Long
A1a_x = B_x
A1a_y = B_y + Abst_b_aa_xy
A1a_z = B_z - Abst_b_aa_z

'Arm2: (Der von oben gesehen linke Arm)
Dim A2a_x As Long
Dim A2a_y As Long
Dim A2a_z As Long
Dim Hilf1 As Single 'Hilfsvariable für Zwischenergebnisse
Dim Hilf2 As Long
Dim Hilf3 As Long
Hilf1 = 0.866025403784435 '=Cos(30°)
Hilf2 = Hilf1 * Abst_b_aa_xy
A2a_x = B_x - Hilf2
Hilf3 = Abst_b_aa_xy / 2 '=Sin(30°)*Abst_b_aa_xy = Abst_b_aa_xy / 2
A2a_y = B_y - Hilf3
A2a_z = B_z - Abst_b_aa_z

'Arm3: (Der von oben gesehen rechte Arm)
Dim A3a_x As Long
Dim A3a_y As Long
Dim A3a_z As Long
A3a_x = B_x + Hilf2
A3a_y = B_y - Hilf3
A3a_z = B_z - Abst_b_aa_z

Print "Fixwert-Berechnung abgeschlossen."
Print "Arm1-Anfang = ( " ; A1a_x ; " , " ; A1a_y ; " , " ; A1a_z ; " )"
Print "Arm2-Anfang = ( " ; A2a_x ; " , " ; A2a_y ; " , " ; A2a_z ; " )"
Print "Arm3-Anfang = ( " ; A3a_x ; " , " ; A3a_y ; " , " ; A3a_z ; " )"

Do
Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
Call Eins
Case 2
Call Zwei
Case 3
Call Drei
Case 4
Call Vier
Case 5
Call Fuenf
End Select
End If
Waitms 1000
Loop

End

Sub Eins()
Print "Sub 1"
End Sub


Sub Zwei()
Print "Sub 2"
End Sub


Sub Drei()
Print "Sub 3"
End Sub


Sub Vier()
Print "Sub 4"
End Sub


Sub Fuenf()
Print "Sub 5"
End Sub


'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Local Ws As Word

Tastenabfrage = 0
Start Adc
Ws = Getadc(7)
' Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
If Ws < 500 Then
Select Case Ws
Case 400 To 450
Tastenabfrage = 1
Case 330 To 380
Tastenabfrage = 2
Case 260 To 305
Tastenabfrage = 3
Case 180 To 220
Tastenabfrage = 4
Case 90 To 130
Tastenabfrage = 5
End Select
End If
End Function

radbruch
09.02.2009, 01:43
wie hast du die Positionen geteacht?
teachen=solange an den Servopositionen fummeln bis es halbwegs passt.

In C sieht das bei mir dann so aus:

// Deltaarm ansteuern mit dem RP6 3.2.09 mic

#include "rblib.h"
#include "rblib.c"

volatile uint16_t p=0;
uint8_t xpos=120, ypos=120, zpos=120, demo;
uint16_t speed;

void servo_init(void);
void pause(uint16_t p_10ms);
void moveto(uint8_t x, uint8_t y, uint8_t z, uint8_t pause_10ms);
void holen1(void);
void holen2(void);
void holen3(void);
void bringen1(void);
void bringen2(void);
void bringen3(void);
int main(void)
{
rblib_init();
servo_init();
pause(100);
/* for(demo=120; demo<190; demo++) moveto(demo,demo,demo,5);
for(demo=189; demo>120; demo--) moveto(demo,demo,demo,4);
for(demo=121; demo<190; demo++) moveto(demo,demo,demo,3);
for(demo=189; demo>120; demo--) moveto(demo,demo,demo,2);
for(demo=121; demo<190; demo++) moveto(demo,demo,demo,2);
for(demo=189; demo>120; demo--) moveto(demo,demo,demo,1);
moveto(190,190,190,50);
moveto(120,120,120,50);
*/

// heben und legen
holen1(); bringen1();
holen3(); bringen3();

while(1)
{
// tauschen
holen1(); bringen2();
holen3(); bringen1();
holen2(); moveto(90,160,90,40); bringen3();
}
return(0);
}
ISR(TIMER0_COMP_vect)
{
static uint16_t count=0;
if(count>xpos) PORTA &= ~16; else PORTA |= 16; // E_INT1 (Pin8)
if(count>ypos) PORTC &= ~1; else PORTC |= 1; // SCL (Pin10)
if(count>zpos) PORTC &= ~2; else PORTC |= 2; // SDA (Pin12)
if(count<1000)count++; else { count=0; if(p) p--; }
}
void servo_init(void)
{
DDRA |= 16; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang

TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin
TCCR0 |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8
TIMSK = (1 << OCIE0); // Interrupt ein
OCR0 = 10; // 100kHz?
}
void pause(uint16_t p_10ms)
{
p=p_10ms;
while(p);
}
void moveto(uint8_t x, uint8_t y, uint8_t z, uint8_t p_10ms)
{
xpos=x;
ypos=y;
zpos=z;
p=p_10ms;
while(p);
}
void holen1(void)
{
moveto(99,104,91,50);
moveto(80,90,73,20);
moveto(99,104,91,30);
}
void holen2(void)
{
moveto(60,111,83,50);
moveto(50,95,65,20);
moveto(60,111,83,30);
}
void holen3(void)
{
moveto(84,110,52,50);
moveto(69,95,47,20);
moveto(84,110,52,30);
}
void bringen1(void)
{
moveto(99,104,91,50);
pause(200);
}
void bringen2(void)
{
moveto(60,111,83,50);
pause(200);
}
void bringen3(void)
{
moveto(81,107,50,50);
pause(200);
}
*GG*

Bensch
09.02.2009, 02:21
fein fein,
ich bin zwar nicht der Knaller in C, aber ich glaube ich versteh's.

Wirst du eine Rückwärtskinematik umsetzen?

MeckPommER
09.02.2009, 06:21
ich
ich bin
ich bin schwer
ich bin schwer beeindruckt

bravo, radbruch :-)

vohopri
09.02.2009, 13:11
Hallo mic,

sehr schönes und interessantes Projekt. Mich würd noch interessieren, wie du den Saugnapf für die Kugeln ansteuerst.

grüsse,
Hannes

radbruch
09.02.2009, 13:53
Es ist ein passiver Saugnapf (ein Werbeschlüsselanhänger von einem Lufthandlingfritzen) Deshalb auch die Wartezeit beim Bringen: Der Ball fällt einfach von alleine ab ;)

vohopri
09.02.2009, 13:59
Danke für die Info, es sah mir danach aus, war aber nicht sicher, ob das tatsächlich so geht.

grüsse, Hannes

Bensch
09.02.2009, 14:58
So ein Mist.
Meinem Programmierwahn wurde ein jäher Einhalt geboten:
DEMO/BETA only supports 4096 bytes of code

Wo bekomm ich günstig eine BASCOM-Vollversion her? Möglichst natürlich mit Studenten-Rabatt....

Grüße,
Benjamin

Bajuvar
09.02.2009, 18:21
So ein Mist.
Meinem Programmierwahn wurde ein jäher Einhalt geboten:
DEMO/BETA only supports 4096 bytes of code

Wo bekomm ich günstig eine BASCOM-Vollversion her? Möglichst natürlich mit Studenten-Rabatt....

Grüße,
Benjamin

Elektor hätte momentan das Angebot noch: 69 statt 89 €uro

www.elektor.de/products/offers/software/bascom-avr.759187.lynkx

Gruß Bajuvar

Bensch
10.02.2009, 00:24
So ein Mist.
Meinem Programmierwahn wurde ein jäher Einhalt geboten:
DEMO/BETA only supports 4096 bytes of code

Wo bekomm ich günstig eine BASCOM-Vollversion her? Möglichst natürlich mit Studenten-Rabatt....

Grüße,
Benjamin

Elektor hätte momentan das Angebot noch: 69 statt 89 €uro

www.elektor.de/products/offers/software/bascom-avr.759187.lynkx

Gruß Bajuvar

Ist bestellt, vielen Dank für den Tipp!

Auch wenn ich mit der Demo noch nicht kompilieren kann, mach ich trotzdem am Code weiter. Ich bin jetzt soweit, dass die Endpunkte der Arme im Raum zu einer beliebigen Tool-Position T berechnet werden und anschließend geprüft wird, ob der Bot die Position erreichen kann. Wenn ja, wird ein Bit "Erreichbar" gesetzt.



'(
################################################## ##############################
Name : Delta-Ansteuerung.bas
Zweck : Stellt Eine Rückwärtskinematik Für Einen 3 -armigen
"Delta" -roboter Zur Verfügung.
Mikroprozessor : : Atmega32 Auf Rn -control V1.4

Alle Berechnungen Gehen Von Folgendem Aus:
Der Bot Ist An Einer Ebene Befestigt , Die Parallel Zur Xy -ebene Liegt
Der Arm 1 Liegt In Y -richtung.
Der Arm 2 Liegt , Von Oben Gesehen , 120° Links Gedreht(negative Y - Und X -richtung).
Der Arm 3 Liegt , Von Oben Gesehen , 120° Rechts Gedreht(negative Y - , Positive X -richtung).
Alle Werte Für Längen , Abstände Und Positionen Werden In Nanometern(nm) Angegeben!
################################################## ##############################
')
Declare Function Tastenabfrage() As Byte
Declare Sub Update_ae()
Declare Sub Change_t()
Declare Sub Nix()


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000 'Quarzfrequenz
$baud = 9600

Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein

Dim Taste As Byte

' Deklaration der Variablen, die die Proportionen des Roboters beschreiben
' Alle Angaben in nm und als "Long" (32bit genauigkeit)
' Zulässig sind Werte zwischen -2147483648 und +2147483647

Print
Print "= = = = Delta-Steuerung = = = ="

' Fixer Befestigungspunkt B im Raum
Dim B_x As Long
Dim B_y As Long
Dim B_z As Long
B_x = 0
B_y = 0
B_z = 0


' Länge des Servoseitigen Armteils ("Oberer Armteil" -> Oa)
Dim Oa As Long
Oa = 100000000 '=10cm


' Länge des Servofernen Armteils ("Unterer Armteil" -> Ua)
Dim Ua As Long
Ua = 200000000 '=20cm


' Abstand des Armanfangs (aa) vom Befestigungspunkt B auf der Befestigungsebene (parallel zur xy-Ebene)
Dim Abst_b_aa_xy As Long
Abst_b_aa_xy = 70000000 '=7cm


' Abstand des Armanfangs (aa) von der Befestigungsebene
Dim Abst_b_aa_z As Long
Abst_b_aa_z = 30000000 '=3cm


' Abstand des Armendes (ae) vom Tool auf der xy-Parallel-Ebene
Dim Abst_t_ae_xy As Long
Abst_t_ae_xy = 40000000 '=4cm

' Abstand des Armendes (ae) von der xy-Parallel-Ebene
Dim Abst_t_ae_z As Long
Abst_t_ae_z = 20000000 '=2cm

'##### Berechne nun Konstruktionsabhängige Fixwerte #####

' Arm-Anfangspunkte:
' Arm1: (Der von oben gesehen hintere Arm, genau in y-Richtung)
Dim A1a_x As Long
Dim A1a_y As Long
Dim A1a_z As Long
A1a_x = B_x
A1a_y = B_y + Abst_b_aa_xy
A1a_z = B_z - Abst_b_aa_z

'Arm2: (Der von oben gesehen linke Arm)
Dim A2a_x As Long
Dim A2a_y As Long
Dim A2a_z As Long
Dim Hilf1 As Single 'Hilfsvariable für Zwischenergebnisse
Dim Hilf2 As Long
Dim Hilf3 As Long
Hilf1 = 0.866025403784435 '=Cos(30°)
Hilf2 = Hilf1 * Abst_b_aa_xy
A2a_x = B_x - Hilf2
Hilf3 = Abst_b_aa_xy / 2 '=Sin(30°)*Abst_b_aa_xy = Abst_b_aa_xy / 2
A2a_y = B_y - Hilf3
A2a_z = B_z - Abst_b_aa_z

'Arm3: (Der von oben gesehen rechte Arm)
Dim A3a_x As Long
Dim A3a_y As Long
Dim A3a_z As Long
A3a_x = B_x + Hilf2
A3a_y = B_y - Hilf3
A3a_z = B_z - Abst_b_aa_z

'Maximale und minimale "Länge" des Arms (Abstand von Armanfang zu Armende)
'jeweils mit sicherheitsabsatnd von 10% bzw 30%, um instabile Positionen zu vermeiden.
Dim Abst_min As Long
Dim Abst_max As Long
Hilf2 = Oa - Ua
Hilf2 = Abs(hilf2)
Abst_min = Hilf2 * 1.3
Hilf2 = Oa + Ua
Abst_max = Hilf2 * 0.9


Print "Montagepunkt = (" ; B_x ; "," ; B_y ; "," ; B_z ; ")"
Print "Armanfangs-Versatz:"
Print Abst_b_aa_xy ; "nm vom Montagepunkt in xy-Ebene"
Print "und " ; Abst_b_aa_z ; "nm in z-Richtung."
Print "Armende-Versatz:"
Print Abst_t_ae_xy ; "nm vom Toolpunkt in xy-Ebene"
Print "und " ; Abst_t_ae_z ; "nm in z-Richtung."
Print "Arm1-Anfang = ( " ; A1a_x ; " , " ; A1a_y ; " , " ; A1a_z ; " )"
Print "Arm2-Anfang = ( " ; A2a_x ; " , " ; A2a_y ; " , " ; A2a_z ; " )"
Print "Arm3-Anfang = ( " ; A3a_x ; " , " ; A3a_y ; " , " ; A3a_z ; " )"

'Deklariere restliche Variablen:
'Tool-Punkt T (Dieser Punkt soll angefahren werden)
Dim T_x As Long
Dim T_y As Long
Dim T_z As Long
'Kontroll-Bits:
Dim Erreichbar As Bit 'Ist 1, wenn der derzeitig geladene Toolpunkt erreichbar ist.
Erreichbar = 0
'Arm-Endpunkte
'Arm1
Dim A1e_x As Long
Dim A1e_y As Long
Dim A1e_z As Long
'Arm2
Dim A2e_x As Long
Dim A2e_y As Long
Dim A2e_z As Long
'Arm3
Dim A3e_x As Long
Dim A3e_y As Long
Dim A3e_z As Long
'Abstände der Armenden:
Dim Abst(3) As Long
'Hilfsvariablen für Zwischenergebnisse
Dim Hilf4 As Single
Dim Hilf5 As Long
Dim Hilf6 As Long
Dim Hilf7 As Single
Dim I As Integer

Print "Tastenbelegung:"
Print "1 = Armendpunkte berechnen + Pruefen, ob Punkt ereichbar"
Print "2 = Tool-z-Koordinate testweise aendern"

'
'## ## ## ## ## ## ## ## ## Hauptprogramm-Schleife ## ## ## ## ## ## ## ## ##
'
Do
Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
Call Update_ae
Case 2
Call Change_t
Case 3
Call Nix
Case 4
Call Nix
Case 5
Call Nix
End Select
End If
Waitms 20
Loop

End


Sub Update_ae()
' Berechnen der Arm-Endpunkte bei gegebenem Werkzeugpunkt W = ( W_x , W_y , W_z )
' und die Abstände der Arm-Enden "Abst1" bis "Abst3"
' Muss für jede Position natürlich neu vorgenommen werden!
' Arm1: (Der von oben gesehen hintere Arm, genau in y-Richtung)
A1e_x = T_x
A1e_y = T_y + Abst_t_ae_xy
A1e_z = T_z + Abst_t_ae_z

' Arm2: (Der von oben gesehen linke Arm)
Hilf4 = 0.866025403784435 '=Cos(30°)
Hilf5 = Hilf4 * Abst_t_ae_xy
A2e_x = T_x - Hilf5
Hilf6 = Abst_t_ae_xy / 2
A2e_y = T_y - Hilf6
A2e_z = T_z + Abst_t_ae_z

' Arm3: (Der von oben gesehen rechte Arm)
A3e_x = T_x + Hilf5
A3e_y = T_y - Hilf6
A3e_z = T_z + Abst_t_ae_z

' Debug-Ausgabe
Print "Arm-Endpunkte:"
Print "A1e = ( " ; A1e_x ; " , " ; A1e_y ; " , " ; A1e_z ; " )"
Print "A2e = ( " ; A2e_x ; " , " ; A2e_y ; " , " ; A2e_z ; " )"
Print "A3e = ( " ; A2e_x ; " , " ; A2e_y ; " , " ; A2e_z ; " )"

' Prüfen, ob der Punkt erreicht werden kann.
Erreichbar = 0
' Arm1:
Hilf2 = A1a_x - A1e_x
Hilf1 = Hilf2 * Hilf2
Hilf2 = A1a_y - A1e_y
Hilf4 = Hilf2 * Hilf2
Hilf2 = A1a_z - A1e_z
Hilf7 = Hilf2 * Hilf2
Hilf7 = Hilf7 + Hilf4
Hilf7 = Hilf7 + Hilf1
Abst(1) = Sqr(hilf7)
' Arm2:
Hilf2 = A2a_x - A2e_x
Hilf1 = Hilf2 * Hilf2
Hilf2 = A2a_y - A2e_y
Hilf4 = Hilf2 * Hilf2
Hilf2 = A2a_z - A2e_z
Hilf7 = Hilf2 * Hilf2
Hilf7 = Hilf7 + Hilf4
Hilf7 = Hilf7 + Hilf1
Abst(2) = Sqr(hilf7)
' Arm3:
Hilf2 = A3a_x - A3e_x
Hilf1 = Hilf2 * Hilf2
Hilf2 = A3a_y - A3e_y
Hilf4 = Hilf2 * Hilf2
Hilf2 = A3a_z - A3e_z
Hilf7 = Hilf2 * Hilf2
Hilf7 = Hilf7 + Hilf4
Hilf7 = Hilf7 + Hilf1
Abst(3) = Sqr(hilf7)

Print "Abstaende der Armenden: Arm1: " ; Abst(1) ; " Arm2: " ; Abst(2) ; " Arm3: " ; Abst(3)

Erreichbar = 0

For I = 1 To 3 ' Teste Arme 1-3
If Abst(i) < Abst_max And Abst(i) > Abst_min Then ' Wenn der Abstand ok ist...
Erreichbar = 1 ' Dann setze das erreichbar-bit
Else ' Sonst
Erreichbar = 0 ' Clear das Erreichbar-bit
Exit For ' Und verlasse sofort die Schleife
End If
Next I

If Erreichbar = 1 Then
Print "Punkt ist erreichbar!"
Else
Print "Punkt ist NICHT erreichbar! Fehler!"
End If

Waitms 500

End Sub


' Ändert den Punkt T (zu Testzwecken) in z-Richtung, also nach oben/unten
Sub Change_t()
Select Case T_z
Case 0
T_z = -50000000
Case -50000000
T_z = -100000000
Case -100000000
T_z = -150000000
Case -150000000
T_z = -300000000
Case -300000000
T_z = 0
End Select
Print "T_z geändert auf " ; T_z

Waitms 500

End Sub

Function Tastenabfrage() As Byte
Local Ws As Word

Tastenabfrage = 0
Start Adc
Ws = Getadc(7)
If Ws < 500 Then
Select Case Ws
Case 400 To 450
Tastenabfrage = 1
Case 330 To 380
Tastenabfrage = 2
Case 260 To 305
Tastenabfrage = 3
Case 180 To 220
Tastenabfrage = 4
Case 90 To 130
Tastenabfrage = 5
End Select
End If
End Function

Sub Nix()
End Sub


Edit:
Ich habe jetzt viele Deklarationen in Arrays gepackt, wodurch sich auch der rest des Codes deutlich verkürzt, weil ich vieles in "For I = 1 To 3" verpacken kann, wenn identische Berechnungen für alle 3 Arme gemacht werden.
Morgen stell ich den neuen Code ein, is zur Zeit nicht sehr ansehlich ;)

user529
10.02.2009, 19:38
unbedingt einstellen und die berechnung kommentieren, bin gerade am überlegen ob ich ein altes spielzeug wieder belebe und auch auf kipphebel umrüste.
https://www.roboternetz.de/phpBB2/download.php?id=4631
https://www.roboternetz.de/phpBB2/viewtopic.php?t=9069

mfg clemens

Bensch
11.02.2009, 00:22
wenn du auf kipphebel umrüstest, hast du auf jeden fall einen viel größeren Arbeitsraum. Ich halt dich auf dem laufenden, keine Sorge.

Zur Zeit schreibe ich den Code nochmal komplett um. Ich mach wenig mit software, deshalb bin ich da nicht so bewandert, was strukturiertes Programmieren angeht. aber ich geb mit mühe ;)

Gruß,
Ben

goara
07.03.2009, 03:48
wozu willst du es benutzen?
Problem bei Parallelkinematik ist, dass 1. die Regleung komplex ist, 2. der Arbeitsraum sehr klein ist, Vorteil ist hohe Steifigkeit, aber auch nur in einem kleinen bereich... macht also nur für sehr spezielle Anwendungen Sinn..

radbruch
21.03.2009, 14:28
Hallo

Naja, so wirklich brauchbar ist das in meiner Spielzeuggröße wohl nicht.

Irgendwie zieht sich das Projekt nun auch etwas in die Länge. Für die Potis (die noch nicht verwendet werden) habe ich mit Irrwegen locker 3 Wochen gebraucht, die Basis ist verändert, eine kleine Adapterplatine wurde zusammengelötet und der RP6 hat nun einen genutzten USRBUS und einen dritten "freien" ADC. Zudem habe ich endlich eine pfiffige Servoansteuerung gefunden die sich mit den RP6-Libs verträgt. Und schliesslich habe ich noch einen kleinen Greifer zusammengebastelt, der wiederrum war nach einer Stunde fertiggebogen:

http://radbruch.bplaced.net/robot/delta/deltagreifer1_klein.jpg (http://radbruch.bplaced.net/robot/delta/deltagreifer1.jpg) http://radbruch.bplaced.net/robot/delta/deltagreifer2_klein.jpg (http://radbruch.bplaced.net/robot/delta/deltagreifer2.jpg) http://radbruch.bplaced.net/robot/delta/deltagreifer3_klein.jpg (http://radbruch.bplaced.net/robot/delta/deltagreifer3.jpg)
http://radbruch.bplaced.net/robot/delta/deltagreifer4_klein.jpg (http://radbruch.bplaced.net/robot/delta/deltagreifer4.jpg) http://radbruch.bplaced.net/robot/delta/deltagreifer5_klein.jpg (http://radbruch.bplaced.net/robot/delta/deltagreifer5.jpg) http://radbruch.bplaced.net/robot/delta/deltagreifer6_klein.jpg (http://radbruch.bplaced.net/robot/delta/deltagreifer6.jpg)
(Digitales 5€-Miniservo: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=42121)

Zusammengebaut sieht das nun so aus:

http://i4.ytimg.com/vi/O1G1xVg6CcU/3.jpg (http://www.youtube.com/watch?v=O1G1xVg6CcU) http://i2.ytimg.com/vi/94sjwaqIeAI/1.jpg (http://www.youtube.com/watch?v=94sjwaqIeAI)
http://www.youtube.com/watch?v=O1G1xVg6CcU
http://www.youtube.com/watch?v=94sjwaqIeAI

Das Programm (für einen 8MHz-Mega32) fährt stur die einzelnen Positionen an:


// Parallele Kinematik 21.3.2008 mic
// RP6 steuert Deltaroboter mit Greifer

#include "RP6RobotBaseLib.h"

// Servoausgänge 1-4
#define servoinit {DDRB |= (1<<PB7); PORTB &= ~(1<<PB7); DDRC |= 0b01110000; PORTC &= ~0b01110000;}
#define servo1on PORTC |= (1<<PC4)
#define servo1off PORTC &= ~(1<<PC4)
#define servo2on PORTC |= (1<<PC5)
#define servo2off PORTC &= ~(1<<PC5)
#define servo3on PORTC |= (1<<PC6)
#define servo3off PORTC &= ~(1<<PC6)
#define servo4on PORTB |= (1<<PB7)
#define servo4off PORTB &= ~(1<<PB7)

typedef struct
{
uint16_t pos1, pos2, pos3, pos4;
uint8_t pause;
} schritt;

schritt schrittfolge[10];
uint8_t servo1, servo2, servo3, servo4, s[5]={0,200,200,200,200}; //oben offen
uint16_t adc1, adc2, adc3;

void getadcs(void)
{
adc1=readADC(7);
adc2=readADC(1);
adc3=readADC(0);
}
int main(void)
{
initRobotBase();
getadcs();
servoinit;

//Timer2 Initialisierung
TCCR2 = (0 << WGM21) | (0 << COM20) | (1 << CS22); // Normal Mode, prescaler /64
TIMSK |= (1 << TOIE2); // Timer2 Overflow-Interrupt erlauben
//TIMSK &= ~(1 << TOIE2); // Timer2 Overflow-Interrupt verbieten

servo1=s[1];
servo2=s[2];
servo3=s[3];
servo4=s[4];
while(1)
{
servo1=200; // hoch
servo2=200;
servo3=200;
mSleep(600);

servo4=154; // aufpicken
mSleep(200);
servo1=150;
servo2=150;
servo3=150;
mSleep(400);

servo1=220; // hoch
servo2=220;
servo3=220;
mSleep(400);
servo2=70; // rueber
servo3=250;
mSleep(150);
servo1=130;
mSleep(500);

servo4=170; // oeffnen
mSleep(200);
servo1=120; // neu positionieren
servo2=60;
servo3=240;
mSleep(300);
servo4=154; // schliesen
mSleep(200);

servo1=200; // hoch
servo2=120;
servo3=240;
mSleep(200);

servo1=220; // mitte oben
servo2=220;
servo3=220;
mSleep(600);
servo1=170; // runter
servo2=170;
servo3=170;
mSleep(500); // fallenlassen
servo4=170;
mSleep(300);
}
return(0);
}
ISR (TIMER2_OVF_vect)
{
static uint8_t servo_nr=0, grundimpuls=0;
static uint16_t impulspause;
if(servo_nr)
{
if(grundimpuls++ & 1) TCNT2=200; else
{
if(servo_nr==1) {TCNT2=servo1; servo1on; impulspause-=servo1;}
if(servo_nr==2) {TCNT2=servo2; servo1off; servo2on; impulspause-=servo2;}
if(servo_nr==3) {TCNT2=servo3; servo2off; servo3on; impulspause-=servo3;}
if(servo_nr==4) {TCNT2=servo4; servo3off; servo4on; impulspause-=servo4;}
if(servo_nr==5) {servo4off; servo_nr=0;}
if(servo_nr) servo_nr++;
}
}
else
{
if(impulspause>256) impulspause-=256;
else {TCNT2=-impulspause; servo_nr++; impulspause=1500;}
}
}

Gruß

mic

orph
22.03.2009, 23:29
Hei,

echt super der Greifer!!!
und mit nur einem Servo.
Ist wirklich ne gute alternative zum Saugnapf.
Danke!

vohopri
23.03.2009, 09:04
Ha,

was für eine elegante Konstruktion. Sowas begeistert mich immer.

Nur die arme Katze bekommt keine Bälle mehr geworfen.

grüsse,
Hannes

Brantiko
22.04.2009, 23:06
Auf der Hannovermesse hat wohl Jemand meine/unsere Idee geklaut.
Generell war dieses Jahr deutlich mehr im Bereich Linearkinematik zu sehen.
Fast in jeder Halle stand ein Hexapod. Einer war sogar so klein dass er problemlos als Überrschsungsei-Extra daher kommen könnte..

Das Ding auf dem Bild konnte man selber steuern.. also jeden Servo einzeln.
Wird Zeit dass ich mir auch mal einen baue.

Goblin
25.05.2009, 15:07
Ich hab meinen Deltabot jetzt auch mal zusammengebastelt und werd mich mal ein wenig mit Mathe rumschlagen. Ich habe ein recht interessantes Paper für die Inverse Kinematik gefunden, welches ich mal auseinandernehmen werde:

http://www.cim.mcgill.ca/~paul/clavdelt.pdf

edith: Fotos

http://www.xiano.org/upload/bild.php/2,221,geradeBQG44.jpg (http://www.xiano.org/upload/bild.php/221,geradeBQG44.jpg) http://www.xiano.org/upload/bild.php/2,222,schraegEZK2J.jpg (http://www.xiano.org/upload/bild.php/222,schraegEZK2J.jpg) http://www.xiano.org/upload/bild.php/2,223,gelenkEMGOR.jpg (http://www.xiano.org/upload/bild.php/223,gelenkEMGOR.jpg)

Brantiko
17.06.2009, 22:51
Klasse!
Woher hast du die Teile? Wasserstrahl?

Hat mal jemand überlegt ob mit einem Hexapod nicht auch eine CNC-Fräse machbar wäre, zumindist für kleine Gravuraufgaben bzw. weiche Materialien?

Inkoknito
18.06.2009, 16:42
hi,

sowas gibt es schon : )

hier ein kleines Video^^

http://www.youtube.com/watch?v=7hEXwyJ2B78

Goblin
21.06.2009, 23:10
also cool ist es schon (delta cnc). aber ein karthesischer aufbau ist für sowas einfacher, weil leichter zu steuern und mechanisch stabiler. den geschwindigkeitsvorteil eines deltas kannst du in einer eigenbau-fräse vermutlich sowieso nicht nutzen.
meine teile hab ich überigens mit der cnc gefräst.

Goblin
26.07.2009, 10:48
Ich hab vor ein paar Tagen auch mal ein kleines Video gemacht. Eine Kinematik hab ich immernoch nicht realisiert. Mehr zur Ansteuerung steht im Beschreibungstext des Videos.

http://www.youtube.com/watch?v=emdhIxwYEc8

JamisonBruch
18.08.2009, 02:46
Hello all, please forgive the English.
I designed and built the Delta Tau controlled deltas found on YouTube.
http://www.youtube.com/watch?v=Gv5B63HeF1E
I have spent many years working on parallel kinematic mechanisms. Delta Robots and Hexapods.
http://www.youtube.com/watch?v=bQtT4EDyQVU

The hexapod joints are 12mm ball magnets, constrained with a simple four bar linkage on the base... or actually the top, as it is hung upside down.

The delta robot inverse kinematics can be calculated using simple trigonometry, projection of triangles, law of cosines.
Hexapod kinematics are a different matter. I encourage everyone to discover the benefits of parallel kinematic mechanisms. They are superior in rigidity, speed, cost.
My friend and colleague has a website on the subject http://www.parallemic.org/

JamisonBruch
18.08.2009, 03:00
picture of rotation constrained magnet joint
http://img27.imageshack.us/img27/4627/cimg0120f.jpg
http://img27.imageshack.us/img27/8875/cimg2163.jpg
http://img249.imageshack.us/img249/9221/cimg0301.jpg

Of course the key to this working is the lubrication coating method on the steel inserts.


Jamison Bruch
MimixMotion.com

themaddin
02.06.2010, 21:50
Hallo,

auch ich habe es geschafft einen kleinen Delta-Roboter aufzubauen. Der Aufbau ist dank Inspiration von radbruch sehr einfach und super um so einen Roboter Live in der Praxis zu testen.

Mit einem Komillitonen habe ich auch die Berechnungen für die inverse Kinematik in Matlab aufgestellt.

Das bereits von Goblin genannte Dokument ( http://www.cim.mcgill.ca/~paul/clavdelt.pdf ) beschreibt die Berechnung der inversen Kinematik.
Anschaulicher ist allerdings folgende Seite, welche auf diesem Dokument basiert:
http://forums.trossenrobotics.com/tutorials/introduction-129/delta-robot-kinematics-3276/

Wenn noch Interesse besteht kann ich die Berechnung der inversen Kinematik hier auch nochmal grob beschreiben.

Hier ein Video von meinem Roboter:
http://www.youtube.com/watch?v=1F_r6B1B9Ng

MfG
Martin

the_muck
10.06.2010, 12:16
Danke,
ich bin gerade dabei einen aus dem Mindstorm Bausatz zu bauen :D. Nur knapper ich an der Mathematik/Kinematik, wenn du noch mehr Links oder Dokumente hast immer her damit.

lg der muck

themaddin
11.06.2010, 00:44
Ich habe in der Tat noch was. Ein weiteres Dokument bzw. Buch, welches wir erst später entdeckt haben, ist z.B. dieses hier:

Parallelkinematische Maschinen: Entwurf, Konstruktion, Anwendung
von Reimund Neugebauer

http://books.google.de/books?id=7dlsgM9W1HMC&printsec=frontcover&dq=parallelkinematische+maschinen&hl=de&ei=nWkRTJmPMMyQOMOmoKQI&sa=X&oi=book_result&ct=result&resnum=1&ved=0CDUQ6AEwAA

Ich weiß allerdings nicht wie brauchbar das ist, da wir es nicht näher untersucht haben.

MfG
Martin

dafriedl
14.07.2010, 22:24
habe mir auch desletzt einen low-cost Delta-Roboter gegönnt.

Bisher habe ich nur ein kurzes Video gedreht

http://www.youtube.com/watch?v=Upi09OP4IXw

Er besteht u.a. aus einem kleinen Seriellen Servocontroller-Board, ein USB-Seriell Adapter, 3 Standard Servos, Modellbau-Gewindestangen mit Kugelgelenken und einem Holzgestell, das sich platzsparend zusammeklappen lässt. Die Regelung erfolgt mit VB, die inverse Transformation habe ich selbst durchgeführt.

Sollte Interesse bestehen, werde ich ihn euch vielleicht etwas ausfürlicher vorstellen. Aber zuerst ist sind mal Klausuren angesagt :)

the_muck
14.07.2010, 23:02
Ja ja mehr mehr... besonders zu der Berechnung. Wie sieht es denn mit 3D Fahrten aus? Zur zeit sieht es so aus als ob die Z Richtung noch nicht viel macht...

dafriedl
15.07.2010, 22:29
Hallo zusammen,

Also 3D-Fahrten sind generell kein Problem. Die Berechnung der Winkel geschieht mithilfe der 3 kartesischen Koordinaten. In dem Video hat die z-Koordinate lediglich 2 diskrete Werte, abhängig von der Maustaste

Anbei findet ihr noch meine Rechnung. Hier noch ein paar Anmerkungen:
Zuerst werden der Mittelpunkt der bewegten Platform und der untere Gelenkpunkt in die X-Z-Ebene projeziert (Phytagoras)
Es bildet sich ein Dreieck aus projeziertem unteren Gelenkpunkt, oberem Gelenkpunkt und der Drehachse des Servos
Mithilfe der 3 bekannten Seitenlängen lässt sich der obere Winkel beta berechnen (siehe http://de.wikipedia.org/wiki/Dreieck#Berechnung_eines_beliebigen_Dreiecks )
Mit der Arcustangesfunktion mit 2 Argumenten lässt sich der Winkel epsilon berechnen
Letzendlich lässt sich der Servowinkel als Differenz der anderen beiden Winkel berechnen.
Die verbleibenden 2 Servowinkel berechnen sich, indem die die X und Y Koordinate in jeweils um 120° gedrehte Koordinatensysteme Transformiert werden

themaddin
16.07.2010, 20:05
Hallo!

Es gibt ein neues Video von meinem Delta Roboter:
http://www.youtube.com/watch?v=EMZaf5lKPlA

MfG
Martin

radbruch
16.07.2010, 20:26
Hallo


...dank Inspiration von radbruch...Tja, die mathematische Hürde habe ich selbst ja leider nicht geschafft. Es freut es mich sehr, wenn euch meine Ideen inspirieren :)

Ob Kugelgelenke oder Scharniere, alle Lösungen für einen selbstgebauten Deltarobot sind beeindruckend.

Gruß

mic

[Edit]
Ach, wie geil ist das denn:
http://hackedgadgets.com/2009/08/13/diy-delta-robot/
http://blog.bricogeek.com/noticias/diy/robot-delta-casero/(Mein Lieblingsvideo :)

*stolzist*

JamisonBruch
02.08.2010, 01:42
My latest home built delta robot

http://www.youtube.com/watch?v=lkbFCVcRP88

:D

default.user
24.08.2010, 19:57
Jamison,

looks very impressive and with the right ambition behind.

Was is just a proof-of-concept, something you're planning to sell or is it something you want to share with the community ?

JamisonBruch
24.08.2010, 21:04
I'm not sure...
Just sent this one to a ASME conference in Montreal... maybe professors will buy the mechanism for their grad student projects or robotics labs.
It has a lot of really cool development steps... just the calibration is a significant software/hardware task... the minimal time between points can be optimized with dynamics modeling and can result in fast but bizarre routes from PointA to PointB.

So cool to develop all these little pieces... maybe I'll develop a kit and sell.

It already outperforms $30-$60k robots for less than half the cost.

theodleif
26.08.2010, 14:49
Hallo allerseits,

denkt Ihr, man kann davon die Kinematik berechnen?

http://builders.reprap.org/search?q=assembling+tripod

Die Jungs im deutschen Reprap-Forum stecken da etwas fest. Die wesentliche Frage wäre auch, wie genau sich das ansteuern lässt. Repraps drucken Kunststoff mit einer Genauigkeit von 0.2 mm. Für das Ausfüllen von Flächen braucht man hohe x-y Geschwindigkeiten.

Es wäre natürlich super, wenn man das mit einem Delta könnte, weil man viel Mechanik einsparen könnte und das Ziel der Reprap-Bewegung ja ist, dass sich der Drucker irgendwann selbst nachdrucken kann.

JamisonBruch
26.08.2010, 19:14
Nice!
I've used magnet ball joints on a hexapod with great results.

Kinematics are found using trig and the law of cosines. Find an old high school text regarding solving triangles angles and side lengths.

Calibration and error mapping is very important to accuracy on mechanisms like these because link lengths are never perfect. Renishaw has a tripod/delta for dental milling and they get 10 micron accuracy through a painful calibration process.
http://www.renishaw.com/en/incise-scanner-and-cad-software--10249



To get motion accurately in X,Y,Z directions is more difficult than in a cartesian machine (even after you've applied the kinematic transforms) because tiny length differences in the fixed-length struts cause 'dishing' in the motion and divergence from linearity. To correct for this we do 3D volumetric error mapping, i.e. we use the machine to probe the locations of a large array of accurately mapped balls (previously measured on a CMM). Depending on the accuracy you are looking for, you may not have to do this. Our machine is tiny (roughly spherical working envelope about 90mm diameter) and without error mapping can be out by 0.3mm or more. With error mapping it is accurate to sub 10 microns.

SO either take special care in "perfect" mechanical geometry, or you will need to calibrate and error map for accuracy.

I haven't used error mapping yet on the deltas I make... I will soon.


[/code][/quote]

theodleif
26.08.2010, 19:59
Is the error mapping done by an artificial neural network? Years ago in a book of Ritter, Schulten, and Martinez about Self Organizing Neural Maps there was an account to solve the Mapping of angles in a robot arm to the yielded x-y positions. At least I remember to have that book in my office. I will look it up.

ADDED: As I see, the master of Self Organizing Maps himself, Teuvo Kohonen, has written about it:

http://books.google.de/books?id=e4igHzyfO78C&pg=PA299&lpg=PA299&dq=self+organizing+maps+robot+arm&source=bl&ots=thSIuCRkcF&sig=usI9JAU1venAvwqmeE-6INfWHLg&hl=de&ei=TKx2TKS6HcyaON--0dEG&sa=X&oi=book_result&ct=result&resnum=2&ved=0CCkQ6AEwAQ#v=onepage&q&f=false

This seems to be a more contemporary article:

http://mhrg.if.uidaho.edu/papers/2010/TIE10_LindaManic_SOFAMAP.pdf

JamisonBruch
26.08.2010, 21:14
Nothing that complex. Calibration takes care of reference frame translations and rotations. Error mapping is a recorded error data table.

Put the tool at a known XYZ location (known either by cmm or calibration tooling) and compare the results given by the mechanism encoders after inverse kinematics. You know it is at point A, but the mechanism says it thinks its at point A PLUS some error in X,Y,Z. If you do this enough times all throughout the workspace you will find error patterns (not necessarily linear).

Now with software, you can error correct by calculating (interpolating from the error mapping results) how much error the robot would probably have at that position and then adding in error correcting offsets.

Very crude, painful procedure, but needs to be done only once per machine.

Jamison

theodleif
26.08.2010, 22:50
Are the error vectors just interpolated form the measured errors on nearby positions?

JamisonBruch
26.08.2010, 23:17
yes.
Depending on the data..., there are many ways to map error.
Hardcode it in 1mm intervals to interpolate, or if there is a pattern, one could extrapolate. It totally depends on the patterns... I'm looking forward to finding out how link length (and other) error propagates to the tool tip. Perhaps it is a simple equation for each coordinate, or a simple offset constant within certain regions...