Das Buch
in den Auflagen von 2016 und 2019, das ich geschrieben habe, benötigt einige kleinere Updates. Die Software zu diesem Projekt hat sich über die Zeit weiterentwickelt und vor allem das Live-Videostreaming funktioniert nun ein wenig anders. Alle über die vergangenen Jahre angefallenen Änderungen sind hier für euch dokumentiert.Wenn euch noch etwas auffällt, das jetzt nicht mehr funktioniert, meldet euch bitte. So kann ich das Problem – und hoffentlich auch zeitnah die Lösung – hier für alle veröffentlichen.
2. Auflage 2019 ![]() |
1. Auflage 2016 ![]() |
Der Hintergrund zu diesem Update
Mit der Weiterentwicklung des Betriebssystems Raspbian OS und auch der Bibliotheken wie der libcamera-Bibliothek für die Kamera haben sich etliche Änderungen ergeben. Ich habe diese Anpassungen und Lösungen hier so gut wie möglich beschrieben und jeweils die Seitenzahl für jede Anpassung angegeben.
Die Raspbian-Version, die für diese Anpassungen genutzt wurde, ist Version 12 (BOOKWORM).
PRETTY_NAME=“Debian GNU/Linux 12 (bookworm)“
NAME=“Debian GNU/Linux“
VERSION_ID=“12″
VERSION=“12 (bookworm)“
VERSION_CODENAME=bookworm
ID=debian
Hinweis: Ein Leser hat die Erfahrung gemacht, dass es zu Problemen kam, wenn er Pi-Imager zum Erstellen seiner micro SD-Karte verwendet hat. Dann konnte er die Bibliothek
libjpeg9-dev
nicht installieren. Verwendet daher bitte den Win32 Disk Imager zum Schreiben des Images auf die micro SD-Karte, wie ich dies in beiden Büchern beschrieben habe.
Mit dem folgenden Befehl könnt ihr die Version eurer Installation abfragen:
Befehl: cat /etc/os-release
Da es Nachfrage nach dem Download-Link für das von mir verwendete Image gab, möchte ich diesen hier ergänzen:
Vorbereitung der Installation
Bevor es losgeht, aktualisiert wie im Buch beschrieben eure Installation. Führt dazu die folgenden Befehle aus:
Befehl: sudo apt-get update -y
Befehl: sudo apt-get upgrade -y
Installationsanleitung als Video
Hier findet ihr das passende Video, das euch bei der Installation der Software auf eurem Roboter-Auto unterstützt.
Änderung 1 – Python 3
Wichtig ist, dass anstelle von Python 2.7 jetzt die Version Python 3.x zum Einsatz kommt. Unter anderem benötigt die Bibliothek readchar
, mit der wir Tastatureingaben einlesen, Python 3. Die Beispielprogramme mussten daher ebenfalls aktualisiert werden. Sie stehen ab jetzt hier in angepasster Fassung zum Download bereit:
Hinweis: Aufgrund eines aktuellen Problems mit dem Live-Stream in dem Web-Programm für die Steuerung des Roboter-Autos ist diese Veröffentlichung noch nicht erfolgt (Stand Dezember 2023).
Änderung 2 – readchar installieren
Buch 2016: Seite 128
Buch 2019: Seite 133
Die readchar
-Bibliothek steht nur noch für Python 3 zur Verfügung und muss daher für Python 3 installiert werden. Damit das sicher gelingt, muss PIP
für Python 3 vorhanden sein. Bei aktuellen Raspbian-Versionen ist das in der Regel bereits der Fall. Zur Sicherheit hier dennoch der notwendige Befehl:
Pip für Python3 installieren
Befehl: sudo apt-get install python3-pip
readchar für Python3 installieren
Jetzt, da PIP für Python 3 installiert ist, kann readchar
für Python 3 installiert werden. Wir benötigen es später zum Einlesen von Tastatureingaben für die Steuerung des Roboter-Autos.
Befehl: python3 -m pip install --break-system-packages readchar
Änderung 3 – Kamera-Bild anzeigen
Buch 2016: Seite 161
Buch 2019: Seite 161
Wenn ihr die Kamera angeschlossen und Bookworm auf dem aktuellen Stand habt, funktionieren Stand Januar 2024 bei mir folgende Befehle, um ein erstes Bild bzw. einen Video-Stream der Kamera anzuzeigen. Allerdings steht in der offiziellen Dokumentation bereits, dass sich diese Befehle zukünftig ändern können.
Dokumentation: https://www.raspberrypi.com/documentation/computers/camera_software.html
Der folgende Befehl zeigt ein erstes Kamerabild:
Befehl: libcamera-hello
Dieser Befehl speichert ein Bild im aktuellen Verzeichnis, in dem ihr euch im Terminalfenster befindet:
Befehl: libcamera-jpeg -o image.jpg
Dieser Befehl speichert ein 15 Sekunden langes Video im aktuellen Verzeichnis:
Befehl: libcamera-vid -t 15000 -o video.h264
Änderung 4 – MJPG-Streamer
Buch 2016: Seite 129
Buch 2019: Seite 134
Bei der Installation und der Konfiguration des mjpg-streamers ist eine Änderung nötig, da sich die Kameraunterstützung unter Raspbian OS geändert hat. Im Folgenden findet ihr eine Anleitung, wie ihr den mjpg-streamer installiert.
Der Video-Streaming-Server mjpg-streamer übernimmt die Aufgabe, das Video aus dem Roboter-Auto über WLAN zu übertragen. Damit das klappt, müssen einige Bibliotheken installiert und konfiguriert werden. Diese zusätzlichen Bibliotheken unterstützen den Server bei der Bildkomprimierung und -verarbeitung für den Live-Stream.
Die libjpeg9-dev-Bibliothek installieren
Die libjpeg9-dev
-Bibliothek ist eine frei erhältliche Software der Independent JPEG Group. Wesentlich stellt sie einen JPEG-Codec zur Verfügung, der Bilder mit unterschiedlicher Kompression erzeugen kann. Dieses Paket ist Voraussetzung, damit der mjpg-streamer das Video ruckelfrei über das WLAN übertragen kann.
Befehl: sudo apt-get install libjpeg9-dev
Zusätzliche Bibliotheken installieren
Bevor der mjpg-streamer kompiliert und installiert werden kann, sind kleinere Vorbereitungen nötig. Dazu gehört die Installation des plattformunabhängigen Programmierwerkzeugs CMake
und das Entpacken des zuvor heruntergeladenen ZIP-Archivs. CMake erzeugt die notwendigen Skriptdateien zum Kompilieren des mjpg-streamer
. Mit folgendem Befehl installiert ihr CMake auf eurem Raspberry Pi:
Befehl: sudo apt-get install cmake
Damit der mjpg-streamer
kompiliert werden kann, wird außerdem die GNU Compiler Collection gcc
sowie der GNU C++ Compiler g++
benötigt:
Befehl: sudo apt-get install gcc g++
Da für das Streaming über die libcamera
-Bibliothek zugegriffen wird, muss deren Entwicklerversion installiert werden:
Befehl: sudo apt-get install libcamera-dev
Den mjpg-streamer herunterladen
Da die Version des mjpg-streamers, die wir für das Roboter-Auto verwenden, vom Autor leicht angepasst wurde, um die Installation zu vereinfachen, muss eine ZIP-Datei von der Webseite des Autors heruntergeladen werden. Das Programm soll später in den Ordner /opt/mjpg-streamer-rapi-libcamera
installiert werden. Wechselt dazu im Terminal-Fenster in den Ordner /opt
:
Befehl: cd /opt
Führt dann diesen Befehl aus, um die mjpg-streamer-rapi-libcamera.zip
herunterzuladen:
Befehl: sudo wget https://custom-build-robots.com/mjpg-streamer-rapi-libcamera.zip
Anschließend entpackt ihr die ZIP-Datei:
Befehl: sudo unzip mjpg-streamer-rapi-libcamera.zip
Den mjpg-streamer installieren
Wechselt nun in den Ordner /opt/mjpg-streamer-rapi-libcamera/mjpg-streamer-experimental
:
Befehl: cd /opt/mjpg-streamer-rapi-libcamera/mjpg-streamer-experimental
Bereitet die Installation mit dem make
-Befehl vor:
Befehl: sudo make
Nachdem alle Skripte erstellt sind, installiert ihr den mjpg-streamer mit:
Befehl: sudo make install
Die Installation dauert ein paar Minuten und es erscheinen diverse Zeilen im Terminal.
Video-Live-Stream starten
Ist alles installiert und konfiguriert, könnt ihr den mjpg-streamer wie folgt starten. Führt dazu im Ordner des mjpg-streamers den Befehl aus:
Befehl: sh start.sh
Öffnet nun einen Browser und ruft folgende URL auf. Tragt dabei die IP-Adresse ein, unter der euer Raspberry Pi im Netzwerk erreichbar ist:
Befehl: http://<IP-Adresse>:8080/stream.html
Ein Beispiel-Aufruf könnte so aussehen:
Befehl: http://192.168.1.10:8080/stream.html
Änderung 5 – Flask Web-Framework installieren
Buch 2016: (In dieser Auflage wurde Flask nicht verwendet)
Buch 2019: Seite 134
Der Befehl für die Installation von Flask hat sich leicht verändert. Bei Raspbian OS (Bookworm, Dezember 2023) ist Flask meist bereits vorinstalliert. Der Befehl zum Installieren lautet:
Befehl: sudo apt-get install python3-flask
Änderung 6 – Das Start-Skript für den mjpg-streamer
Buch 2016: Seite 178
Buch 2019: Seite 188
Mit der Einführung von libcamera hat sich auch das automatische Start-Skript für den mjpg-streamer geändert. Bitte verwendet jetzt das Skript aus folgender ZIP-Datei:
Download: mjpg-streamer.zip
Hinweis: Achtet darauf, dass der Pfad zum mjpg-streamer richtig gesetzt ist. Dieser kommt in dem Skript an zwei Stellen vor und lautet in meinem Beispiel: /opt/mjpg-streamer-rapi-libcamera/mjpg-streamer-experimental/
. Außerdem wird die Log-Datei an zwei Stellen in /home/robot/mjpg-streamer.log
geschrieben. Hier müsst ihr robot
durch euren eigenen Benutzer ersetzen.
Hinweis zu weiteren Updates
Wenn ihr Probleme feststellt und mir schreibt oder ich weitere notwendige Anpassungen entdecke, werde ich sie hier veröffentlichen.
Zu readchar: der pip-Befehl brachte bei mir eine längere Fehlermeldung:
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
etc….
(Raspi 3, Bookworm)
Ich habe daraufhin von der Seite https://pypi.org/project/readchar/ den Sourcecode heruntergeladen und über den dort enthaltenen setup.py installiert.
Hallo Peter,
vielen Dank für Deinen Hinweis.
Ich habe den Installationsbefehl angepasst und dieser sieht jetzt wie folgt aus:
Befehl:
python3 -m pip install --break-system-packages readchar
Viele Grüße,
Maker
Webinterface:
Folgende Fehlermeldung beim Start:
root@PBU-RAS-13:/home/robot# python RobotControlWeb.py
Traceback (most recent call last):
File „/home/robot/RobotControlWeb.py“, line 22, in
import webiopi
File „/usr/local/lib/python3.11/dist-packages/WebIOPi-0.7.1-py3.11-linux-aarch64.egg/webiopi/__init__.py“, line 20, in
from webiopi.utils.thread import runLoop
File „/usr/local/lib/python3.11/dist-packages/WebIOPi-0.7.1-py3.11-linux-aarch64.egg/webiopi/utils/thread.py“, line 36
def runLoop(func=None, async=False):
^^^^^
Letztere Zeile kommt schon bei der Installation des Webinterfaces.
Ferner folgende Warnungen bei der Installation:
Found Python 3.11.2…
Trying to install python-dev using apt-get
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
Paket python-setuptools ist nicht verfügbar, wird aber von einem anderen Paket
referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
wurde oder nur aus einer anderen Quelle verfügbar ist.
Paket python-dev ist nicht verfügbar, wird aber von einem anderen Paket
referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
wurde oder nur aus einer anderen Quelle verfügbar ist.
Doch die folgenden Pakete ersetzen es:
python-dev-is-python3
E: Für Paket »python-dev« existiert kein Installationskandidat.
E: Für Paket »python-setuptools« existiert kein Installationskandidat.
Ich habe Raspi 3 mit Bookworm, Python 3.11.2
Muss man eventuell sources.list ergänzen?
Hallo Peter,
vielen Dank für den Hinweis. Den Fehler hatte ich selber noch nicht und versuche herauszufinden wie eine Lösung aussehen könnte.
Viele Grüße,
Maker
Hatte mir das 2016er Buch ausgeliehen aus der Bücherei zum Ausprobieren. Habe mir inzwischen das 2019er Buch beschafft. In den neuen Programmen kommt dieser Importbefehl nicht mehr vor. Das Webinterface funktioniert also. Allerdings scheint es mit Bookworm noch andere Probleme zu geben. Die Kamera funktioniert zwar tadellos mit der mjpg-streamer Demoseite. In Kombination mit dem Webinterface erscheint das Video allerdings bildschirmfüllend. Auch gibt es bei Bookworm anscheinend die Befehle raspistill und raspivid nicht mehr (S. 161). Details später.
Noch im Nachgang zu vorher:
das funktioniert überhaupt nicht (Buch S. 164)
./mjpg_streamer -i „./input_uvc.so -d /dev/video0 -r 800×640 -f 25“ -o „./output_http.so -w ./www“
Es kommt schon beim Start eine längliche Meldung:
root@PBU-RAS-13:/opt/mjpg-streamer# sh start.sh
MJPG Streamer Version.: 2.0
i: Using V4L2 device.: /dev/video0
i: Desired Resolution: 800 x 640
i: Frames Per Second.: 25
i: Format…………: JPEG
i: TV-Norm………..: DEFAULT
i: Could not obtain the requested pixelformat: MJPG , driver gave us: YUYV
… will try to handle this by checking against supported formats.
… Falling back to YUV mode (consider using -yuv option). Note that this requires much more CPU power
Unable to query that the FPS change is supported
: Inappropriate ioctl for device
UVCIOC_CTRL_ADD – Error at Pan (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD – Error at Tilt (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD – Error at Pan Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD – Error at Tilt Reset: Inappropriate ioctl for device (25) …..etc
Das funktioniert statt dessen:
./mjpg_streamer -i „input_libcamera.so -r 320×240 -f 25“ -o „./output_http.so -w ./www“
Allerdings füllt dann im Webinterface das Video den ganzen Bildschirm aus. In der Demoseite ist das Bild korrekt.
Ich habe es leider nicht geschafft im Webinterface die Größe des Videos anzupassen.
Sobald ich das Webinterface starte bringt der mjpg-streamer periodisch folgende Meldungen:
[2:23:02.034162060] [3493] INFO Camera camera.cpp:1183 configuring streams: (0) 2592×1944-BGR888
[2:23:02.035514926] [3490] INFO RPI vc4.cpp:608 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 – Selected sensor format: 2592×1944-SGBRG10_1X10 – Selected unicam format: 2592×1944-pGAA
Configuring still capture…
Stream configuration adjusted
Still capture setup complete
[2:23:02.612591924] [3493] INFO Camera camera.cpp:1183 configuring streams: (0) 320×240-BGR888
[2:23:02.614548229] [3490] INFO RPI vc4.cpp:608 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 – Selected sensor format: 640×480-SGBRG10_1X10 – Selected unicam format: 640×480-pGAA
d.h. irgendetwas setzt meine Videogröße auf 2592×1944 und das kommt nur wenn das Webinterface läuft.
Für Hilfe wäre ich dankbar.
Hallo Peter,
ich habe diesen Beitrag geschreiben da sich seit 2019 das Betriebssystem Raspbian OS weiter entwickelt hat und sich im Bereich der Kamera einiges geändert hat bzw. immer noch ändert.
Daher funktioniert der Aufruf
./mjpg_streamer -i “./input_uvc.so -d /dev/video0 -r 800×640 -f 25” -o “./output_http.so -w ./www
” leider nicht mehr. Aktuell funktioniert libcamera zusammen mit dem mjpg-streamer so wie Du es hier im Kommentar geschrieben hast.Mehr zur Unterstützung der Kamera steht auf der Seite die Du über den folgenden Link aufrufen kannst. Wobei diese offizielle Dokumentation meiner Erfahrung nach auch schon wieder veraltet ist bzw. zum neuesten Raspbian OS Bookworm aus Dezember 2023 nicht passt. Die hier beschreibenen Befehle wurden z. B. bei mir unter Bookworm gar nicht erst gefunden!
https://www.raspberrypi.com/documentation/computers/camera_software.html
Es ist wohl auch so, dass die Entwicklung des Betriebssystems, der Softwaremodule sowie der Hardware nicht immer zu einem Stichtag einen Stand haben das alles zusammen funktioniert.
So habe ich schon zum neuesten Raspberry Pi 5 gelesen das die Kamera mit der Bibliothek libcamera Probleme macht. So ist es natürlich schon immer schwer gewesen alles stabil für viele Jahre zu beschreiben. Daher habe ich selber noch gar keinen Raspberry Pi 5 und warte hier erst einmal etwas ab.
Das wohl aktuell der Parameter für die Auflösung bei der libcamera Bibliothek nicht funktioniert könnte daran liegen das dieser Parameter gar nicht mehr übergeben werden kann. Das werde ich mir einmal anschauen und hoffe eine Lösung zu finden. Denn ein max Auflösung als Bild anzuzeigen ist keine gute Lösung auch nicht von der Übertragungszeit her betrachtet. Oft braucht man bei einem live Bild die maximale Auflösung ja gar nicht.
Ich werde noch die Befehle die bei mir aktuell unter Bookworm zum Anzeigen eines ersten Bildes etc. funktioniert haben in der Anleitung hier ergänzen.
Viele Grüße,
Maker
Hallo Maker,
bin wieder etwas weitergekommen. Ausgehend von der Erkenntnis, dass Du eigentlich kein Video erzeugst, sondern eine Folge von jpg-Einzelbildern, ergibt sich aus der Hilfe für input_libcamera.so, dass für die Auflösung nicht der Parameter r zu verwenden ist, sondern s.
Die Zeile muss also lauten:
./mjpg_streamer -i „input_libcamera.so -s 640×480 -f 25“ -o „./output_http.so -w ./www“.
Damit wird auch das Webinterface korrekt angezeigt. Allerdings habe ich die Erfahrung gemacht, dass sich bei der angegebenen Framerate von 25 der Streamer sich nach kurzer Zeit verabschiedet mit Segmentation fault. Ich nehme an, dass mein Raspberry 3 damit überlastet ist. Ich habe daher auf 5 reduziert.
Zu bemerken wäre noch, dass der Streamer weiterhin periodische Meldungen produziert, sobald man mit der Auflösung von der Kameraaufösung abweicht (in diesem Fall SainSmart 5MP).
Grüße
Hallo Peter,
ich habe heute Morgen mit dem Aufruf in der start.sh das ein oder andere ausprobiert. Mit dem folgenen Aufruf hat es mir sehr gut funktioniert. Es sind dann auch nicht mehr die Meldung durch das Terminal-Fenster gelaufen.
./mjpg_streamer -i "input_libcamera.so -r 640x480 -f 25 -b 4 -s 640x480" -o "./output_http.so -w ./www"
Hier einmal ein Auszug der möglichen Parameter die verwendet werden können:
Hallo Peter,
ich habe es jetzt ausprobiert ob das Web-Interface wieder funktioniert. Mit dem Aufruf
./mjpg_streamer -i "input_libcamera.so -r 640x480 -f 25 -b 4 -s 640x480" -o "./output_http.so -w ./www"
in der start-sh Datei wird das Bild der Kamera im Web-Interface auch wieder ordentlich klein angezeigt. Somit ist dieses Problem jetzt meiner erfahrung nach auch behoben. Ich würde mich freuen wenn Du dazu kurz Feedback geben könntest.Viele Grüße,
Maker
Hallo Maker,
Webinterface funktioniert jetzt gut. Ich habe in den letzten Tagen erst die Mechanik zusammengebaut. Bisher war es eher noch Trockenübung. Ich bin jetzt durch mit Teil 1.
Habe die Erfahrung gemacht, dass die gelben Motoren aus dem New 4WD Robot Smart Car Kits ein hohes Losbrechmoment haben, so dass sie sich sehr schwer manövrieren lassen. Das Gerät startet z.T. erst bei 0,35 und schießt dann richtig gehend los. Ist ja kein Wunder bei dem Preis. Ich habe den Motoren eine Kennlinie verpasst, d.h. sobald ich mit der Geschwindigkeit über 0 (oder unter 0) bin, bekommen die schon 0,2 und dann ansteigend bis 1 (Gerade y=0,2+0,8x). Es ist etwas besser aber optimal ist das nicht. Gibt es Alternativen?
Ausgehend von der Annahme, dass ich das Ding auch mal im Freien fahren will, speziell wenn das GPS montiert ist, habe ich den Raspberry mit Routerfunktion versehen, so dass ich das Roboterauto ohne extra WLAN steuern kann, siehe https://www.elektronik-kompendium.de/sites/raspberry-pi/2002171.htm. Das hat den Vorteil, dass ich das Gerät überall mit der gleichen Adresse 192.168.1.1:8181 ansprechen kann. Funktioniert ganz gut mit dem Laptop oder PC. Allerdings zeigt mein Androidtablett nicht das Bild vom MJPG-Streamer. Habe noch nicht herausgefunden, an was das liegt. Sind wohl die Spinnereien von Android.
Hallo Peter,
das freut mich sehr das bei Dir jetzt das Web-Interface auch wieder richtig funktioniert. Ich bin ja schon länger am Überlegen es einmal komplett neu zu entwickeln. Mal sehen ob ich dazu die Zeit finden werde. Aber wenn es jetzt wieder gut funktioniert reicht es wohl um den Einsteig zu finden erst einmal.
Vielen Dank für Dein Feedback hier und viele Grüße,
Maker
Hallo Maker,
mein Auto läuft jetzt doch perfekt. Folgendes: Wie erwähnt habe ich eine Kennlinie eingeführt:
Code:
def kennlinie(speed):
# Anfangswert der Geschwindigkeit
vanf=0.24
# Hier wird die Geschwindigkeit umgerechnet. Es wird berücksichtigt,
# dass die Motoren erst bei einem Schwellenwert anfangen zu drehen.
# Positiver Wert von speed.
if speed > 0.03:
steps=(1-vanf)*speed+vanf
#print(„Geschwindigkeit: „,speed)
#print(„Steps: „, steps)
return(steps)
# Negativer Wert von Speed
elif speed < -0.03:
steps=(-1+vanf)*(-speed)-vanf
#print("Geschwindigkeit: ", speed)
#print("Steps: ", steps)
return(steps)
# Tote Zone
else:
return(0)
Aufruf (gilt entsprechend auch für alle anderen Buttons):
# Uebergabe der Geschwindigkeit an die Funktion der H-Bruecke
HBridge.setMotorLeft(kennlinie(speedleft))
HBridge.setMotorRight(kennlinie(speedright))
Außerdem habe ich die Schrittweite auf 0,05 reduziert.
Die wichtigste Maßnahme:
Ich habe die PWM-Frequenz auf 25Hz reduziert.
Der Gedanke dahinter:
Induktiver Widerstand des Motors X=2Pi * f * L. Motortstrom im Anlauf wird im wesentlichen bestimmt durch X bei den hohen Frequenzen. Je höher X, desto kleiner der Motorstrom. Beim Gleichstrommotor gilt Moment proportial Strom. Daraus folgt, je kleiner die Frequenz desto höher das Drehmoment.
Damit lässt das Auto sich auch in meinem kleinen Büro präzise fahren.
Hallo Peter,
vielen Dank für Deinen tollen Kommentar und der Idee mit der Kennlinie für eine deutlich besser Steuerung der Motoren. Das muss ich mir genauer anschauen zumal ich aktuell plane einen größeren Roboter zu bauen mit deutlich stärkeren Motoren.
Toll auch das Du gleich das Programm mitgeliefert hast so das es alle hier nutzen können.
Viele Grüße,
Maker
Hallo Maker,
ich bin bei der Suche nach Informationen für mein Kettenfahrzeug-Projekt auf Dein interessantes Buch gestoßen.
Ist ggfs. eine Neuauflage des Buches geplant bzw. in Bearbeitung?
VG, Christian
Hallo Christian,
aktuell ist noch keine Neuauflage geplant.
Viele Grüße,
Ingmar
Hallo Maker,
nachdem ich vor einigen Wochen mit dem Thema Video angefangen habe, möchte ich noch einige Bemerkungen dazu machen.
Ich bin jetzt auf dem Raspberry 5 und bin mit dem Buch durch außer dem GPS und dem Tiltkit. Ich habe den Mjpeg-Streamer auf dem Raspberry 5 nicht zum Laufen gekriegt. Nach vielen Versuchen und Abstürzen auch mit anderer Software bin ich hier fündig geworden:
https://github.com/raspberrypi/picamera2/blob/main/examples/mjpeg_server.py
Das ist ein smarter kleiner Videostreamer. Man braucht eigentlich nur den Port anpassen und die Videogröße und das Modul wie im Kommentar angegeben zu installieren. Wichtig ist, dass man einen anderen Port festlegt wie für den Roboter. Dann kann man das Video direkt in den HTML-Code einbinden, z.B. mit einem iframe.
Codeschnipsel hierzu:
var hostadr=location.host;
var videoid=document.getElementById(„video“);
hostadr=“http://“+ hostadr;
videoid.setAttribute(„src“, hostadr + „:5000“);
Man kann die Videosource natürlich auch direkt eintragen. Dann sollte man aber nicht die IP-Adresse verwenden sondern den Hostnamen. Das Programm läuft sehr stabil, bringt aber auf dem Raspberry 5 eine CPU-Auslastung von rund 20% ständig, was für ein Einzelprogramm ganz ordentlich ist. Wenn der Raspi auf Batterie läuft kommt es bei hoher Auslastung, wenn z.B. das Webinterface läuft und ich gleichzeitig mit 2 Terminals arbeite zu Abstürzen. Dies dürfte aber am USB-Spannungswandler liegen, der m.E. für den 5er etwas zu schwach ist. Am entsprechenden Netzteil und im Normalbetrieb habe ich das nicht beobachtet.
Das ursprüngliche Script für das Video wird damit natürlich hinfällig.
Hallo Maker
Mit Begeisterung bin ich am durcharbeiten des Buches.
(Raspberry Pi 4B / OS bookworm)
Leider habe ich ein Problem mit der Kamera, habe schon Stunden die Foren durchsucht.
rpicam-hello oder libcamera-hello liefern eine Fehlermeldung. (siehe unten)
Leider kann ich mit dieser Fehlermeldung nichts anfangen.
Sie sind hoffentlich meine Rettung
Ich habe auch schon config.txt angepasst (camera_auto_detect=0 und dtoverlay=ov5647)
Fehlermeldung:
INFO Camera camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b
ERROR DmaBufAllocator dma_buf_allocator.cpp:116 Could not open any dma-buf provider
WARN RPiSdn sdn.cpp:40 Using legacy SDN tuning – please consider moving SDN inside rpi.denoise
ERROR RPI vc4.cpp:216 Failed to register camera ov5647 10-0036: -12
Freundliche Grüsse
Thomas Hellstern
Hallo Thomas,
ich kenne diesen Fehler selber nicht. Aber wenn ich folgendes lese „ov5647“ dann vermute ich das es nicht eine Raspberry Pi Kamera ist. Eventuell sind nicht die passenden Treiber für Dein Kameramodul geladen?
Viele Grüße,
Maker
Hallo Maker
Mit Begeisterung bin ich am abarbeiten des Buches
Leider kann ich die Bibliothek des Distanzsensors VL53L1X nicht einbinden:
Ich habe einen Raspi 4B / 64 Bit / OS bookworm)
Alle Versuche mit pip/pip3/apt/apt-get/ sind fehlgeschlagen.
Haben Sie noch eine Idee
Hallo Thomas,
leider hatte ich diesen Fehler noch nicht. Kommt eine Fehlermeldung im Bezug vielleicht auf die Python-Version?
Viele Grüße,
Maker
Hallo Maker,
ich hoffe, es geht Ihnen gut! Ich habe Ihr Buch gekauft, weil ich mich während meiner Elternzeit mit der Programmierung auseinandersetzen möchte. Man braucht schließlich auch ein anderes Thema in dieser Zeit!
Bisher hat mir Ihr Buch sehr gut weitergeholfen, und ich bin aktuell bei Kapitel 12.3. Ich erhalte, wie in Ihrem Buch beschrieben, dieselbe Meldung (siehe Abbildung 12.2), aber danach folgt folgende Fehlermeldung.
========== Geschwindigkeitsanzeige ==========
Left motor speed: 0.2
Right motor speed: 0.0
Programm Ende
Exception ignored in:
Traceback (most recent call last):
File „/usr/lib/python3/dist-packages/RPi/GPIO/__init__.py“, line 179, in __del__
File „/usr/lib/python3/dist-packages/RPi/GPIO/__init__.py“, line 202, in stop
File „/usr/lib/python3/dist-packages/lgpio.py“, line 1084, in tx_pwm
TypeError: unsupported operand type(s) for &: ‚NoneType‘ and ‚int‘
Exception ignored in:
Traceback (most recent call last):
File „/usr/lib/python3/dist-packages/RPi/GPIO/__init__.py“, line 179, in __del__
File „/usr/lib/python3/dist-packages/RPi/GPIO/__init__.py“, line 202, in stop
File „/usr/lib/python3/dist-packages/lgpio.py“, line 1084, in tx_pwm
TypeError: unsupported operand type(s) for &: ‚NoneType‘ and ‚int‘
Könnten Sie mir bitte weiterhelfen? Ich wäre Ihnen sehr dankbar! Leider finde ich trotz mehrstündiger suche keine antwort.
Viele Grüße, Sebastian
Hallo Sebastian,
kannst Du bitte noch ergänzen welches Programm Du ausführst. Ist es das joystick.py oder das robot-control.py Skript?
Dann bitte noch ergänzen wann der Fehler im Programmablauf auftritt. Also während der Ausführung gleich zu Beginn des Programmes oder am Ende wenn Du das Programm beendest aber bereits fahren konntest.
Der Fehler könnte mit INT vs. FLOAT zu tun haben. Versuche mal bei der Ausgabe der Geschwindigkeit folgendes:
print(„========== Geschwindigkeitsanzeige ==========“)
print(„Geschwindigkeit linker Motor: „, int(speedleft*100))
print(„Geschwindigkeit rechter Motor: „, int(speedright*100))
Vielen Dank,
Maker
Hallo Maker,
vielen Dank für die schnelle Rückmeldung! Es handelt sich um das Skript robot-control.py. Die Fehlermeldung tritt gleich zu Beginn auf.
Ich habe den Code wie folgt angepasst:
print(„========== Geschwindigkeitsanzeige ==========“)
print(„Geschwindigkeit linker Motor: „, int(speedleft*100))
print(„Geschwindigkeit rechter Motor: „, int(speedright*100))
print(„Left motor speed: „, speedleft)
print(„Right motor speed: „, speedright)
„`
Leider besteht das Problem weiterhin. Ich wäre Ihnen sehr dankbar, wenn Sie mir weiterhelfen könnten!
Viele Grüße Sebastian