Aller au contenu


Photo
- - - - -

Embed Python3 + Dependencies into C++ Binary

robotics python cython c++

  • Veuillez vous connecter pour répondre
2 réponses à ce sujet

#1 tobimarsh43

tobimarsh43

    Nouveau membre

  • Membres
  • 2 messages

Posté 17 octobre 2020 - 01:23

J'ai une application fonctionnant sous linux 2.6, qui contrôle en fait un robot. J'ai écrit une infrastructure et une API c ++ pour permettre à un utilisateur d'écrire un "Mainloop" en c ++ pour le robot. La signature de la fonction est RobotRunLoop (const Robot & robot). La classe Robot fournit toutes les API nécessaires. Le système actuel une fois compilé, configure l'environnement puis appelle le RobotRunLoop. Je voudrais pouvoir écrire la "boucle principale" en python au lieu de c ++. Donc, fondamentalement, le démarrage de c ++, appelle dans la boucle principale de python, qui utilisera ensuite l'API fournie pour rappeler en C ++ pour contrôler le robot.

 

Je suppose que je peux créer un RobotRunLoop similaire en python avec un objet robot similaire qui contient les hooks aux API c ++. Je voudrais pouvoir le compiler dans un binaire que je peux ensuite exécuter sur le robot de la même manière que la version pure c ++ .
 
La motivation pour cela est de pouvoir expérimenter plus facilement des modèles et des approches d'apprentissage automatique de manière expérimentale. Faire fonctionner quelque chose avec TensorFlow ou un package similaire sur le c ++ infra serait l'objectif final
 
Est-ce même possible? Que faire si le code python utilise d'autres packages? Dois-je utiliser cython ou pybind11 (aucun ne semble faire ce que je veux)?
 
Merci pour l'aide

 

 


Formateur pour Machine learning program.


#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 894 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 17 octobre 2020 - 04:46

Je ne suis pas sûr à 100% d'avoir compris l'ensemble de la problématique et je ne suis pas un utilisateur du langage python, mais ce que je sais c'est que de nombreux programmes python utilises des classes en C++.

Par conséquent c'est de ce côté que je chercherais. Je ferais une classe C++ qui gère le contrôle de ton robot et je regarderais comment utiliser cette classe en python. 
https://cpp.developp...cer-cpp-python/

 

Hésite pas à revenir pour présenter les avancées de ton projet! Ou me dire si je suis à côté de la plaque avec ma réponse ;)

 

à bientôt !


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#3 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 681 messages
  • Gender:Male

Posté 17 octobre 2020 - 07:15

Je n'utilises pas beaucoup python non plus, mais voici quelques questions qui aideront peut-être a avancer dans tes recherches :

- est-ce que tu as forcément besoin d'avoir un exécutable comme programme principal, ou est-ce qu'un script python comme exécutable principal est acceptable? Si oui, je penses comme Mike qu'il sera plus facile de créer une classe programmée en C++ mais utilisable en python, et de faire le programme principal en python

- si tu as besoin que le programme lancé soit en C++,alors il me semble que depuis le C on peut exécuter une commande bash, qui peut être "python mon_script_python.py" afin de lancer le programme python

- il me semble qu'il y a des compilateurs du python vers du C ou vers un exécutable

- si vraiment tu veux apeller ton loop en python depuis le programme en C++ (je ne sais pas comment), alors je penses qu'il vaut mieux appeler une fonction exécutée une seule fois (qui contiendra une boucle infinie) plutôt que d'appeler une fonction en boucle : ça permet d'initialiser des variables python avant, et évite de "perdre" les variables python entre chaque tour de boucle.

- si tes besoins en termes de performances sont réduites, alors tu peux te contenter d'exécuter le programme C++ et un script python en même temps, et de mettre en place un système de passage de messages (via ROS par exemple, par des requêtes réseaux en local, par l'écriture dans des fichiers, ...) : l’inconvénient est que la communication est très peu efficace par rapport à une communication directe, et que des latences importantes peuvent apparaître.

 

Donc en conclusion, si tu peux ajouter une interface python à ton objet Robot (avec toutes les initialisations dans le constructeur ou dans une fonction init), et utiliser celui-ci en python, alors ce sera probablement le plus simple







Aussi étiqueté avec au moins un de ces mots-clés : robotics, python, cython, c++

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users