Il y a un an, j'ai
décrit une station météo avec un instrument de mesure pour la direction et la vitesse du vent. Sur la base de l'expérience de deux saisons d'exploitation, certains changements et améliorations y ont été apportés, qui y sont partiellement décrits dans des ajouts au texte principal.
L'un de ces changements concerne le calcul de la direction moyenne du vent. Ă ma grande surprise, je n'ai rien trouvĂ© de raisonnable sur ce sujet sur le Web, seulement sur l'un des forums les gens eux-mĂȘmes ont presque pensĂ© Ă la mĂ©thode de la moyenne vectorielle (mais seulement presque, ils n'ont pas rĂ©solu le problĂšme en termes gĂ©nĂ©raux). Par consĂ©quent, j'ai trouvĂ© utile de mettre ce sujet dans une publication sĂ©parĂ©e - tout Ă coup, quelqu'un d'autre vous sera utile. La mĂ©thode peut ĂȘtre utilisĂ©e pour faire la moyenne de n'importe quelle quantitĂ© de vecteur, pas seulement le vent ou le courant.
Notez que la mĂ©thode canonique pour effectuer des mesures mĂ©tĂ©orologiques du vent est la suivante: faire la moyenne du vecteur (c'est-Ă -dire Ă la fois la vitesse et la direction) sur 10 minutes (en Russie et dans la plupart des pays du monde, il est acceptĂ© de cette façon, disent-ils, aux Ătats-Unis et dans certains autres pays diffĂ©remment). Dans ce cas, les mesures sont prises Ă une hauteur de 10 m de la surface de la Terre. Assurer tout cela dans des conditions de genou est assez difficile: on ne peut pas atteindre une hauteur de 10 m dans un espace ouvert (ne pas construire de tour spĂ©ciale, loin des maisons et des arbres qui faussent le vent), et la tempĂ©rature avec l'humiditĂ© doit, au contraire, ĂȘtre mesurĂ©e Ă l'ombre et Ă proximitĂ© de la surface. Le capteur portable est transformĂ© d'un appareil compact en un systĂšme de mesure complet (voir photo du territoire d'une station mĂ©tĂ©o de la ville de Kirov).

Et le rĂ©sultat - en moyenne 10 minutes - sera peu informatif. PrĂšs de la surface, le vent est beaucoup plus en rafales qu'en altitude, en 10 minutes, il peut changer de vitesse et de direction vingt fois, et les informations sur ces rafales sont beaucoup plus informatives pour la personne moyenne que la valeur moyenne. Permettez-moi de vous rappeler que le capteur de vitesse montre ici la valeur maximale de quatre mesures par cycle de 8 s, et cela s'est avĂ©rĂ© ĂȘtre le bon choix (en fait, nous avons obtenu un capteur d'ondulation au lieu du capteur de vitesse moyenne).
Mais la girouette s'est avĂ©rĂ©e plus morose que le capteur de vitesse. Selon l'algorithme initial de ma station mĂ©tĂ©orologique (qui a Ă©tĂ© sĂ©lectionnĂ© en fonction de l'Ă©conomie d'Ă©nergie maximale possible), la direction a Ă©tĂ© mesurĂ©e une fois par cycle, c'est-Ă -dire que mĂȘme les pulsations n'ont pas fonctionnĂ©: il y avait des Ă©chantillons alĂ©atoires du processus continu de suspension de la girouette d'avant en arriĂšre avec une frĂ©quence beaucoup plus grande qu'une fois tous les 8 et plus de 16 secondes.
Par consĂ©quent, il a Ă©tĂ© dĂ©cidĂ© de faire la moyenne de la direction du vecteur vitesse par cycle, en prenant des mesures toutes les deux secondes et en calculant la moyenne. Et le problĂšme n'est pas qu'il puisse ĂȘtre rĂ©solu avec un demi-coup de pied - les valeurs de direction ne forment pas un tableau pair de nombres qui peuvent ĂȘtre directement ajoutĂ©s et divisĂ©s (un mot est un vecteur, pas un scalaire de conneries). Habituellement, un exemple est donnĂ© avec des valeurs de 1 degrĂ© et 359 degrĂ©s: il est facile de comprendre qu'en moyenne ce sera exactement 360 (ou 0, pas de diffĂ©rence), mais l'arithmĂ©tique ordinaire donnera le nombre 180 degrĂ©s.
Inutile d'inventer quoi que ce soit - tout a dĂ©jĂ Ă©tĂ© inventĂ© avant vous. Le problĂšme est rĂ©solu par la mĂ©thode de la moyenne vectorielle, bien connue de ceux qui ont traitĂ© des mesures de vents ou de courants. La mĂ©thode est essentiellement trĂšs simple: comme nous ne pouvons pas faire la moyenne directe des angles, alors faisons la moyenne des projections du vecteur sur l'axe des coordonnĂ©es, qui, par dĂ©finition, est une valeur scalaire, c'est-Ă -dire peut ĂȘtre soumise Ă une arithmĂ©tique ordinaire sans question.
Les projections du vecteur vent actuel W '(l'apostrophe joue le rĂŽle d'un exposant) sur les axes X et Y sont wx = Wa âą cos (α) et wy = Wa âą sin (α), oĂč Wa est le module du vecteur (valeur de vitesse), et α - la valeur de l'angle entre le vecteur et l'axe des coordonnĂ©es nulles. Si nous faisons la moyenne de ces valeurs des projections, puis reconvertissons les moyennes en un vecteur, alors nous obtenons la vraie valeur de la vitesse et de la direction moyennes du vent.
Remarque pour particuliĂšrement corrosifPour une moyenne complĂštement correcte de cette maniĂšre, il est nĂ©cessaire que la valeur de Wa (valeur de vitesse) soit mesurĂ©e strictement simultanĂ©ment avec la valeur d'angle. En pratique, cela ne doit ĂȘtre surveillĂ© que si les pĂ©riodes de fluctuations importantes de l'amplitude du dĂ©bit sont infĂ©rieures ou comparables au temps des mesures. Pour le vent (et pour presque tous les cas d'Ă©coulement naturel de l'eau), il n'est gĂ©nĂ©ralement pas nĂ©cessaire de suivre, car le temps de mesure pour nous est au maximum d'une fraction de seconde, et les pulsations importantes du vent, bien sĂ»r, durent plus longtemps. Nous pouvons nĂ©gliger les inhomogĂ©nĂ©itĂ©s Ă haute frĂ©quence du flux, car elles n'affectent rien: l'inertie des corps physiques rĂ©els (y compris les capteurs) est beaucoup plus grande que ces inhomogĂ©nĂ©itĂ©s, et nous ne les ressentons tout simplement pas - un morceau de papier tremblera, mais rien de plus. Dans les cas extrĂȘmes, ils se prĂ©sentent sous la forme d'un petit bruit alĂ©atoire qui n'affecte pas de maniĂšre significative la qualitĂ© des mesures.
Cette merveilleuse mĂ©thode (appelons-la moyennage vectoriel complet) a un inconvĂ©nient cardinal d'un point de vue pratique: en l'absence d'un sujet de mesure (c'est-Ă -dire lorsqu'elle est complĂštement calme, ce qui est un cas assez courant), elle donne un rĂ©sultat mathĂ©matiquement incorrect: puisque la vitesse du vent est nulle, alors et les deux projections sont Ă©gales Ă zĂ©ro, ce qui ne peut pas l'ĂȘtre (puisque sin et cos sont des fonctions complĂ©mentaires). Plus prĂ©cisĂ©ment, c'est possible, mais il est fondamentalement impossible d'extraire des informations d'une telle situation. Que voulez-vous montrer Ă l'Ă©cran? Pour ĂȘtre honnĂȘte, je ne connais toujours pas la bonne façon de contourner cette situation (dans les dĂ©bitmĂštres que j'ai conçus, les cycles de calcul de la moyenne Ă©taient des heures, et on pensait qu'au moins une certaine agitation se produirait).
Mais dans notre cas, la tĂąche, heureusement, est plus facile - nous n'avons pas besoin de faire la moyenne de la vitesse, et nous pouvons le faire avec des projections uniques du vecteur, sans prendre en compte l'ampleur de son module. En d'autres termes, on peut fonctionner avec des sinus et cosinus purs, qui ne prennent jamais zĂ©ro Ă la fois: mĂȘme quand il n'y a pas de vent, une girouette gelĂ©e dans l'immobilier montre une certaine direction. Nous appelons une telle mĂ©thode un vecteur simplifiĂ© faisant la moyenne d'une direction (peut-ĂȘtre qu'elle a un nom officiel, mais je ne suis pas au courant).
Il n'y avait plus qu'une seule difficultĂ©: reconvertir les valeurs de projection moyennes calculĂ©es en valeur d'angle. Pour cela, la fonction α = arctan (sin (α) / cos (α)) est gĂ©nĂ©ralement utilisĂ©e, mais si nous calculons Ă travers les fonctions trigonomĂ©triques inverses, alors il est plus simple de prendre simplement arcos (cos (α)) (ou arcsin (sin (α)), de toute façon), et pour complĂ©ter ce rĂ©sultat pour obtenir un cercle complet (c'est-Ă -dire de 0 Ă 359 degrĂ©s), en analysant les signes des projections, il faut quand mĂȘme le faire: toutes les fonctions inverses donnent le rĂ©sultat dans un demi-cercle (de 0 Ă 180 ou de -90 Ă +90). (Voir UPD Ă ce sujet Ă la fin de l'article.)
Nous formalisons tout ce qui précÚde en un véritable algorithme (en référence à Arduino). Pour commencer, nous lirons les indications de direction non pas à chaque cycle, mais à chaque mesure (aprÚs la valeur de la fréquence de l'anémomÚtre). Nous convertirons le résultat en code Gray (dans notre pays, il a été désigné comme wind_Gray de type octet, voir
cette publication ) en un code binaire normal, et, comme la frĂ©quence de l'anĂ©momĂštre, nous le placerons dans un tableau global, que nous dĂ©clarerons wDirAvr [4], oĂč 4 est le nombre de mesures dans le cycle. Nous ne peindrons pas la conversion du code Gray Ă quatre chiffres en code binaire - cela peut ĂȘtre fait de plusieurs maniĂšres Ă la discrĂ©tion du programmeur et est dĂ©crit dans toute rĂ©fĂ©rence.
Ce code binaire prendra des valeurs de 0 à 15, et nous convenons de compter les angles, non pas comme des géographes / topographes / navigateurs décalés, mais comme des gens normaux qui ont étudié la trigonométrie à l'école - dans le sens antihoraire. Autrement dit, si le nord correspond à la valeur zéro, alors 90 degrés ne sont pas l'est, comme dans les «décalés», mais l'ouest. Comme nous avons 16 gradations de direction, nous devons multiplier la valeur de code par 22,5 (360/16) pour obtenir la direction en degrés ordinaires de l'arc.
Maintenant, l'algorithme réel de moyenne vectorielle simplifiée de la direction à partir de 4 valeurs de code:
. . . . . float wSin=0; // sin float wCos=0; // cos float wind_Rad; // for (byte i=0; i<4; i++){ wind_Rad= ((float(wDirAvr[i])*22.5)*M_PI/180); // wSin=wSin+sin(wind_Rad);// sin wCos=wCos+cos(wind_Rad);// cos } // wSin=wSin/4;// sin â , wCos=wCos/4; // cos wind_Rad = acos(wCos); // arccos if (wSin<0) wind_Rad=2*M_PI-wind_Rad; // sin int wind_G = round ((wind_Rad*180/M_PI)/22.5); // 0-15 . . . . .
La derniĂšre ligne, nous convertissons la moyenne, exprimĂ©e en radians, en moyenne, exprimĂ©e dans notre code de 0 Ă 15. Vous pouvez ensuite la reconvertir en code Gray, puis vous n'avez mĂȘme pas besoin de changer le programme dans le module principal pour afficher la direction.
Voici, en fait, tout l'algorithme. J'avais peur que le calcul des cosinus-arcsines ralentisse le contrĂŽleur Arduino faible (par les temps 32 bits d'aujourd'hui), mais rien ne s'est passĂ©: il a avalĂ© le code sans mĂȘme clignoter ... une LED, probablement.
UPD : Pour l'auteur, l'algorithme fonctionne sous cette forme pendant plusieurs mois sans Ă©checs. Cependant, les commentateurs m'ont conduit Ă une erreur possible, quoique extrĂȘmement improbable dans la pratique: si les donnĂ©es contiennent deux groupes de mesures qui sont Ă environ 180 degrĂ©s l'un de l'autre prĂšs de la valeur de cosinus zĂ©ro (c'est-Ă -dire environ 90 et 270 degrĂ©s), alors l'algorithme produira une erreur valeur. Pour l'Ă©viter, au lieu d'acos (), utilisez la fonction atan2 (wSin, wCos), qui donne immĂ©diatement le rĂ©sultat correct en tenant compte des signes sinus et cosinus (merci
aamonster pour l'aide). La ligne oĂč la valeur moyenne de wSin est calculĂ©e ne doit pas ĂȘtre commentĂ©e et la ligne ajustĂ©e pour le signe wSin n'est pas nĂ©cessaire. Au lieu de cela, vous devez insĂ©rer le cast Ă des valeurs positives de l'angle (car atan2 donne des valeurs de pi Ă -pi):
if (wind_Rad<0) wind_Rad=2*M_PI+wind_Rad;