@@ -99,6 +99,16 @@ def tle_fmt_int(num, digits=5):
99
99
return string_int
100
100
101
101
102
+ def tle_fmt_float (num ,width = 10 ):
103
+ """ Return a left-aligned signed float string, with no leading zero left of the decimal """
104
+ digits = (width - 2 )
105
+ ret = "{:<.{DIGITS}f}" .format (num ,DIGITS = digits )
106
+ if ret .startswith ("0." ):
107
+ return " " + ret [1 :]
108
+ if ret .startswith ("-0." ):
109
+ return "-" + ret [2 :]
110
+
111
+
102
112
def tle_fmt_epoch (EpochDateTime ):
103
113
""" Return an Epoch string in TLE format, with a total width of 14 characters
104
114
@@ -392,6 +402,23 @@ def __init__(self, catalog=None, line0=None, line1=None, line2=None, tle_source_
392
402
except TLEValueError :
393
403
log .warning ("{}: Encountered errors in processing the following TLE block:\t {}\n \t {}\n \t {}" .format (self ._tle_source_filename , self .line0 ,self .line1 ,self .line2 ))
394
404
405
+ def correct_value_ranges (self ):
406
+ """ Adjust angular ranges outside of customary ranges
407
+
408
+ e.g. 0 <= var1 < 360
409
+ 0 <= var2 < 180
410
+ 0 <= var3 < 2 pi
411
+ 0 <= var4 < pi
412
+ """
413
+ self .raan_degrees = self .raan_degrees % 360
414
+ self .arg_perigee_degrees = self .arg_perigee_degrees % 360
415
+ self .mean_anomaly_degrees = self .mean_anomaly_degrees % 360
416
+
417
+ if (not (0 <= self .inclination_degrees <= 180 )):
418
+ self .inclination_degrees = self .inclination_degrees % 180
419
+ self .raan_degrees = self .raan_degrees = (self .raan_degrees + 180 ) % 360
420
+
421
+
395
422
def derived_values (self ):
396
423
""" Calculate values which are determined from TLE parameters """
397
424
self .epoch_string = self .epoch_datetime .isoformat (timespec = 'microseconds' )
@@ -622,13 +649,17 @@ def make_tle_lines(self):
622
649
LAUNCH_NUM = self ._id_launch_num ,
623
650
LAUNCH_PIECE_LETTER = self ._id_launch_piece_letter )
624
651
652
+ self .correct_value_ranges ()
653
+
654
+ tle_mean_motion_derivative = tle_fmt_float (self .mean_motion_derivative ,width = 10 )
655
+
625
656
# TODO: Deal with First Derivative xno, Second derivative xno, Bstar
626
- line1 = "1 {:5d }{:1} {:<8s} {:14s} {:<10.8f } {:8s} {:8s} {:1d}{:4s}00" .format (
657
+ line1 = "1 {:05d }{:1} {:<8s} {:14s} {:10s } {:8s} {:8s} {:1d}{:4s}00" .format (
627
658
self .satellite_number ,
628
659
self .classification ,
629
660
packed_designation ,
630
661
tle_epoch ,
631
- self . mean_motion_derivative ,
662
+ tle_mean_motion_derivative ,
632
663
tle_fmt_decimal_pack (self .mean_motion_sec_derivative ),
633
664
tle_fmt_decimal_pack (self .bstar ),
634
665
self .ephemeris_type ,
@@ -777,7 +808,7 @@ def assumed_decimal_point(num_less_than_one, digits=7):
777
808
string_num = "{0:.{DIGITS}f}" .format (num ,DIGITS = digits )
778
809
return (string_num [2 :])
779
810
780
-
811
+ # FIXME: This function currently only used by elfind.py - update elfind to use make_tle_lines instead
781
812
def make_tle (* , name = "None" , ssn , desig = "0000000" , epoch_datetime , xincl , xnodeo , eo , omegao , xmo , xno , deg = True , quiet = False ):
782
813
""" write TLE to output file and to screen """
783
814
@@ -824,7 +855,7 @@ def make_tle(*, name="None", ssn, desig="0000000", epoch_datetime, xincl, xnodeo
824
855
if not quiet :
825
856
print ("{:s}" .format (line0 ))
826
857
827
- line1 = "1 {:5d }U {:<8s} {:14s} 0.00000073 00000-0 50000-4 0 00" .format (ssn ,desig ,tle_epoch )
858
+ line1 = "1 {:05d }U {:<8s} {:14s} 0.00000073 00000-0 50000-4 0 00" .format (ssn ,desig ,tle_epoch )
828
859
# TODO: Deal with First Derivative xno, Second derivative xno, Bstar
829
860
line2 = "2 {:05d} {:8.4f} {:8.4f} {:7s} {:8.4f} {:8.4f} {:11.8f} 00" .format (
830
861
ssn , xincl , xnodeo , eo_string , omegao , xmo , xno )
@@ -886,6 +917,7 @@ def make_tle_from_SGP4_satrec(satrec, classification="T"):
886
917
887
918
TLE .launch_piece_number = launch_piece_letter_to_number (TLE .designation )
888
919
920
+ TLE .correct_value_ranges ()
889
921
TLE .derived_values ()
890
922
TLE .make_tle_lines ()
891
923
TLE ._fingerprint_tle ()
0 commit comments