Caméra raspberry en rade

Maintenant j’ai un problème avec la caméra:

$ raspistill -o cam.jpg
mmal: mmal_vc_component_enable: failed to enable component: ENOSPC
mmal: camera component couldn’t be enabled
mmal: main: Failed to create camera component
mmal: Failed to run camera app. Please check for firmware updates

Le voyant est allumé, elle est bien branchée.

Au lancement de Poppy le message est:

VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
Unable to stop the stream: Device or resource busy

C’est différent du message de rapistill.

Que puis-je faire ? Est-ce qu’il y a aussi une commande de mise à jour magique du système ?

Si la caméra est activé (dans l’interface web) elle est ouverte et lue en permanance par le robot, donc c’est normal que raspistill ne puisse pas y acceder. Je ne vois pas de problème. Pour le second message d’erreur, il vient des log du robot ?

Oui ça vient des logs du robot. Je n’arrive d’ailleurs pas à éteindre la caméra.

Je suis allé un peu plus loin, en fait ça doit être un problème de configuration de mes robots
ou l’API qui a changé.
J’ai maintenant le message d’erreur suivant quand je lance mon programme Python, mais je n’ai pas de problème dans l’interface Web:

SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?

Le programme de deux lignes qui crée l’exception ci-dessus:

from pypot.creatures import PoppyErgoJr
poppy = PoppyErgoJr()

Et la trace:

Exception in thread Thread-3:
Traceback (most recent call last):
File “/home/poppy/miniconda/lib/python2.7/threading.py”, line 810, in __bootstrap_inner
self.run()

File “/home/poppy/miniconda/lib/python2.7/site-packages/pypot/dynamixel/io/abstract_io.py”, line 512, in __real_read
data += self._serial.read(header.packet_length)
File “/home/poppy/miniconda/lib/python2.7/site-packages/serial/serialposix.py”, line 475, in read
raise SerialException(‘device reports readiness to read but returned no data (device disconnected or multiple access on port?)’)
SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)

Lorsqu’on clique sur Jupyter notebook depuis l’interface web, ça tue le processus qui fait tourner l’API de Snap et de Poppy Monitor. Cependant, si on reclique sur Poppy Monitor ou Snap alors qu’un onglet de Jupyter ouvert, il va les relancer et on n’auras alors plus accès au port série, ni a la caméra (si elle est activé dans l’interface web).

Si le problème apparait, on peut directement tuer tous les processus qui utilisent le port série depuis l’interface de Jupyter. Pour cela il faut executer la commande dans une cellule d’un notebook (le point d’exclamation sert à éxecuter des commandes système depuis une cellule de Jupyter):

# Pour l'Ergo Jr
!fuser -k /dev/ttyACM*

# Pour l'Humandoid/Torso
!fuser -k /dev/ttyUSB*

En fait dans mon environnement pour ErgoJr c’est : /dev/ttyAMA0

Ca marche ! C’est bizarre que je n’ai pas eu ce problème sur l’autre robot.

Est-ce que tu sais comment je peux tuer proprement depuis Python tous les processus lancés par l’API à part fuser ?

Est-ce qu’il est possible de faire cohabiter mon programme utiliser comme un service avec la web API ? C’est ce qui se passe sur mon autre robot, donc c’est possible. Mais comment dans la dernière version de pypot ?

Maintenant quand je démarre mon service systemd, j’ai cet autre service qui m’embête et qui utilise le port du robot:

/home/poppy/miniconda/bin/python /home/poppy/miniconda/bin/poppy-services

Est-ce que je ne pourrais pas intégrer mon script à ce service ?

C’est probablement un pur hasard de la version de systemd ou de Debian qui fait que votre service se lance avant ou après celui de l’interface web.
Un moyen simple de lancer code à la place de l’interface web (qui lance elle-même l’utilitaire en cli poppy-services) est de modifierle fichier launch.sh qui est dans /home/poppy/dev/puppet-master.

Sinon, l’idéal serait de modifier l’interface web pour ajouter un paramètre de configuration où l’utilisateur choisirait quoi lancer au démarrage (il faudrait modifier le Deamon).

Tiens à propos

bouteillederouge.py
n’est pas à jour:

$ cat /tmp/bouteillederouge.log
WARNING:root:You are still using the deprecated poppy-creature package! You should replace all “from poppy.creatures import *” with “from pypot.creatures import *” in order to be compatible with future development.