Lancement d'un programme au démarrage du robot pour le rendre totalement autonnome

français
ergo-jr
software
snap
python
Tags: #<Tag:0x00007f5e0b5a7bf0> #<Tag:0x00007f5e0b5a7a60> #<Tag:0x00007f5e0b5a78d0> #<Tag:0x00007f5e0b5a76c8> #<Tag:0x00007f5e0b5a74e8>

#1

Bonjour,
Je souhaite utiliser un bras Poppy Ergo lors du concours Robocup dans la ligue On Stage. Je souhaite donc que le bras puisse évoluer en toute autonomie. J’ai commandé les batteries nécessaires pour qu’il soit autonome en énergie. Je souhaiterai maintenant pouvoir le déconnecter de mon ordinateur. Je programme avec Snap et au départ de mon programme je souhaite qu’il attende jusqu’à ce qu’un QR code soit détecté. Existe t’il un moyen de lancer le programme puis de débrancher le robot? Merci d’avance pour votre aide.


#2

J’ai oublié de préciser qu’il est interdit par le règlement de le connecter en Wifi.


#3

bonjour @Marlene_Pecondon,

dsl, je n’ai pas de solution en tête pour le moment, je vais me renseigner.

a+
tibo


#4

une solution est proposé sur ce post :


#5

Bonjour Marlène,

Bon courage. Suite à mes nombreuses expériences fin 2016, j’ai constaté que ce n’était pas possible, car le Raspberry-Pi n’est pas assez puissant pour faire tourner un environnement JavaScript et Snap.

La solution que j’ai trouvée est de récrire en Python le programme Snap ! On peut aussi en l’écrire en shell bash avec des listes de ‘curl’, car c’est ce que fait l’API de Snap : envoyer des requêtes REST sur le serveur, mais en Python c’est plus direct et aussi facile à programmer qu’en Snap, l’API est même plus complète qu’en Snap !.

Ensuite il faut modifier le script launch.sh, qui se trouve dans le répertoire /home/poppy/dev/puppet-master pour lancer son propre script à la place du serveur bouteillederouge.py.

Dans mes derniers essais, j’ai un peu plus rusé, dans le script je lance bouteillederouge.py, puis je fais une pause de 2 minutes (sleep 120), je tue les processus qui utilisent les ports dont j’ai besoin (fuser /dev/tty* -k) puis je lance mon propre programme qui attend la lecture de QR-Code pour faire diverses actions.

J’ai essayé aussi de nombreuses autres manières de lancer mon programme, mais cette dernière est celle qui me semble la plus robuste pour l’instant.

Prévoyez de pouvoir brancher un ordinateur de temps à autre sur le Poppy, car lors de la dernière installation de la démo, les moteurs étaient retournés à leur valeur par défaut.

Prévoyez aussi un Poppy de secours au cas où.


#6

Bonjour,
Merci beaucoup pour cette réponse détaillée à laquelle je n’ai pas compris grand chose. Je suis novice et ne sais programmer qu’ avec des blocs.
En y passant l’après-midi, j’ai réussi à réécrire mon programme en Python (du moins, sans les conditions de départ) avec Jupyter.
Mais je n’ai pas trouvé non plus comment le transférer sur la Raspberry pi et rendre le poppy autonome ?
Existe t’il une manip ou est ce que je me suis encore trompée?
Merci d’avance.

Merci d’avance.


#7

zut, c’est bon à savoir …

tu peux également supprimer le démarrage automatique de la créature en supprimant la ligne 70 de bouteille de rouge

une autre solution (plus simple): créer une primitive et la lancer automatiquement , je vous détails la procédure ici dès que j’ai 5min :wink:

c’est d’ailleurs très intéressant comme exercice, traduire d’une langue à une autre, chacune ont leur grammaire et syntaxe … comme le français, l’anglais, le langage mathématique, etc

j’avais produit quelques petits exemples vidéo pour aborder ces sujets :

1: un défis, rendre têtu le robot, biensure c’est un jeux de langage, ici, têtu = «quand on me bouscule, je reviens toujours sur mes positions» la video:


2: je fourni la correction: (attention les blocs utilisées sont un peu différent, c’est une version beta de snap (dispo ici: Pypot-snap-block New version)

3: je montre plusieurs traduction: “mot-a-mot” vs “logique”


#8

Bonjour,
Bravo pour la conversion en Python.
Je joins à ce message mon programme Python, le programme Snap en XML vous pouvez l’importer et le script shell pour lancer le programme Python.

Via le navigateur web vous pouvez ouvrir un Terminal sur le Raspberry et aller modifier les fichiers, mais il faut connaître les commandes Unix pour se déplacer dans l’arborescence de fichiers:

  • ls : lister les fichiers
  • cd : se placer dans le répertoire
  • nano : éditer/modifier le fichier

Je pourrai vous faire une réponse plus détaillée demain après-midi.

poppy_danse.py (1.8 KB)
launch_dance.sh (61 Bytes)
poppy-danse-couleur.xml (103.5 KB)

Bon courage et bonne chance.

Laurent


#10

Bonjour @Marlene_Pecondon,

ErgoJr autonome, résumons:

Batteries

pour rendre votre robot totalement autonome, la première étape était donc de passer sur batterie. cf Quelle batterie utiliser pour un poppy ergo jr?

Wifi

Pour le pilotage à distance, pour la robotcup l’activation du wifi, comme indiqué ci-après, est interdit!

Vérifier si vous disposez d’une version avec un terminal opérationnel (cf Probleme terminal shell command not found)

Lancement au démarage

Programme Snap!

Tu souhaites donc simplement lancer un programme (snap!) au démarrage, mais comme l’as constaté @lpierron

Traduction en python

La solution la plus simple était donc de traduire ton code snap en code python, comme je te le suggéré ici:

(à noter que sur la version en ligne de Snap! vous pouvez ouvrir le projet exemple “Codification” qui permet une traduction automatique des bloc de base)

C’est donc la solution que tu as retenu.

Intégration du code

Maintenant tu souhaite connaître la marche à suivre pour éxécuter ce code python au démarrage, voici donc la méthode pour

Première étape, création d’une primitive

Dans le répertoire http://poppy.local:8888/tree/poppy_src/poppy_ergo_jr/primitives

créer un fichier primitive_template.py similaire à celui-ci :

# -*- coding: utf-8 -*
import time
from pypot.primitive import Primitive

class My_primitive(Primitive):
    # Dans ce contexte notre robot s'appel "self.robot"

    def setup(self):
        # ici, ce que mon robot va faire au lancement de la primitive
        # Exemple:
        for m in self.robot.motors: # je parcourt la liste des 6 moteurs
            m.compliant = False # moteur m en mode non compliant (stiff)
            m.led = "red" # led du moteur m en rouge 
            m.goto_position(0, 0.5, wait=False) # moteur m va dans la position O degres, en 0.5 seconde, sans attendre (que la position soit atteinte pour poursuivre l'execution du code.)
        
    def run(self):
        # ici, ce que mon robot va faire au durant la primitive
        while not self.should_stop(): # tant qu'on me demande pas de m’arrêter
            if self.should_pause(): # si on me demande de mettre en pause
                self.wait_to_resume() # alors j’attends qu'on me dise de reprendre

            # ajouter ici tout ce qu'il vous plaira ;)
            # Exemple
            for m in self.robot.motors: # je parcourt la liste des 6 moteurs
                m.led = "pink" # led du moteur m en rouge
                time.sleep(.2) # attendre 0.2 seconde
                m.led = "off"
                
    def teardown(self):
        # ici, ce que mon robot va faire quand la primitive sera stoppé
        # Exemple:
        for m in self.robot.motors: #je parcourt la liste des 6 moteurs
            m.compliant = True #moteur m en mode compliant
            m.led = "green" # led du moteur m en vert 

(à noter, que vous pouvez définir une nouvelle fonction dans ce même fichier et l’appeler dans votre primitives)

Deuxième étape, attacher et exécuter votre primitive

(cette étape est facultative et sert juste à tester votre primitive, via un notebook par exemple)

une fois votre robot instancier
poppy = PoppyErgoJr()

importer votre primitive:
from .primitives.primitive_template import My_primitive

attacher là au robot:
poppy.attach_primitive(My_primitive(poppy), 'my_primitive')

démarrer et stoper là:

poppy.my_primitive.start()
poppy.my_primitive.stop()

Troisième étape, lancement au démarrage

Dans le fichier http://poppy.local:8888/edit/poppy_src/poppy_ergo_jr/poppy_ergo_jr.py

  • à la ligne 13: ajouter
try: 
    from .primitives.primitive_template import My_primitive
except Exception as err:
    print(err)
  • à la ligne 52: ajouter:
try: 
    robot.attach_primitive(My_primitive(robot), 'my_primitive')
    robot.my_primitive.start()
except Exception as err:
    print(err)

Pour info

après cette manip,
vous verrez apparaître votre primitive directement depuis le monitor ( http://poppy.local/monitor )
vous pouvez également la commander directement via ces url:
http://poppy.local:8080/primitive/my_primitive/start
http://poppy.local:8080/primitive/my_primitive/stop
ou voir la liste complète des primitives attachées:
http://poppy.local:8080/primitives
ou seulement celles actuellement actives:
http://poppy.local:8080/primitives/running


MQTT bridge for IoT integration with Poppy Ergo Jr
Exécuter un programme lors de la mise sous tension