本文记录恒星时
的有关知识。
恒星时
恒星时(Sidereal time),是指以地球相对于恒星的自转周期为基准的时间计量系统。将春分点
相继两次上中天所经历的时间称为恒星日,其等于23时56分4.09秒平太阳时,并以春分点在该地上中天的瞬间作为这个计量系统的起点,即恒星时为零时,用春分点时角来计量。
为了计量方便,把恒星日分成24个恒星小时,一恒星小时分为60恒星分,一恒星分分为60恒星秒。所有这些单位统称为计量时间的恒星时单位,简称恒星时单位。按上述系统计量时间,在天文学中称为恒星时。引用百度百科
有几个知识点(初中或高中的知识,忘记了)
此处的知识主要是为了更好的理解恒星时,做一个铺垫。我个人理解:所有的理论或定理都是基于一定的参考点的,参考点不同需要理解的知识或层次也会不同。
下面的大部分定义都考虑了太阳
,地球是围绕太阳公转的,我们可以简单的将太阳定为一个不动
的参考点,其实它是围绕银河系中心公转的,银河系围绕着本超星系团中心公转。这里不细记录了,大概是这种模式。我们在这里都是给定参考点,比如太阳,研究太阳与地球之间的相对物理特性。
- 地轴:地球自转轴(简称地轴,也称地球斜轴),
- 赤道:通过地球中心划一个与地轴(地球自转轴)成直角相交的平面;
- 黄道:太阳光在地球上
走
过的最长路线,简单理解,太阳光是一束平行光,照在地球上,它在与地心相交的平面上会划过一个圆,形成的平面就是黄道面。 - 春分点:太阳从南向北在黄道和赤道上的交点。太阳作为一颗特殊的恒星,其黄经在发生着周年性的变化,这种变化也引起太阳的赤道坐标值的改变。春分日太阳黄经为0°,赤经为0°或0时,赤纬为0°;夏至日太阳黄经为90°,赤经为90°,赤纬为+23°26′;秋分日太阳黄经为180°,赤经为180°,赤纬为0°;冬至日太阳黄经为270°,赤经为270°,赤纬为-23°26′。
- 秋分点:太阳沿黄道从天赤道以北向南通过天赤道的那一点。
- 冬至点和夏至点:冬至点:当太阳光直射到地球南回归线的那一刻,地球在公转轨道的那一点,太阳通过春分点到达最北的那一点称为夏至点。
- 黄赤交角:由于地球的自转轴没有垂直于轨道平面,所以赤道平面不与黄道平行,有23°26′的夹角,这个夹角就是黄赤交角。
- 经线:也称子午线,是地球表面连接南、北两极,并且垂直于赤道的弧线。某一天体
视运动
轨迹中,同一子午线上的各点该天体在上中天(午)与下中天(子)出现的时刻相同。 - 天体
视运动
:地面观测者直观观测到的天体的运动,主要由地球的自转引起。就像人坐在奔驰的火车里看到外面的房屋、树木在向后跑一样,地球每天绕自转轴自西向东旋转一周,地球上的人们就会看到所有的星星每天都绕着一个轴自东向西旋转一周。这个旋转轴与地球的自转轴方向一致,叫做天轴。天轴和天球相交于两点,和地球北极相对应的一点叫做北天极,和地球南极相对应的一点叫做南天极。引用自百度百科
当恒星在做周日旋转
的时候,北天极和南天极是固定不动的,而两个天极附近的恒星(即拱极星
)的运动轨迹呈一个个的同心圆。恒星离天极越近,所得到的圆圈的半径就越小,小熊星座星很靠近北天极,人们通常就把它叫做北极星。北极星在周日旋转中的轨迹是一个极小的圆,我们几乎可以认为它是固定不动的。假如你有兴趣的话,在晴朗无月的夜晚,有照相机对准北极星露光一小时左右,你就可以拍下拱极星周日视运动的轨迹了。
在天体周日视运动中,每天两次过中天:位置最高(地平高度)叫上中天;位置最低叫下中天。中天时天顶,天极,天体都在天子午圈上。所以,天体在上中天时天顶距z = φ - δ
,φ为观测地地里纬度;δ为天体赤纬;下中天时,z = δ - φ
- 天球:是在天文学和导航上想出的一个与地球同球心,并有相同的自转轴,半径无限大的球。天空中所有的物体都可以当成投影在天球上的物件。地球的赤道和地理极点投射到天球上,就是天球赤道和天极。天球是位置天文学上很实用的工具。
- 地平高度:也称地平纬度,通称高度和高度角;
- 地平圈:通过天球中心(实际是观测者的眼睛)并与铅垂线(天顶于天底连线)相垂直的平面,称为天球的地平面,地平面与天球相交而成的大圆称为地平圈。简单理解,把地球想象成一个椭圆,我们人站的位置想象成一个点A,连接点A和椭圆的圆心,形成一条线,在A点做一个与这条线垂直的圆,这个圆就是地平面(也就意味着不同的位置,地平面不同),把这个圆想象成无限大。下面计算如何将计算一个天体可不可以被该观测者观测到。
只要在上面计算的区域内,理论上观测者都可以看到,可以看到此圆与天球有两个交点,接下来我们计算如何以观测者的角度算出天球中某个恒星对应的纬度。在这里补充一点计算恒星距离的方法。 - 天体距离的测量:引用知乎,太阳与地球的平均距离149,597,870,700千米,天文单位
1AU=149597870700
,天体距离r=206265/Π″
,秒距差(pc)r=1pc
,光年(l.y.)1pc=3.261l.y.=206265AU
。 - 恒星时:是沿着天赤道测量的,从观察者的子午线到通过三月春分点和两个天极的大圆的角度
- 北天极:是指地轴和天球于北方相交的一点,即北半球星空旋转的虚拟中心点。
岁差
由于太阳、月球和行星对地球的吸引力造成的。
(1)回归年:也称太阳年,属于太阳时间计量系统,是太阳的平黄经变化360°所经历的时间。由于太阳视运动不是均匀的,选取不同的起点会得到不同的长度。若选取春分点作为基准,太阳从春分点出发运行一周再次回到春分点的时间为春分点年。在2000年,回归年的平均长度(即平回归年)为365.24219天(SI day)。
(2)恒星年:属于恒星时间计量系统,是太阳在黄道上的视位置相对遥远恒星变化360°所经历的时间。也相当于地球相对于遥远恒星在绕太阳公转轨道上运行360°所经历的时间。在2000年,恒星年的平均长度(即平恒星年)为365.25636天(SI day)。
(3)日月岁差:太阳和月球对地球赤道隆起部分的吸引力产生不可抵消的力偶作用,从而使得地球自转轴在惯性空间中绕黄道轴进动。地球自转轴以大约26,000年的周期在空间扫出一个圆锥。
如上图所示,在起始时刻,太阳视位置在春分点1,平黄经为0°。一段时间后,地球自转轴与天轴2重合,春分点的位置移动到了点2,太阳视位置到达点2,平黄经再次为0°,相对春分点运动了360°,这段时间为一个回归年。太阳继续运动到点1,相对惯性空间中的遥远恒星在黄道上转动了360°这段时间为一个恒星年。因此,恒星年比回归年略长。
(4)行星岁差:由于太阳系内其它行星引力作用,地球的周年运动并不严格遵守开普勒定律,黄道面的位置是在不断变化的,黄道面的变化也会导致春分点的变化,这使得春分点每年沿着#天赤道#东进约0.13″。
注意:日月岁差使春分点沿着黄道移动,行星岁差使春分点沿着天赤道移动。因此,有真春分点的格林尼治时角(GAST)和平春分点的格林尼治时角(GMST)之分。
(5)章动:在行星或陀螺仪的自转运动中,轴在进动中的一种轻微不规则运动,使自转轴在方向的改变中出现如点头
般的摇晃现象。
(6)J2000.0
坐标系:J2000.0的“J”代表儒略历,从上文可以了解地球自转轴和春分点是不断变化的,如果坐标系以自转轴或者春分点做参考的话,则必须指定某一瞬时作为参考基准,这一时刻称为历元。J2000.0的历元就是2000年1月1.5日TBD(质心动力学时),对应的儒略日为2451545.0日。
(7)WGS84
坐标系:WGS84坐标系是一种协议地球坐标系,Z轴指向北平天极,X轴指向格林尼治天文台零度子午面与协议地球极赤道的交点,Y轴与Z、X成右手直角坐标系。CGCS2000与WGS84所采用的历元、ITRF(地球参考框架)均不相同,因此存在一定差距。
卫星定位
北斗
系统定位的核心原理是利用多个卫星组网并计算距离(由信号接收时间差乘以电磁波的光速获得)来确定物体在地球上的位置,这种算法的精度主要取决于授时精度
和卫星之间的时间对齐程度
。
空间原子钟被誉为导航卫星的“心脏”,直接决定了导航定位精度。它能为导航系统提供具备超高稳定性的时间频率基准信号,更好地确定相互之间的距离,直接决定了导航系统的定位、测速和授时精度。导航系统的精度究竟能达到米级、分米级、还是厘米级,很大程度上依赖于空间原子钟的性能。
儒略日的计算
JD = INT( 365.25*(Y+4716) ) + INT( 30.6001*(M+1) ) + D + B - 1524.5
Y:给定年份,M为月份,D为该月日期(可以带小数)。
- 如果M>2,Y和M不变;如果M=1或2,Y=Y-1,M=M+12;
- 对格里高利历(即现在的公历)如果你输入的时间是公历,就需要按照这种规则:A=INT(Y/100),B=2-A+INT(A/4);
- 如果你输入的时间是儒略历,则 B=0;Y=Y;
本公式适用于计算-4712年1月1日12时
以后的任何日期的儒略日
综上,给出用JS
的计算函数。// 此处的date是格里高利历 const cJulianDate = () => { let date = new Date(); let y = date.getUTCFullYear(); let m = date.getUTCMonth()+1; let d = date.getUTCDate(); let h = date.getUTCHours(); let mi = date.getUTCMinutes(); let s = date.getUTCSeconds(); let mill = date.getUTCMilliseconds(); let df = d + h / 24 + mi / (60 * 24) + s / (60 * 60 * 24) + mill / (60 * 60 * 24 * 1000); if (m <= 2) { y = y - 1; m = m + 12; } //使用的是格里高利历,所以要计算两个常数,A,B let A = parseInt(y / 100); let B = 2 - A + parseInt(A / 4); let JD = parseInt(365.25 * (y + 4716)) + parseInt(30.6001 * (m + 1)) + df + B - 1524.5; return JD; } let jd = cJulianDate(); // 这是自公元 -4712年1月1日12时 到现在为止的天数,精度是毫秒 let mjd = jd - 2400000.5; // 约化儒略日,在1859至2130年之间,只需要5位数字来表示日期就够了,约化儒略日的起算点在1858年11月16日平午。
格林尼治视恒星时角
- 计算格林尼治平恒星时
let Am = 100.46061837 + 36000.770053608*T + 0.000387933*T*T - T*T*T / 38710000 // T = (JD-2451545)/36525 // 2451545 是J2000的儒略日。 // 格林尼治视恒星时角 // Θ = Θm + ΔΨ cos(εm + Δε) // Θm GMST 则是平春分点与经度零点问的夹角,ΔΨ是黄经章动,Δε是交角章动,εm黄道倾角 // 黄道倾角计算,下面的公式最后要转换为度 // εm=23°26′21.″448 - 46.″8150*T - 0.″00059*T*T + 0.″001813*T*T*T // 倾角章动和经度 // L = 280.4665 + 36000.7698T // L′ = 218.3165 + 481267.8813T // Ω = 125.04452 - 1934.136261T // 计算倾角章动 //ΔΨ= -17.20 sinΩ - 1.32 sin2 L - 0.23 sin2 L′ + 0.21sin2 Ω //Δε= 9.20 cos Ω + 0.57cos2 L + 0.10 cos 2 L′ - 0.09 cos 2 Ω const cJulianDate = () => { let date = new Date(); let y = date.getUTCFullYear(); let m = date.getUTCMonth() + 1; let d = date.getUTCDate(); // console.log(date.getTime()); let h = date.getUTCHours(); let mi = date.getUTCMinutes(); let s = date.getUTCSeconds(); let mill = date.getUTCMilliseconds(); let df = d + h / 24 + mi / (60 * 24) + s / (60 * 60 * 24) + mill / (60 * 60 * 24 * 1000); if (m <= 2) { y = y - 1; m = m + 12; } //使用的是格里高利历,所以要计算两个常熟,A,B let A = parseInt(y / 100); let B = 2 - A + parseInt(A / 4); let JD = parseInt(365.25 * (y + 4716)) + parseInt(30.6001 * (m + 1)) + df + B - 1524.5; let jdInt = Math.trunc(JD); let jdS = (JD - jdInt) * 24 * 60 * 60; // console.log(JD-jdInt,df-d,JD,jdInt,"jds") return [jdInt,jdS]; }; const calGMST = (jd, st) => { let D = jd + st / (24 * 60 * 60) - 2451545.0; let T = D / 36525.0; let GMST = 67310.54841 + (876600 * 60 * 60 + 8640184.812866) * T + 0.093104 * T * T - 6.2e-6 * T * T * T; let gmst1 = (GMST % 86400) / 240; // console.log(GMST2,"2") return gmst1; }; const calGAST = () => { let [fjd, st] = cJulianDate(); let TJD = fjd + st / (24 * 60 * 60) - 2451545.0; let T0 = TJD / 36525.0; let THETAm = calGMST(fjd, st); let EPSILONm = 23.4392911111111111 - 0.0130041666667 * T0 - 1.638e-7 * T0 * T0 + 5.0361e-7 * T0 * T0 * T0; let L = 280.4665 + 36000.7698 * T0; let dL = 218.3165 + 481267.8813 * T0; let OMEGA = 125.04452 - 1934.136261 * T0; let dPSI = -17.2 * Math.sin(OMEGA) - 1.32 * Math.sin(2 * L) - 0.23 * Math.sin(2 * dL) + 0.21 * Math.sin(2 * OMEGA); let dEPSILON = 9.2 * Math.cos(OMEGA) + 0.57 * Math.cos(2 * L) + 0.1 * Math.cos(2 * dL) - 0.09 * Math.cos(2 * OMEGA); dPSI = dPSI / 3600; dEPSILON = dEPSILON / 3600; let GAST = (THETAm + dPSI * Math.cos(EPSILONm + dEPSILON)) % 360; return GAST }; let gast = calGAST() // console.log((gast+360)*24/360,"1"); const getSide = (gast) => { let t1 = 0; if (gast < 0) { t1 = ((gast + 360) * 24) / 360; } else { t1 = gast * 24 / 360; } let h = Math.floor(t1); let m = Math.floor((t1 - h) * 60) let s = (t1 - h - m / 60) * 3600; return [h, m, s]; } let res = getSide(gast); console.log(res);