(RA/Dec) vers (Alt/Az) et (Alt/Az) vers (RA/Dec)

Bonjour à toutes et à tous,

J'ai trouvé sur le forum une librairie qui permet de passer d'un système de coordonnées équatoriales à un système de coordonnées horizontales et vice versa.

le lien de la librairie.

le code exemple "full" ici. ( je met le lien volontairement sinon "The message exceeds the maximum allowed length (9000 characters)").

Comme intitulé du code il regroupe tous ce qu'on peut faire avec la librairie.

J'ai réussi à garder que les fonctions nécessaires pour la conversion entre les systèmes.

#include <Ephemeris.h>

long retourcoo;

void equatorialCoordinatesToString(EquatorialCoordinates coord, char raCoord[14] , char decCoord[14])
{
  int raHour,raMinute;
  float raSecond;
  Ephemeris::floatingHoursToHoursMinutesSeconds(coord.ra, &raHour, &raMinute, &raSecond); 
  sprintf(raCoord," %02dh%02dm%02ds.%02d",raHour,raMinute,(int)raSecond,(int)round(((float)(raSecond-(int)raSecond)*pow(10,2))));
    
  int decDegree,decMinute;
  float decSecond;
  Ephemeris::floatingDegreesToDegreesMinutesSeconds(coord.dec, &decDegree, &decMinute, &decSecond);
    
  if(decDegree<0)
  {
    sprintf(decCoord,"%02dd%02d'%02d\".%02d",(int)decDegree,decMinute,(int)decSecond,(int)round(((float)(decSecond-(int)decSecond)*pow(10,2))));
  }
  else
  {
    sprintf(decCoord," %02dd%02d'%02d\".%02d",(int)decDegree,decMinute,(int)decSecond,(int)round(((float)(decSecond-(int)decSecond)*pow(10,2))));
  }
}

void printEquatorialCoordinates(EquatorialCoordinates coord)
{   
  char raCoord[14];
  char decCoord[14];
  equatorialCoordinatesToString(coord,raCoord,decCoord);

  Serial.print("R.A: ");
  Serial.println(raCoord);
  Serial.print("Dec: ");
  Serial.println(decCoord);

  return;
}

void printHorizontalCoordinates(HorizontalCoordinates coord)
{ long test;
  Serial.print("Azi: ");
  Serial.print(coord.azi,6);
  Serial.print("  Alt: ");
  Serial.println(coord.alt,6);
  test = coord.azi;
  return ( test);
  }


void setup() 
{
  Serial.begin(9600);
  Ephemeris::setLocationOnEarth(48,50,11,-2,20,14);  // Lat: 48°50'11" Lon: -2°20'14"
  Ephemeris::flipLongitude(true);// East is negative and West is positive
  Ephemeris::setAltitude(75); // Set altitude to improve rise and set precision
  int day=10,month=4,year=2014,hour=19,minute=21,second=0;  // Choose a date and time

  Serial.println("_____________________________________");
  Serial.println("Testing coordinates transformations:");
    
  EquatorialCoordinates objettest;
  objettest.ra  = Ephemeris::hoursMinutesSecondsToFloatingHours(2, 31, 49);      // 2h31m49s
  objettest.dec = Ephemeris::degreesMinutesSecondsToFloatingDegrees(89, 15, 51); // +89° 15′ 51″
  printEquatorialCoordinates(objettest);
  
  Serial.println("Convert RA/Dec to Alt/Az:");
  HorizontalCoordinates polarStarHCoord = Ephemeris::equatorialToHorizontalCoordinatesAtDateAndTime(objettest,day, month, year,hour, minute, second);
  printHorizontalCoordinates(polarStarHCoord);


  Serial.println("Convert Alt/Az back to RA/Dec:");
  objettest = Ephemeris::horizontalToEquatorialCoordinatesAtDateAndTime(polarStarHCoord,day, month, year,hour, minute, second);
  printEquatorialCoordinates(objettest);

retourcoo = printHorizontalCoordinates(HorizontalCoordinates coord);
  
}

void loop() {}

Mais dans la fonction "printHorizontalCoordinates" :

void printHorizontalCoordinates(HorizontalCoordinates coord)
{ long test;
  Serial.print("Azi: ");
  Serial.print(coord.azi,6);
  Serial.print("  Alt: ");
  Serial.println(coord.alt,6);
  test = coord.azi;
  return ( test);
  }

Je n'arrive pas à retourné la valeur "test" avec :

retourcoo = printHorizontalCoordinates(HorizontalCoordinates coord)

l'IDE ne compile pas .

sketch_jun28a:75:64: error: expected primary-expression before 'coord'
   retourcoo = printHorizontalCoordinates(HorizontalCoordinates coord);

le ^ se place sous "coord" .

Ou est mon erreur ?
et quelles sont les fonctions des "::" ?

Par avance merci

C'est bizarre :

void printHorizontalCoordinates(HorizontalCoordinates coord)

devrait être

long printHorizontalCoordinates(HorizontalCoordinates coord)

Bonjour lesept, j'avais essayer en long aussi mais ça ne compile pas non plus,
J'essaye de comprendre la librairie mais pas facile ^^.

Sinon j'utiliserais des pointeurs, mais j'aurais préféré la comprendre quand même...

@+

Tu as aussi changé le prototype ?

hum le prototype ?

Au temps pour moi, je pensais que la fonction printHorizontalCoordinates venait de la bibliothèque. Par contre, en la cherchant, j'ai vu que HorizontalCoordinates est une struct formée de 2 float. Donc 'test' doit être un float et pas un long.
Essaye :

float retourcoo;

...

float printHorizontalCoordinates(HorizontalCoordinates coord) {
  float test;
  Serial.print("Azi: ");
  Serial.print(coord.azi,6);
  Serial.print("  Alt: ");
  Serial.println(coord.alt,6);
  test = coord.azi;
  return ( test);
}

Re,

Le problème semble venir du faite que la fonction

"printHorizontalCoordinates(HorizontalCoordinates coord)"

a un espace et/ou une fonction en + avec le "coord"

car l'IDE me renvoi l'erreur sur cet espace

Ton appel de fonction doit être

retourcoo = printHorizontalCoordinates(coord);

au lieu de

retourcoo = printHorizontalCoordinates(HorizontalCoordinates coord);

Mais 'coord' n'est défini nulle part, donc tu dois choisir l'argument que tu passes à cette fonction. Que veux-tu afficher à cet endroit ?

Dans le contexte de ton programme,

retourcoo = printHorizontalCoordinates(HorizontalCoordinates coord);

ne devrait pas plutôt être

retourcoo = printHorizontalCoordinates(objettest);

En même temps, d'un point de vue purement programmation le fait que cette fonction d'impression retourne l'un de ses paramètres n'a pas vraiment de sens puisque la coordonnée en question est directement accessible et tu pourrais écrire

retourcoo = objettest.azi;

fdufnews:
Dans le contexte de ton programme,

retourcoo = printHorizontalCoordinates(HorizontalCoordinates coord);

ne devrait pas plutôt être

retourcoo = printHorizontalCoordinates(objettest);

En même temps, d'un point de vue purement programmation le fait que cette fonction d'impression retourne l'un de ses paramètres n'a pas vraiment de sens puisque la coordonnée en question est directement accessible et tu pourrais écrire

retourcoo = objettest.azi;

J'ai pris la dernière fonction justement pour comparé comme elle était accessible.

et je cherche le moyen de recupéré les valeurs heure, minute , seconde et degré , minute , seconde séparément.

j'ai utilisé des pointeurs pour montré ce que je recherche

#include <Ephemeris.h>

float *pCoordAzi,*pCoordAlti,*pCoordRa,*pCoordDECs,*pCoordRas;
int *pCoordDECd,*pCoordDECm,*pCoordRah,*pCoordRam;
int CoordDECd,CoordDECm,CoordRah,CoordRam;
float CoordDECs,CoordRas;



long equatorialCoordinatesToString(EquatorialCoordinates coord, char raCoord[14], char decCoord[14])
{
  int raHour, raMinute;
  float raSecond;
  Ephemeris::floatingHoursToHoursMinutesSeconds(coord.ra, &raHour, &raMinute, &raSecond);
  CoordRah = raHour; CoordRam = raMinute; CoordRas = raSecond;
  pCoordRah = &CoordRah;
  pCoordRam = &CoordRam;
  pCoordRas = &CoordRas;
  
  int decDegree, decMinute;
  float decSecond;
  Ephemeris::floatingDegreesToDegreesMinutesSeconds(coord.dec, &decDegree, &decMinute, &decSecond);
  CoordDECd = decDegree;
  CoordDECm = decMinute;
  CoordDECs = decSecond;
  pCoordDECd = &CoordDECd;
  pCoordDECm = &CoordDECm;
  pCoordDECs = &CoordDECs;
}


long printEquatorialCoordinates(EquatorialCoordinates coord)
{
  char raCoord[14];
  char decCoord[14];
  equatorialCoordinatesToString(coord, raCoord, decCoord);
}



long printHorizontalCoordinates(HorizontalCoordinates coord)
{
  float test;
  pCoordAzi = & coord.azi;
  pCoordAlti = & coord.alt;
  test = coord.azi;
  return(test);
}

void setup()
{
  Serial.begin(9600);
  Ephemeris::setLocationOnEarth(48, 50, 11, -2, 20, 14); // Lat: 48°50'11" Lon: -2°20'14"
  Ephemeris::flipLongitude(true); // East is negative and West is positive
  Ephemeris::setAltitude(75); // Set altitude to improve rise and set precision
  int day = 10, month = 4, year = 2014, hour = 19, minute = 21, second = 0; // Choose a date and time
  EquatorialCoordinates objettest;
  objettest.ra = Ephemeris::hoursMinutesSecondsToFloatingHours(2, 31, 49); // 2h31m49s
  objettest.dec = Ephemeris::degreesMinutesSecondsToFloatingDegrees(89, 15, 51); // +89° 15′ 51″
  printEquatorialCoordinates(objettest);
  HorizontalCoordinates polarStarHCoord = Ephemeris::equatorialToHorizontalCoordinatesAtDateAndTime(objettest, day, month, year, hour, minute, second);
  printHorizontalCoordinates(polarStarHCoord);
  objettest = Ephemeris::horizontalToEquatorialCoordinatesAtDateAndTime(polarStarHCoord, day, month, year, hour, minute, second);
  printEquatorialCoordinates(objettest);


  Serial.println("_____________________________________");
  Serial.println("Coordonnées horizontales :");
  Serial.print("pCoordAzi . :");
  Serial.println(* pCoordAzi, 6);
  Serial.print("pCoordAlti . :");
  Serial.println(* pCoordAlti, 6);
  Serial.println("_____________________________________");
  Serial.println("Coordonnées équatoriales :");
  Serial.print("DEC :");
  Serial.print(*pCoordDECd);
  Serial.print("d");
  Serial.print(*pCoordDECm);
  Serial.print("'");
  Serial.print(*pCoordDECs);
  Serial.println("\"");
  Serial.print("R.A :");
  Serial.print(*pCoordRah);
  Serial.print("h");
  Serial.print(*pCoordRam);
  Serial.print("m");
  Serial.print(*pCoordRas);
  Serial.println("s");
}

void loop()
{
}

le float decSecond; après passage dans la fonction :

Ephemeris::floatingDegreesToDegreesMinutesSeconds(coord.dec, &decDegree, &decMinute, &decSecond);

Me retourne une valeur que je ne comprend pas 327731 au lieu de 51.

Pas facile cette librairie ^^

J4l13n:
Pas facile cette librairie ^^

N'y aurait-il pas surtout quelques grosses lacunes en C/C++? :wink:

C'est normal que les fonctions print... ne renvoient rien dans l'exemple puisque que leur rôle est juste de mettre en forme les données issues des structures retournées par la librairie pour les afficher sur la liaison série à titre de démo.

Je veux bien t'aider à comprendre le fonctionnement de ma librairie mais je n'ai pas vocation à t'apprendre la programmation. Tu n'iras pas loin sur Arduino sans savoir ce qu'est un prototype, une fonction/méthode ou encore une structure, etc. Il faut commencer par un bon bouquin.

marscaper:
N'y aurait-il pas surtout quelques grosses lacunes en C/C++? :wink:

C'est normal que les fonctions print... ne renvoient rien dans l'exemple puisque que leur rôle est juste de mettre en forme les données issues des structures retournées par la librairie pour les afficher sur la liaison série à titre de démo.

Je veux bien t'aider à comprendre le fonctionnement de ma librairie mais je n'ai pas vocation à t'apprendre la programmation. Tu n'iras pas loin sur Arduino sans savoir ce qu'est un prototype, une fonction/méthode ou encore une structure, etc. Il faut commencer par un bon bouquin.

Bonjour,

Pas facile pour moi ^^

Quelle valeur doit ton rentré à la place de polarStarHCoord ?

objettest = Ephemeris::horizontalToEquatorialCoordinatesAtDateAndTime(polarStarHCoord, day, month, year, hour, minute, second);

@+

Pour ta question sur la signification des :: voir ici.

Je découvre aussi mais si je comprends bien ça permet de lever les ambiguïtés lorsqu'on veut accéder à des méthodes ou des variables qui peuvent être définies en différents endroits avec le même nom.

On dirait que ça permet aussi d'accéder à une variable définie dans une fonction, depuis un autre endroit du code. Je ne sais pas si c'est correct, je n'ai jamais testé.

Pour tes problèmes d'utilisation de la bibliothèque Ephemeris, il faudrait que tu expliques clairement ce que tu cherches à faire. Quelles variables ou valeurs veux-tu obtenir, pour les afficher ou les utiliser ensuite, etc.

J4l13n, si tu regardes le fichier d'entête Ephemeris.hpp de la librairie...

https://github.com/MarScaper/ephemeris/blob/master/Ephemeris.hpp:
/*! Convert horizontal coordinates to equatorial coordinates. Location on Earth must be initialized first. */
static EquatorialCoordinates horizontalToEquatorialCoordinatesAtDateAndTime(HorizontalCoordinates hCoordinates,
unsigned int day, unsigned int month, unsigned int year,
unsigned int hours, unsigned int minutes, unsigned int seconds);

Source: ephemeris/Ephemeris.hpp at master · MarScaper/ephemeris · GitHub

Le premier paramètre attend donc une structure de type "HorizontalCoordinates"...

https://github.com/MarScaper/ephemeris/blob/master/Ephemeris.hpp:
/*! This structure describes horizontal coordinates. /
struct HorizontalCoordinates
{
/
! Floating value for altitude. */
FLOAT alt;

/*! Floating value for azimuth */
FLOAT azi;
};

En l'état c'est une simple structure contenant l'altitude et l'azimuth de l'objet dans le ciel à un instant T pour les coordonnées GPS de l'observateur.

Si je modifie la fonction setup du projet d'exemple, cela peut donner quelque chose du genre...

void setup() 
{
  Serial.begin(9600);

  // Set location on earth for horizontal coordinates transformations
  Ephemeris::setLocationOnEarth(48,50,11,  // Lat: 48°50'11"
                                -2,20,14); // Lon: -2°20'14"

  // East is negative and West is positive
  Ephemeris::flipLongitude(true);
    
  // Set altitude to improve rise and set precision
  Ephemeris::setAltitude(75);
                                
  // Choose a date and time
  int day=10,month=4,year=2014,hour=19,minute=21,second=0;

  // Create Alt/Azi coordinates
  HorizontalCoordinates objectHCoord;
  objectHCoord.alt = 30,4; 
  objectHCoord.azi = 23.1;

  // Display Alt/Azi coordinates on serial port
  Serial.println("Alt/Az coordinates:");
  printHorizontalCoordinates(objectHCoord);

  Serial.println("Convert Alt/Az to RA/Dec:");
  EquatorialCoordinates objectEqCoord = Ephemeris::horizontalToEquatorialCoordinatesAtDateAndTime(objectHCoord,
                                                                                                  day, month, year,
                                                                                                  hour, minute, second);
  // Display Equatorial coordinates on serial port                                                                                              
  printEquatorialCoordinates(objectEqCoord);

  return;
}

Concernant les "::", la classe Ephemeris expose des méthodes de manière statique (google: "méthode c++ static"). C'est une bibliothèque de fonctionnalités comme si on utilisait des fonctions C. En d'autre termes, on a pas besoin de créer un objet pour y accéder. Cependant une approche objet induit que ces méthodes (qu'on nommerait "fonction" en C) soient encapsulées dans la classe Ephemeris. D'où la syntaxe "Ephemeris::maMéthode(titi,toto,)" lorsque l'on souhaite les appeler.

J'ai pigé merci :slight_smile:

marscaper:
Concernant les "::", la classe Ephemeris expose des méthodes de manière statique (google: "méthode c++ static"). C'est une bibliothèque de fonctionnalités comme si on utilisait des fonctions C. En d'autre termes, on a pas besoin de créer un objet pour y accéder. Cependant une approche objet induit que ces méthodes (qu'on nommerait "fonction" en C) soient encapsulées dans la classe Ephemeris. D'où la syntaxe "Ephemeris::maMéthode(titi,toto,)" lorsque l'on souhaite les appeler.

J'avais taper sur google /// "::" arduino \\ sans succes, il fallait juste savoir que c'était des static du coup j'etudie cette méthode et c'est intérressant pour mes prochains codes.

Merci encore
@+

Si tu veux chercher sur google ça s'appelle 'opérateur de résolution de portée'

Merci kamill

Je bookmark ça , va falloir le digéré ^^

c'est un peut dans le principe des pointeurs ?

@+