Navigation eines Autonomen-Roboters mittels Kamera

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Hallo zusammen,

ich ein Schüler aus der 5.Klasse HTL und wir haben dieses Jahr eine sehr interessante Diplomarbeit vor uns.

Wir haben uns entschlossen, als Diplomarbeit einen (vielleicht fertigen) Roboter mit einer Bilderfassung-Kamera auszurüsten. Das Ziel dabei ist es mithilfe der Kamera den Roboter auf einer Fahrbahn fahren zu lassen während sie verschiedene Schilder/Symbole erkennt und dementsprechend reagiert (z.B. muss sie bei einer Stop-Tafel anhalten oder eine Markierung auf dem Boden verfolgen).

Verwenden werden wir dazu:
Raspberry Pi + Kamera
Python + Bildverarbeitungssoftware

Da wir bis jetzt garnicht mit Python gearbeitet haben und uns auch nicht entscheiden konnten was für eine Kamera wir dafür verwenden sollen, oder ob Python die beste Programmiersprache dafür ist, wollte ich mich noch, bevor wir anfangen schlau machen.

Falls ihr Fragen habt wie zum Beispiel unser Roboter oder die Fahrbahn ausschaut könnt ihr euch gerne melden.

Ich wäre sehr dankbar für jede Art und Weise an Hilfe die von euch kommt.

LG
Emre
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hallo Emre,

ein schoenes Projekt, aber auch anspruchsvoll. Ich denke, dass man da etwas mit Python und der OpenCV machen kann.

Grundsaetzlich gilt fuer CV-Projekte das es wichtig ist, einen grossen Korpus and gelabelten (also benannten) Testdaten zu bekommen. Also zB Frames mit dem Stoppschild aus verschiedenen moeglichen Perspektiven, etc. Die muesst ihr sammeln und gut aufbewahren, denn anhand derer werdet ihr verschiedene Klassifikatoren immer wieder ausprobieren/trainieren muessen.

Fuer das verfolgen des Streifens auf dem Boden wuerde ich eher auf klassische Methoden setzten, also das bearbeiten des Bildes so dass man zB die Position, an der der Streifen gerade am unteren Ende verschwindet, ermitteln kann. Auch hier ist es wichtig, Testdaten zu sammeln, um ueber die Zeit den Algorithmus darauf loszulassen.

Bezueglich der Kamera wuerde ich nichts allzu besonderes nehmen. Neuronale Netze zb rechnen oft nur auf 240 Pixeln im Quadrat, und generell ist ein kleines Bild natuerlich schneller verarbeitet. Und selbst 30fs seid ihr gut genug dabei, das erreichen die Algorithmen eher nicht. Die neue PI-Kamera ist zB schon besser, als ihr sein muesst - da reicht auch die alte.

Viel Erfolg!
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Hallo __deets__ und danke erstmal für deine ausführliche Antwort.

Eine Sache wo ich mir sehr viele Gedanken gemacht habe ist, ob es möglich für unseren Roboter wäre sowohl die Spur (Linie auf dem Boden) als auch die Symbole gleichzeitig zu erkennen und zu bearbeiten/reagieren.

Bei der Auswahl der Kamera werde ich deine Tips auf jeden fall beachten. Uns ist jedoch noch nicht klar wie groß die Symbole sein müssen bzw. wie weit weg sie sein dürfen um noch erkennbar zu bleiben. Dementsprechend müssen wir glaub ich auch entscheiden ob wir eine weitwinkel Kamera brauchen oder nicht, das nehme ich jedoch nicht an.. oder was denkst du ?

LG
Emre
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke ihr solltet euch vordringlich auf das Pfad-verfolgen konzentrieren. Und die Schilder als Bonus machen. Das kann dann ggf bedeuten, dass ihr die Schilder statt wie ein normales Schild auf dem Boden platziert, zB auf einem kleinen LEGO-Unterbau. Denn es wird euch deutlich leichter fallen, wenn die Kamera recht weit nach unten zeigt. Wenn ihr das damit hinbekommt, ist der Schritt es mit einer weitwinkeligeren Kamera oder einer zweiten zu machen klein.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Sorry nachricht kam zu oft ^^
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Vielen Dank für deine Antworten.

Morgen habe ich Zeit um mit meinem Lehrer darüber zu reden. Werde ihm auf jeden fall deine Ideen vorschlagen!
Ich danke dir dafür das du dir Zeitgenommen hast um mir weiterzuhelfen, falls Fragen auftauchen werde ich mich wieder melden.

LG
Emre
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Hallo nochmals,
um die Motoren von unserem Roboter anzusteuern brauchen wir ein Motorshild für Raspberry Pi 4. Auf Amazon gibts allerdings nur eines für Raspberry Pi 2 und 3.

Hat eventuell jemand Erfahrung und kann uns behilflich sein?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das sollte keinen Unterschied machen. Die IO leiste ist gleich geblieben.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Hallo nochmals,

wir haben bis jetzt alle nötigen Bauteile, sowohl für die Programmierung als auch für die Mechanik gekauft, und sind bereit mit dem Projekt zu starten. Ich habe allerdings nicht viel Ahnung bzw. bin sogar ganz neu was das Programmieren mit Python Raspberry Pi und OpenCV angeht. Ich hab versucht mich mit Videos aus dem Internet oder Beiträgen in Forums, wie zum Beispiel in diesem, schlauer zu machen.

Meine Frage: Da ich relativ neu bin habe ich nicht wirklich eine Ahnung wie ich mit dem Programm anfangen soll. Ich habe bereits ein Programm aus dem Internet für die Bilderfassungskamera gefunden.
Link dazu: https://electreeks.de/project/exkurs-in ... mobilenet/

Ich muss jetzt ein Programm schreiben damit sozusagen die Kommunikation zwischen Roboter und der Kamera funktioniert (Ihr kennt euch da sicher besser aus ^^).

Hat vielleicht jemand von euch schon eine Erfahrung in Sachen Bildverarbeitung und könnte mir dabei helfen, Tipps geben ?

PS. (Wir sind gerade dabei die Kamera in Betrieb zu nehmen um so wie bereits vorgeschlagen, sie mal auszutesten).

Ich wäre sehr glücklich über jede einzelne Antwort..

LG
Emre
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hallo Emre,

ich denke nicht, dass dieser Link wirklich hilft. Ihr braucht ja keine beliebigen Objekte erkennen. Und auch Bilder helfen euch nicht, sondern ihr muesst die OpenCV capture Objekte verwenden, um Frames von der Kamera zu bekommen.

Ein Projekt, dass das viel mehr zu bieten hat, waere zB das hier: https://github.com/vishalvarghese46/RPiTank

Dann braucht ihr eine grundlegende Programmstruktur, die die zwei Aspekte des Roboters getrennt umsetz:

1) Kontrolle der Fahrfunktionen
2) Auswertung der Kamerabilder, und entsprechende Eingaben an Modul 1.

Ich wuerde noch ein drittes Modul schreiben:

3) Fernsteuerung mit der Moeglichkeit, Fotos von der momentanen Kameraansicht zu machen.

Denn fuer Funktion 2 musst du Bildmaterial haben, dass du sammelst und durch deine Klassifikation laufen laesst, um zu pruefen, dass es das richtige Steuersignal produziert.

Die Funktion 1 kannst du zB so umsetzen:

Code: Alles auswählen

from bottle import route, run, template
import threading
import queue

COMMAND_TIMEOUT = 2

command_queue = queue.Queue()


@route('/robot/<command>')
def robot(command):
    command_queue.put(command)
    return {"status": "Ok"}


def stop():
    print("robot stop")


def left():
    print("roboter left")


def right():
    print("roboter left")


COMMANDS = dict(
    left=left,
    right=right,
    stop=stop,
    )


def robot_control():
    while True:
        try:
            command = command_queue.get(timeout=COMMAND_TIMEOUT)
            COMMANDS.get(command, stop)()
        except queue.Empty:
            stop()


def main():
    t = threading.Thread(target=robot_control)
    t.daemon = True
    t.start()
    run(host='localhost', port=8080)


if __name__ == '__main__':
    main()
Ich nutze dazu bottle, ein kleines web-Framework.

Wenn du das mit pip installierst, und das Programm aufrufst, probiert der Thread Kommandos aus der queue zu holen. Wenn das innerhalb eines gewissen Zeitraums nicht geht, stoppt der Roboter.

Du kannst dann mit zB http://localhost:8080/robot/left den Roboter links fahren lassen.

Mit einer kleinen Seite mit Javascript und ein paar Knoepfen kannst du dann Kommandos an den Roboter schicken. Auch ueber Netzwerk vom PI! Mit der richtigen Adresse natuerlich. Das ist dann Modul 3. Das kannst du auch von der Anwendung oben ausliefern lassen, als index-Seite.

Und Modul zwei kann als eigenstaendiges Programm auch mit dem httpclient Kommandos an Modul 1 uebergeben. Dadurch sind die nett entkoppelt, und jeder kann an etwas anderem arbeiten.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Vielen Dank __deets__!
Ich schau mir das alles an und bespreche es eventuell auch mit meinem Lehrer.
Melde mich wieder falls was ist.

LG und schönes WE
Emre
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Hallo __deets__,
Ich habe ein Problem beim installieren der Libraries.
1-3 habe ich ohne Probleme hinbekommen doch beim 4. kriege ich ständig einen Fehlercode (failed with error code 1 in None).

Ich spreche hier über diese Seite:
https://github.com/vishalvarghese46/RPiTank


Außerdem habe ich bereits ein Programm zur Bilderkennung gefunden was relativ gut erklärt wird.

Link dazu (Youtube):
https://youtu.be/ylnjXbcNLJU
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du mal in deiner Paketverwaltung geschaut? Ich denke ein halbwegs aktuelles OpenCv reicht vollkommen. Und das ist damit schnell installiert. Ohne pip, sondern mit synaptic oder apt direkt.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Ich habs versucht so wie in dem Link, welches du mir geschickt hast, zu installieren: (https://github.com/vishalvarghese46/RPiTank)

Hab aber immer ein Error gehabt. Unter dem Video. habe ich außerdem auch viele positive Kommentare gelesen. Solang es also funktioniert ist es für mich kein Problem ob es lange dauern würde oder nicht, weil ich sonst nix finde.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das mag sein, aber das ist ein viel aufwendigerer Weg.l, mit viel mehr Fehlerquellen. Probier bitte mal Pakete zu suchen und zu installieren.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Stimmt.
Wie auch immer, ich hab mir die Zeit genommen und es hinbekommen...
Habe jetzt allerdings ein Problem bei der Inbetriebnahme der Kamera.

Kriege an dieser Stelle jedesmal ein Fehlercode:
Bild

Hoffe das Bild ist noch leserlich.

Hab auch grad zusammen mit Kollegen eine Seite gefunden:
https://www.murtazahassan.com/courses/s ... pberry-pi/

Auch ein Video dazu:
https://www.youtube.com/watch?v=_wi2L-K ... 1A&index=2

In dem Video wird, so wie du es mir am Anfang gesagt hast, erzählt das man Daten sammeln muss um sozusagen das System zu trainieren. In seinem Video hat er aber nicht nur ein Webcam Modul sondern viele verschiedene. Muss ich das in diesem Falle auch tun oder reicht es wenn ich nur ein Modul für die Cam habe?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das capture funktioniert nicht. Du uebernimmst den Frame ungeprueft, und ohne auf 'success' zu testen, und beim imshow fliegt dir das dann um die Ohren.

Zuerst einmal musst du sicherstellen, dass deine Kamera am Pi ueberhaupt funktioniert. Mit irgendwelchen Programmen, welche die benutzen.

Wenn das geht, wuerde ich versuchen, mit picamera zu arbeiten. Das ist weniger komplex als OpenCV, und wenn es damit geht, dann hast du eigentlich schon gewonnen. Denn das kann auch numpy arrays liefern, und die wiederum stellen die Eingabe fuer OpenCV und seine Algoritmen dar. Ob du dann wirklich der Frage nachgehen willst, warum es mit OpenCV nicht geht, kannst du dir dann ueberlegen. Ich wuerd's ignorieren. Denn das kann viele Gruende haben, Fehlkonfiguration beim bauen zB. Da ranzugehen bedeutet ggf. seeeehr viel Zeit zu investieren, und du solltest dich auf deine eigentliche Aufgabe fokussieren.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Die Kamera habe ich bereits getestet. Ist schon paar Wochen her. Die Auflösung ist zwar nicht das Beste (habe ein leichtes lila-effect) aber sie funktioniert auf jedenfall.

Zu deinem Vorschlag. Ich bin da wie schon gesagt nicht so erfahren aber, mein Lehrer hat mir damals wie wir ihm von unserer Idee erzählt haben vorgeschlagen mit OpenCV zu arbeiten. Aber dennoch werde ich mich auf jedenfall schlauer machen und mir deinen Ratschlag genauer anschauen.

(In einem Video, dass ich von der selben Person habe, habe ich gesehen das er mit PyCharm auf einem PC programmiert und es dann auf sein Pi überträgt. Er hat sozusagen das selbe Projekt und auch alles Schritt für Schritt erklärt. Vielleicht wäre es keine schlechte Idee ihm zu folgen..)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem mit all diesen Videos und Anleitungen da draussen: die sind *irgendwann* entstanden, und sehr oft finden die dort angegebenen Schritte so keine direkte Entsprechung mehr.

Und was die Anmerkung des Lehrers angeht: der hat schon recht, und OpenCV ist auch meine Wahl. Dabei geht es aber um die Algorithmen, die ihr zur Auswertung des Bildes nutzt. Wie genau aber die Kamera angesprochen wird, das hat damit ueberhaupt nichts zu tun. Wenn du das mit picamera machst, dann wirst du auch damit dann mit der OpenCV weiter arbeiten. Es geht wirklich nur darum, wie die Pixel-Daten in dein Programm kommen. Und picamera hat einfach viel viel viel weniger Konfiguration und Abhaengigkeiten, und wenn es damit geht, ist alles gut.
Emre
User
Beiträge: 23
Registriert: Mittwoch 9. September 2020, 12:41

Hallo nochmals!

Wir sind relativ weit voran gekommen und sind mit dem Programmieren sogar fast fertig, allerdings nur "fast".
Für unser Programm müssen wir noch Videos bzw. Bilder aufnehmen um es um laufen bringen doch bis dahin haben wir noch ein wenig Zeit da wir erst heute den Lasercutter verwenden durften. Wie auch immer...

Ich wollte mein Programm Testen und bin dabei auf ein paar fehler codes gestoßen...

C:\Users\Moamm\PycharmProjects\DiplArbeit\venv\Scripts\python.exe C:/Users/Moamm/PycharmProjects/DiplArbeit/ColorPickerScript.py
Traceback (most recent call last):
File "C:\Users\Moamm\PycharmProjects\DiplArbeit\venv\lib\site-packages\numpy\__init__.py", line 305, in <module>
_win_os_check()
File "C:\Users\Moamm\PycharmProjects\DiplArbeit\venv\lib\site-packages\numpy\__init__.py", line 302, in _win_os_check
raise RuntimeError(msg.format(__file__)) from None
RuntimeError: The current Numpy installation ('C:\\Users\\Moamm\\PycharmProjects\\DiplArbeit\\venv\\lib\\site-packages\\numpy\\__init__.py') fails to pass a sanity check due to a bug in the windows runtime. See this issue for more information: https://tinyurl.com/y3dm3h86
Traceback (most recent call last):
File "C:\Users\Moamm\PycharmProjects\DiplArbeit\ColorPickerScript.py", line 1, in <module>
import cv2
File "C:\Users\Moamm\PycharmProjects\DiplArbeit\venv\lib\site-packages\cv2\__init__.py", line 5, in <module>
from .cv2 import *
ImportError: numpy.core.multiarray failed to import

Process finished with exit code 1

(Der ganze code passt nicht in ein Bild musste es deshalb einfügen)

Wir haben noch nicht die gelegenheit gehabt mit unserem Lehrer darüber zu sprechen da er noch krank ist und aus dem Grund auch nicht in der Schule sein kann. Deshalb wollte ich mich schon im vorhinein schlauer machen oder sogar das Problem mit Eurer Hilfe lösen.

Ich könnte euch unser Projekt (per Mail oder auch andere Möglichkeiten) schicken, was glaub ich auch besser ist da es ansonsten sehr unübersichtlich wäre.

LG
Emre
Antworten