PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hexabot



pinsel120866
27.12.2014, 10:32
Hallo,

ich wage mich nun an einen Hexabot mit 18 Servos, der von einem RPi gesteuert wird. Als Servoboard habe ich dieses verwendet: Servoboard (http://www.pridopia.co.uk/pi-9685-2-lp.html)
Funktioniert soweit ganz gut.

Nun zu meinen Fragen:

- Ich verwende die Library von Adafruit (http://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi). Damit drehen die Servos mit voller Geschwindigkeit. Gibt es einen Weg, die Geschwindigkeit zu drosseln?
- Ziel ist es, den Bot mit einem XBOX-Controller zu steuern. Gibt es hierzu schon Erfahrungen?
- Welchen Servoakku soll ich verwenden?

pinsel120866
27.12.2014, 14:27
UPDATE: Einen Teilerfolg habe ich bereits erziehlt: Ich habe es geschafft, einen Servo mittels XBOX Controller zu steuern:

http://youtu.be/qnCina1r5Rk

Hilfe dazu habe ich hier (http://blog.zephod.com/post/37120089376/lego-xbox-raspberry-pi) gefunden.

pinsel120866
28.12.2014, 11:13
Nun brauche ich Hilfe beim Programmieren:


#!/usr/bin/python

from Adafruit_PWM_Servo_Driver import PWM
import xbox_read
import time

# ================================================== =========================
# Example Code
# ================================================== =========================

# Initialise the PWM device using the default address
pwm = PWM(0x40)
pwm2 =PWM(0x41)
# Note if you'd like more debug output you can instead run:
#pwm = PWM(0x40, debug=True)

servoMin = 200 # Min pulse length out of 4096
servoMid = 375
servoWidth = 200
steer = servoMin
servoMax = 550 # Max pulse length out of 4096

def setServoPulse(channel, pulse):
pulseLength = 1000000 # 1,000,000 us per second
pulseLength /= 60 # 60 Hz
print "%d us per period" % pulseLength
pulseLength /= 4096 # 12 bits of resolution
print "%d us per bit" % pulseLength
pulse *= 1000
pulse /= pulseLength
pwm.setPWM(channel, 0, pulse)

pwm.setPWMFreq(60) # Set frequency to 60 Hz

for event in xbox_read.event_stream(deadzone=12000):

# Nach vor laufen
if event.key=='Y1': # Linker Joystick nach vor
# time.sleep(1)
pwm.setPWM(10, 0, 350)
pwm.setPWM(9, 0, 550)
pwm.setPWM(8, 0, 500)
# time.sleep(1)
pwm.setPWM(10, 0, 350)
pwm.setPWM(9, 0, 300)
pwm.setPWM(8, 0, 250)


Ich möchte, dass der Bot beim Drücken der Taste "Y1" des XBOX Controllers nach vor läuft. Mit dem geposteten Code funktioniert das nur teilweise.
Im Grunde will ich eine Schleife einbauen, die die Servos zwischen 2 Stellungen hin und her bewegt, solange die Taste gedrückt wird.
Wie mache ich das richtig?
Bitte um Hilfe, danke.

pinsel120866
28.12.2014, 15:30
ich bin einen Schritt weiter:

for event in xbox_read.event_stream(deadzone=12000):
while event.key=='X':
pwm.setPWM(10, 0, 350)
pwm.setPWM(9, 0, 550)
pwm.setPWM(8, 0, 500)
time.sleep(1)
pwm.setPWM(10, 0, 350)
pwm.setPWM(9, 0, 300)
pwm.setPWM(8, 0, 250)
time.sleep(1)
pwm.setPWM(10, 0, 350)
pwm.setPWM(9, 0, 550)
pwm.setPWM(8, 0, 500)
time.sleep(1)

Ich weiss nur nicht, wie ich aus der while-Schleife rausspringen kann.

Möglichweise kann mir ja hier jemand helfen?

pinsel120866
24.01.2015, 16:38
Nun habe ich das Projekt soweit fertig. Die ersten Schritte sind noch etwas wackelig, aber das liegt am "weichen" Chassis.
http://youtu.be/NsqLgpKzViY
(http://youtu.be/NsqLgpKzViY)
Gesteuert wird mir einem XBOX Controller.

HeXPloreR
25.01.2015, 08:42
Hallo Pinsel,

ein sehr schönes Projekt hast Du da bisher umgesetzt =D>

Mich würde interessieren "wie schnell das Programm" in dieser Ausbaustufe im Endeffekt auf dem Pi läuft - Kannst Du die Zeit messen?

Viele Grüße
Jörg

pinsel120866
25.01.2015, 11:50
Hallo,

messe ich gerne, wenn du mir sagst wie...

HeXPloreR
26.01.2015, 16:57
Hallo pinsel,

ich dachte an ein Oszilloskop und dann am besten einen Schleifen Durchlauf per extra high/low Pin abstecken.
Vermutlich wird es sowieso nicht wiederholbar genau werden - aber ein ungefähr Wert würde mir hier schon reichen.
Aber bitte, falls vorhanden, keine "Waits" mit messen.
Sollte doch gehen, oder?

Hast Du inverse Kinematik drin?

Viele Grüße
Jörg

pinsel120866
27.01.2015, 12:57
Hallo Jörg,

ich fürchte, meine Elektronikkenntnisse reichen nicht aus, deinen Wunsch zu erfüllen. Oszilloskop habe ich auch keines. Inverse Kinematik wäre interessant, müsste ich mich aber noch schlau machen wie man das in Python programmiert.

021aet04
01.02.2015, 10:44
Wenn du ein DMM mit Frequenzmessung hast könntest du einfach statt des oszi das DMM nehmen.

MfG Hannes

pinsel120866
15.02.2015, 11:10
Ich habe nun das Chassis aus Kunststoff gegen eines aus Aluminium ersetzt. Nun bin ich mit dem Aufbau zufrieden. Hardware ist die gleiche: "Gehirn" ist ein Rasperry Pi, gesteuert wird der Bot mit einem XBOX Controller. Für die Ansteuerung der Servos nehme ich ein I2C 32 Channel PWM Servo Board.

Ausserdem habe ich noch eine Ultraschall-Entfernungmessung implimentiert. Den Tetrapod-Gang beherrscht der Hexapod auch schon (sh. Video).Durch die US-Messung ergeben sich kurze Pausen zwischen den Bewegungen.

http://youtu.be/2TXm8v5fBYs

Als nächstes werde ich mich mit inverser Kinematik auseinandersetzen - gibt es hierzu schon Erfahrungen beim Programmieren mit Python? Wäre nett, wenn ich das Rad nicht neu erfinden müsste...

pinsel120866
17.02.2015, 10:48
Hallo,

ich habe es nun auch geschafft, inverse Kinematik einzubauen:
http://youtu.be/sZRRAya2TSg

HeXPloreR
17.02.2015, 12:58
Hallo Pinsel,

wenn du nicht grade zwei Werte (der 3 Koordinaten X Y Z) gleichzeitig veränderst dann ist es leider noch keine inverse Kinematik - bzw sieht noch nicht ganz danach aus.
Interessant wäre zu wissen was du da tun willst in dem Video - also ich kann es mir denken, aber es von Dir zu hören würde weiterhelfen ;)

Viele Grüße
Jörg

Geistesblitz
17.02.2015, 13:38
Inverse Kinematik sind letztendlich nur eine Reihe von mathematischen Rechenoperationen, das sollte in jeder Programmiersprache zu implementieren gehen. Wichtig ist nur, die Formeln richtig aufzustellen. Wahrscheinich musst du da selbst noch ein wenig suchen, anbieten kann ich dir schonmal diese Seite von Malthy: http://www.mtahlers.de/index.php/robotik/hexapode/inverse-kinematik
Letztendlich willst du für die Fußspitze die Position in kartesischen Koordinaten (x,y,z) vorgeben können und die inverse Kinematik berechnet dir dafür die Gelenkstellungen. Dann kannst du genau bestimmen, wie sich die Fußspitze im Raum bewegen soll.

pinsel120866
17.02.2015, 13:43
Aha, ich habe inverse Kinematik so verstanden:

Ich gebe die Startpunkt- und Endpunktkkordinaten an und die Fusspitze beschreibt auf dem kürzesten Weg die Verbindung indem alle 3 Servos betätigt werden.

Aber danke für eure Hinweise, ich werde mich noch näher damit auseinandersetzen.

Geistesblitz
17.02.2015, 14:24
Nicht direkt, die inverse Kinematik beschreibt wirklich nur die Umrechnung von Koordinaten auf Gelenkwinkel. Ich hatte das bei meinem Roboterarm so aufgebaut, dass wirklich jeder Zwischenschritt der Bewegung auf Raumebene berechnet und anschließend mittels der IK transformiert wird. Das ist allerdings relativ rechenaufwändig, je nachdem musst du vielleicht gucken, ob dein Controller das schafft. Dafür wäre es aber so möglich, dass der Fuß, wenn er aufgesetzt ist, sich wirklich in einer geraden Linie bewegt. Das nach vorne setzen kann man dann entweder wieder auf Gelenkebene arbeiten oder wieder auf Koordinatenebene, je nachdem, was von der Berechnung her günstiger ist. Zu den Formeln wird auf Malthys Seite eigentlich schon das Wesentlichste erklärt.

pinsel120866
17.02.2015, 18:27
Der Link zu Malthys Page war sehr hilfreich, ich habe nun eine bessere Übersicht gewonnen. Natürlich habe ich versucht das Gelernte gleich umzusetzen mit folgendem Ergebnis:
http://youtu.be/ewqSKVut-R4

Die Fussspitze bewegt sich unter Angabe der Koordinaten x, y, und z auf direktem Weg zwischen 2 vorgegebenen Punkten. Es werden bei dieser Vorgabe alle 3 Gelenkservos benötigt.

Geistesblitz
17.02.2015, 19:04
Das ging aber fix :)
Hast auch überprüft, ob die gefahrene Bahn mit der Berechneten übereinstimmt?

malthy
17.02.2015, 19:29
Hast auch überprüft, ob die gefahrene Bahn mit der Berechneten übereinstimmt?

Man sieht ganz gut ob man richtig gerechnet hat, wenn man mit der Fußspitze einfach mal eine Gerade abfährt, also nur eine Koordinate über einen bestimmten Bereich inkrementiert.

Gruß
Malte

pinsel120866
18.02.2015, 07:18
Das ging aber fix
Naja, ich war auf dem richtigen Weg und musste mein Konzept nur noch um die 3 Achse ergänzen.

HeXPloreR
18.02.2015, 12:59
Hallo Pinsel,

auch auf die Gefahr hin das ich wieder der einzige bin der nicht ganz nachvollziehen kann was das Video uns zeigen soll.
Nach meinem Verständnis der inversen Kinematik ist es nicht so einfach möglich nur die Anfangs- und Endpunkte anzugeben - ohne das der Weg bzw Winkel dazwischen auch immer wieder neu berechnet werden muss. Deine Servos bewegen sich also momentan nicht in Abhängigkeit zueinander. Kann das sein?

Viele Grüße
Jörg

pinsel120866
18.02.2015, 13:13
Hallo Jörg,

ich berechne alle 10 mm in der Z-Achse die Zwischenpunkte und gebe sie auf Bildschirm aus, du siehst das im letzten Teil des Videos. Aber du hast Recht, die Sache könnte sicher noch verfeinert werden.