Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 16-12-2013 17:05:28

gflocea
Invité

Asservissement d'un télépointeur

Bonjour,

Je travaille sur l'asservissement d'un télé pointeur en pan/tilt. Je souhaiterais lui interdire certaines zones. Pour cela, je convertis sa position (pan/tilt) en coordonnées cartésiennes, résultat sur lequel j'effectue mes tests (hors butées si X<0 et Z>-1m). Je ne peux pas me contenter de limiter indépendamment le pan et le tilt car ils sont liés pour décrire l'espace (sphère).
Le repère est le suivant :
Centre au croisement des axes de rotation
X est vers l'avant du télé pointeur
Y est à sa gauche
Z est vers le haut

Mon problème est que je travaille entre 0 et 135° en tilt (valeurs renvoyées par mon télé pointeur) et j'ai un problème au-delà de 90°. Par exemple, si j'applique les fonctions suivantes(*), j'obtiens :
cart2Pol( pol2Cart(30,89, 1) ) = [30, 89]
cart2Pol( pol2Cart(30,91, 1) ) = [30, 89]

J'ai pensé changer d'échelle [-72.5, 72.5] mais ensuite je ne sais pas comment redéfinir mes butées ( valeurs correspondantes à ce changement d'échelle).

Je vous remercie pour votre aide.

(*)
pol2Cart(gisement, site, distance)
X = distance*Math.sin(gisement)*Math.cos(site);
Y = distance*Math.cos(gisement)*Math.cos(site);
Z = distance*Math.sin(site);

cart2Pol(X, Y, Z)
X = X==0? 0.001:X;
Y = Y==0? 0.001:Y;

gisement    = Math.atan2(X, Y) + (X<0? Math.PI:0) ;
site     = Math.atan2(Z, Math.sqrt(X*X+Y*Y));
distance    = Math.sqrt(X*X+Y*Y+Z*Z);

#2 17-12-2013 11:15:20

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Bonjour,

Je veux bien essayer de t'aider, mais il y a un certain nombre d'éléments qui m'échappent...

Je travaille sur l'asservissement d'un télé pointeur en pan/tilt

Qu'est-ce que le télépointeur ? Cet appareil de pointage à distance, il pointe quoi ? Il doit disposer des coordonnées dans l'espace d'un objet à proximité de lui-même ?
"en pan/tilt" ques acquo ?
Sur la "toile", j'ai trouvé ça :

Le panoramique , pano ou pan est un mouvement de caméra en rotation autour d’un point fixe (le trépied est … utile :lol: ) : rotation de gauche à droite (ou l’inverse), de haut en bas (ou l’inverse) et pourquoi pas en biais ou de manière azimutale (en courbe lisse)…

Le terme tilt est utilisé pour le cas particulier du pano vertical.

Ca avait bien l'air d'avoir un rapport, mais plus loin tu écris :

Mon problème est que je travaille entre 0 et 135° en tilt (valeurs renvoyées par mon télé pointeur) et j'ai un problème au-delà de 90°.

Soit un point A de l'espace  de coordonnées [tex](X_A\ ;\ Y_A\ ; \ Z_A)[/tex] et  le centre des coordonnées O,  si je projette verticalement la droite (OA) sur le plan de base (XOY) en un point A', 135° est l'angle [tex]\widehat{AOA'}[/tex], c'est ça ?

Je vois bien tes formules
Qui a écrit  ces fonctions Pocart2 et cart2Pol ? Voilà des noms pas très explicites...

Et on en revient à la même question fondamentale :
de quelles données disposes-tu, quelle données veux-tu en tirer ?
Tu es censé faire quoi avec ça ?
La fonction cart2Pol est-elle censée définir si une position donnée dans le plan (XOY) est atteinte à 0,01 près ?
Ensuite

X = distance*Math.sin(gisement)*Math.cos(site);
Y = distance*Math.cos(gisement)*Math.cos(site);
Z = distance*Math.sin(site);
(...)
gisement    = Math.atan2(X, Y) + (X<0? Math.PI:0) ;
site     = Math.atan2(Z, Math.sqrt(X*X+Y*Y));
distance    = Math.sqrt(X*X+Y*Y+Z*Z);

Le coup du chien qui se mord la queue ?
D'autre part, cette fonction atan2 n'est pas standard, elle est censée faire quoi ?
Moi je connais atan(x), qui me revoie l'angle quand le lui passe comme paramètre (un seul, pas deux) la tangente, qui me renvoie un angle, par exemple atan(1) --> pi/4 à moi de savoir si ce n'est pas 5pi/4.... Dans ton cas le pb ne se pose pas puisque tu ne dépasse pas pi.

La distance c'est la longueur dans l'espace du segment OA (A étant la tête du télépointeur). Ça c'est clair...
Le [tex]site[/tex] s'obtient à partir de 2 paramètres : la cote (ou hauteur Z) et la longueur OA' (A' étant dans XOY à la verticale de A)...
Pour moi, la longueur OA' te donne un cercle C' de centre O et de rayon [tex]\sqrt{X^2+Y^2}[/tex], associée à la cote Z tu as ainsi un cercle C centré sur l'axe (Oz) et de cote Z, parallèle au plan de base (XOY)...
Le gisement te donne la position de A' sur le cercle C', et donc la position de A sur ce cercle C.

C'est bon ?

Bon, simplifions...
X,Y,Z sont les coordonnées dans l'espace de la tête du télépointeur ?
Un moteur actionne la tête dudit télépointeur dans l'espace pour l'orienter et tu as comme contrainte de ne pas dépasser 135° en "tilt" ?
Tu bouges ton télépointeur. Tu l'arrêtes.
De quelles infos disposes-tu à ce moment là ? Tu as des angles ? des coordonnées cartésiennes ?
Tu veux en faire quoi ?

Désolé si je t'ai apporté beaucoup de questions et peu de réponses...

@+

[EDIT]
Dans un repère orthonormé (xOy) donné, la position d'un point M sur un cercle donné de centre O est repérée par la donnée de l'angle (pris dans le sens trigonométrique) que fait la demi droite [Ox avec la demi-droite [OA), l'angle orienté [tex]([Ox,\overrightarrow{OM})[/tex] de 0° à 360 °, l'azimut. Limites de ton azimut ?

Si je prends le même cercle que j'ajoute un axe vertical [Oz et que je déplace son centre en O' sur [Oz à une cote, une hauteur Z, j'ai besoin soit de l'azimut et de la cote, soit de l'azimut et de l'altitude (élévation dans les docs de réglages des antennes paraboliques) angle fait par [OS) avec le plan horizontal.

Pour un cercle quelconque, j'ai besoin en plus de son rayon [tex]R=\sqrt{X^+Y^2}[/tex] ou de la longueur nommé distance ci-dessus.
Si je dispose de R et de Z je peux trouver "l'altitude" [tex]alt = \arctan\left(\frac{Z}{R}\right)[/tex] .
Deux problèmes :
* On ne doit pas avoir R=0
* Pour ne pas dépasser 135°, je dois veiller à ce que [tex]alt \geqslant -1\pm 0.001[/tex]

Dernière modification par yoshi (17-12-2013 13:33:46)


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 17-12-2013 15:03:14

gflocea
Invité

Re : Asservissement d'un télépointeur

Bonjour Yoshi,

Tout d'abord, je te remercie de te pencher sur mon problème et de m'apporter ton aide.

Je vais essayer d'être un peu plus précis dans la description de mon problème :)

Je cherche à asservir un laser monté sur une tourelle motorisée sur 2 axes (2 moteurs) : un en circulaire et un en élévation (couramment appelés pan/tilt si tu préfères pan : mouvement circulaire dans le plan horizontal et tilt dans le plan vertical).

Cette tourelle permet donc au laser de couvrir une sphère. Hors, il y a certaines zones que je ne dois pas "arroser". Je ne peux pas me contenter de limiter indépendamment les mouvements en circulaire ou en élévation, je dois interdire des combinaisons.
Pour éviter de travailler avec une table de couples interdits (pan/tilt), je travaille en cartésien. Ainsi dans mon cas, il me suffit simplement de limiter le Z à une certaine hauteur quand X est négatif (cf. définition du repère de mon premier message ou voir plus bas), c'est super simple. Mais...

Ce "télépointeur" me renvoie périodiquement (Te)  sa position courante sous la forme de coordonnées angulaires (pan/tilt) à l'aide de codeurs. Le pan va de 0 à 350° et le tilt (position en élévation) de 0 à 135° ; en fait, ces valeurs extrêmes correspondent à la position physique du laser à chaque extrémité de sa course. Je peux actionner simultanément les deux moteurs à l'aide d'un joystick.

En fonction de la position courante de la tourelle et de l'info reçue du joystick, je souhaiterais éviter que le laser pointe une zone interdite. J'intercepte les ordres du joystick (vitesse sur chaque axe) et j'envoie périodiquement mes propres ordres à la tourelle en tenant compte des zones interdites.

Circulaire à commander au canon : Pan(n) = V(n)*Te + Pan(n-1)
avec Pan(n-1) = position courante de la tourelle si n=0 sinon circulaire commandé à l'instant n-1
        V(n) = vitesse à appliquer envoyée par le joystick sur l'axe circulaire
        Te = période d'envoi des ordres à la tourelle
Idem pour le tilt que je dois/peux commander de 0 à 135°.

Je travaille en java. J'ai écrit deux  fonctions , une première que j'ai nommée pol2Cart (polar to cartesian) qui transforme des coordonnées polaires en coordonnées cartésiennes et sa fonction réciproque cart2Pol.

Mon problème se situe quand le tilt calculé dépasse 90°. J'essaie d'appliquer ma fonction pol2Cart( pan(n), tilt(n), 1) pour vérifier mes butées et logiquement j'ai un changement de signe au delà de 90°, ce qui me pose problème. Exemple :

pol2Cart(30, 89) -->    X = 0.008726203218641797    Y = 0.015114227331858666   Z = 0.9998476951563913
cart2Pol(X,Y,Z)   -->   G = 29.999999999999993        S = 89.0

pol2Cart(30,91)  -->    X = -0.008726203218641737   Y = -0.01511422733185856    Z = 0.9998476951563913
cart2Pol(X,Y,Z)   -->   G = 29.999999999999993         S = 89.0


Ce télépointeur est monté "la tête en bas" avec un angle de 120° par rapport à l'axe horizontal. Il a un débattement vertical de 135° donc il peut aller en "absolu" de -120° à 15° par rapport à l'horizontal.

   15°               
              _______________________ horizontal
               \           
                \         
                 \         
                  -120°

Je souhaiterais interdire toute la zone derrière le télé pointeur au-dessus d'une certaine hauteur i.e. si X<0 et Z>-0.5 par exemple

Repère du télé pointeur ramené à l'horizontal (sans la rotation de 120°) dans lequel je souhaite tester ma zone interdite (ou butées) :
               Z
               ^
               |
               |
               |
  X <------0  Le 0 est au croisement des axes de rotation de la tourelle. Y vers nous.

Bien évidemment je commande ma tourelle dans son repère et je fais une rotation (120°)  pour me ramener dans le repère où (X,Y) est parallèle au plan horizontal et ainsi je peux tester mes butées simplement.


Je pensais travailler en tilt entre -72.5° et 72.5° pour éviter ce problème mais je ne sais pas redéfinir mes butées en cartésien avec ce changement. D'ailleurs, il y a peut-être une meilleure solution.

Je ne suis pas sûr d'avoir été plus clair :).

Pour info http://fr.wikipedia.org/wiki/Atan2

Merci beaucoup.

#4 17-12-2013 16:02:11

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Salut,

Bon, j'ignorais l'existence de atan2 : je me coucherai donc moins bête ce soir...
Tu sembles, contrairement à ce que je croyais, avoir un problème sur le plan horizontal...
Cela dit, pour ce que j'en vois, la fonction atan2 semble être infaillible et donne les bons signes...
Ton problème doit donc venir d'ailleurs... donc de ta fonction cart2Pol.
C'est elle qui à partir des bonnes coordonnées ne te fournit qu'un seul des 2 angles correctement.
Ceci veut dire quoi (désolé, je ne fais pas de Java mais du Python) ?

cart2Pol(X, Y, Z)
X = X==0? 0.001:X;
Y = Y==0? 0.001:Y;

Pour essayer de comprendre, je vais ce soir (j'espère avoir le temps et le courage) implémenter tes fonctions en Python pour faire des tests.
Le bug se niche probablement là :
site     = Math.atan2(Z, Math.sqrt(X*X+Y*Y));

Tu as noté S la valeur du site ? Soit l'élévation ?
Si cette élévation varie entre  et 135° la valeur Z est toujours positive, entre -15° et 120°, la cote est parfois négative.
C'est déjà une chose.
Ensuite S= atan2(Z,R) où [tex]R=\sqrt{X^2+Y^2}[/tex] est toujours positif.
Donc d'après  la définition de wikipedia, atan2(Z,R) avec R >= 0  dit que tu ne peux pas trouver 180-89 =91 mais que tu restes à 89...
Pour passer à [tex]\pi-alt[/tex], il faudrait que R puisse être négatif, or c'est impossible, ou alors il te faudrait non pas utiliser une longueur mais une "valeur algébrique" (en gros une longueur signée, si tu ne connais pas...)

Donc le problème est là, il y a un ajustement à faire dans cart2Pol...

Je regarderai...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#5 17-12-2013 16:55:12

gflocea
Invité

Re : Asservissement d'un télépointeur

Salut,

Je ne pense pas qu'il y ait de bugs (j'espère), je m'explique :

En fait, j'ai 2 repères :
REP 1 qui est le repère ayant pour centre le croisement des axes de rotation avec (X,Y) parallèle au plan horizontal et Z vers le haut,
REP 2 qui est REP1 avec une rotation de 120° vers le bas autour de Y.

Lorsque je reçois mes ordres du joystick, je calcule ma commande en pan et tilt :
Pan(n) =  Vh(n).T + Pan(n-1) avec Vh : vitesse horizontale envoyée par le joystick
Tilt(n)  =  Vv(n).T . Tilt(n-1) avec Vv : vitesse verticale envoyée par le joystick
dans REP2 et j'obtiens la commande à envoyer à mon télé pointeur dans REP2.

Par contre, je teste mes butées dans REP1.

Pour passer de REP2 à REP1, j'utilise la fonction pol2Cart(Pan(n), Tilt(n), 1) pour être en cartésien puis j'applique une rotation de -120° autour de l'axe des Y.
Le fait de dépasser 90° en tilt fait changer de signe au niveau du passage en cartésien mais c'est "mathématiquement cohérent" car si l'on vise vers le haut, après 90° on vise derrière. Sauf que dans mon cas, le télé pointeur a son 0 physique à 120° sous "l'horizontale absolue", donc après 90° il continue physiquement à viser dans le même sens. Hors si je passe dans REP1 en utilisant les fonctions classiques de transformation polaire en cartésien, j'obtiens un X négatif qui me fait croire que je vise derrière.

A mon avis, mathématiquement et logiciellement, tout est bon. Il faut trouver une solution pour contourner ce problème de passage à 90° et au-delà. Je pensais translater mon tilt entre -72.5 et 72.5° mais je ne sais pas translater mes bornes en cartésien pour pouvoir tester mes butées.

Par exemple, si je dois envoyer une commande à la tourelle avec un tilt à 100°, je souhaite tester si le couple (pan, 100°) me fait tirer dans ma zone interdite (cf. message précédent). Donc je passe en cartésien (-rotation 120° pour être dans REP1) et c'est là que le bât blesse (au niveau de pol2Cart).
Si je translate, je testerai le couple (pan, 100-72.5°) et je n'aurais plus de valeurs au-delà de 90° mais quelle est la règle pour transformer mes butées cartésiennes (cf. message précédent X<0 et Z>-0.5) pour être cohérent.
Peut-être, existe t'il une méthode plus simple pour tester si le télé pointeur vise derrière lui vers le haut (cf. message précédent).

Pour info, dans cart2Pol :
X = X==0? 0.001:X;
Y = Y==0? 0.001:Y;
signifie que si X=0 alors X=0.001 (idem pour Y)
Ces 2 lignes servent uniquement à ne pas entrer de valeurs nulles dans atan2.

Merci beaucoup.

#6 17-12-2013 19:22:29

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Bonsoir,

Ça se complique...

Ma remarque sur atan2.
Tu déplores (ou semble déplorer) que
cart2Pol(X,Y,Z)  avec X = -0.008726203218641737   Y = -0.01511422733185856    Z = 0.9998476951563913 te renvoie
G= 29,99999 et S = 89,
alors que Pol2cart (30,91) t'a pourtant donné X = -0.008726203218641737   Y = -0.01511422733185856    Z = 0.9998476951563913, et donc que tu attendrais en retour 91°...
Tu confirmes que ce qui te gêne c'est 89° au lieu de 91° ?
Si oui, alors je reprends.
je pose [tex]l = \sqrt{(-0.008726203218641737)^2+(-0.01511422733185856 )^2}[/tex]
j'ai donc  l = + 0.017452406437283477.
D'après wikipedia :
[tex]atan2(Z,l)=\begin{cases}\phi*sign(Z)\quad\quad\quad\;\; si\ l >0\\(\pi-\phi)*sign(Z)\quad si\ l<0\end{cases}[/tex]
Donc, puisque[tex] \phi\approx=89^{\circ}[/tex]
si tu calcules atan2(0.9998476951563913,0.017452406437283477) il ne peut te renvoyer que 89°...
Et si tu demandes atan2(0.9998476951563913,- 0.017452406437283477), ça te donne bien 91° non ?
Si, oui, il ne devrait te rester qu'à savoir quand il faut passer -l et non l en paramètre à atan2...

Changement de repère...
Pourquoi 72.5 ? Tu as dit que tu allais de 0 à 135... La moitié de 135 c'est 67.5. Mais ça ne changera pas ton problème de changement de repère...
Si translation
Dans un repère orthonormé (O,\vec i, \vec j, \vec k), les coordonnées d'un point [tex]A(x_A\;;\;y_A\;;\;z_A)[/tex] sont les coordonnées du vecteur [tex]\overrightarrow{OA}[/tex].
Si je possède les coordonnées de A dans un deuxième repère [tex](O',\vec i, \vec j, \vec k)[/tex] soit [tex]A'(x'_A\;;\;y'_A\;;\;z'_A)[/tex], ces coordonnées sont celles du vecteur [tex]\overrightarrow{O'A}[/tex].
Je sais que [tex]\overrightarrow{OA}=\overrightarrow{OO'}+\overrightarrow{O'A}[/tex]
J'ai donc besoin des coordonnées de O' dans le repère de centre O...
Si rotation
Voir : http://chatbleucom.free.fr/Math/SUP1/Ge … entRepere1 à adapter pour l'espace.
Mais toi, tu gardes la même origine, il y a "juste" rotation du plan (xOz) autour de [Oy c'est bien ça ?
Si j'ai ça, le reste suit...

Bon, les habitués des calculs bizarroïdes, v'zêtes où ?
Me laissez pas tout seul !!!

@+
[EDIT]
J'ai retranscrit tes instructions en Python, mais je suis arrêté par :
    X<0? Math.PI:0
Cela signifie quoi ?
que si x est < 0 tu rajoutes pi ...?  à qui ?

Dernière modification par yoshi (18-12-2013 09:24:53)


Arx Tarpeia Capitoli proxima...

Hors ligne

#7 18-12-2013 10:04:52

gflocea
Invité

Re : Asservissement d'un télépointeur

Merci pour ton aide.

Aie, 135/2=67.5... et non 72.5 :)

J'ai retranscrit tes instructions en Python, mais je suis arrêté par :
    X<0? Math.PI:0
Cela signifie quoi ?

if(X<0)
gisement = Math.atan2(X, Y)  + Math.PI();
else
gisement = Math.atan2(X, Y);


Si, oui, il ne devrait te rester qu'à savoir quand il faut passer -l et non l en paramètre à atan2...

C'est la condition à définir. Je souhaite vérifier si ma commande ne fait pas aller mon laser en zone interdite et si tel est le cas, je sature à la butée :
1- Calcul de la commande dans REP 2 = V.T + Position(n-1) en pan/tilt à partir des infos du joystick
2- Passage en cartésien dans REP2 : pol2Cart(pan, tilt, 1)
3- Rotation de -120° pour passer dans REP1 : rotationXYZ(0, Math.toRadians(-120°), 0)
4- Tests : si X<0 et Z >-0.5 alors Z=0.5
5- Rotation de 120°pour passer dans REP2 : rotationXYZ(0, Math.toRadians(120°), 0)
6- Passage en polaire  cart2Pol(X, Y, Z) --> pan/tilt à commander à la tourelle et problème si tilt au point 1 >= 90°.


Bye

Pour info :
    public void rotationXYZ(double rotX, double rotY, double rotZ){
        Matrix mX = new Matrix(3,3);
        Matrix mY = new Matrix(3,3);
        Matrix mZ = new Matrix(3,3);
        Matrix mE = new Matrix(3,1);
        Matrix mS = new Matrix(3,1);
       
        mX.set(0, 0, 1);        mX.set(0, 1, 0);                    mX.set(0, 2, 0);
        mX.set(1, 0, 0);        mX.set(1, 1, Math.cos(rotX));        mX.set(1, 2, -Math.sin(rotX));
        mX.set(2, 0, 0);        mX.set(2, 1, Math.sin(rotX));        mX.set(2, 2, Math.cos(rotX));
       
        mY.set(0, 0, Math.cos(rotY));    mY.set(0, 1, 0);        mY.set(0, 2, Math.sin(rotY));
        mY.set(1, 0, 0);            mY.set(1, 1, 1);        mY.set(1, 2, 0);
        mY.set(2, 0, -Math.sin(rotY));    mY.set(2, 1, 0);        mY.set(2, 2, Math.cos(rotY));

        mZ.set(0, 0, Math.cos(rotZ));    mZ.set(0, 1, -Math.sin(rotZ));        mZ.set(0, 2, 0);
        mZ.set(1, 0, Math.sin(rotZ));    mZ.set(1, 1, Math.cos(rotZ));        mZ.set(1, 2, 0);
        mZ.set(2, 0, 0);            mZ.set(2, 1, 0);                mZ.set(2, 2, 1);
       
        mE.set(0, 0, X);
        mE.set(1, 0, Y);
        mE.set(2, 0, Z);
       
        mS = mX.times(mY.times(mZ.times(mE)));
       
        X = mS.get(0,0);
        Y = mS.get(1,0);
        Z = mS.get(2,0);
}
Matrix est une classe propriétaire permettant de définir et d'utiliser des matrices :
times : multiplication
set : row, column, data
get : row, column, data

#8 18-12-2013 11:05:22

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

itionSalut,

if(X<0)
gisement = Math.atan2(X, Y)  + Math.PI();
else
gisement = Math.atan2(X, Y);

ok, c'est bien ce que j'avais fait...
J'ai vérifié sur ton exemple atan2(Z,-l) me donne bien 91° et non 89°...
Donc, le problème git bien là... Comment savoir si ton élévation dépasse 90°...
Il y a 4 cas :
x>0 et y>0
x>0 et y<0
x<0 et y>0
x<0 et y<0
On peut éliminer le cas n°1 et il semble qu'il faille passer -l en paramètres dans le cas n°4...
Je vais essayer un schéma en perspective pour voir.
En Python, je créerais un coefficient sign tel que (sous réserve) sign = 1 ou -1.
Exemple :
Une condition vérifiée renvoie 1 en Python, 0 dans le cas contraire.
sign = 1-2*((x<0 and y<0) or condition or ...)
puis je calculerais atan2(z,sign*sqrt(x*x+y*y)).

Bon maintenant au tour du schéma et chasse à la condition...

Pour utiliser des matrices en Python, il faudrait que je lui adjoigne un module mathématique comme NumPy

@+

[EDIT] Après vérification, il me semble qu'on peut dire que l'élévation est > 90 si x et y sont tous deux <0 (3e quadrant) ou x<0 et y >0 (2e quadrant) donc pour tout pan tel que 90 < pan < 270...
Dans ce cas, j'ai corrigé :
sign = 1-2*((x<0 and y<0) or (x<0 and y>0)) et le calcul fonctionne avec atan2(z,sign*sqrt(x*x+y*y)).

Pol_To_Cart(30,91,1) --> x = -0.00872620321864 y = -0.0151142273319 z =  0.999847695156
Cart_To_Pol(x,y,z) --> (30.0, 91.0, 1.0)

Pol_To_Cart(120,91,1) --> x = -0.0151142273319 y = 0.00872620321864 z =  0.999847695156
Cart_To_Pol(x,y,z) --> (120.0, 91.0, 1.0)

Dernière modification par yoshi (18-12-2013 12:31:30)


Arx Tarpeia Capitoli proxima...

Hors ligne

#9 18-12-2013 13:25:33

gflocea
Invité

Re : Asservissement d'un télépointeur

Salut,

((x<0 and y<0) or (x<0 and y>0)) revient à tester si x <0, mais malheureusement, ça ne paraît pas fonctionner si pan > 180.

A+

#10 18-12-2013 15:35:45

totomm
Membre
Inscription : 25-08-2011
Messages : 1 093

Re : Asservissement d'un télépointeur

Bonjour,

yoshi a écrit :

Bon, les habitués des calculs bizarroïdes, v'zêtes où ?
Me laissez pas tout seul !!!

@ yoshi : Vous vous tirez bien des explications un peu confuses de gflocea (pardon gflocea !) aussi toute autre intervention était inutile.

Des coordonnées polaires habituelles ([tex]\theta, \phi, R[/tex]) dans un repère orthonormé (X,Y,Z) aux valeurs (pan, tilt, distance), ou (gisement, site, distance), et réciproquement, les transformations sont classiques,
aux origines des paramètres près.
Si on retrouve 89 après une valeur de départ de 91, l'erreur se trouve dans l'écriture des fonctions, et non dans le processus de commande....
C'est bien ce que signale yoshi.

Dernière modification par totomm (18-12-2013 15:36:35)

Hors ligne

#11 18-12-2013 15:41:08

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Bonjour,

Exact...
Je tente un dessin avec un point A de la sphère qui se projette en H sur le plan (xOy) de base.
J'ai noté par xA, yA, zA les coordonnées de A

131218044214419175.jpg

Ce qui m'amène à deux questions :
* pourquoi corrigez-vous le gisement en ajoutant pi si < 0 ? Votre pan varie de 0 à 360°, pourquoi couloir ramener une valeur de 150 à 30 ?
   Empiler les correctifs me paraît malsain.
* pour vous, à quel intervalle doit appartenir pan pour que tilt soit > 90° ?
   Autrement dit, est-il cohérent de chercher des coordonnées telles que :
   Pol_To_Cart(200,80,1) ou Pol_To_Cart(200,100,1) ?

@+

[EDIT]
@totomm. Merci. En toute sincérité, je me sens un peu plus à l'aise maintenant.
Quand notre ami aura répondu aux deux questions ci-dessus, on y verra plus clair...

Dernière modification par yoshi (18-12-2013 15:45:12)


Arx Tarpeia Capitoli proxima...

Hors ligne

#12 18-12-2013 16:25:43

gflocea
Invité

Re : Asservissement d'un télépointeur

Bonsoir,

Pas de soucis, je suis bien conscient que mes explications ne sont pas très claires car j'ai un peu de mal à expliciter mon problème... Merci beaucoup Yoshi pour ta persévérance.

Voici les formules classiques que j'utilise :

pol2Cart :

                X = distance*sinus(gisement)*cosinus(site);
        Y = distance*cosinus(gisement)*cosinus(site);
        Z = distance*sinus(site);

cart2Pol :
        gisement    = atan2(X, Y) + (X<0? Math.PI:0) ;          //On ajoute PI si X<0
        site        = atan2(Z, sqrt(X*X+Y*Y));
        distance    = sqrt(X*X+Y*Y+Z*Z);

Je pense que l'application des formules classiques ne suffit pas et qu'il y a plusieurs cas particuliers à traiter. Le fait d'avoir un site > 90 n'est pas commun mais s'explique par la position inclinée vers le bas de mon pointeur.

Merci.

#13 18-12-2013 18:24:44

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Bonsoir,

Je repose donc mes questions (les formules figuraient dans le 1er post et je les ai transcrites en Python, ce qui permet mes essais) :
1. Pourquoi corrigez-vous le gisement en ajoutant pi si < 0 ? Votre pan varie de 0 à 360°, pourquoi vouloir ramener, par ex,  une valeur de 150° à 30° ? En quoi est-ce que 150° est gênant pour vous ?

2. Pour vous, à quel intervalle doit appartenir pan si tilt > 90° ?
   Autrement dit, est-il cohérent de chercher des coordonnées telles que :
   Pol_To_Cart(200,80,1) ?
   Pol_To_Cart(200,100,1) ?

Pas de soucis, je suis bien conscient que mes explications ne sont pas très claires car j'ai un peu de mal à expliciter mon problème...

Oh mais, c'est que ce n'est pas évident à expliquer d'un côté et à comprendre de l'autre pour qui n'a pas l'appareil sous les yeux...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#14 18-12-2013 21:20:13

gflocea
Invité

Re : Asservissement d'un télépointeur

Bonsoir,

Désolé pour ma réponse tardive.

1- Effectivement, l'ajout de PI à atan2() est une erreur. Précédemment, j'utilisais atan() qui nécessitait l’ajout de PI si X<0.
Par contre, on ne retrouve pas le pan initial lorsque l'on fait successivement pol2Cart puis cart2Pol quand le tilt est > 90°. Dans ce cas, j'ai remarqué qu'il fallait ajouter PI au pan obtenu à partir de atan2(X,Y).

2- Chacun des moteurs de la tourelle permet d'aller de 0 à 350° en pan et de 0 à 135° en tilt ; ces limitations sont des butées mécaniques. D'après moi, le pointeur décrit une sphère complète moins un cône correspondant aux 10° de limitation en pan.
Donc je peux obtenir n'importe quel couple pan/tilt tels que les exemples cités

Merci,
Bonne soirée.

#15 19-12-2013 15:36:16

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Bonjour,

Mes questions ont peut-être semblé bizarre, mais parce que quelque chose m'échappe depuis le début dans le fonctionnement du télépointeur et n'arrivais oas à mettre le cdoigt dessus...
Je reprends mon image retouchée et repose quelques questions.

131219041629930204.jpg

1. J'ai assimilé la tourelle du télépointeur à un point et je l'ai positionné en O.
    Cette supposition est-elle correcte ?
2. Supposons maintenant que l'axe de la tourelle est dans le plan vertical (xOz) et que je vise le point I de la sphère qui est sur l'axe [Ox
    L'élévation est 0. Correct ?
    Dire que l'élévation varie entre 0 et 135°, signifie-t-il que cette tourelle, tout en demeurant dans ce plan, va pouvoir en passant par la verticale, décrire un arc de cercle de 135° et avoir son axe pile sur la bissectrice de l'angle [tex]\widehat{I'OK}[/tex] ?
    Cela suppose qu'il y ait un avant et un arrière identifiables sur cette tourelle
3. Je reprends la position de l'axe de la tourelle sur (OI) en visant I.
    Pouvez-vous faire pivoter cette tourelle de 180° dans le plan horizontal(OIJ) et viser I' ? Elévation 0 ?
    De cette position, même question qu'au point 2. Peut-on faire pivoter cette tourelle, en restant dans le plan vertical, en passant vers la verticale, pour se retrouver à viser le point de la sphère sur la bissectrice de l'angle [tex]\widehat{IOK}[/tex] ?

Des réponses négatives me plongeraient dans la perplexité, à cause d'un problème de discontinuité...

Là, je pense que j'aurai cerné le problème.
Je pourrai alors me pencher sur tes fonctions et je suis persuadé que le problèmes sont dus à atan(2). Après tes réponses j'envisage de récrire en partie tes fonctions...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#16 19-12-2013 20:11:59

gflocea
Invité

Re : Asservissement d'un télépointeur

Bonsoir,

1.
Oui. On peut considérer le point 0 comme étant le croisement des axes pan/tilt donc un point invariant.

 
2 et 3 : oui

En fait il n'y a pas de limitation, la sphère est totalement décrite sauf un cône correspondant aux 10° en pan (0..350°). Le comportement n'est pas intuitif car si l'on veut suivre une ligne droite horizontale par exemple, il faut faire varier le pan mais aussi le tilt.

Il faut l'imaginer à "tête en bas" faisant un angle 120° par rapport au plan horizontal.  Par exemple, à partir de sa position ci-dessous (B), on remonte un peu le tilt vers (A)  puis on fait un 180° en pan et on peut viser en (C). En position B à 120° de l'horizontal, le télé pointeur est en butée mécanique en tilt. Toutes proportions gardées, le croisement des axes de rotation peut être considéré en haut de \B.
Si on le fait tourner en pan quand il est en butée en tilt (B), la direction visée est invariante.

                     C

              _______________hrz
A             \
                 \
                   \B

Merci,
Bonne soirée.

PS : désolé, je ne parviens à insérer une image ou schéma qui serait plus explicite.

#17 19-12-2013 20:34:30

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Bonsoir,

Pour insérer une image, il te faut d'abord l'uploader chez un hébergeur d'images :
casimages.com, hiboox, imageshack.us, photobucket... ,lequel te fournira quand ce sera fait un code pour un forum que tu insères dans ton post où tu veux...
Va voir casimages, c'est le plus clair : c'est là-bas que j'héberge les miennes.

Je relirai tes explications demain.

@+

[EDIT] Alors s'il n'y a pas de limitation pourquoi ces 135° ?


Arx Tarpeia Capitoli proxima...

Hors ligne

#18 19-12-2013 20:51:37

gflocea
Invité

Re : Asservissement d'un télépointeur

Quand je dis qu'il n'y a pas de limitation, je veux souligner le fait que les combinaisons pan/tilt permettent de décrire quasiment l'intégralité d'une sphère.

Voici deux images montrant les débattements en pan/tilt

131220084420348350.jpg131220084623122547.jpg


A+

#19 20-12-2013 16:46:02

gflocea
Invité

Re : Asservissement d'un télépointeur

Bonsoir Yoshi,

Je serai "coupé du monde" pendant quelques jours.

Bonnes fêtes de fin d'année

#20 22-12-2013 11:33:04

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Bonjour,

Joueuses fêtes à tous !
Bon, j'ai virtuellement terminé...
Je ne mets plus d'un changement de repère.
Je suis parti du principe quen vu les dessins, ton télépointeur devait être capable de fournir des coordonnées réelles, absolues...
Donc,  l'angle du gisement
* soit de 0° à +175°
* soit de 0° à -175°
et l'angle du site
* soit de 0 à 90°
* soit de 0 à -45° (et donc toute mesure impossible sur l'intervalle ]-135°  ; -45°[.
J'ai donc décidé que
- les gisements seraient exprimés par un nombre compris entre 0 et + 175°, soit entre 0 et -175°  comme je ne sais pas ce que tu appelles butée : j'ai prévu un avertissement sur les intervalles ]175° ; 180°] et [-180° ; -175°[
- toutes les cotes de l'hémisphère nord seraient positives
- que toute la partie est de cet hémisphère nord auraient des sites compris entre 0 et 90° : les sites sont affichés de 0 à 180°, les calculs sont faits pour la partie ouest avec l'angle symétrique par rapport à [Oz, soit dans le cas du dessin post #15 l'angle [tex]\widehat{HOA}[/tex] même si l'affichage indique l'angle [tex]180-\widehat{HOA}[/tex]
Pour l'hémisphère sud avertissement prévu pour un site sur l'intervalle ]-135° ; -45°[

Quelques sorties pour l'hémisphère nord :

Pol_To_Cart(-160,91,1) --> x = -0.0163998975441  y = -0.00596907455106  z =  0.999847695156
Cart_To_Pol(x,y,z) --> -160.0  91.0  1.0

Pol_To_Cart(120,80,1) --> x = -0.0868240888335  y = 0.15038373318  z =  0.984807753012
Cart_To_Pol(x,y,z) --> 120.0  100.0  1.0

Pol_To_Cart(120,100,1) --> x = -0.0868240888335  y = 0.15038373318  z =  0.984807753012
Cart_To_Pol(x,y,z) --> 120.0  100.0  1.0

Pol_To_Cart(60,75,1) --> x = 0.129409522551  y = 0.224143868042  z =  0.965925826289
Cart_To_Pol(x,y,z) --> 60.0 75.0 1.0

Pol_To_Cart(120,91,1) --> x = -0.00872620321864  y = 0.0151142273319  z =  0.999847695156
Cart_To_Pol(x,y,z) --> 120.0  91.0  1.0

2e série : avec mes présupposés, Pol_To_Cart(120,80,1), n'était pas une demande cohérente.
Avec 120° de gisement, le point H dessin post #15, devait appartenir au 2e quadrant du repère du plan du base, avec x<0 et y>0. Le point correspondant de la sphère appartenait à la partie ouest de son hémisphère nord : le site correspondant aurait dû être 100 et non 80, comme le confirme la 3e série...

Je teste l'hémisphère sud et j'attends tes remarques ensuite pour corriger quelque chose.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#21 29-12-2013 09:43:18

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Bonjour,

Sorties dans l'hémisphère sud :

Pol_To_Cart(120,-50,1) --> x = -0.321393804843 y = 0.556670399226 z =  -0.766044443119
Cart_To_Pol(x,y,z) --> ! WARNING ! Zone non couverte !
120.0 -130.0 1.0

Pol_To_Cart(120,-150,1) --> x = -0.433012701892 y = 0.75 z =  -0.5
Cart_To_Pol(x,y,z) --> 120.0 -150.0 1.0

Pol_To_Cart(-30,-30,1) --> x = 0.75 y = -0.433012701892 z =  -0.5
Cart_To_Pol(x,y,z) --> -30.0 -30.0 1.0

Pol_To_Cart(-120,-150,1) --> x = -0.433012701892 y = -0.75 z =  -0.5
Cart_To_Pol(x,y,z) --> -120.0 -150.0 1.0

Je mets mon code dans la partie programmation.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#22 07-01-2014 10:43:04

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Bonjour,

Apparemment, gflocea est toujours coupé du monde...
Dommage j'aurais bien aimé avoir un retour et procéder aux ajustements nécessaires...

Pas très encourageant pour le dévouement !

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#23 10-01-2014 08:29:14

gflocea
Invité

Re : Asservissement d'un télépointeur

Bonjour,

Merci beaucoup Yoshi pour ton travail et pour ton aide précieuse. Désolé de ma réponse (très) tardive.
Il faut que je teste avec le matériel mais à première vue, sur le papier cela donne des résultats encourageants.
Je te tiens au courant dès que j'ai pu tester.

A+

#24 11-01-2014 15:46:44

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 391

Re : Asservissement d'un télépointeur

Salur,

Ok. J'attendrai tes retours.
Mon cahier des charges est-il clair  ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#25 18-01-2014 13:21:43

gflocea
Invité

Re : Asservissement d'un télépointeur

Bonjour Yoshi,

Ton travail m'a permis de corriger mes erreurs de changement de repère et de transformations géométriques. Tout fonctionne.

Merci beaucoup.

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le troisième mot de cette phrase?

Pied de page des forums