C++ code in Python - Welche Methode verwenden

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
basti2s
User
Beiträge: 29
Registriert: Samstag 14. November 2020, 08:36

Hallo zusammen,

ich möchte mittels einem RaspberryPi einen Motor ansteuern. Dieser soll mittels EtherCat die entsprechenden befehle erhalten.
Hierzu verwende das EthercatShield von Bausano, welches über SPI mit dem Pi kommuniziert. Von der Firma Bausano https://www.bausano.net/en/hardware/eth ... t-pro.html wird ein Codebeispiel in C++ angeboten.
Dieses besteht aus zwei C++ Dateien und einer Headerdatei. Außerdem greift es auf die Libary des bcm2835 für die Kommunikation mittels SPI zu.
Mit diesem habe ich es hinbekommen die Steuerung über EtherCat zu verwirklichen.

Nun stehe ich vor dem Problem, dass mein restlicher Code in Python geschrieben ist und ich das ganze irgendwie in meinen Python Code integrieren muss.
Aktuell versuche ich dies mittels SWIG. Ist das der richtige weg? Habt ihr ein paar Tipps welche Methode hier am schnellsten und einfachsten zum Ziel führt?
Es gibt gefühlt zig Möglichkeiten.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst auch einfach den benötigten Code in Python schreiben. Der Zugriff auf SPI und IO ist damit ja problemlos auch möglich.
basti2s
User
Beiträge: 29
Registriert: Samstag 14. November 2020, 08:36

Das war ich auch schon am überlegen. Jedoch ist das ganze sehr komplex. Dürften so 1000 Zeilen Code sein.

Aktuell bin ich sogar am überlegen, ob ich einen zweiten Raspberry Pi, da würde ja ein Zero genügen verwenden soll, der die EtherCat auswertung in C++ übernimmt und via SPI am haupt Pi Angeschlossen ist.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Python Code ist ueblicherweise 5-10mal so kompakt. Und ich wuerde mal sagen, dass die Spezialitaeten von C++-Wrappern komplexer zu meistern sind, als diese doch am Ende recht einfache Implementierung.
basti2s
User
Beiträge: 29
Registriert: Samstag 14. November 2020, 08:36

Ja ich glaube mittlerweile auch, dass das mit den C++ wrappen keine allzugute Idee ist.
Ich bin jedoch noch Anfänger was Python und C++ anbelangt, weshalb ich mich nicht ganz daran traue ein C++ Skript in Python umzuschreiben.

Vielleicht muss ich mich doch noch mehr in richtung IPC umschauen. Wäre vermutlich besser als zwei Raspberry Pi einzusetzen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

IPC hinzubekommen ist auch nicht trivial. Ich kann da nanomsg empfehlen, oder zeromq.

Hast du mal einen Link auf deine C++-Dateien? Den oben habe ich zwar gesehen, aber ich finde da nur Microcontroller-Code.
Sirius3
User
Beiträge: 18054
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum hast Du jetzt zwei Raspberrys?
basti2s
User
Beiträge: 29
Registriert: Samstag 14. November 2020, 08:36

__deets__ hat geschrieben: Freitag 8. Januar 2021, 12:09 Hast du mal einen Link auf deine C++-Dateien? Den oben habe ich zwar gesehen, aber ich finde da nur Microcontroller-Code.
Ja, sry.: https://www.bausano.net/images/arduino- ... T_Test.zip
Sirius3 hat geschrieben: Freitag 8. Januar 2021, 12:20 Warum hast Du jetzt zwei Raspberrys?
Habe ich nicht. Es war nur eine Idee auf einem pi das c++ Programm fürs EtherCat laufen zu lassen und auf dem anderen Pi das Pythonprogramm.
Die beiden PIs hätte ich dann über SPI miteinander kommunizieren lassen.

Ich schau mir jetzt mal nanomsg an.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also das sind ~570 Zeilen Code mit seeeeeehr viel Leerraum, printf-statements, und trivialer Logik. Die libbcm2835 ist voellig uebergfluessig, haette man auch einfach mit spidev machen koennen.

Ich rate nochmal ausdruechlich dazu, das einfach in Python zu implementieren. Du wirst einen Zoo von PIs und IPC nicht einfacher in den Griff bekommen.
basti2s
User
Beiträge: 29
Registriert: Samstag 14. November 2020, 08:36

ich hatte dabei die Codezeilen in der Headerdatei mit dazu gezählt.

Was ich nicht ganz aus dem C++ Code verstanden habe ist, ob sich die ganzen Zeilen mit der SPI Kommunikation beschäftigen, oder um EtherCat spezifische dinge?
Oder ist es wirklich so, dass ich mich nur um die SPI Kommunikation kümmern muss?

Ich bin halt wirklich ein Anfänger, was Python und C++ anbelangt. Daher bin ich skeptisch, ob es nicht einfacher wäre das ganze anders zu lösen und nicht alles quasi neu zu programmieren.
Auf den ersten Blick schaut dein Vorschlag mit ZeroMQ sehr einfach machbar aus.

Wie wäre da denn jetzt die richtige vorgehensweise, wenn ich das ganze in Python umschreiben würde?
Einfach Zeile für Zeile quasi übersetzen und überlegen wie ich das in Python schreiben kann?
Zuletzt geändert von basti2s am Freitag 8. Januar 2021, 14:22, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist ether-cat spezifisches SPI. Was anderes macht das Ding nicht, ich verstehe also nicht um was du dich da sonst kuemmern willst. Durch die eingefuehrten Abstraktionen wie SPIReadRegisterDirect etc. ist der Code auch gut portierbar, denn sobald du diese 3 oder 4 spezifischen Methoden umgesetzt hast, ist der Rest quasi copy & paste.
Antworten