Telescope Control Library

Dependents:   PushToGo-F429

Committer:
caoyu@caoyuan9642-desktop.MIT.EDU
Date:
Mon Sep 24 19:36:48 2018 -0400
Revision:
19:fd854309cb4c
Parent:
18:3ea58b079adc
Fix bug in nudging with small speeds mentioned in the last commit

Who changed what in which revision?

UserRevisionLine numberNew 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
caoyu@caoyuan9642-desktop.MIT.EDU 18:3ea58b079adc 143 double 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,
caoyu@caoyuan9642-desktop.MIT.EDU 18:3ea58b079adc 149 double 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);
caoyu@caoyuan9642-desktop.MIT.EDU 18:3ea58b079adc 192 static double getGreenwichMeanSiderealTime(double timestamp);
caoyu@caoyuan9642-desktop.MIT.EDU 18:3ea58b079adc 193 static double getLocalSiderealTime(double timestamp,
caoyuan9642 0:6cb2eaf8b133 194 const LocationCoordinates &loc);
caoyuan9642 0:6cb2eaf8b133 195 static LocalEquatorialCoordinates equatorialToLocalEquatorial(
caoyu@caoyuan9642-desktop.MIT.EDU 18:3ea58b079adc 196 const EquatorialCoordinates &e, double timestamp,
caoyuan9642 0:6cb2eaf8b133 197 const LocationCoordinates &loc);
caoyuan9642 0:6cb2eaf8b133 198 static EquatorialCoordinates localEquatorialToEquatorial(
caoyu@caoyuan9642-desktop.MIT.EDU 18:3ea58b079adc 199 const LocalEquatorialCoordinates &a, double 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,
caoyu@caoyuan9642-desktop.MIT.EDU 18:3ea58b079adc 305 double time);
caoyuan9642 0:6cb2eaf8b133 306
caoyuan9642 0:6cb2eaf8b133 307 };
caoyuan9642 0:6cb2eaf8b133 308
caoyuan9642 0:6cb2eaf8b133 309 #endif /* CELESTIALMATH_H_ */
caoyuan9642 0:6cb2eaf8b133 310