Go Down

Topic: Petit problème de virgule et soustracion (Read 617 times) previous topic - next topic

pascal74

Voilà le petit bout de code tout simple qui me pose problème.

Code: [Select]
float LOCAL_PI = 3.1415926535;

void setup() {
Serial.print("A> (LOCAL_PI*Long2/180.000000): ");Serial.println((LOCAL_PI*Long2/180.000000000),9);

Serial.print("B> (LOCAL_PI*Long1/180.000000): ");Serial.println((LOCAL_PI*Long1/180.000000000),9);

Serial.print("A-B>");Serial.println(((LOCAL_PI*Long1/180.000000000)-(LOCAL_PI*Long1/180.000000000)),9);
}

Le moniteur série m'affiche comme résultat ceci :

A> (LOCAL_PI*Long2/180.000000): 0.100979304
B> (LOCAL_PI*Long1/180.000000): 0.100968968
A-B>0.000000000


Le résultat de A> et B est conforme mais je ne comprend par pourquoi A-B ne me donne pas 0,000010336  :smiley-confuse:

kamill

Bonjour,

Ce ne serait pas:
Code: [Select]
Serial.println(((LOCAL_PI*Long2/180.000000000)-(LOCAL_PI*Long1/180.000000000)),9);
au lieu de
Code: [Select]
Serial.println(((LOCAL_PI*Long1/180.000000000)-(LOCAL_PI*Long1/180.000000000)),9);
comme tu as écrit?

pascal74

#2
Jan 15, 2017, 09:14 pm Last Edit: Jan 15, 2017, 09:21 pm by pascal74
Ooooops  :smiley-red: Voilà qui est corrigé (merci) mais qui ne résous pas mon problème suivant concernant le calcul de distance en mètres entre 2 points gps dont voici l'énoncé du sujet :

Code: [Select]
#include <SoftwareSerial.h>

const float rayonTerre = 6378137.000000000000000;
float LOCAL_PI = 3.1415926535;

/* Coordonnées GPS */
float Lat1   = 43.078658;  // Latitude en degrés
float Long1  = 5.785095;  // Longitude en degrés
float Lat2   = 43.078746; // Latitude position 2 en degrés
float Long2  = 5.785688;  // Longitude position 2 en degrés

void setup() {
  Serial.begin(115200);
Serial.println(rayonTerre * acos((cos(LOCAL_PI*Lat1/180.000000000000000) * cos(LOCAL_PI*Lat2/180.000000000000000) * cos((LOCAL_PI*Long2/180.000000000000000)-(LOCAL_PI*Long1/180.000000000000000))) +  (sin(LOCAL_PI*Lat1/180.000000000000000) * sin(LOCAL_PI*Lat2/180.000000000000000))),15);
}


Le résultat affiché par la console me donne : 2202.160156250000000 (donc en mètre puisque rayonTerre est exprimé en mètres).

Dans GoogleEarth, Lorsque je calcul (avec la réglette) la distance entre ces 2 points il m'affiche une distance de 49.39 mètres !


ChPr

Les formules ne sont peut-ête pas bonnes. Moi j'ai ça qui fonctionne très bien :

Code: [Select]
double angAB = acos(sin(PI / 2 - latA) * sin(PI / 2 - latB) * cos(lonB - lonA) + cos(PI / 2 - latA) * cos(PI / 2 - latB));
        if (lonA == lonB) {
            if (latB >= latA)
                capAB = 0;
            else
                capAB = PI;
        } else {
            capAB = signum(lonB - lonA) * acos((cos(PI / 2 - latB) - cos(angAB) * cos(PI / 2 - latA)) / (sin(PI / 2 - latA) * sin(angAB))) + 2 * PI * ((1 - signum(lonB - lonA)) / 2);
        }
        distAB = angAB * GPS.rEqu;


Ça vous donne aussi le cap pour le même prix  ;) .

Mais est-ce que votre bibliothèque de GPS ne fournit pas une fonction effectuant ce calcul ?

Cordialement.

Pierre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

_pepe_

#4
Jan 15, 2017, 11:00 pm Last Edit: Aug 19, 2018, 02:58 pm by _pepe_
Supprimé

ChPr

En regardant les formules que je viens de vous donner, je m'aperçois que j'ai joué du PI/2. Je ne sais plus pour quelle raison je l'avais fait. En tous cas, vous pouvez remplacer :

cos(PI/2-x) par sin (x)
et
sin(PI/2-x) par cos(x)

Cordialement.

Pierre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

ChPr

Désolè, les formules que je vous ai données viennent d'un calcul que je fais en JAVA où les doubles sont de vrais doubles. J'ai refais le calcul avec vos valeurs et des float : on est complètement dans les choux : _pepe_ a entièrement raison : on ne peut pas faire de calcul si les différences angulaires sont trop petites devant la précision de calcul trigonométrique avec des float.

Par contre, dans mon application GPS, j'utilise les formules données par la bibliothèque TinyGPS. Elles fonctionnent bien même pour de faibles distances (quelques mètres). Avec vos valeurs, j'obtiens :

distance :49.12 m
cap : 78.63 °

C'est ce qu'on trouve avec Google Earth (Bon vent ;) )

Cordialement.

Pierre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

_pepe_

#7
Jan 16, 2017, 01:16 am Last Edit: Aug 19, 2018, 02:58 pm by _pepe_
Supprimé

_pepe_

#8
Jan 16, 2017, 01:29 am Last Edit: Aug 19, 2018, 02:58 pm by _pepe_
Supprimé

pascal74

Merci à tous pour votre aide. L'objectif de ce calcul est de définir une alarme de mouillage pour un bateau. Par conséquent la distance du point 2 vis à vis du point 1 sera systématiquement courte. Sans quoi il pourrait y avoir un problème en cas de hauts fonds à proximité.

_pepe_

#10
Jan 16, 2017, 10:02 am Last Edit: Aug 19, 2018, 02:57 pm by _pepe_
Supprimé

pascal74

La librairie Adafruit que j'utilisais n'intégrais pas de fonction de calcul comme celle fournies par Tinygps (merci pour l'info à ChPr).

Du coup je l'ai intégrée et maintenant le calcul est correct aussi bien pour les petits que les longs écarts.

Merci à tous pour votre réactivité et entraide.

Go Up