khancyr / TTGO_T_BEAM

GNU General Public License v3.0
16 stars 15 forks source link

Mesure de distance entre 2 points instable : beacon envoyé sans raison #1

Closed ElekPat closed 4 years ago

ElekPat commented 4 years ago

Bonjour,

j'ai réalisé votre exemple sur une carte Lolin32 Lite avec un module GPS NEO6-M externe et tout semble fonctionner correctement excepté que des beacons sont envoyés sporadiquement car la distance parcourue est reportée comme > 30m (mon montage est immobile dans le jardin).

J'ai inspecté le code et je vois un problème, comme _travelled_distance est signé, il faudrait faire la comparaison sur la valeur absolue:

bool has_pass_distance() const {
    return (abs(_travelled_distance) >= FRAME_DISTANCE_LIMIT);
}

Mais ce n'et pas le seul apparemment, avec une instrumentation de votre code

void set_lat_lon(double lat, double lon) {
    char buffer[80];
    _old_latitude = _latitude;
    _old_longitude = _longitude;
    _latitude = lat * 1e5;
    _longitude = lon * 1e5;

    _travelled_distance = distanceBetween(_latitude, _longitude, _old_latitude, _old_longitude);
    if (_travelled_distance != 0) {
        sprintf(buffer, "DIST : %8d", _travelled_distance);
        Serial.println(buffer);
        sprintf(buffer, "Old LAT: %8d", _old_latitude);
        Serial.println(buffer);
        sprintf(buffer, "LAT : %8d", _latitude);
        Serial.println(buffer);
        sprintf(buffer, "Old LNG: %8d", _old_longitude);
        Serial.println(buffer);
        sprintf(buffer, "LNG : %8d", _longitude);
        Serial.println(buffer);
    }
}

Voilà ce que j'obtiens à la console série:

Setting Home Position ........

plus tard DIST : 74424 m Old LAT: 4884308 LAT : 4884308 Old LNG: 199616 LNG : 199617

Send beacon

.......

DIST : 111226m Old LAT: 4884308 LAT : 4884309 Old LNG: 199617 LNG : 199617

Send beacon

Le dernier digit des latitudes et/ou longitude fluctue de +/-1, pas surprenant, mais la distance correspondante reportée est fausse (plusieurs km)?

Enfin, votre code enregistre (dans _old_longitude et _old_latitude a chaque appel de la méthode set_lat_lon) la longitude/latitude à chaque trame GPS reçue, hors il me semble que le texte de loi demande à ce qu'un beacon soit émis si la distance parcourue depuis l'envoi du précédant beacon émis est supérieure à 30m, donc on devrait mémoriser _old_longitude et _old_latitude à chaque envoi de beacon et non pas chaque trame GPS.

Merci encore pour votre travail. Bien cordialement, Patrick

ElekPat commented 4 years ago

Bonjour,

je pense avoir trouvé pour le calcul de distance (problème sur les paramètres passés à la méthode distanceBetween qui attend des doubles en degrés, vous aviez les valeur int en degrés*100000) :

void set_lat_lon(double lat, double lon) {
    _latitude = lat * 1e5;
    _longitude = lon * 1e5;

    _travelled_distance = distanceBetween(lat, lon, (double)(_old_latitude / 1e5), (double)(_old_longitude / 1e5));
}

et pour la mémorisation de la longitude/latitude:

void set_home_lat_lon(double lat, double lon) {
    _home_latitude = lat * 1e5;
    _home_longitude = lon * 1e5;
    _old_latitude = _home_latitude; // on mémorise lat et lon dans old afin d'éviter d'avoir une distance très grande lors du premier appel de distanceBetween()
    _old_longitude = _home_longitude;
}

void set_last_send() {
    _last_send = std::chrono::high_resolution_clock::now();
    _travelled_distance = 0;
    _old_latitude = _latitude; // on met à jour old_lat et old_lon à chaque envoi de beacon
    _old_longitude = _longitude;
}

Bien cordialement, Patrick

khancyr commented 4 years ago

Bonjour,

Effectivement, je me suis trompé sur le calcul de distance parcouru ... Je n'ai pas mis la dernière version ... L'analyse est bonne, j'ai pas mis à jour les données GPS sur les bonnes valeurs ... Pour l'actualisation de la variable _travelled_distance, il manque un plus. Mon interprétation est qu'ils veulent une estimation cumulative de la distance parcouru entre deux envoies. Mais je pense que la version entre deux points d'envoi doit aussi être valide même si moins restrictive.

Merci pour le rapport, je vais corrigé le bug dans la journée !

khancyr commented 4 years ago

J'ai mis à jour le code. Maintenant ça doit être bon.

ElekPat commented 4 years ago

Merci