Telescope Control Library
CelestialMath.h@0:6cb2eaf8b133, 2018-08-19 (annotated)
- Committer:
- caoyuan9642
- Date:
- Sun Aug 19 05:21:20 2018 +0000
- Revision:
- 0:6cb2eaf8b133
- Child:
- 18:3ea58b079adc
v0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
caoyuan9642 | 0:6cb2eaf8b133 | 1 | /* |
caoyuan9642 | 0:6cb2eaf8b133 | 2 | * CelestialMath.h |
caoyuan9642 | 0:6cb2eaf8b133 | 3 | * |
caoyuan9642 | 0:6cb2eaf8b133 | 4 | * Created on: Feb 21, 2018 |
caoyuan9642 | 0:6cb2eaf8b133 | 5 | * Author: Yuan |
caoyuan9642 | 0:6cb2eaf8b133 | 6 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 7 | |
caoyuan9642 | 0:6cb2eaf8b133 | 8 | #ifndef CELESTIALMATH_H_ |
caoyuan9642 | 0:6cb2eaf8b133 | 9 | #define CELESTIALMATH_H_ |
caoyuan9642 | 0:6cb2eaf8b133 | 10 | |
caoyuan9642 | 0:6cb2eaf8b133 | 11 | #include <time.h> |
caoyuan9642 | 0:6cb2eaf8b133 | 12 | #include <math.h> |
caoyuan9642 | 0:6cb2eaf8b133 | 13 | |
caoyuan9642 | 0:6cb2eaf8b133 | 14 | static const double sidereal_speed = 0.00417807462; /* deg / s */ |
caoyuan9642 | 0:6cb2eaf8b133 | 15 | |
caoyuan9642 | 0:6cb2eaf8b133 | 16 | struct EquatorialCoordinates |
caoyuan9642 | 0:6cb2eaf8b133 | 17 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 18 | double dec; // Declination |
caoyuan9642 | 0:6cb2eaf8b133 | 19 | double ra; // Right ascension |
caoyuan9642 | 0:6cb2eaf8b133 | 20 | EquatorialCoordinates(double d = 0, double r = 0) : |
caoyuan9642 | 0:6cb2eaf8b133 | 21 | dec(d), ra(r) |
caoyuan9642 | 0:6cb2eaf8b133 | 22 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 23 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 24 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 25 | |
caoyuan9642 | 0:6cb2eaf8b133 | 26 | struct LocalEquatorialCoordinates |
caoyuan9642 | 0:6cb2eaf8b133 | 27 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 28 | double dec; // Declination |
caoyuan9642 | 0:6cb2eaf8b133 | 29 | double ha; // Hour angle |
caoyuan9642 | 0:6cb2eaf8b133 | 30 | LocalEquatorialCoordinates(double d = 0, double h = 0) : |
caoyuan9642 | 0:6cb2eaf8b133 | 31 | dec(d), ha(h) |
caoyuan9642 | 0:6cb2eaf8b133 | 32 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 33 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 34 | LocalEquatorialCoordinates operator+( |
caoyuan9642 | 0:6cb2eaf8b133 | 35 | const LocalEquatorialCoordinates &b) const |
caoyuan9642 | 0:6cb2eaf8b133 | 36 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 37 | return LocalEquatorialCoordinates(remainder(dec + b.dec, 360), |
caoyuan9642 | 0:6cb2eaf8b133 | 38 | remainder(ha + b.ha, 360)); |
caoyuan9642 | 0:6cb2eaf8b133 | 39 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 40 | LocalEquatorialCoordinates operator-( |
caoyuan9642 | 0:6cb2eaf8b133 | 41 | const LocalEquatorialCoordinates &b) const |
caoyuan9642 | 0:6cb2eaf8b133 | 42 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 43 | return LocalEquatorialCoordinates(remainder(dec - b.dec, 360), |
caoyuan9642 | 0:6cb2eaf8b133 | 44 | remainder(ha - b.ha, 360)); |
caoyuan9642 | 0:6cb2eaf8b133 | 45 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 46 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 47 | |
caoyuan9642 | 0:6cb2eaf8b133 | 48 | struct AzimuthalCoordinates |
caoyuan9642 | 0:6cb2eaf8b133 | 49 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 50 | double alt; // Altitude |
caoyuan9642 | 0:6cb2eaf8b133 | 51 | double azi; // Azimuth |
caoyuan9642 | 0:6cb2eaf8b133 | 52 | AzimuthalCoordinates(double a1 = 0, double a2 = 0) : |
caoyuan9642 | 0:6cb2eaf8b133 | 53 | alt(a1), azi(a2) |
caoyuan9642 | 0:6cb2eaf8b133 | 54 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 55 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 56 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 57 | |
caoyuan9642 | 0:6cb2eaf8b133 | 58 | struct LocationCoordinates |
caoyuan9642 | 0:6cb2eaf8b133 | 59 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 60 | double lat; // Latitude |
caoyuan9642 | 0:6cb2eaf8b133 | 61 | double lon; // Longtitude |
caoyuan9642 | 0:6cb2eaf8b133 | 62 | LocationCoordinates(double l1 = 0, double l2 = 0) : |
caoyuan9642 | 0:6cb2eaf8b133 | 63 | lat(l1), lon(l2) |
caoyuan9642 | 0:6cb2eaf8b133 | 64 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 65 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 66 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 67 | |
caoyuan9642 | 0:6cb2eaf8b133 | 68 | struct Transformation; |
caoyuan9642 | 0:6cb2eaf8b133 | 69 | |
caoyuan9642 | 0:6cb2eaf8b133 | 70 | struct CartesianVector |
caoyuan9642 | 0:6cb2eaf8b133 | 71 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 72 | double x, y, z; |
caoyuan9642 | 0:6cb2eaf8b133 | 73 | CartesianVector(double x = 0, double y = 0, double z = 0) : |
caoyuan9642 | 0:6cb2eaf8b133 | 74 | x(x), y(y), z(z) |
caoyuan9642 | 0:6cb2eaf8b133 | 75 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 76 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 77 | CartesianVector operator*(const Transformation &t); |
caoyuan9642 | 0:6cb2eaf8b133 | 78 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 79 | |
caoyuan9642 | 0:6cb2eaf8b133 | 80 | struct Transformation |
caoyuan9642 | 0:6cb2eaf8b133 | 81 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 82 | double a11, a12, a13; |
caoyuan9642 | 0:6cb2eaf8b133 | 83 | double a21, a22, a23; |
caoyuan9642 | 0:6cb2eaf8b133 | 84 | double a31, a32, a33; |
caoyuan9642 | 0:6cb2eaf8b133 | 85 | CartesianVector operator*(const CartesianVector &vec); |
caoyuan9642 | 0:6cb2eaf8b133 | 86 | void transpose() |
caoyuan9642 | 0:6cb2eaf8b133 | 87 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 88 | double temp = a12; |
caoyuan9642 | 0:6cb2eaf8b133 | 89 | a12 = a21; |
caoyuan9642 | 0:6cb2eaf8b133 | 90 | a21 = temp; |
caoyuan9642 | 0:6cb2eaf8b133 | 91 | temp = a13; |
caoyuan9642 | 0:6cb2eaf8b133 | 92 | a13 = a31; |
caoyuan9642 | 0:6cb2eaf8b133 | 93 | a31 = temp; |
caoyuan9642 | 0:6cb2eaf8b133 | 94 | temp = a32; |
caoyuan9642 | 0:6cb2eaf8b133 | 95 | a32 = a23; |
caoyuan9642 | 0:6cb2eaf8b133 | 96 | a23 = temp; |
caoyuan9642 | 0:6cb2eaf8b133 | 97 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 98 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 99 | |
caoyuan9642 | 0:6cb2eaf8b133 | 100 | typedef enum |
caoyuan9642 | 0:6cb2eaf8b133 | 101 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 102 | PIER_SIDE_EAST, PIER_SIDE_WEST, PIER_SIDE_AUTO = 0 |
caoyuan9642 | 0:6cb2eaf8b133 | 103 | } pierside_t; |
caoyuan9642 | 0:6cb2eaf8b133 | 104 | |
caoyuan9642 | 0:6cb2eaf8b133 | 105 | struct IndexOffset |
caoyuan9642 | 0:6cb2eaf8b133 | 106 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 107 | double dec_off; // Offset of the index position in DEC |
caoyuan9642 | 0:6cb2eaf8b133 | 108 | double ra_off; // Offset of the index position in RA/HA axis |
caoyuan9642 | 0:6cb2eaf8b133 | 109 | IndexOffset(double d = 0, double r = 0) : |
caoyuan9642 | 0:6cb2eaf8b133 | 110 | dec_off(d), ra_off(r) |
caoyuan9642 | 0:6cb2eaf8b133 | 111 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 112 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 113 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 114 | |
caoyuan9642 | 0:6cb2eaf8b133 | 115 | struct MountCoordinates |
caoyuan9642 | 0:6cb2eaf8b133 | 116 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 117 | double dec_delta; // Displacement from index position in DEC axis |
caoyuan9642 | 0:6cb2eaf8b133 | 118 | double ra_delta; // Displacement from index position in RA/HA axis |
caoyuan9642 | 0:6cb2eaf8b133 | 119 | pierside_t side; |
caoyuan9642 | 0:6cb2eaf8b133 | 120 | MountCoordinates(double dec = 0, double ra = 0, pierside_t s = |
caoyuan9642 | 0:6cb2eaf8b133 | 121 | PIER_SIDE_AUTO) : |
caoyuan9642 | 0:6cb2eaf8b133 | 122 | dec_delta(dec), ra_delta(ra), side(s) |
caoyuan9642 | 0:6cb2eaf8b133 | 123 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 124 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 125 | MountCoordinates operator+(const IndexOffset &offset) const |
caoyuan9642 | 0:6cb2eaf8b133 | 126 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 127 | return MountCoordinates(remainder(dec_delta + offset.dec_off, 360), |
caoyuan9642 | 0:6cb2eaf8b133 | 128 | remainder(ra_delta + offset.ra_off, 360), side); |
caoyuan9642 | 0:6cb2eaf8b133 | 129 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 130 | MountCoordinates operator-(const IndexOffset &offset) const |
caoyuan9642 | 0:6cb2eaf8b133 | 131 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 132 | return MountCoordinates(remainder(dec_delta - offset.dec_off, 360), |
caoyuan9642 | 0:6cb2eaf8b133 | 133 | remainder(ra_delta - offset.ra_off, 360), side); |
caoyuan9642 | 0:6cb2eaf8b133 | 134 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 135 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 136 | /** |
caoyuan9642 | 0:6cb2eaf8b133 | 137 | * Alignment star object |
caoyuan9642 | 0:6cb2eaf8b133 | 138 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 139 | struct AlignmentStar |
caoyuan9642 | 0:6cb2eaf8b133 | 140 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 141 | EquatorialCoordinates star_ref; /// Reference position of the star in the sky (in current epoch) |
caoyuan9642 | 0:6cb2eaf8b133 | 142 | MountCoordinates star_meas; /// Measured position of the star in mount coordinates |
caoyuan9642 | 0:6cb2eaf8b133 | 143 | time_t timestamp; /// UTC timestamp of the measurement |
caoyuan9642 | 0:6cb2eaf8b133 | 144 | AlignmentStar() |
caoyuan9642 | 0:6cb2eaf8b133 | 145 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 146 | timestamp = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 147 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 148 | AlignmentStar(const EquatorialCoordinates & ref, MountCoordinates meas, |
caoyuan9642 | 0:6cb2eaf8b133 | 149 | time_t t) : |
caoyuan9642 | 0:6cb2eaf8b133 | 150 | star_ref(ref), star_meas(meas), timestamp(t) |
caoyuan9642 | 0:6cb2eaf8b133 | 151 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 152 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 153 | LocalEquatorialCoordinates star_ref_local( |
caoyuan9642 | 0:6cb2eaf8b133 | 154 | const LocationCoordinates &loc) const; |
caoyuan9642 | 0:6cb2eaf8b133 | 155 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 156 | |
caoyuan9642 | 0:6cb2eaf8b133 | 157 | struct EqCalibration |
caoyuan9642 | 0:6cb2eaf8b133 | 158 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 159 | IndexOffset offset; |
caoyuan9642 | 0:6cb2eaf8b133 | 160 | AzimuthalCoordinates pa; |
caoyuan9642 | 0:6cb2eaf8b133 | 161 | double cone; |
caoyuan9642 | 0:6cb2eaf8b133 | 162 | double error; |
caoyuan9642 | 0:6cb2eaf8b133 | 163 | EqCalibration() : |
caoyuan9642 | 0:6cb2eaf8b133 | 164 | cone(0), error(0) |
caoyuan9642 | 0:6cb2eaf8b133 | 165 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 166 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 167 | EqCalibration(const IndexOffset &off, const AzimuthalCoordinates p, |
caoyuan9642 | 0:6cb2eaf8b133 | 168 | double c, double e) : |
caoyuan9642 | 0:6cb2eaf8b133 | 169 | offset(off), pa(p), cone(c), error(e) |
caoyuan9642 | 0:6cb2eaf8b133 | 170 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 171 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 172 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 173 | /** |
caoyuan9642 | 0:6cb2eaf8b133 | 174 | * Utility functions for doing math on coordinates of the celestial sphere |
caoyuan9642 | 0:6cb2eaf8b133 | 175 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 176 | class CelestialMath |
caoyuan9642 | 0:6cb2eaf8b133 | 177 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 178 | public: |
caoyuan9642 | 0:6cb2eaf8b133 | 179 | CelestialMath() |
caoyuan9642 | 0:6cb2eaf8b133 | 180 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 181 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 182 | ~CelestialMath() |
caoyuan9642 | 0:6cb2eaf8b133 | 183 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 184 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 185 | |
caoyuan9642 | 0:6cb2eaf8b133 | 186 | /*Basic conversion between reference frames*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 187 | static AzimuthalCoordinates localEquatorialToAzimuthal( |
caoyuan9642 | 0:6cb2eaf8b133 | 188 | const LocalEquatorialCoordinates &a, |
caoyuan9642 | 0:6cb2eaf8b133 | 189 | const LocationCoordinates &loc); |
caoyuan9642 | 0:6cb2eaf8b133 | 190 | static LocalEquatorialCoordinates azimuthalToLocalEquatorial( |
caoyuan9642 | 0:6cb2eaf8b133 | 191 | const AzimuthalCoordinates &b, const LocationCoordinates &loc); |
caoyuan9642 | 0:6cb2eaf8b133 | 192 | static double getGreenwichMeanSiderealTime(time_t timestamp); |
caoyuan9642 | 0:6cb2eaf8b133 | 193 | static double getLocalSiderealTime(time_t timestamp, |
caoyuan9642 | 0:6cb2eaf8b133 | 194 | const LocationCoordinates &loc); |
caoyuan9642 | 0:6cb2eaf8b133 | 195 | static LocalEquatorialCoordinates equatorialToLocalEquatorial( |
caoyuan9642 | 0:6cb2eaf8b133 | 196 | const EquatorialCoordinates &e, time_t timestamp, |
caoyuan9642 | 0:6cb2eaf8b133 | 197 | const LocationCoordinates &loc); |
caoyuan9642 | 0:6cb2eaf8b133 | 198 | static EquatorialCoordinates localEquatorialToEquatorial( |
caoyuan9642 | 0:6cb2eaf8b133 | 199 | const LocalEquatorialCoordinates &a, time_t timestamp, |
caoyuan9642 | 0:6cb2eaf8b133 | 200 | const LocationCoordinates &loc); |
caoyuan9642 | 0:6cb2eaf8b133 | 201 | |
caoyuan9642 | 0:6cb2eaf8b133 | 202 | /*Misalignment correction functions*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 203 | static Transformation &getMisalignedPolarAxisTransformation( |
caoyuan9642 | 0:6cb2eaf8b133 | 204 | Transformation &t, const AzimuthalCoordinates &mpa, |
caoyuan9642 | 0:6cb2eaf8b133 | 205 | const LocationCoordinates &loc); |
caoyuan9642 | 0:6cb2eaf8b133 | 206 | static LocalEquatorialCoordinates applyMisalignment(const Transformation &t, |
caoyuan9642 | 0:6cb2eaf8b133 | 207 | const LocalEquatorialCoordinates &a); |
caoyuan9642 | 0:6cb2eaf8b133 | 208 | static LocalEquatorialCoordinates applyMisalignment( |
caoyuan9642 | 0:6cb2eaf8b133 | 209 | const LocalEquatorialCoordinates &a, |
caoyuan9642 | 0:6cb2eaf8b133 | 210 | const AzimuthalCoordinates &mpa, const LocationCoordinates &loc); |
caoyuan9642 | 0:6cb2eaf8b133 | 211 | static LocalEquatorialCoordinates applyConeError( |
caoyuan9642 | 0:6cb2eaf8b133 | 212 | const LocalEquatorialCoordinates &a, double cone); |
caoyuan9642 | 0:6cb2eaf8b133 | 213 | static LocalEquatorialCoordinates deapplyMisalignment( |
caoyuan9642 | 0:6cb2eaf8b133 | 214 | const Transformation &t, const LocalEquatorialCoordinates &a); |
caoyuan9642 | 0:6cb2eaf8b133 | 215 | static LocalEquatorialCoordinates deapplyMisalignment( |
caoyuan9642 | 0:6cb2eaf8b133 | 216 | const LocalEquatorialCoordinates &a, |
caoyuan9642 | 0:6cb2eaf8b133 | 217 | const AzimuthalCoordinates &mpa, const LocationCoordinates &loc); |
caoyuan9642 | 0:6cb2eaf8b133 | 218 | static LocalEquatorialCoordinates deapplyConeError( |
caoyuan9642 | 0:6cb2eaf8b133 | 219 | const LocalEquatorialCoordinates &a, double cone); |
caoyuan9642 | 0:6cb2eaf8b133 | 220 | |
caoyuan9642 | 0:6cb2eaf8b133 | 221 | /*Convert to and from Mount coordinates*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 222 | static MountCoordinates localEquatorialToMount( |
caoyuan9642 | 0:6cb2eaf8b133 | 223 | const LocalEquatorialCoordinates &a, pierside_t side = |
caoyuan9642 | 0:6cb2eaf8b133 | 224 | PIER_SIDE_AUTO); |
caoyuan9642 | 0:6cb2eaf8b133 | 225 | static LocalEquatorialCoordinates mountToLocalEquatorial( |
caoyuan9642 | 0:6cb2eaf8b133 | 226 | const MountCoordinates &m); |
caoyuan9642 | 0:6cb2eaf8b133 | 227 | |
caoyuan9642 | 0:6cb2eaf8b133 | 228 | /*Alignment procedures*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 229 | |
caoyuan9642 | 0:6cb2eaf8b133 | 230 | /** |
caoyuan9642 | 0:6cb2eaf8b133 | 231 | * One-star alignment (only for testing), to find the PA misalignment |
caoyuan9642 | 0:6cb2eaf8b133 | 232 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 233 | static AzimuthalCoordinates alignOneStar( |
caoyuan9642 | 0:6cb2eaf8b133 | 234 | const LocalEquatorialCoordinates &star_ref, |
caoyuan9642 | 0:6cb2eaf8b133 | 235 | const LocalEquatorialCoordinates &star_meas, |
caoyuan9642 | 0:6cb2eaf8b133 | 236 | const LocationCoordinates &loc, |
caoyuan9642 | 0:6cb2eaf8b133 | 237 | const AzimuthalCoordinates &pa_start); |
caoyuan9642 | 0:6cb2eaf8b133 | 238 | |
caoyuan9642 | 0:6cb2eaf8b133 | 239 | static IndexOffset alignOneStarForOffset( |
caoyuan9642 | 0:6cb2eaf8b133 | 240 | const LocalEquatorialCoordinates &star_ref, |
caoyuan9642 | 0:6cb2eaf8b133 | 241 | const MountCoordinates &star_meas); |
caoyuan9642 | 0:6cb2eaf8b133 | 242 | |
caoyuan9642 | 0:6cb2eaf8b133 | 243 | /*static AzimuthalCoordinates alignOneStar(const LocalEquatorialCoordinates &star_ref, const LocalEquatorialCoordinates &star_meas, |
caoyuan9642 | 0:6cb2eaf8b133 | 244 | const LocationCoordinates &loc, const AzimuthalCoordinates &pa_start);*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 245 | /** |
caoyuan9642 | 0:6cb2eaf8b133 | 246 | * Two-star alignment for finding PA misalignment as well as offset in both axis |
caoyuan9642 | 0:6cb2eaf8b133 | 247 | * @param star_ref Reference stars (array of 2) |
caoyuan9642 | 0:6cb2eaf8b133 | 248 | * @param star_meas Measured stars (array of 2) |
caoyuan9642 | 0:6cb2eaf8b133 | 249 | * @param loc Location |
caoyuan9642 | 0:6cb2eaf8b133 | 250 | * @param pa Initial PA alt-az coordinates. This parameter will be updated with new values |
caoyuan9642 | 0:6cb2eaf8b133 | 251 | * @param offset Initial offset values. This parameter will be updated with new values |
caoyuan9642 | 0:6cb2eaf8b133 | 252 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 253 | static void alignTwoStars(const LocalEquatorialCoordinates star_ref[], |
caoyuan9642 | 0:6cb2eaf8b133 | 254 | const LocalEquatorialCoordinates star_meas[], |
caoyuan9642 | 0:6cb2eaf8b133 | 255 | const LocationCoordinates &loc, AzimuthalCoordinates &pa, |
caoyuan9642 | 0:6cb2eaf8b133 | 256 | LocalEquatorialCoordinates &offset); |
caoyuan9642 | 0:6cb2eaf8b133 | 257 | static void alignTwoStars(const LocalEquatorialCoordinates star_ref[], |
caoyuan9642 | 0:6cb2eaf8b133 | 258 | const MountCoordinates star_meas[], const LocationCoordinates &loc, |
caoyuan9642 | 0:6cb2eaf8b133 | 259 | AzimuthalCoordinates &pa, IndexOffset &offset, bool &diverge); |
caoyuan9642 | 0:6cb2eaf8b133 | 260 | |
caoyuan9642 | 0:6cb2eaf8b133 | 261 | /** |
caoyuan9642 | 0:6cb2eaf8b133 | 262 | * N-star alignment for finding PA misalignment, offset, and cone error |
caoyuan9642 | 0:6cb2eaf8b133 | 263 | * This function will first call alignTwoStars with the first two stars assuming no cone error, then run an optimization algorithm to minimize the residual error by tweaking all 5 parameters. |
caoyuan9642 | 0:6cb2eaf8b133 | 264 | * @param N number of alignment stars |
caoyuan9642 | 0:6cb2eaf8b133 | 265 | * @param star_ref Reference stars |
caoyuan9642 | 0:6cb2eaf8b133 | 266 | * @param star_meas Measured stars |
caoyuan9642 | 0:6cb2eaf8b133 | 267 | * @param loc Location |
caoyuan9642 | 0:6cb2eaf8b133 | 268 | * @param pa Initial PA alt-az coordinates. This parameter will be updated with new values |
caoyuan9642 | 0:6cb2eaf8b133 | 269 | * @param offset Initial offset values. This parameter will be updated with new values |
caoyuan9642 | 0:6cb2eaf8b133 | 270 | * @param cone Initial cone error. This parameter will be updated with new values |
caoyuan9642 | 0:6cb2eaf8b133 | 271 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 272 | static void alignNStars(const int N, |
caoyuan9642 | 0:6cb2eaf8b133 | 273 | const LocalEquatorialCoordinates star_ref[], |
caoyuan9642 | 0:6cb2eaf8b133 | 274 | const LocalEquatorialCoordinates star_meas[], |
caoyuan9642 | 0:6cb2eaf8b133 | 275 | const LocationCoordinates &loc, AzimuthalCoordinates &pa, |
caoyuan9642 | 0:6cb2eaf8b133 | 276 | LocalEquatorialCoordinates &offset, double &cone); |
caoyuan9642 | 0:6cb2eaf8b133 | 277 | static void alignNStars(const int N, |
caoyuan9642 | 0:6cb2eaf8b133 | 278 | const LocalEquatorialCoordinates star_ref[], |
caoyuan9642 | 0:6cb2eaf8b133 | 279 | const MountCoordinates star_meas[], const LocationCoordinates &loc, |
caoyuan9642 | 0:6cb2eaf8b133 | 280 | AzimuthalCoordinates &pa, IndexOffset &offset, double &cone, |
caoyuan9642 | 0:6cb2eaf8b133 | 281 | bool &diverge); |
caoyuan9642 | 0:6cb2eaf8b133 | 282 | |
caoyuan9642 | 0:6cb2eaf8b133 | 283 | /** |
caoyuan9642 | 0:6cb2eaf8b133 | 284 | * Adaptor for EqMount |
caoyuan9642 | 0:6cb2eaf8b133 | 285 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 286 | static EqCalibration align(const int N, const AlignmentStar stars[], |
caoyuan9642 | 0:6cb2eaf8b133 | 287 | const LocationCoordinates &loc, bool &diverge); |
caoyuan9642 | 0:6cb2eaf8b133 | 288 | |
caoyuan9642 | 0:6cb2eaf8b133 | 289 | static double alignmentError(const int N, const AlignmentStar stars[], |
caoyuan9642 | 0:6cb2eaf8b133 | 290 | const EqCalibration &calib, const LocationCoordinates &loc); |
caoyuan9642 | 0:6cb2eaf8b133 | 291 | |
caoyuan9642 | 0:6cb2eaf8b133 | 292 | /*Utility functions*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 293 | |
caoyuan9642 | 0:6cb2eaf8b133 | 294 | /* |
caoyuan9642 | 0:6cb2eaf8b133 | 295 | * Convert HMS notation such as 21h54m31.6s to degrees (counting from 0h0m0s = 0degree, from -180 ~ 180 degrees) |
caoyuan9642 | 0:6cb2eaf8b133 | 296 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 297 | static double parseHMSAngle(char *hms); |
caoyuan9642 | 0:6cb2eaf8b133 | 298 | |
caoyuan9642 | 0:6cb2eaf8b133 | 299 | static double parseDMSAngle(char *dms); |
caoyuan9642 | 0:6cb2eaf8b133 | 300 | |
caoyuan9642 | 0:6cb2eaf8b133 | 301 | /** |
caoyuan9642 | 0:6cb2eaf8b133 | 302 | * Calculate King tracking rate based on the star position and location |
caoyuan9642 | 0:6cb2eaf8b133 | 303 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 304 | static double kingRate(EquatorialCoordinates eq, LocationCoordinates loc, |
caoyuan9642 | 0:6cb2eaf8b133 | 305 | time_t time); |
caoyuan9642 | 0:6cb2eaf8b133 | 306 | |
caoyuan9642 | 0:6cb2eaf8b133 | 307 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 308 | |
caoyuan9642 | 0:6cb2eaf8b133 | 309 | #endif /* CELESTIALMATH_H_ */ |
caoyuan9642 | 0:6cb2eaf8b133 | 310 |