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

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.

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

bonjour @Marlene_Pecondon,

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

a+
tibo

une solution est proposé sur ce post :

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ù.

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.

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”

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

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

from poppy.creatures import PoppyErgoJr
poppy = PoppyErgoJr()

importer votre primitive:
from poppy_ergo_jr.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

1 Like

Bonjour,
Je suis à l’étape 2 et je suis bloquée. J’ai créé ma primitive et je l’ai enregistrée sous primitive_template.
Lorsque je veux la tester, un message d’erreur apparaît à l’importation de la primitive comme sur le screenshot ci-dessous.

Je ne trouve pas mon erreur.
Merci pour votre aide.

c’est normal puisque c’est mon erreur :wink: j’ai modifier le post précédent …

essaie avec

from poppy_ergo_jr.primitives.primitive_template import My_primitive

pourquoi :
Dans le fichier http://poppy.local:8888/edit/poppy_src/poppy_ergo_jr/poppy_ergo_jr.py
nous ne somme pas au même niveau dans les répertoires qu’avec la notebook que tu viens de créer http://poppy.local:8888/notebooks/Essaie%20primitive.ipynb. Ainsi pour le from import il faut adapter le chemin :wink: cqfd

1 Like

Merci, j’ai modifié et il a bien importé ma primitive. J’ai maintenant une erreur en ligne 5.
Cela me dit: ‘Robot’ object has no attibute ‘My_primitive’

J’ai donc besoin de nouveau d’aide.

Désolé, j’avais une erreur de frappe. J’avais oublié un i.

Voici ma nouvelle erreur:

le coup classique :sweat_smile:

en réalité il y en a deux:

  • celle avec la coloration syntaxique de python, indique qu’un des Thread a planté
  • celle dans l’encadré rouge est celle fournir par le Thread, elle indique que plt n’est pas définit (c’est celle-ci qui nous intéresse)

je n’ai pas le code de ta primitive mais je peux te dire qu’il manque en entête de fichier un:

import matplotlib as plt

par contre, la ligne42 plt.imshow(img) produira certainement une image mais via une fenêtre pop-up (pas directement dans le notebook) visible unique via la sortir video par défaut (à savoir la sortie HDMI de la raspberry)