IOerror pyot avec XL320

Bonjour,

Maintenant que la mécanique de Fendi est montée place à la programmation, cependant je commence avec des petits problèmes lorsque je lance mon fichier python.

Voici l’erreur:

Je travaille sous Windows avec anaconda. Tous mes moteurs ont leurs “id” de paramétré ainsi que le fichier json. Pour le moment, je veux juste mettre tous les moteurs à 0.
Je vous joins les fichiers json et mon code python en cas de besoin: configjson.txt (4.1 KB) programmepython.txt (712 Bytes)

Tu utilises un USB2AX ou un USB2Dynamixel ?

oups j’ai oublié de préciser, j’utilise l’USB2AX
Je ne sais pas si ça a une importance, mais avec dynamixel wizzard je vois bien tous mes moteurs. Je ne pense donc pas que le problème soit électrique ou alimentation.

Il me semble que @pierre n’a pas réussi à piloter des XL320 avec des USB2AX… Mais je ne sais pas si c’est ça le problème dans ce cas.

De mon côté j’ai réussi à les piloter avec dynamixel Wizard (XL320 et USB2AX)
Vous faites comment du coup pour les ergo robot?

Ici je pense que l’erreur est simplement du au fait qu’il ne ping pas les moteurs.

On utilise des USB2Dynamixel. Il faut aussi spécifier que tu utilises le protocole v2 (cf. poppy-ergo-jr.json).

Intéressant de voir que les USB2AX marche avec le dynamixel wizard… je vais regarder ça… Tu as quelle version des USB2AX ?

J’ai bien justifié que j’utilise le protocole V2. Tu penses que c’est possible que vous testiez mon code avec l’USB2DYNAMIXEL afin d’éliminer ou de confirmer que ça vienne de là

J’ai la version 3.2a

Il faudrait que j’ai le robot pour pouvoir tester vraiment la même chose. Je vais faire quelques tests de mon côté.

Est-ce que tu peux essayer le code suivant de ton côté (avec ton setup actuel) et m’afficher le résultat:


from pypot.dynamixel import DxlIO, Dxl320IO, get_available_ports

ports = get_available_ports()
print('ports found {}'.format(ports))

for port in ports:
   print('Now using {}'.format(port))

   io = DxlIO(port)
   ids = io.scan()
   print('Found ids {} on protocol 1'.format(ids))
   io.close()

   io2 = Dxl320IO(port)
   ids = io2.scan()
   print('Found ids {} on protocol 2'.format(ids))
   io2.close()

@Pierre Voilà ce qu’il m’affiche, j’ai pris soin de désactiver le COM1 avant histoire d’être sur que c’est bien le COM15 qui est utilisé, car c’est celui du robot

Ok et maintenant ça :

import time

from numpy import mean, std

from pypot.dynamixel import Dxl320IO

port = 'COM15'

io = Dxl320IO(port)
ids = io.scan()
print '{} found'.format(len(ids))

dt = []
for _ in range(100):
    start = time.clock()
    io.get_present_position(ids)
    end = time.clock()
    dt.append(end - start)
io.close()
print 'sans sync: M={}ms (STD={})'.format(mean(dt)*1000, std(dt)*1000)

io = Dxl320IO(port, use_sync_read=True)
ids = io.scan()
print '{} found'.format(len(ids))

dt = []
for _ in range(100):
    start = time.clock()
    io.get_present_position(ids)
    end = time.clock()
    dt.append(end - start)
io.close()
print 'avec sync: M={}ms (STD={})'.format(mean(dt)*1000, std(dt)*1000)

@Pierre

Voici le résultat:

Ok c’est limite pour faire du 50Hz mais ça devrait passer.

Tests suivants :smile:


import json

with open('config2.json') as f:
    d = json.load(f)

conf_ids = [m['id'] for k, m in d['motors'].items()]

import pypot.dynamixel
io = pypot.dynamixel.Dxl320IO('COM15')

real_ids = io.scan()

print(conf_ids)
print(real_ids)
print set(conf_ids) == set(real_ids)

et

from pypot.robot import from_json

test_robot = from_json('config2.json')

time.sleep(10)

test_robot.close() 

Voici ce que j’obtient pour le premier code :

Et pour le deuxième l’erreur a réapparu, peut être que c’est bon signe dans le débogage…

Espérons :smile:

Est-ce que le programme suivant fonctionne ?


import pypot.dynamixel
io = pypot.dynamixel.Dxl320IO('COM15')
ids = io.scan()

print(io.get_pid_gain(ids))

@Pierre

C’est bon signe ?

Oui et non… C’est ce qu’il est essaie de faire quand il plante…
Et là il y arrive.

Est-ce que tu peux aller modifier la méthode setup du fichier controller (C:\Anaconda\lib/site-packages\pypot\dynamixel\controller.py) et changer la durée du time.sleep: 0.1 par 1.0.

    def setup(self):
        if self.mode == 'set':
            MAX_TRIALS = 25
            for _ in range(MAX_TRIALS):
                if self.get_register():
                    break
                time.sleep(1.)
            else:
                raise IOError('Cannot initialize syncloop for "{}"'.format(
                              self.regname))

Et re-tester si ça fonctionne.

@Pierre

Malheureusement, l’erreur est apparue

J’ai bien changé le time.sleep et j’ai testé avec ce bout de code que tu m’as donné

import pypot.dynamixel
io = pypot.dynamixel.Dxl320IO('COM15')
ids = io.scan()

print(io.get_pid_gain(ids))

@Pierre
Une piste de résolution pour le problème?
Est-ce que ça pourrait venir du faite que tous mes moteurs sont sur le même USB2AX? Car pour Poppy il y en a 2.

Désolé j’étais parti en we loin de toute connection internet.

C’est possible mais cela devrait passer normalement.

Est-ce que tu peux faire une config avec un seul moteur et juste en brancher un voir si ça passe ? Si ça fonctionne essaie de monter le nombre de moteur petit à petit. Pour info j’ai testé des robots à base de XL-320 jusqu’à 6 moteurs sans avoir de problème.

@Pierre
Pas de soucis pour le weekend :smile:

Alors, je viens de tester moteur par moteur en augmentant leur nombre au fur et à mesure? Cela a fonctionné avec tous les moteurs, j’ai pu mettre le robot à 0. Cependant, l’erreur originale revient régulièrement et il me suffit d’éteindre et d’allumer pour que ça fonctionne (normalement), car jeudi pendant nos phases de tests, j’ai allumé et éteins plein de fois le robot sans succès

Une piste pour ce gentil bug aléatoire?