Tête motorisée Clauss et PapyWizard  

En photos panoramique, le matériel est aussi important. Voici la place pour en discuter : appareil photo, tête, imprimante, ordinateur
User avatar
fma38
Member
 
Posts: 5827
Joined: Wed Dec 07, 2005 6:21 pm
Location: Grenoble, France

by fma38 » Sun Jan 02, 2011 6:45 pm

martinlbb wrote:Dans le fichier papywizard/driver/serialDriver.py, la méthode read (la dernière en bas du fichier).
Comme je dois lire tout ce qui est écrit sur la ligne série jusqu'au timout, cela me générait des erreurs.
La manière de penser n'est pas la même pour Clauss. Une réponse peut avoir de 1 à  3 CR. Je dois donc tout lire pour ne pas perdre d'arguments.

Mmmm, mieux vaut éviter de modifier le coeur, car il peut y avoir des effets de bord avec les autres plugins. Si tu as besoin de lire plus de choses, appelle la méthode read() plusieurs fois. Peux-tu poster ta modife, que je comprenne de quoi il retourne ?

fma38 wrote:L'offset est utilisé lorsque tu utilises le menu pour modifier la référence (la position où tu lis yaw=0, pitch=0). La Claus peut peut-être être mise à  zéro, mais pas la Merlin (ni d'autres têtes). Donc je gère ça au niveau au dessus du plugin.

OK, dois je le garder ?

Comme tu veux. Greg a aussi la possibilité de faire ça. Je lui ai conseillé de surcharger la méthode setReference() (définie dans la classe parent AbstractAxisPlugin). Là , tu peux appeler ton code bas niveau, et laisser _offset à  0. Mais tu vas perdre la fonctionnalité qui est de revenir à  la position initiale (menu hardware), qui est la position de la tête lors de l'allumage ; ça peut être intéressant (genre revenir à  cette position lors du shutdown)... à€ toir de voir.

Ah sinon, ce serait bien d'implémenter un état de la batterie, avec affichage sur la barre d'état (batterie ou secteur). Mais est-ce que les autres têtes le gère ?

Non, pas vu. C'est pas évident de mettre des choses sépcifiques aux plugins dans la barre d'état... Il faudrait faire un autre truc, spécifique à  ce genre de chose. Mais cela veut dire modifier tous les plugins... Faudra y réfléchir plus à  fond.

Sinon, bravo !
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100

User avatar
fma38
Member
 
Posts: 5827
Joined: Wed Dec 07, 2005 6:21 pm
Location: Grenoble, France

by fma38 » Sun Jan 02, 2011 6:55 pm

fma38 wrote:
martinlbb wrote:Dans le fichier papywizard/driver/serialDriver.py, la méthode read (la dernière en bas du fichier).
Comme je dois lire tout ce qui est écrit sur la ligne série jusqu'au timout, cela me générait des erreurs.
La manière de penser n'est pas la même pour Clauss. Une réponse peut avoir de 1 à  3 CR. Je dois donc tout lire pour ne pas perdre d'arguments.

Mmmm, mieux vaut éviter de modifier le coeur, car il peut y avoir des effets de bord avec les autres plugins. Si tu as besoin de lire plus de choses, appelle la méthode read() plusieurs fois. Peux-tu poster ta modife, que je comprenne de quoi il retourne ?

Pourquoi ne fais-tu pas comme dans le plugin de la Merlin (et des autres), en lisant 1 caractère à  la fois, et en bouclant jusqu'à  tout recevoir ? Et tu peux gérer le timeout toi-même à  l'appel du read, dans ta classe (avec un try/except)...
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Sun Jan 02, 2011 10:38 pm

Voila les deux fonctions (l'original en commenté et la modifiée dessous) :

#def read(self, size):
# data = self._serial.read(size)
# #Logger().debug("SerialDriver.read(): data=%s" % repr(data))
# if size and not data:
# raise IOError("Timeout while reading on serial bus (size=%d, data=%s)" % (size, repr(data)))
# else:
# return data

def read(self, size, retvalue = 0):
data = self._serial.read(size)
#Logger().debug("SerialDriver.read(): data=%s" % repr(data))
if retvalue == 0 and size and not data:
raise IOError("Timeout while reading on serial bus (size=%d, data=%s)" % (size, repr(data)))
elif size and not data:
return retvalue
else:
return data
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Sun Jan 02, 2011 10:40 pm

fma38 wrote:Pourquoi ne fais-tu pas comme dans le plugin de la Merlin (et des autres), en lisant 1 caractère à  la fois, et en bouclant jusqu'à  tout recevoir ? Et tu peux gérer le timeout toi-même à  l'appel du read, dans ta classe (avec un try/except)...

C'est ce que je fais déjà , mais sans la modif, je me retrouve avec un IOError à  chaque fin de buffer. C'est que je veux éviter.

Pour le timeout, je le gère déjà  moi même
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
fma38
Member
 
Posts: 5827
Joined: Wed Dec 07, 2005 6:21 pm
Location: Grenoble, France

by fma38 » Mon Jan 03, 2011 7:50 am

Je ne comprend pas trop ; en principe, tu sais ce que tu attends comme réponse, non ? Je veux dire, tu dois pouvoir prédire, en fonction de la commande, combien de trames avec CR il y aura. Il te suffit donc de lire caractère par caractère, jusqu'à  recevoir le dernier (un petit compteur, et hop !).

Mieux, l'idéal serait de construire une expression régulière correspondant à  la réponse complète, et de faire la comparaison à  chaque caractère reçu (après l'avoir ajouté au buffer). à‡a, c'est même un truc que je pourrais, à  terme, ajouter au driver (dans la classe de base)...
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Mon Jan 03, 2011 10:48 am

fma38 wrote:Je ne comprend pas trop ; en principe, tu sais ce que tu attends comme réponse, non ? Je veux dire, tu dois pouvoir prédire, en fonction de la commande, combien de trames avec CR il y aura. Il te suffit donc de lire caractère par caractère, jusqu'à  recevoir le dernier (un petit compteur, et hop !).

Eh non, sur certaines commandes, j'ai une réponse qui peut être plus longue que prévue, sans que je m'y attende. Donc, ca peut varier de 2 à  3 CR par exemple sur la même commande :(


fma38 wrote:Mieux, l'idéal serait de construire une expression régulière correspondant à  la réponse complète, et de faire la comparaison à  chaque caractère reçu (après l'avoir ajouté au buffer). à‡a, c'est même un truc que je pourrais, à  terme, ajouter au driver (dans la classe de base)...

Sauf que ca revient au même problème. Sur certaines réponses, j'ai deux regex différents à  appliquer, de longueurs différentes :(
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
fma38
Member
 
Posts: 5827
Joined: Wed Dec 07, 2005 6:21 pm
Location: Grenoble, France

by fma38 » Mon Jan 03, 2011 11:00 am

Ok, je vois (pas très sioux, leur protocole !!!)

Ceci-dit, tu n'as pas besoin de modifier la méthode read() du driver (il faudrait le faire pour tous les drivers, si tu veux pouvoir utiliser du bluetooth, par exemple). Capturer une exception n'est pas un problème du tout : c'est même beaucoup plus efficace, puisque ça n'apparaît qu'une seule fois, contrairement à  ton test¹.

De plus, j'ai constaté que suivant les plateformes, le timeout n'était pas toujours pris en compte. Tu cours le risque qu'il reste à  une valeur très élevée (genre plusieurs secondes !).

¹ et comme on dit : "Easier to Ask Forgiveness than Permission"
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Mon Jan 03, 2011 11:08 am

fma38 wrote:Ok, je vois (pas très sioux, leur protocole !!!)

Oui, le concepteur de la tête est certainement un bon ingé en elec, mais coté soft, j'ai pas l'impression que ce soit sa grand passion.

fma38 wrote:Ceci-dit, tu n'as pas besoin de modifier la méthode read() du driver (il faudrait le faire pour tous les drivers, si tu veux pouvoir utiliser du bluetooth, par exemple). Capturer une exception n'est pas un problème du tout : c'est même beaucoup plus efficace, puisque ça n'apparaît qu'une seule fois, contrairement à  ton test¹.

Ohhh, je connaissais pas ! (je suis un fils du C Kernighan et Ritchie). C'est terriblement intéressant !
Et ce sera plus élégant que ma 'rustine'.

fma38 wrote:De plus, j'ai constaté que suivant les plateformes, le timeout n'était pas toujours pris en compte. Tu cours le risque qu'il reste à  une valeur très élevée (genre plusieurs secondes !).

Exactement. C'est d'ailleurs ce que donne le premier copié collé sur ce post. Tu peux voir que la tête réponds chaque.... seconde !
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Mon Jan 03, 2011 12:31 pm

Bon, j'ai finalement décidé de conserver le modèle initial, basé sur la prédiction du nombre de CR (que je passe en arguments à  la méthode __sendCmd).
Sachant que je n'utilise pas les réponses supplémentaires (celles qui arrivent en plus de temps en temps), j'ai décidé de fixer un nombre de CR max par requête.

Ainsi, je boucle jusqu'au CR concerné, puis je vide la ligne série (driver.empty() ).
Et comme, ca je peux lire sans problème et sans timeout... :)

J'ai tout "recodé", ah marche nickel :)
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
fma38
Member
 
Posts: 5827
Joined: Wed Dec 07, 2005 6:21 pm
Location: Grenoble, France

by fma38 » Mon Jan 03, 2011 12:44 pm

Il n'y a vraiment pas moyen de prédire le nombre de trames (terminée par CR) en fonction de la commande ?

Au fait, attention à  driver.empty() : cette méthode ne fonctionne que pour le driver série. Pour les drivers bluetooth et ethernet, elle est vide, car on ne peut pas savoir combien de caractères sont en attente dans le buffer. à€ la limite, je pourrais faire une boucle pour tout lire jusqu'au timeout... Sauf que dans el cas du bluetooth sous Windows, le timeout ne peut pas être changé, donc reste à  plusieurs secondes ! Tant pis, je vais quand même faire ça.
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Mon Jan 03, 2011 12:50 pm

fma38 wrote:Il n'y a vraiment pas moyen de prédire le nombre de trames (terminée par CR) en fonction de la commande ?

Il y a 3 commandes qui retournent des valeurs non prédictives.

Deux dans la phase d'init :
La commande reset
Une commande inconnue en phase d'init.

Et la plus importante :
La commande de position (celle qui retourne la position physique de la tête) qui retourne de temps en temps un élément supplémentaire, quand la tête est proche de la position demandée.

fma38 wrote:Au fait, attention à  driver.empty() : cette méthode ne fonctionne que pour le driver série. Pour les drivers bluetooth et ethernet, elle est vide, car on ne peut pas savoir combien de caractères sont en attente dans le buffer. à€ la limite, je pourrais faire une boucle pour tout lire jusqu'au timeout... Sauf que dans el cas du bluetooth sous Windows, le timeout ne peut pas être changé, donc reste à  plusieurs secondes ! Tant pis, je vais quand même faire ça.

Aïe :(
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
fma38
Member
 
Posts: 5827
Joined: Wed Dec 07, 2005 6:21 pm
Location: Grenoble, France

by fma38 » Mon Jan 03, 2011 1:07 pm

Ouais, aïe, comme tu dis ! Le bluetooth, c'est de l'USB sans fil : une usine à  gaz tout aussi bordélique.

Plutôt que d'appeler empty() à  la fin de la réception de la réponse, tu ne peux pas le faire au début ? Puisque la réponse reprend toujours la commande, ça doit pas être difficile de filtrer ce qu'il y a éventuellement avant...

Note : dans la doc sur le wiki, tu devrais virer les codes hexa, et ne laisser que l'ASCII, ce serait plus lisible... Les codes hexas seraient utiles pour un protocole binaire ; l'ASCII est justement fait pour que ce soit lisible par nous autres, pov'z'umins.
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Mon Jan 03, 2011 2:06 pm

fma38 wrote:Ouais, aïe, comme tu dis ! Le bluetooth, c'est de l'USB sans fil : une usine à  gaz tout aussi bordélique.

Autant j'aime beaucoup l'USB et la manière dont il a été pensé, autant je hais le bluetooth pour sa très mauvaise conception.

fma38 wrote:Plutôt que d'appeler empty() à  la fin de la réception de la réponse, tu ne peux pas le faire au début ? Puisque la réponse reprend toujours la commande, ça doit pas être difficile de filtrer ce qu'il y a éventuellement avant...

Ca me va. Entre recoder la partie Bluetooth et modifier mon code, j'ai choisi !

fma38 wrote:Note : dans la doc sur le wiki, tu devrais virer les codes hexa, et ne laisser que l'ASCII, ce serait plus lisible... Les codes hexas seraient utiles pour un protocole binaire ; l'ASCII est justement fait pour que ce soit lisible par nous autres, pov'z'umins.

Tu vas rire, mais j'ai mis l'Hexa car c'est plus lisible pour ce protocole à  cheval entre l'Ascii et l'hexa.
Autant sur d'autres protocole, je n'aurai mis que l'ASCII, autant celui est vraiment particulier.
C'est pour cela que c'est tout en double.
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
AlexandreJ
Kolor Team
 
Posts: 5911
Joined: Mon Nov 14, 2005 4:56 pm
Location: Francin, France

by AlexandreJ » Mon Jan 03, 2011 2:13 pm

C'est énorme le boulon fait ! Bravo les gars :)

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Mon Jan 03, 2011 2:22 pm

AlexandreJ wrote:C'est énorme le boulot fait ! Bravo les gars :)

Merci :)

Et bonne nouvelle, j'ai débridé la tête sur le mouvement vertical. Au lieu d'être limitée à  +90, -90°, elle peut se déplacer jusqu'à  +360, -360°.

Bien entendu, le driver s'adapte automatiquement en fonction des données du moteur : nombre de pas = résolution du moteur en ° et vitesse du moteur.

Virtuellement, le driver doit s'adapter à  toute type de tête Rodeon, quelque soit le type de moteur (plus ou moins précis, avec ou sans frein).
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Mon Jan 03, 2011 7:57 pm

Bon, j'ai tout qui marche !

Y'a plus qu'à  gérer les préférences de la tête Clauss (AF enclenché ou non, délais AF, double appareil ou non)
Ou puis-je l'intégrer ? Dans un onglet ? Dans un fichier de config ?
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
fma38
Member
 
Posts: 5827
Joined: Wed Dec 07, 2005 6:21 pm
Location: Grenoble, France

by fma38 » Mon Jan 03, 2011 8:10 pm

Les plugins permettent de gérer leur config, via un GUI assez simple mais suffisant. Regarde dans la doc :

http://www.papywizard.org/wiki/DevelopGuide#Plugins

et dans les autres plugins... Tout se décrit via les méthodes _defineConfig() et _defineGui() des classes model et controller du plugin (attention à  bien utiliser les mêmes paramètres des 2 côtés).

Les valeurs entrées ici seront automatiquement sauvées dans le fichier de config général de Papywizard.

Met tes valeurs par défaut dans des constantes, en haut du fichier ; c'est plus pratique à  modifier par la suite.
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Mon Jan 03, 2011 8:19 pm

OK :)

En attendant, une capture du log avec la connexion de la tête :


2011-01-03 20:18:30,721::Main::INFO::Starting connection. Please wait...
2011-01-03 20:18:30,771::Main::INFO::ClaussHardware.init(): Transceiver brand=CLAUSS
2011-01-03 20:18:30,798::Main::INFO::ClaussHardware.init(): Transceiver firmware version=02.00
2011-01-03 20:18:30,871::Main::INFO::ClaussHardware.init(): axis=1, motor firmware version=01.05
2011-01-03 20:18:30,891::Main::INFO::ClaussHardware.init(): axis=1, motor numbers of steps=24000, axis accuracy=0.015°
2011-01-03 20:18:31,059::Main::INFO::ClaussHardware.init(): axis=2, motor firmware version=01.05
2011-01-03 20:18:31,078::Main::INFO::ClaussHardware.init(): axis=2, motor numbers of steps=60000, axis accuracy=0.006°
2011-01-03 20:18:31,263::Main::INFO::ClaussHardware.init(): Clauss head is on AC power
2011-01-03 20:18:31,267::Main::INFO::Connection started
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
fma38
Member
 
Posts: 5827
Joined: Wed Dec 07, 2005 6:21 pm
Location: Grenoble, France

by fma38 » Mon Jan 03, 2011 8:51 pm

Joli :)
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Tue Jan 04, 2011 11:57 pm

Bon, bah y'a tout qui marche :)

Les options sont codées, y compris le dual camera (que je dois tester en import avec APG).

Pour le single camera, ca import nickel (bracketing) dans APG.

Parfait :)
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
AlexandreJ
Kolor Team
 
Posts: 5911
Joined: Mon Nov 14, 2005 4:56 pm
Location: Francin, France

by AlexandreJ » Wed Jan 05, 2011 1:47 pm

Perfect :)

User avatar
fma38
Member
 
Posts: 5827
Joined: Wed Dec 07, 2005 6:21 pm
Location: Grenoble, France

by fma38 » Wed Jan 05, 2011 1:59 pm

J'ai quand même peur que le mode 'dual camera' ne puisse pas fonctionner avec le filtre d'import Papywizard. En effet, tu vas générer 2 photos à  chaque fois, mais il n'y en aura qu'une seule inscrite dans le fichier xml... Pour que ça marche, il faut modifier des choses dans le coeur de Papywizard.
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Wed Jan 05, 2011 2:54 pm

fma38 wrote:J'ai quand même peur que le mode 'dual camera' ne puisse pas fonctionner avec le filtre d'import Papywizard. En effet, tu vas générer 2 photos à  chaque fois, mais il n'y en aura qu'une seule inscrite dans le fichier xml... Pour que ça marche, il faut modifier des choses dans le coeur de Papywizard.

C'est marrant, je me faisais la même réflexion tout à  l'heure en me promenant.

Je laisse pour le moment l'option en attendant de toucher (ou non ?) au coeur de Papywizard.

Dans le même ordre d'idée, je reviens sur l'état de la batterie. Sachant que la plupart des têtes motorisées sont sur batterie (et si elle disposent d'une commande d'état de la batterie), cela serait utile d'ajouter cette fonctionnalité dans une nouvelle release.
Ce que je ne sais pas, c'est si les différentes têtes supportées sont capables de donner l'état de leur batterie ?
Clauss : Oui
Merlin/Orion ?
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Tue Mar 15, 2011 11:14 pm

Le code est dispo sur le SVN de Papywizard.

S'il y a des volontaires pour tester ?
Last edited by martinlbb on Wed Mar 16, 2011 8:23 am, edited 1 time in total.
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

User avatar
martinlbb
Member
 
Posts: 57
Joined: Thu Apr 15, 2010 12:41 pm
Location: Lyon

by martinlbb » Thu Apr 14, 2011 4:21 pm

Le modèle VR Head a été testé avec succès sous PapyWizard.

Bonne nouvelle :)
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr

PreviousNext

Return to Matériel

Who is online

Users browsing this forum: No registered users and 1 guest