Seite 1 von 1

Gerade Linie mit drei Achsen

Verfasst: 31 Aug 2012, 14:02
von werner
Hallo!

Stellt euch vor, ich hätte ein dreiachsiges Linearportal (also XYZ im rechten Winkel), das von drei Encodermotoren gesteuert wird.
Ein Unterprogramm soll dafür sorgen, dass der Roboter zu einer bestimmten Position fährt, wobei die Achsen vers. Wege zurücklegen müssen.
Für diese Funktion gibt es zwar ein Unterprogramm, doch dieses ermöglicht es nicht, die Motoren so zu steuern, dass der Roboter eine Gerade fährt.
Wenn man mit zwei Achsen (z.B. Plotter) eine gerade Linie zeichnen will, berechnet man sich die Steigung und dann für jede X die Y Koordinate.
Aber ich scheitere an dem Versuch, so etwas mit drei Achsen zu realisieren... Hat Jemand so ein Unterprogramm? Oder eine Idee?

WERNER

Re: Gerade Linie mit drei Achsen

Verfasst: 31 Aug 2012, 15:03
von vleeuwen
Because of its nature, a normal motor is not suitable for good presision.
Also the encoder motor makes use of a simple incrememtal encoder and that is not suitable for real positioning.
You will need al least a motor with a rotory encoder but a stepper will be better.

Re: Gerade Linie mit drei Achsen

Verfasst: 31 Aug 2012, 17:01
von Dirk Fox
Hallo Werner,

im Zweidimensionalen mancht man das am elegantesten mit dem Bresenham-Algorithmus. Ich denke, dass sich das Konzept auch in die dritte Dimension erweitern lässt - habe ich noch nicht ausprobiert, sollte aber gehen: Du zählst entlang einer Dimension immer um eins weiter, dann bestimmst Du den "Fehler" (Abweichung vom "optimalen" Weg) in den beiden anderen Dimensionen und korrigierst ggf. deren Wert. (In der ft:pedia habe ich zu Bresenham etwas geschrieben; die Darstellung des Bresenham-Algorithmus in Wikipedia ist gut verständlich und sehr anschaulich.)

Beste Grüße,
Dirk

Re: Gerade Linie mit drei Achsen

Verfasst: 31 Aug 2012, 19:08
von Dirk Fox
... tatsächlich, mit einem dreidimensionalen Bresenham scheint es zu gehen - die Idee hatte schonmal jemand:
http://www.cobrabytes.com/index.php?topic=1150.0
program

uses pure2d, keyset

procedure Swap(byref a :integer, byref b :integer)
var
c :integer
begin
c := a
a := b
b := c
end

var
x, x0, x1, delta_x, step_x :integer
y, y0, y1, delta_y, step_y :integer
z, z0, z1, delta_z, step_z :integer
swap_xy, swap_xz :boolean
drift_xy, drift_xz :integer
cx, cy, cz :integer

begin

//start and end points (change these values)
x0 := 0 x1 := -2
y0 := 0 y1 := 5
z0 := 0 z1 := -10

//'steep' xy Line, make longest delta x plane
swap_xy := Abs(y1 - y0) > Abs(x1 - x0)
if swap_xy
Swap(x0, y0)
Swap(x1, y1)
endif

//do same for xz
swap_xz := Abs(z1 - z0) > Abs(x1 - x0)
if swap_xz
Swap(x0, z0)
Swap(x1, z1)
endif

//delta is Length in each plane
delta_x := Abs(x1 - x0)
delta_y := Abs(y1 - y0)
delta_z := Abs(z1 - z0)

//drift controls when to step in 'shallow' planes
//starting value keeps Line centred
drift_xy := (delta_x / 2)
drift_xz := (delta_x / 2)

//direction of line
step_x := 1; if (x0 > x1) then step_x := -1
step_y := 1; if (y0 > y1) then step_y := -1
step_z := 1; if (z0 > z1) then step_z := -1

//starting point
y := y0
z := z0

//step through longest delta (which we have swapped to x)
for x = x0 to x1 step step_x

//copy position
cx := x; cy := y; cz := z

//unswap (in reverse)
if swap_xz then Swap(cx, cz)
if swap_xy then Swap(cx, cy)

//passes through this point
debugmsg(":" + cx + ", " + cy + ", " + cz)

//update progress in other planes
drift_xy = drift_xy - delta_y
drift_xz = drift_xz - delta_z

//step in y plane
if drift_xy < 0
y = y + step_y
drift_xy = drift_xy + delta_x
endif

//same in z
if drift_xz < 0
z = z + step_z
drift_xz = drift_xz + delta_x
endif
next

end
Nur gefunden, nicht getestet...

Beste Grüße,
Dirk

Re: Gerade Linie mit drei Achsen

Verfasst: 31 Aug 2012, 20:36
von Udo2
Hallo Dirk und Werner,
Standard der einschlägigen Steuer-Programme sind "bresenhaminterpoliert" die drei Linearachsen XYZ und zusätzlich bis drei Drehachsen ABC jeweils parallel zu XYZ. Bei den Spitzenprogrammen geht die Anzahl der Dimensionen bis zur Zweistelligkeit ...
Meine beiden Portalroboter zunächst als 3D-XYZ-Basismodelle sind zu ihrem fortentwickelten Einsatz ja in diese Richtung angedacht.
In der "Metasprache" RoboPro sollte das in Annäherungsschritten sicher auch machbar sein. Das dürfte dann aber monolytisch programmiert seeeehr umfangreich und im Ablauf seeeehr langsam werden. Deshalb habe ich dazu mittlererweile eine andere Anwendung in Angriff genommen, die wenn alles klappt auch mit den bekannten ft-Steppern grösser als 75 Stepp/Umdr. möglich sein dürfte.
Gruss, Udo2

Re: Gerade Linie mit drei Achsen

Verfasst: 31 Aug 2012, 21:31
von werner
Hallo

@vleeuwen
Ich weiß, dass es mit Schrittmotoren einfacher ginge, weil man dann auch die Möglichkeit hat, die Motoren einen einzigen Schritt zu fahren. Das geht mit den Encodern ja nicht. Deshalb will ich es annährungsweise versuchen, also dass die Motoren mit entsprechenden Geschwindigkeiten gesteuert werden und die Encoder immer nur kleine Wege fahren und dann warten bis die anderen Motoren auch soweit sind.

@Dirk Fox
Ja so was hab ich gesucht, hört sich gut an... Ich werd mir das mal zu Gemüte führen.

WERNER

Re: Gerade Linie mit drei Achsen

Verfasst: 31 Aug 2012, 21:48
von werner
Hallo

Danke für den Tipp, werde ich auch mal nach googlen.

Und wenn das nicht geht, mir ist gerade noch eine andere Idee gekommen:
Ich steuere die Encoder mit der erweiterten Motorsteuerung und überwache dabei C1Z - C3Z (also die Zähler der Achsen)
und wenn der Roboter von der Linie abkommt, ändert das Programm entsprechend die Geschwingkeiten der Motoren...

Ich werde diesen Methoden mal nachgehen...

Danke für eure Hilfe
WERNER

Re: Gerade Linie mit drei Achsen

Verfasst: 01 Sep 2012, 09:53
von vleeuwen
A solution which fit into the RoboPRo concept too, is to use a microcontroller as I2C slave (I2C connected with the TX-C)
and as preprocessor the actuators (for 3 old ft-steppers).
This microcontroller takes care of the coordination between the steppers and the positioning.

From the point of view of the TX-C, the microcontroller must offer a set of high level commands to control this 3D positioning device.
You can call it a smart 3D actuator if you like.

I fact I am looking for a institute for higher education that will start an this as a learning project (near Enschede).
I can help with knowledge,

Re: Gerade Linie mit drei Achsen

Verfasst: 01 Sep 2012, 12:53
von werner
Hallo

Der erste Algorithmus ist fertig!
Download: [Link aufgrund von Aktualisierung entfernt, neuer Link siehe unten]

Funktioniert soweit, aber die Motoren können nicht rückwärts drehen.
Immer wenn ich den Geschwindigkeitsbefehl negativ mache,
fahren die Motoren erst nomal und, wenn sie fertig sind, drehen die Motoren,
die andersherum drehen sollten, noch mal 29 Impulse - keine Ahnung, warum...

WERNER

Re: Gerade Linie mit drei Achsen

Verfasst: 06 Sep 2012, 17:17
von werner
Hallo

Der Algorithmus funktioniert nun einwandfrei und zuverlässig!!! :)
Zu der Wiederholungsgenauigkeit kann ich leider noch nichts sagen...

Download: https://www.dropbox.com/s/a4icyiyit8ld4ke/LinearPos.rpp

WERNER

Re: Gerade Linie mit drei Achsen

Verfasst: 06 Sep 2012, 21:18
von Udo2
Hallo Werner
verfolge stets interessiert Programmieraktivitäten mit Bresenham oder anderen Interpolationen. In deinem LinearPos.rpp ist im Hauptprogramm versehentlich ? der Weg X=0 ?
Gruss Udo2

Re: Gerade Linie mit drei Achsen

Verfasst: 06 Sep 2012, 21:23
von werner
Hallo

@Udo2
Ich wollte damit verdeutlichen, dass nicht nur pos. und neg. Werte möglich sind, sondern auch 0... :D

WERNER

Re: Gerade Linie mit drei Achsen

Verfasst: 06 Sep 2012, 21:33
von Udo2
Hallo Werner,
natürlich muss das auch mit ein oder zwei Nullwegen funktionieren ... :)
Ansonsten freut es mich ehrlich, dass du hierbei vorankommst.
Da begleitende nD-Grafik mit RoboPro nicht möglich sein dürfte,
ist hier eigenes Bemühen für mich nicht sinnvoll.
Gruss Udo2