Trigonométrie et Programmation [Non réglé]

Bonjour,
Je travaille actuellement sur un petit programme qui nécessite l'utilisation des fonctions trigonométriques inverses (arccos, arcsin...) mais je n'arrive pas à les trouver sur Arduino. J'ai cherché sur Internet, il semble y avoir des librairies pour cela mais je n'ai pas réussi à me les procurer. Quelqu'un aurait-il déjà eu affaire à ce type problème et pourrait m'aider ?
Merci pour vos réponses
Bonne Journée, Théo

Bonjour

#include <math.h>

avr-libc: <math.h>: Mathematics

Ceci compile (mais pas essayé) :

#include <math.h>

void setup( void )
{
  float res1 = acos( 0.5 );
  float res2 = asin( 0.5 );
}

void loop( void )
{
}

Toutefois il faut être réaliste : l’ATmega n’est qu’un petit 8 bit et ca lui coute cher de faire ce genre d’opération. Faut pas être pressé.

Merci, le problème c'est que je dois pouvoir traiter ces calculs très rapidement... Et je ne sais pas comment faire à part en utilisant une table des sinus/cosinus mais qui serait peu précise.

Ah ben tu peux pas avoir le beurre et l’argent du beurre (la crémière, je m’la garde).

As tu déjà vérifié si les bibliothèques standard ci-dessus sont ok ou pas vis à vis de tes contraintes de précision et de vitesse ?

Quelle précision/vitesse cherches tu et pourquoi faire ?

Je n’ai pas encore testé les librairies. Pour faire simple, avec deux capteurs ultrasons, je détermine les distances à un émetteur mobile, et à partir de là j’oriente les capteurs pour obtenir un triangle isocèle ( dont la base est connue, c’est le segment entre les deux capteurs). L’orientation des capteurs nécessite de travailler dans des triangles et donc des angles (Al-Kashi, Théorème des sinus). Mon but étant d’avoir le triangle isocèle instantanément pour que même lorsque l’émetteur bouge le triangle reste isocèle. L’application serait la détection d’une personne possédant un émetteur par une caméra, avec le triangle isocèle, le sujet est toujours centré par la caméra.

Si la distance vis à vis du sujet est grande par rapport à la distance entre les deux capteurs (et surtout si j'ai tout compris), l'écart de mesure de distance divisé par la distance entre les capteurs va correspondre au sinus de l'angle d'erreur de pointage. En effet, si un angle theta est faible, tu peux approximer sin(theta) à theta (et par la même occasion, tu auras theta ~ asin(theta)).
Bref, ça t'évite d'avoir à calculer un arcsin: ta différence de mesure de distance divisé par la distance entre les capteurs est en fait très proche de l'angle que tu cherches.
Quand l'angle est grand ça devient faux mais ce n'est pas très grave car j'imagine que tu auras un asservissement pour maintenir l'erreur de pointage très faible ; donc à part à l'initialisation du système, ton erreur de pointage sera toujours faible.

Merci pour ta réponse, cela à l'air super, par contre au niveau maths quelles lois utilises-tu pour affirmer que l'écart entre les deux longueurs (les deux cotés du triangle) divisé par la base est égale à sin(thêta) ? Je ne pense pas avoir bien compris.

Je me suis fait un croquis dans la tête. Tu en as fait un de ton côté ?
Ce que je te dis est une approximation aux petits angles, ce n’est pas rigoureusement correct mais a priori ça sera largement suffisant pour ce que tu veux faire (si j’ai bien compris, encore une fois ; pour être certain il faudrait que tu postes un schéma montrant tes deux capteurs, la cible et les différents segments qui les relient).

Voilà un petit croquis pour expliquer clairement le problème:

Pourquoi ne pas monter le récepteur directement sur un axe d'un moteur pas à pas en rotation permanente (comme un radar) ? Tu aurais le bon angle directement

Capteur à ultrason ?

Au mieux, ils travaillent déjà avec un angle approximatif de 15 degrés dans le meilleur des cas, pour une distance toute relative d'environ quelques mètres pour les meilleurs candidats.

d vaudrait combien environ ???

@+

Zoroastre.

@B@tto, la caméra est aussi montée sur le pivot donc si je le fais tourner en permanence mon image risque de ne pas être top.

Le but serait de pouvoir faire facilement un suivi de puis un point fixe, exemple un skieur au niveau d'une bosse ou autre.
d est environ égale à 20cm.

C'est, il me semble, un peu trop ambitieux pour une arduino. C'est déjà assez galère de suivre un mobile à quelques centimètres sans avoir de mouvement oscillant...

OK, c'est bien ce que j'avais compris. Si tu traces un segment qui part du récepteur de gauche vers la droite "L2" et qui "isocèlise" le triangle, l'angle entre ce segment et l'horizontale devrait être proche de theta (ou peut-être de 2 x theta).
Mais je pense que pour l'instant les histoires d'angles sont tes derniers problèmes. Je ne suis pas un spécialiste des capteurs à ultrasons mais il me semble qu'ils fonctionnent en mesurant le temps mis aller-retour entre l'émetteur et le récepteur, qui sont normalement positionnés au même endroit. Ici, si j'ai bien compris, l'émetteur est en mouvement et le récepteur est fixe. Pourquoi pas, sauf que tu n'auras pas moyen de savoir quand est parti le signal de l'émetteur, donc impossible de connaître le temps mis entre l'émetteur et le récepteur.
Mais bon, tu as peut-être déjà résolu ce problème. Si c'est le cas, je serais curieux de savoir comment.
En tous cas, si je devais faire ce genre de projet (très intéressant d'ailleurs) je m'orienterais plutôt vers du traitement vidéo (reconnaissance d'un objet en mouvement dans une image) qui n'est pas à la portée d'un Arduino Uno mais sans doute plus des derniers petits nouveaux de la gamme ou d'autres cartes style Raspberry Pi.

Cherches "soloshot" il y a des sujets voisins de ce que tu veux faire.

Re-Bonjour à tous, après une semaine d'absence, je suis de retour et en plus avec des réponses.

@Sigma, quand tu m'as demandé comment je faisais pour mesurer le temps, je me suis rendu compte que je n'avais pas non-plus de solution. J'ai donc cherché et je pense que si on envoie une onde avec une fréquence différente avant l'onde de mesure, on peut réussir en connaissant l'intervalle de temps entre chaque salve à déterminer le temps mis pour parcourir la distance émetteur-récepteur. Cependant je n'ai jamais testé cette technique et je ne suis pas sûr qu'elle fonctionne.

Néanmoins, je pense que je vais changer de méthode pour détecter mon sujet car ce problème + la trigo cela fait un peu trop. Je pense utiliser des comparateurs pour déterminer lequel de mes deux capteurs reçoit l'onde de plus grande intensité et ainsi orienter le pivot pour que chaque capteur reçoive approximativement la même chose. Qu'en pensez-vous ?

Merci pour vos réponses, cela fait plaisir !

Comment ferais-tu pour mesurer l'intensité de l'onde ?

D'après ce que j'ai lu, un capteur ultrason est capable de faire cela, mais si vous avez d'autres idées, je suis complètement ouvert. :wink:

Marsthor:
D’après ce que j’ai lu, un capteur ultrason est capable de faire cela, mais si vous avez d’autres idées, je suis complètement ouvert. :wink:

Les récepteurs étant proches l’écart d’amplitude sera minime.
Par contre tu pourrais mesurer la phase entre les signaux qui sortent des deux récepteurs. Lorsqu’ils pointent vers la source, les signaux sont parfaitement en phase Lorsqu’ils sont tournés dans un sens ou dans l’autre par rapport à la source la phase change.

Merci de ta réponse, juste peux-tu m'expliquer comment cela marche? Je ne connais absolument pas cette méthode.