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.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.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°.
Je pensais travailler en tilt entre -67.5° et 67.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

.