calculate r and v(not very precise)
commit
ea65214b0c
@ -0,0 +1,209 @@
|
|||||||
|
import math
|
||||||
|
import pymap3d.ecef
|
||||||
|
import pymap3d.eci
|
||||||
|
import pymap3d.aer
|
||||||
|
import pymap3d.ellipsoid
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
|
||||||
|
class StandardDistance():
|
||||||
|
def __init__(self, strline):
|
||||||
|
s = "#" + strline
|
||||||
|
self.satelliteID = s[1:8]
|
||||||
|
self.measureType = s[8:10]
|
||||||
|
self.flagTime10 = s[10:11]
|
||||||
|
self.flagTime11 = s[11:12]
|
||||||
|
self.surveyStation = s[12:17].strip()
|
||||||
|
self.timeMeasureYear = int(s[17:19])
|
||||||
|
self.timeMeasureDay = int(s[19:22])
|
||||||
|
self.timeMeasureSecond = int(s[22:27])
|
||||||
|
self.timeMeasureMicroSecond = int(s[27:33])
|
||||||
|
self.flagFixedIonosphere = s[33:34]
|
||||||
|
self.flagFixedTroposphere = s[34:35]
|
||||||
|
self.flagDataEdition = s[35:36]
|
||||||
|
self.flagFixedCentroidShift = s[36:37]
|
||||||
|
self.flagPhaseContinuity = s[37:38]
|
||||||
|
self.flagFixedPhaseCenter = s[38:39]
|
||||||
|
# space in 39
|
||||||
|
self.UHFdistance_mm = float(s[40:52]) # important
|
||||||
|
self.dataCompressionPoint = s[52:55]
|
||||||
|
self.standardPointsWindow = s[55:56]
|
||||||
|
# space in 56
|
||||||
|
self.weatherSurfacePressure = s[57:61]
|
||||||
|
self.weatherSurfaceTemperature = s[61:64]
|
||||||
|
self.weatherRelativeHumidity = s[64:67]
|
||||||
|
self.measurementStandardDeviation_mm = s[67:73]
|
||||||
|
self.ionosphericReflectionCorrection_mm = s[73:80]
|
||||||
|
self.convectiveReflectionCorrection_mm = s[80:86]
|
||||||
|
self.centroidOffsetCorrection_mm = s[86:91]
|
||||||
|
self.phaseCenterCorrection_mm = s[91:97]
|
||||||
|
self.launchStation = s[97:101].strip()
|
||||||
|
# c, light speed
|
||||||
|
self.lightSpeed_m_per_s = 299792458
|
||||||
|
|
||||||
|
|
||||||
|
class AzimuthAndElevationAngle():
|
||||||
|
def __init__(self, strline):
|
||||||
|
s = "#" + strline
|
||||||
|
self.satelliteID = s[1:8]
|
||||||
|
self.measureType = s[8:10]
|
||||||
|
self.flagTime10 = s[10:11]
|
||||||
|
self.flagTime11 = s[11:12]
|
||||||
|
self.surveyStation = s[12:17].strip()
|
||||||
|
self.timeMeasureYear = int(s[17:19])
|
||||||
|
self.timeMeasureDay = int(s[19:22])
|
||||||
|
self.timeMeasureSecond = int(s[22:27])
|
||||||
|
self.timeMeasureMicroSecond = int(s[27:33])
|
||||||
|
self.flagAngle = s[33:34]
|
||||||
|
self.flagFixedTroposphere = s[34:35]
|
||||||
|
self.flagDataEdition = s[35:36]
|
||||||
|
self.angleA_degree = float(s[36:39])
|
||||||
|
self.angleA_minute = float(s[39:41])
|
||||||
|
self.angleA_second = float(s[41:46])
|
||||||
|
self.angleE_degree = float(s[46:49])
|
||||||
|
self.angleE_minute = float(s[49:51])
|
||||||
|
self.angleE_second = float(s[51:56])
|
||||||
|
# space in 56-57
|
||||||
|
self.angleA_StandardDeviation = s[58:62]
|
||||||
|
self.angleE_StandardDeviation = s[62:66]
|
||||||
|
# space in 66
|
||||||
|
self.angleA_TroposphereReflectionCorrection = s[67:72]
|
||||||
|
self.angleE_TroposphereReflectionCorrection = s[72:77]
|
||||||
|
self.CDP_LaserSystemID = s[77:79]
|
||||||
|
self.CDP_SN = s[79:81]
|
||||||
|
# space in 81-90
|
||||||
|
|
||||||
|
|
||||||
|
class OpticalData():
|
||||||
|
def __init__(self, strline):
|
||||||
|
s = "#" + strline
|
||||||
|
self.satelliteID = s[1:8]
|
||||||
|
self.measureType = s[8:10]
|
||||||
|
self.flagTime10 = s[10:11]
|
||||||
|
self.flagTime11 = s[11:12]
|
||||||
|
self.surveyStation = s[12:17].strip()
|
||||||
|
self.timeMeasureYear = int(s[17:19])
|
||||||
|
self.timeMeasureDay = int(s[19:22])
|
||||||
|
self.timeMeasureSecond = int(s[22:27])
|
||||||
|
self.timeMeasureMicroSecond = int(s[27:33])
|
||||||
|
# space in 33,34
|
||||||
|
self.flagDataEdition = s[35:36]
|
||||||
|
self.IDEGA = s[36:39]
|
||||||
|
self.IMINA = s[39:41]
|
||||||
|
self.SECA = s[41:46]
|
||||||
|
self.IDEGE = s[46:49]
|
||||||
|
self.IMINE = s[49:51]
|
||||||
|
self.SECE = s[51:56]
|
||||||
|
# space in 56,57
|
||||||
|
self.SIGMAA = s[58:62]
|
||||||
|
self.SIGMAE = s[62:66]
|
||||||
|
|
||||||
|
|
||||||
|
station_position = {}
|
||||||
|
|
||||||
|
|
||||||
|
# ID = (lat, lon, h)
|
||||||
|
def station_reader(filename):
|
||||||
|
with open(filename, 'r') as f:
|
||||||
|
for line in f.readlines()[1:]:
|
||||||
|
strline = line.split()
|
||||||
|
if len(strline) > 0:
|
||||||
|
station_position[strline[0]] = (float(strline[3]),
|
||||||
|
float(strline[2]),
|
||||||
|
float(strline[1]))
|
||||||
|
|
||||||
|
|
||||||
|
def distance_3D(vec1, vec2):
|
||||||
|
return math.sqrt(sum((x - y)**2 for x, y in zip(vec1, vec2)))
|
||||||
|
|
||||||
|
|
||||||
|
def read_vector_R(str_dist, str_AE):
|
||||||
|
dist_obj = StandardDistance(str_dist)
|
||||||
|
AE_obj = AzimuthAndElevationAngle(str_AE)
|
||||||
|
angleA = AE_obj.angleA_degree + AE_obj.angleA_minute / 60 + AE_obj.angleA_second / 3600
|
||||||
|
angleE = AE_obj.angleE_degree + AE_obj.angleE_minute / 60 + AE_obj.angleE_second / 3600
|
||||||
|
distance = dist_obj.UHFdistance_mm / 1000 # mm to m
|
||||||
|
aer = (angleA, angleE, distance)
|
||||||
|
obs = station_position[dist_obj.surveyStation]
|
||||||
|
launch = station_position[dist_obj.launchStation]
|
||||||
|
|
||||||
|
wgs84 = pymap3d.ellipsoid.Ellipsoid()
|
||||||
|
p_star_fake = pymap3d.aer.aer2ecef(*aer, *obs, wgs84) # fake
|
||||||
|
p_obs = pymap3d.ecef.geodetic2ecef(*obs, wgs84)
|
||||||
|
p_lau = pymap3d.ecef.geodetic2ecef(*launch, wgs84)
|
||||||
|
|
||||||
|
a, b, c = distance_3D(p_star_fake,
|
||||||
|
p_obs), distance_3D(p_lau, p_obs), distance_3D(
|
||||||
|
p_star_fake, p_lau),
|
||||||
|
cos_theta = (a * a + b * b - c * c) / (2 * a * b)
|
||||||
|
delta_x = (b * b - distance * distance) / (2 * b * cos_theta -
|
||||||
|
2 * distance)
|
||||||
|
|
||||||
|
aer2 = (aer[0], aer[1], delta_x)
|
||||||
|
x, y, z = pymap3d.aer.aer2ecef(*aer2, *obs, wgs84) # real
|
||||||
|
obs_time = datetime(2000, 1, 1) + relativedelta(
|
||||||
|
years=dist_obj.timeMeasureYear) + timedelta(
|
||||||
|
days=dist_obj.timeMeasureDay,
|
||||||
|
seconds=dist_obj.timeMeasureSecond,
|
||||||
|
microseconds=dist_obj.timeMeasureMicroSecond)
|
||||||
|
x, y, z = pymap3d.eci.ecef2eci(x, y, z, time=obs_time)
|
||||||
|
return (x[0], y[0], z[0]), obs_time
|
||||||
|
|
||||||
|
|
||||||
|
def diff_v(pos_list, time_h):
|
||||||
|
'''
|
||||||
|
pos_list = [(x1, y1, z1), (x2, y2, z2)...]
|
||||||
|
time_h = time gap, such as 1s
|
||||||
|
'''
|
||||||
|
# n = len(pos_list)//2
|
||||||
|
# down = time_h * n * (n + 1) * (2 * n + 1)
|
||||||
|
# sumX, sumY, sumZ = 0, 0, 0
|
||||||
|
# for (x, y, z) in pos_list:
|
||||||
|
# sumX += x
|
||||||
|
# sumY += y
|
||||||
|
# sumZ += z
|
||||||
|
# # n = 2m+1 , return v_(m+1) if start count form 1
|
||||||
|
# return (sumX * 3 / down, sumY * 3 / down, sumZ * 3 / down)
|
||||||
|
return [(y - x) / (2 * time_h) for x, y in zip(pos_list[0], pos_list[2])]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
R_list = []
|
||||||
|
T_list = []
|
||||||
|
V_list = []
|
||||||
|
Vpos_list = []
|
||||||
|
VT_list = []
|
||||||
|
station_reader(r"C:\Users\ASUS\Desktop\天智杯科目一测试数据\01输入文件示例\站点坐标.dat")
|
||||||
|
with open(
|
||||||
|
r"C:\Users\ASUS\Desktop\天智杯科目一测试数据\01输入文件示例\data\20200720\20200720120000_000877_1376.odp"
|
||||||
|
) as f:
|
||||||
|
odplist = f.readlines()
|
||||||
|
for distline, aerline in zip(odplist[0::2], odplist[1::2]):
|
||||||
|
R, T = read_vector_R(distline, aerline)
|
||||||
|
R_list.append(R)
|
||||||
|
T_list.append(T)
|
||||||
|
if len(R_list) == 3:
|
||||||
|
V = diff_v(R_list, time_h=1)
|
||||||
|
V_list.append(V)
|
||||||
|
VT_list.append(T_list[1])
|
||||||
|
Vpos_list.append(R_list[1])
|
||||||
|
T_list.clear()
|
||||||
|
R_list.clear()
|
||||||
|
|
||||||
|
aso_datas = []
|
||||||
|
ID = 1
|
||||||
|
for v, vp, t in zip(V_list, Vpos_list, VT_list):
|
||||||
|
print(v,vp,t)
|
||||||
|
aso_data = {}
|
||||||
|
aso_data['aso_name'] = ID
|
||||||
|
aso_data['aso_id'] = ID
|
||||||
|
aso_data['epoch'] = t
|
||||||
|
aso_data['r_x'], aso_data['r_y'], aso_data['r_z'] = vp
|
||||||
|
aso_data['v_x'], aso_data['v_y'], aso_data['v_z'] = v
|
||||||
|
aso_data['object_type'] = 'xs'
|
||||||
|
aso_datas.append(aso_data)
|
||||||
|
res = pd.DataFrame(aso_datas)
|
||||||
|
print(res)
|
||||||
|
# res.to_parquet()
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
from numpy.core.arrayprint import DatetimeFormat
|
||||||
|
import pymap3d.ecef
|
||||||
|
import pymap3d.eci
|
||||||
|
import pymap3d.aer
|
||||||
|
import pymap3d.ellipsoid
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
obs = (13.0344804066577, 77.5111003779841, 839.009756775573)
|
||||||
|
aer = (123.08, 50.06, 37350340.0)
|
||||||
|
|
||||||
|
wgs84 = pymap3d.ellipsoid.Ellipsoid()
|
||||||
|
x,y,z = pymap3d.aer.aer2ecef(*aer,*obs, wgs84)
|
||||||
|
print(x,y,z)
|
||||||
|
x,y,z = pymap3d.eci.ecef2eci(x,y,z,time=datetime(1999,4,2,3,0,0))
|
||||||
|
print(x,y,z)
|
||||||
@ -0,0 +1,65 @@
|
|||||||
|
from math import *
|
||||||
|
import numpy as np
|
||||||
|
import pymap3d.ecef
|
||||||
|
|
||||||
|
EARTH_ECC = 0.01671022
|
||||||
|
EARTH_R = 6385607.4105288265 # equator km
|
||||||
|
|
||||||
|
|
||||||
|
def LLA_to_ECEF(lat, lon, h):
|
||||||
|
deg2rad = pi / 180
|
||||||
|
lat = lat * deg2rad
|
||||||
|
lon = lon * deg2rad
|
||||||
|
print((EARTH_R + h), cos(lat) ,cos(lon), (EARTH_R + h) * cos(lat) * cos(lon))
|
||||||
|
X = (EARTH_R + h) * cos(lat) * cos(lon)
|
||||||
|
Y = (EARTH_R + h) * cos(lat) * sin(lon)
|
||||||
|
Z = (EARTH_R * (1 - EARTH_ECC**2) + h) * sin(lat)
|
||||||
|
print(X, Y, Z)
|
||||||
|
return (X, Y, Z)
|
||||||
|
|
||||||
|
|
||||||
|
def local_to_enu(aer):
|
||||||
|
A, E, R = aer
|
||||||
|
deg2rad = pi / 180
|
||||||
|
A = A * deg2rad
|
||||||
|
E = E * deg2rad
|
||||||
|
e = R * cos(E) * sin(A)
|
||||||
|
n = R * cos(E) * cos(A)
|
||||||
|
u = R * sin(E)
|
||||||
|
return (e, n, u)
|
||||||
|
|
||||||
|
|
||||||
|
def enu_to_ECEF(p0_LLA, enu):
|
||||||
|
lat, lon, h = p0_LLA
|
||||||
|
e, n, u = enu
|
||||||
|
deg2rad = pi / 180
|
||||||
|
lat = lat * deg2rad
|
||||||
|
lon = lon * deg2rad
|
||||||
|
mat = [[-sin(lon), -sin(lat) * cos(lon), cos(lat) * cos(lon)],
|
||||||
|
[cos(lon), -sin(lat) * sin(lon), cos(lat) * sin(lon)],
|
||||||
|
[0, cos(lat), sin(lat)]]
|
||||||
|
mat = np.array(mat)
|
||||||
|
# print(mat, enu)
|
||||||
|
delta = mat @ np.array([e, n, u]).reshape(-1, 1)
|
||||||
|
p0_xyz = np.array([*LLA_to_ECEF(*p0_LLA)]).reshape(-1, 1)
|
||||||
|
# print("--------", delta, p0_xyz)
|
||||||
|
return p0_xyz + delta
|
||||||
|
|
||||||
|
|
||||||
|
def observe_to_ECEF(station, aer):
|
||||||
|
enu = local_to_enu(aer)
|
||||||
|
r = enu_to_ECEF(station, enu)
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# lat, lon, h
|
||||||
|
# obs = (13.0344804066577, 77.5111003779841, 0.839009756775573)
|
||||||
|
# # aer = (132.67, 32.44, 16945.450)
|
||||||
|
# aer = (123.08, 50.06, 37350.340)
|
||||||
|
# # obs = (0, 0, 1000)
|
||||||
|
# # aer = (0, 90, 1000)
|
||||||
|
# ans = observe_to_ECEF(obs, aer)
|
||||||
|
# print(ans)
|
||||||
|
LLA_to_ECEF(36.2295894, 93.0661482, 746.049)
|
||||||
|
print(pymap3d.ecef.geodetic2ecef(36.2295894, 93.0661482, 746.049))
|
||||||
Loading…
Reference in new issue