Entwicklung: RoPi - Autonomer Roboter mit RaspberryPI

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich hab das 1,5x erwähnt und auch gesagt, dass das meine Ansicht ist, ich dich aber tun lasse :-/
    Ich unterstütze trotzdem wo ich kann :) denn ich finde das Projekt cool.
    Und aus meinem soll auch noch ein Bot werden, da möchte ich doch auch Hilfe haben, und ich hab auch viel vor *schiefgrins*

  • Entwicklung: RoPi - Autonomer Roboter mit RaspberryPI? Schau mal ob du hier fündig wirst!

  • Ich hab jetzt erst mal ein einfaches Python Script geschrieben was 2 Threads erzeugt:
    - der erste stellt eine Verbindung zum Serial Port her und gibt alles in der Konsole aus
    - der zweite stellt einen socket_server zur Verfügung

    Nun hab ich aber leider das Problem dass sich der socket_server Thread beendet sobald ein Client die Verbindung trennt - Wie kann ich das beheben :huh:

    Server.py:

    Spoiler anzeigen

    Client.py:

    Spoiler anzeigen


    PS: Der read_Thread lässt sich leider auch nicht via STRG+C beenden.

  • Hi,

    Python ... weiss ich jetzt nicht.
    In C ist das jedenfalls so, dass der Server für jede Verbindung einen eigenen Prozess/Thread mit einem neuen socket erzeugt, während der ursprügliche wieder in den "Listen" Modus geht.

    cheers,
    -ds-

  • Habs hingekriegt, aber eben etwas anders:

    "SerialServer.py"
    "settings.py"
    Code
    DEBUG = True
    SerialPort = "/dev/ttyACM0"
    SerialBaudrate = 38400
    SocketHost = "0.0.0.0"
    SocketPort = 7070
    "client.py"

    Aufruf: client.py search:1

    Derzeitige Ausgabe:

    "SerialServer Ausgabe"

    Nun hauch ich dem erstmal ein bisschen Intelligenz ein :)

  • Hab jetzt erst noch mal am motor_driver.ino weiter gemacht und Commands eingebaut um PanTilt Ein- und Aus-zuschalten. Beim Command stop:1 (egal was für ne Zahl) werden zudem die Servo's detached da diese sonst permanent an sind also Geräusche von sich geben..

    Es wird auch der aktuelle Modus gespeichert, der im loop() abgefragt wird und somit fortlaufend ist - also zB search:1 läuft solange weiter bis ich ein stop:1 übermittel. Dh ich hab dort nirgends delay()'s oä. drin (abgesehen für die PanTilt function) oder while Schleifen drin, die den Sketch aufhalten oder ausbremsen würden.

    Hab den Code auch noch etwas optimiert und aufgeräumt - ist aber noch immer nicht fertig ;)

    "motor_driver.ino"

    //EDIT: Bevor ich mich nun ans eigentliche Map erstellen mache muss ich erst noch für die RadEncoder Vorbereitungen treffen - um zu wissen wieviel Strecke der RoPi zurückgelegt hat.

    Für eine bessere Navigation sollte man dann zudem die ungefähren Abmessungen (aufgerundet) des Roboters wissen und festlegen, was dann in der Map die Größe der Quadrate (Zelle) festlegt. Wenn also der RoPi zum Beispiel 15cm breit und 20cm lang ist, wären auch die Quadrate so groß. Erfasst er dann ein Hindernis wird das jeweilige Quadrat, was zB 60cm entfernt ist, als komplett "unbefahrbar" markiert und man läuft nicht Gefahr dagegen zu fahren.

    Beim herumfahren würde er dann seine eigene Position als aktuelle RoPi-Position (Wert: 254) übermitteln und beim verlassen dieses Quadrats (Zelle) erhält dies selbstverständlich auch ein 'befahrbar' Wert von 0.
    Erkennt er ein Objekt in 60cm Entfernung werden die Quadrate (Zelle) dazwischen als 'befahrbar' (Wert: 0) und das Quadrat vom 60cm entfernten Objekt als 'unbefahrbar' (Wert: 255) markiert. Mithilfe des Kompass weiß man dann auch die Richtung.
    Gibt man ihm ein Ziel wird dieses mit dem Wert 1 markiert, wohin er dann selbstständig den optimalsten Weg finden muss.

  • Die Servo.h ist totaler müll... die liest nicht wirklich die aktuelle Position aus sondern gibt nur den zuletzt via write() gesetzt Wert wieder :(

    Dh wenn ich zB den Pan Servo erst auf Position 150 schicke und anschließend auf 10, kann ich nicht prüfen ob er da auch wirklich angekommen ist - bzw jenachdem wie schnell die Servos sind kanns halt öfters vorkommen das der selber festgelegte delay zu kurz ist :( Das nervt mich grad tierisch, vorallem weil ich keine delays nutzen will =(

    Habs hiermit versucht:

    Aber wie gesagt, selbst damit kommt er nicht schnell genug von 150 auf 10... andersherum also von 10 auf 150 ist damit kein Problem da er ja mit 150 länger zählt und somit delayed
    Und detachen tut er auch nicht wirklich - zZt kein Plan wieso :s

    Ich hasse delay's - auch künstliche! :wallbash: :@


  • Die Servo.h ist totaler müll... die liest nicht wirklich die aktuelle Position aus
    ...
    Aber wie gesagt, selbst damit kommt er nicht schnell genug von 10 auf 150
    Und detachen tut er auch nicht wirklich - zZt kein Plan wieso :s

    evtl. doch einen Drehgeber (oder Winkeldecoder) mitlaufen lassen ? umso unabhängig von verschluckten Steps zu sein ?


    Ich hasse delay's - auch künstliche! :wallbash: :@

    kann ich voll verstehen ! :thumbs1:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Wie kommst du auf Decoder?
    Es geht um die Servo's die an eine bestimmte Position drehen sollen und darum festzustellen ob sie dort auch ankommen bevor die Servo's abgeschaltet werden, weil sonst die Motoren der Servos die ganze Zeit an sind und somit auch Strom verbrauchen

    Setze ich den Pan Servo erst auf Position 150 und anschließend auf 10, reicht der Delay nicht da er ja nur 10 * 20ms nutzt - um Gegensatz dazu wäre von 10 auf 150 eben der Delay viel höher -> 150 * 20ms. Setze ich den Delay aber höher verschwendet er Zeit weil er längst an der Position angekommen is :(

  • Hi alter Tüftler,
    das Dumme ist, dass Servos in der Regel (zumindest die preiswerten Teile) keine Rückmeldung über ihre Position liefern.


    Wie kommst du auf Decoder?


    Ich hatte dato mal nach einer Möglichkeit gesucht, die reale Position festzustellen, und bin dabei u.a. auf das -> hier <- gestossen.
    Das geht imho so in die Richtung wie jar das meinte ...

    Ich hab' das nach wie vor auf Halde ... wer weiss, ob ich das mal wirklich brauche.

    cheers,
    -ds-

  • Nunja, das setz ich erstmal auf die ToDo Liste und mach mit anderem Krams weiter :-/


    Ich studiere grad die verschiedenen Möglichkeiten für Pathfinding da ich ja nun Softwaretechnisch bereits soweit gekommen bin das ich das in Angriff nehmen kann..

    Zunächst werde ich mich wohl dazu entscheiden 2 verschiedene Maps zu nutzen:

    • Eine lokale Karte im Speicher des Arduino's welche die aktuelle, unmittelbare Umgebung repräsentiert.
    • Eine globale Karte die der RaspberryPI verwaltet, welche dynamisch wächst.

    Bei der Verwendung von 2 Karten steigt die Genauigkeit, wie man zB auch hier nachlesen kann.
    Der Abgleich beider Karten erfolgt aber nicht in Echtzeit sondern Zeitversetzt.

    Beim autonomen Fahren übermittelt der Arduino seine Positions- und Sensordaten ans Gehirn (RaspberryPI), welches dann die Position mit der globalen Karte vergleicht und dem Arduino (ausführendes Organ) unter Umständen sagt dass da früher ein mal ein Hindernis war und der RoPi somit "vorsichtiger" fahren soll..

    Ich werde zudem die bereits erwähnten Zellen Werte (0, 1, 254, 255) um einige erweitern, wie zum Beispiel für einen Abgrund/Loch auf einen negativen Wert der sich nicht ändern lässt, oder auch für Wände die ebenfalls nicht einfach so verschwinden ;)
    Befährt der RoPi dann einen Bereich den das Gehirn bereits kennt (globale Karte), sollten die Werte der Zellen in der globalen Karte für die Anzahl der wiederholten Abtastung immer weiter "stabilisiert" werden -> befährt er zum ersten mal einen Raum und es wird eine Wand erfasst, erhällt diese zum Beispiel erst einmal nur den Wert 200. Befährt er den Raum dann später nochmal und erfasst die selbe Wand erneut wird der Wert für diese Zelle auf zB 100 gesetzt, solange bis die Zelle einen negativen und nicht veränderbaren Wert von zB -100 erreicht... Hat eine Zelle einen negativen Wert brauch sich der RoPi damit auch nicht weiter beschäftigen sondern weiß dass das Objekt statisch immer da ist :)

    Nun hab ich verschiedene Anlaufstellen wo ich den Code studieren kann, unter anderem direkt auf der OpenSLAM Seite wo auch andere Projekte mit Code verlinkt sind. Aber auch das gut Dokumentierten c't-Bot Wiki wo man auch Quellcode findet.
    Hab dazu auch noch hier ne Seite gefunden wo auch der Code veröffentlicht wurde, da sieht man auch schon mal wie es ungefähr aussehen könnte.

    Allerdings stoße ich jetzt auf 2 blöde Probleme:

    • Ich hab bereits jetzt 18 der verfügbaren 19 Pins des Arduino-UNO's belegt, werde für Pathfinding aber weitere Pins benötigen da ich noch mindestens 4 IR-Sensoren benötige (rund herum angeordnet wo die Reichweite auch nicht so hoch sein muss) und optimal wären (wie ich schon mal erwähnte) auch noch 2 weitere Ultraschall Sensoren da der Pan&Tilt auf Dauer zu langsam schwenkt.
    • Die Arduinos haben zu wenig Ram/Cache um temporäre Werte zu speichern dh um so mehr veränderbare Variablen dazu kommen, um so mehr Ram wird belegt und genau da stoße ich sehr schnell an die Grenzen..

    Wegen 2. müsste ich mir SpiRAM zulegen - und da ich bereits jetzt keine Pins mehr frei hab bzw die SPI Pins bereits verwendet werden, muss ich: Wegen 1. auf einen Arduino-Mega-2560 ausweichen.
    (ein SD Shield könnte zwar auch eine Möglichkeit sein allerdings wären die Zugriffe wesentlich langsamer und ist daher eher ungeeignet für dieses Vorhaben)

    Der schon mal erwähnte Wavefront Algorithm wird auch im c't-Bot Wiki nochmal beschrieben. Habe dazu dann auch im dortigen Source ein bisschen gestöbert und interessanten Code gefunden:
    http://www.heise.de/ct/projekte/ma…ehaviour_scan.c
    http://www.heise.de/ct/projekte/ma…r_pathplaning.c
    http://www.heise.de/ct/projekte/ma…t/include/map.h
    http://www.heise.de/ct/projekte/ma…le/ct-Bot/map.c

    Ein interessantes Code Beispiel für Wavefront hab ich auch hier gefunden.

    Vielleicht kann ich auch die quelloffene c't-Sim für meine Zwecke missbrauchen - mal gucken :D

    ROS hätte für sowas auch ein Module, allerdings hab ich ROS beim letzten Versuch nicht installiert bekommen und will auch erst mal ohne ROS auskommen.
    (ROS install howto on RPI: hier bzw hier)


  • Hey meigrafd,
    schau mal, was ich -> hier <- entdeckt habe.
    Wäre das evtl. eine Alternative zum Uno?

    happige Preise, was ist da besser als Arduino Nanos 328p (32k flash) für 5€ oder Mega2560 (256k flash) für 12,50 ?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ja ich glaub der Teensy fällt flach, der ist mir zu teuer :-/ Also wenn dann käm für mich nur der Teensy++ 2.0 für $24 in frage.
    Einen Arduino-Mega2560 R3 kriegt man in der Bucht bereits für 15€ inkl. VSK (oder aus China für 10€)

    Ein Arduino NANO und Pro Mini hab ich auch noch hier, aber die haben auch zu wenig I/O's.

    Beim Mega2560 ist halt auch ein 4kB großer EEPROM drauf den man mit der gleichnamigen Lib lesen/beschreiben kann und dessen Inhalt auch nach PowerOff bestehen bleibt. Dadrin könnte man ggf die Maps bzw den letzten Zustand auch hinterlegen.


    Heute mach ich mich erst mal ans Regelwerk und muss mir hierfür eine flexible Methode ausdenken die Rules nicht hardcoded im python Script festzulegen (ich mag kein hardcoded :D).

  • Hi,

    ich buddle gerade mal wieder in den Tiefen des WWW und suche Anregungen, Ideen, Impulse, ...
    Da kam mir eine Idee: Du sagst ja, dass Dir die µC zu wenig IOs haben ... könntest Du das Problem nicht mit z.B. einem MCP23008 lösen? Die Arduinos, selbst der Pro Mini, können ja I2C und diesen Baustein gäbe es ja auch als SPI Variante (MCP23S0).
    Wie gesagt ... nur so eine Idee, aber evtl. reicht Dir das ja ...

    cheers, ich geh weitergraben,
    -ds-


  • ich buddle gerade mal wieder in den Tiefen des WWW und suche Anregungen, Ideen, Impulse,


    wenn es einen Arduino o.ä. als mini oder micro gäbe mit mega1284p das wäre was :D

    klein TSOP 44 Pin
    Flash (Kbytes): 128 Kbytes
    SRAM (Kbytes):16
    EEPROM (Bytes):4096
    Operating Voltage (Vcc):1.8 to 5.5
    UART: 2
    PWM Channels: 6
    Diff. ADC Inputs: 14 (genial für Strom & Spannungsmessung ! )

    http://www.atmel.com/devices/atmega1284p.aspx?tab=parameters


    also ich mag den, als DIL 40 oder TSOP 44 ATmega32 kompatibel !

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hi Berliner :) ...


    ...
    wenn es einen Arduino o.ä. als mini oder micro gäbe mit mega1284p das wäre was :D
    ...


    hm ... kann man dem nicht einfach den Arduino Bootloader verpassen?
    Ich muss dazu sagen, ich hab noch nie einen AVR direkt per Bootloader zum Arduino umgeflasht ... sollte aber gehen.
    Werd' ich mal im Hinterkopf behalten. Das interessiert mich und evtl. finde ich eine funktionierende Anleitung dazu.
    Ich würd' das ja auch so mal probieren, aber ich hab' da immer Sorgen wegen den Fuses ... das wäre nicht der erste µC den ich aufgrund falsch gesetzter Fuses in die ewigen Jagdgründe geschickt hätte ;) ...

    see you, "Der mit dem heissen Eisen winkt" ... (in Anlehnung an "Der mit dem Wolf tanzt") ... :)
    -ds-


  • hm ... kann man dem nicht einfach den Arduino Bootloader verpassen?
    Ich muss dazu sagen, ich hab noch nie einen AVR direkt per Bootloader zum Arduino umgeflasht ... sollte aber gehen.

    dann fehlt immer noch die USB Anbindung ! CH340 oder FTI oder Mega8

    die einzige Platine die das bieten würde hat einen m32 IMHO aber den runterlöten :mad_GREEN: ist Quark .....

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • tut mir leid das ich hier nochmal störe aber wer Aruinos einsetzt und günstig sollte folgendes noch wissen:

    es gibt nun mindestens 3 USB Anbindungen:

    mit ATmega8 Treiber in der Arduino IDE vorhanden,
    mit FTI, kenne ich nicht,
    Nano mit CH340 habe ich für 5 € aus China bekommen, brauchen wieder extra Treiber, nach mehr graue Haare und viel googeln gefunden:
    http://www.jens-bretschneider.de/aktuelle-treib…zu-usb-adapter/
    jetzt laufen die 5€ Teile aber prima ....

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (1. August 2014 um 14:34)


  • Ach für Windows ... wer nutzt denn so was ;)

    ach du programmierst Arduino am PI ? :s

    wie geht das ? ist der nicht ein bissl lahm ?

    oder hast du das durchgestrichene OS ? :fies:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!