Hallo zusammen,
ich wollte mal nachfragen, wie eure Erfahrungen sind, wenn man an dem Raspberry Pi mit Python oder mit C++ einige Codes umsetzt. Sicherlich könnte man auch C nehmen. Ich erkläre mal den Background. Ich habe einen Roboter selber gebaut und mit Python und ROS programmiert. Das ist jetzt gute zweieinhalb Jahre her. Python war für mich einfach die Wahl, weil es einfacher ist und weil ich für viele Komponenten auf Libraries zurückgreifen konnte. Nun ist es ja kein Geheimnis, dass C++ eigentlich perfomanter ist, als Python:
C++ ist schneller als Python, weil es statisch typisiert ist, was zu einer schnelleren Kompilierung des Codes führt. Python ist langsamer als C++, da es dynamische Typisierung unterstützt und außerdem einen Interpreter verwendet, was den Kompilierungsprozess verlangsamt.
Ich möchte meinen Roboter "neu" bauen. Ich tausche Motoren und Servos mit welchen, bei denen ich auch ein Feedback bekomme.
Warum ich hier Erfahrungswerte zu C++ suche ist, weil ROS von Haus aus C++ und Python mit bringt. Bei ROS Kinetic gab es mal noch einen experimentellen Ansatz für Java. Da Java in einer virtuellen Maschine (JVM) läuft, wäre es zwar plattformunabhängig, aber die Interaktion mit der Hardware wäre auch langsamer. Außerdem orientiert sich ROS Kinetic an Ubuntu 16.04, was EOL ist.
Ich kann natürlich auch Python-Code in einem C++-Code umsetzen, was mir helfen könnte, gewisse Abhängigkeiten zu umgehen.
Wenn ich nun die Möglichkeiten in C++ anschaue, dann stößt man extrem oft auf WiringPi und auf pigpio. Was man inzwischen auch oft findet und raushört, ist, dass WiringPi nicht mehr fortgesetzt wurde und dass pigpio sowohl robuster als auch umfangreicher sei.
Ich habe folgendes schon gesehen:
https://elinux.org/RPi_GPIO_Code_Samples
Auf einen direkten Zugriff der Register würde ich sehr gerne verzichten. Ist mir definitiv zu kompliziert.
Ich habe hier ein Beispiel zu einem HC-SR04 gefunden in WiringPi:
https://github.com/omaraflak/HC-SR04-Raspberry-Pi-C-.git
Dies dürfte ich wahrscheinlich korrekt übersetzt haben zu pigpio:
https://github.com/Michdo93/HC-SR04-Raspberry-Pi-C-
Ich kann dies erst in ein paar Tagen verifizieren. Auch habe ich für einen Parallax PING))) den Python Code zumindest mal von Python zu C++ (WiringPi) übersetzt. Da muss ich auch mal austesten, wie dass mit WiringPi allgemein klappt und wie mit pigpio. (Man kann WiringPi auch mit einer inoffiziellen Version scheinbar installieren).
Auf dem Raspberry Pi habe ich noch einen L298N H-Brücke als Motor angeschlossen. Im obenstehenden Link zu den verschiedenen Programmierungen mit dem GPIOs steht ja auch drinnen, wie ich ein PWM-Signal schicke. Für das Betreiben einer einfachen Motorsteuerung wäre mir das ausreichend genug, dass ich meinen Python-Code zu C++ (pigpio oder auch WiringPi) übersetzen kann.
Komplizierter wird für mich jetzt aber alles andere, was mit SPI oder auch mit I2C zu tun hat. Ebenfalls habe ich auch testweise den Arduino Nano seriell am Raspberry Pi angeschlossen. Wie ich auf dem Arduino seriell schreibe, ist mir klar. Wie ich auf dem Raspberry Pi seriell mit Python lese, auch. Problem: Python!
Ein gutes Beispiel hier mit Python wäre:
https://roboticsbackend.com/raspberry-pi-a…-communication/
Mit Python habe ich den HC-SR04 auch über seriell, UART und I2C getestet, wenn ich diesen am Arduino angeschlossen habe. Dies würde ich gerne auch für das Verständnis mit C++ nachstellen.
Für WiringPi kann ich mich an den Vorschlag von Stackoverflow orientieren:
https://stackoverflow.com/questions/4957…arduino-using-c
Einen wirklichen Ansatz zu pigpio habe ich nicht gesehen. Ein einfaches Beispiel für das serielle Lesen einmal per USB-Kabel und einmal per GPIO-Pins, wären für mich sehr hilfreich.
Bei SPI nutze ich spidev in Python, um einen MCP3008 zu verwenden. Nachfolgen kann ich spidev auch in C++ nutzen:
https://medium.com/geekculture/ra…rt-4677f401b584
Bei I2C nutze ich ebenfalls smbus2, im eben geposteten Link wird smbus in C++ verwendet. Das sollte mir eigentlich genügen, da ich dort weder WiringPi noch pigpio benötige. Bei der dort gezeigten Lösung für UART bin ich mir noch nicht sicher, ob dass für das zuvor beschriebene Problem bereits meine Lösung wäre.
Ich komme mal wieder anwendungsbezogener. Der Parallax PING))) und der HC-SR04 haben keinen Treiber an für sich. Dort brauche ich nur eine robuste und schnelle Möglichkeit für den Zugriff auf die Pins der Raspberry Pi's. Davon setze ich mehrere ein. Für meinen Infrarotabstandssensor der GP2Y0A02YK0F*-Familie, benötige ich einen Analog-Digital Wandler, den MCP3008. Für diesen brauche ich SPI und spidev, was scheinbar auch in C++ umsetzbar ist. Den Gleichstrommotor tausche ich mit vier Gleichstrommotoren aus. Heißt statt einem L298N verwende ich nun zwei. Hierfür brauche ich prinzipiell Minimum den Raspberry Pi. Dort kann ich für PWM die Pins 12, 32, 33 oder 35 einsetzen. Ich werde dies jedoch nur mit einem einzigen Motor testen.
Bei RPi GPIO Codes Samples sehe ich für pigpio:
Also ist prinzipiell auch mit pigpio dies recht direkt umsetzbar und ich kann meinen Python-Code für einen einfachen Motor einfach übersetzen.
Ich bin ehrlicherweise nur irritiert, warum ich hier den GPIO17 verwende... Für mich ist der GPIO17 dasselbe wie Pin 11. Meiner Meinung nach muss ich GPIO18 (Pin 12), GPIO12 (Pin 32), GPIO13 (Pin 33) oder GPIO19 (Pin 35) verwenden.
Für den Raspberry Pi sehe ich bei einem Motor, der einen Encoder verwendet, keine wirkliche Anleitung. Nur Encoder, die nicht direkt sich an einem Motor befinden. Diese liefern meist 3,3V zurück. Bei meinem Motor steht dran, dass diese 3,3V - 5V zurückliefern können. Ich habe mal Logic Level Shifter bereits gelötet. Habe auch bei einem anderen Motor mit einem Encoder, der 3,3V zurückliefert schon ein kleines Python-Programm geschrieben, der sich nur um den Encoder kümmert. Denke auch hier entsteht dann mal in naher Zukunft sowohl ein Python, als auch ein C++-Tutorial.
Wesentlich exakter ist es, einen Servotreiber zu verwenden. Sprich das PWM-Signal kommt vom Servotreiber. Hierfür habe ich einen PCA9685 vorgesehen und eingeplant. Bei pigpio sehe ich hierzu leider nur ein Python-Beispiel.
Einen nicht funktionierenden Ansatz in C++ mit pigpio sehe ich hier:
https://forums.raspberrypi.com/viewtopic.php?t=213033
Es gibt irgendeinen C++-Ansatz mit NXP:
https://github.com/TeraHz/PCA9685
Hab jetzt auch nicht auf die Schnelle rausgefunden, was NXP sein soll.
Ich sehe hier einen schönen WiringPi-Ansatz:
https://github.com/Reinbert/pca9685
Hier gibt es einen bcm2835-Ansatz:
https://github.com/vanvught/rpidm…ter/lib-pca9685
Ich bin noch unentschlossen, ob ich diesen einfach zusätzlich nehmen sollte oder ob ich selbst die Mühe mir machen muss, um einen C++-Ansatz für pigpio zu entwickeln.
Am PCA9685 werden natürlich auch verschiedene Servos angeschlossen. Zum Beispiel für ein Pan-Tilt-Kit der Kamera. Daher wäre es ein wichtiges Schlüsselelement. Auch hier gibt es wenige Python-Tutorials, wie ein Servo mit analogem Feedback verwendet wird. Aber es gibt welche. Es geht einfach nur ein Female-Jumper-Wire zu einem GPIO-Pin auf dem Raspberry Pi. Bei Arduinos gibt es ein wenig mehr Tutorials, wie man dort das analoge Feedback ausliest. Sollte aber nicht das große Problem werden.
Als IMU verwende ich einen Raspberry Pi Sense HAT. Einfach, weil's einfach ist. Dessen Library ist in C geschrieben:
https://github.com/raspberrypi/rpi-sense
Die hierfür verwendete RTIMU Library ist sogar in C++ geschrieben.
Bei der Sense HAT habe ich hier ein gutes Beispiel gefunden:
https://github.com/PhilippeSimier/SenseHat
Teilweise schlecht dokumentiert. Liest sich viel nach französisch-englisch. Aber alles in allem recht brauchbar. Hauptsächlich muss ich per I2C mit der Platine kommunizieren. Für Python gibt es eine gute Dokumentation, auch für Kinder. Hier würde ich auch einige Programmcodes vergleichen, die ich eben nicht nur für den Roboter brauche. Also bspw. die Temperatur.
Viele setzen ja auf pigpio statt WiringPi. Ich könnte hier wie gesagt Hilfe gebrauchen, wie ich einige Programmcodes übersetzen könnte. Teilweise zu WiringPi und definitiv zu pigpio. Bauchschmerzen macht mir eigentlich der PCA9685.
Ich würde mich in ein paar Tagen noch einmal melden, wenn ich manches durchgetestet habe. Neben der unterschiedlichen Umsetzung in Python, C++ (WiringPi und pigpio), welche Vergleichsparameter wären denn wichtig? Beim HC-SR04 habe ich noch nie gemerkt, dass die Pins nicht robust ihre Spannung halten würden. Die CPU-Auslastung soll hier jedoch hochgehen. Also macht es meiner Meinung nach Sinn, die Programme jeweils einzeln laufen zu lassen und zu prüfen, wie die CPU-Auslastung ist. Ich habe auch nie Verzögerung festgestellt was hier die Abstandsmessung angeht. Etwas von oben runtergelassen und vor den Sensor gehalten und meine Messung hat auch direkt einen kürzeren Wert ergeben. Hier halte ich es fast schwer bis unmöglich, eine Zeitmessung vorzunehmen, bis ein Sensor einen neuen Wert erfasst. Vielleicht hat hier jemand ein mögliches Prüfkriterium im Kopf.
Jetzt gibt es Erfahrungswerte, die ich nicht prüfen will:
- Der PCA9685 ist präziser was PWM angeht.
- Servomotoren können damit präziser gesteuert werden.
- Auch Gleichstrommotoren können besser gesteuert werden. Es gibt sogar eine wissenschaftliche Arbeit darüber, dass der Duty Cycle am besten über PWM gesteuert wird.
- Ultraschallsensoren funktionieren robuster und präziser als Infrarotabstandssensoren.
- Der Parallax PING))) ist genauer als der HC-SR04. Hab ich alles schon mit einem Meterstab gemessen.
Für Kameras will ich kein Treiber schreiben. Denn für die Kamera kann ich den Raspicam Node in ROS verwenden:
https://github.com/UbiquityRobotics/raspicam_node
Der funktioniert aus Erfahrung gut. Für weitere Kameras wäre meiner Meinung nach OpenCV in C++ ganz nützlich, weil ich mittels OpenCV Bridge OpenCV Bilder in ROS Bilder umwandeln kann.
In ROS sind erfahrungsgemäß auch die Latenzen bei ROS Publisher und Subscriber geringer, wenn man C++ statt Python nutzt. Auch das werde ich hier nicht darstellen, sondern ich konzentriere mich auf Standard-Codes ohne ROS, damit man diese genannten Komponenten auf dem Raspberry Pi auch mit C++ betreiben kann.
Würdet ihr hier weiterhin pigpio bevorzugen? Welche Tipps habt ihr noch mitzugeben? Hab ich irgendetwas ausgelassen, dass wichtig werden könnte? Ich hoffe, dass ich bis Heilige Drei Könige dann soweit durch bin und hier immer wieder Lösungen präsentieren kann, da dies für mich nebenberuflich abläuft und ich da denke ich schon hin und wieder paar Tage brauche, bis ich eine Lösung präsentiere. Diskussionen sind dann herzlich willkommen.
Liebe Grüße