TLEとSGP4による軌道計算 — 衛星追跡の実用的手法

「ISSは今どこを飛んでいるのか?」「今夜Starlinkの列を見るには何時にどの方向を見ればいいのか?」— これらの問いに答えるためには、衛星の軌道情報とそれを伝播する計算モデルが必要です。

世界中の衛星追跡は、TLE(Two-Line Element、二行軌道要素)と呼ばれるわずか2行のテキストデータと、SGP4(Simplified General Perturbations 4)と呼ばれる伝播モデルに基づいています。米国宇宙コマンド(USSPACECOM)は地上のレーダー網と光学望遠鏡で約36,000個の宇宙物体を追跡し、その軌道情報をTLE形式で公開しています。

TLEとSGP4は1960年代から使われている「枯れた技術」ですが、その理解は衛星工学の基礎として今なお重要です。

TLEとSGP4を理解すると、以下のことが可能になります。

  • 衛星の現在位置の計算: 任意の時刻における衛星の地球固定座標での位置を求める
  • 衛星の可視性予測: 地上のある地点から衛星が見える時間帯と方向を計算する
  • コンステレーション管理: 数百機の衛星群の配置状況をリアルタイムで把握する

本記事の内容

  • 衛星カタログとTLEの歴史
  • TLEフォーマットの詳細な読み方
  • SGP4モデルの概要(解析的摂動理論)
  • J2-J4項とドラッグ項の物理
  • Pythonのsgp4ライブラリを使った位置計算
  • ISSの軌跡の可視化
  • 地上局からの可視性判定
  • TLEの精度と限界

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

衛星カタログとTLEの歴史

NORADカタログ

1957年のスプートニク打ち上げ以降、米国はすべての人工宇宙物体を追跡・カタログ化するシステムを構築しました。NORAD(North American Aerospace Defense Command)が管理するカタログでは、各物体に一意の番号(カタログ番号、NORAD ID)が割り当てられます。たとえば、ISS(Zarya モジュール)のカタログ番号は25544です。

現在この役割は第18宇宙防衛隊(18 SDS)が担い、データはSpace-Trackウェブサイト(space-track.org)や一般向けのCelestrak(celestrak.org)で公開されています。

TLEの歴史

TLE形式は1960年代にNORADが開発したデータフォーマットで、80桁のパンチカード2枚に軌道情報を収めることを前提に設計されました。パンチカード時代の遺産ですが、そのコンパクトさと世界的な普及から、60年以上経った今でも衛星追跡の標準フォーマットとして使われ続けています。

重要な点は、TLEはSGP4モデルとセットで使うことが前提だということです。TLEに含まれる軌道要素は、SGP4の内部処理で使われる「平均軌道要素」(mean elements)であり、一般的な瞬時軌道要素(osculating elements)とは異なります。TLEの軌道要素をそのまま二体問題のケプラー伝播に使うと、正確な結果は得られません。

TLEの基本的な背景がわかったところで、次にTLEの各フィールドの意味を一つずつ見ていきましょう。

TLEフォーマットの読み方

TLEの構造

TLEは0行目(オプション)、1行目、2行目の最大3行で構成されます。以下はISSのTLEの例です(データは例示用)。

ISS (ZARYA)
1 25544U 98067A   24001.50000000  .00016717  00000-0  10270-3 0  9993
2 25544  51.6400 247.4627 0006703 130.5360 229.6208 15.49815135439123

1行目の詳細

1 25544U 98067A   24001.50000000  .00016717  00000-0  10270-3 0  9993
桁位置 内容 ISS例での値 意味
1 行番号 1 1行目であることを示す
3-7 カタログ番号 25544 NORAD衛星カタログ番号
8 分類 U U=非機密, C=機密, S=秘密
10-17 国際識別符号 98067A 98年67番目の打ち上げ、A=最初の物体
19-32 エポック 24001.50000000 2024年の1.5日目(1月1日12:00 UTC)
34-43 平均運動1次導関数 .00016717 $\dot{n}/2$ [rev/day²] — ドラッグ効果
45-52 平均運動2次導関数 00000-0 $\ddot{n}/6$ — SGP4では通常未使用
54-61 B*ドラッグ項 10270-3 $B^* = 0.10270 \times 10^{-3}$ — 大気抵抗パラメータ
63 エフェメリスタイプ 0 0=SGP4
65-68 要素セット番号 999 通算の更新番号
69 チェックサム 3 各桁の数字の和の mod 10

2行目の詳細

2 25544  51.6400 247.4627 0006703 130.5360 229.6208 15.49815135439123
桁位置 内容 ISS例での値 意味
1 行番号 2 2行目
3-7 カタログ番号 25544 1行目と同じ
9-16 傾斜角 51.6400 $i$ [度]
18-25 昇交点赤経 247.4627 $\Omega$ [度]
27-33 離心率 0006703 $e = 0.0006703$(先頭の「0.」は省略)
35-42 近地点引数 130.5360 $\omega$ [度]
44-51 平均近点角 229.6208 $M$ [度]
53-63 平均運動 15.49815135 $n$ [rev/day]
64-68 通算周回数 43912 エポック時の通算周回数
69 チェックサム 3

主要パラメータの解釈

平均運動 $n$: 1日あたりの周回数です。ISSの場合15.50回/日なので、周期は約92.9分、高度は約415 kmと計算できます。

$$ T = \frac{86400}{n} \, \text{[s]}, \quad a = \left(\frac{\mu T^2}{4\pi^2}\right)^{1/3} $$

B*ドラッグ項: 大気抵抗の効果を表すパラメータです。

$$ B^* = \frac{\rho_0 C_D A}{2m} $$

単位は $R_E^{-1}$(地球半径の逆数)です。Bが大きいほど大気抵抗の影響が大きい衛星です。ISSのBは $\sim 10^{-4}$、高軌道衛星では $\sim 10^{-5}$ 以下です。

平均運動の1次導関数: 大気抵抗による軌道の縮小速度を表します。正の値は平均運動が増加(周期が短縮、高度が低下)していることを意味します。

TLEの各フィールドが理解できたところで、次にこのデータをどう使って衛星の位置を計算するかを見ていきましょう。それがSGP4モデルです。

SGP4モデルの概要

解析的摂動理論

SGP4は解析的(analytical)な軌道伝播モデルです。数値積分のように微分方程式を1ステップずつ解くのではなく、摂動の効果を解析的な公式(閉じた形の数式)で計算します。

SGP4の計算手順は大まかに以下の通りです。

  1. TLEの平均軌道要素をエポック時の値として読み込む
  2. セキュラー項(永年変動)を計算: J2, J4, 大気抵抗の永年効果
  3. 長周期項を計算: J3の効果による離心率と近地点引数の周期変動
  4. 短周期項を計算: 1軌道以内の周期変動
  5. 平均要素 + セキュラー + 長周期 + 短周期 → 瞬時(osculating)軌道要素に変換
  6. 軌道要素から地心慣性座標(ECI)の位置・速度を計算

J2-J4摂動項

SGP4が考慮する地球非球形の項は $J_2$、$J_3$、$J_4$ です。

J2項($J_2 = 1.08263 \times 10^{-3}$)は最も重要で、以下の永年変動を引き起こします。

昇交点赤経の回帰:

$$ \dot{\Omega} = -\frac{3}{2}n J_2 \left(\frac{R_E}{p}\right)^2 \cos i $$

近地点引数の移動:

$$ \dot{\omega} = \frac{3}{4}n J_2 \left(\frac{R_E}{p}\right)^2 (5\cos^2 i – 1) $$

平均近点角の変化(平均運動の修正):

$$ \delta n = \frac{3}{4}n J_2 \left(\frac{R_E}{p}\right)^2 \sqrt{1-e^2}(3\cos^2 i – 1) $$

J3項($J_3 = -2.54 \times 10^{-6}$)は地球の南北非対称性を表し、主に離心率と近地点引数に長周期の変動を引き起こします。

J4項($J_4 = -1.62 \times 10^{-6}$)はJ2の高次補正で、永年変動の精度を向上させます。

大気抵抗モデル

SGP4の大気抵抗モデルは非常に簡略化されたもので、TLEに含まれるB*パラメータと平均運動の導関数 $\dot{n}$ を使います。大気密度の詳細なモデル(NRLMSISE-00など)は使わず、冪級数展開による解析的な近似を行います。

具体的には、半長軸の永年変化を

$$ \dot{a}_{\text{drag}} \propto -B^* \rho(a) a^2 $$

として、密度を高度の指数関数で近似した解析解を使います。この近似は粗いですが、TLEが定期的(数日ごと)に更新されることを前提としているため、短期的な精度は十分です。

SDP4(深宇宙)

軌道周期が225分以上(高度約5,900 km以上)の衛星には、SGP4の拡張版であるSDP4(Simplified Deep-space Perturbations)が使われます。SDP4はJ2-J4に加えて、月と太陽の第三体摂動と太陽輻射圧も考慮します。

実際にはsgp4ライブラリが軌道周期に基づいてSGP4とSDP4を自動的に切り替えるため、利用者が意識する必要はありません。

SGP4の理論的背景が理解できたところで、Pythonで実際にTLEデータを使った軌道計算を行いましょう。

PythonでのSGP4による位置計算

sgp4ライブラリの基本

Pythonのsgp4ライブラリを使えば、TLEデータから衛星の位置をすぐに計算できます。

import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, timedelta

# sgp4ライブラリのインポート
# pip install sgp4 でインストール
from sgp4.api import Satrec, WGS72
from sgp4 import exporter

# --- ISS (ZARYA) のTLE(例示用データ) ---
tle_line1 = "1 25544U 98067A   24001.50000000  .00016717  00000-0  10270-3 0  9993"
tle_line2 = "2 25544  51.6400 247.4627 0006703 130.5360 229.6208 15.49815135439123"

# SGP4衛星オブジェクトの作成
satellite = Satrec.twoline2rv(tle_line1, tle_line2, WGS72)

# エポック情報の確認
epoch_year = satellite.epochyr
epoch_days = satellite.epochdays
print(f"エポック: {epoch_year}年 {epoch_days:.4f}日")
print(f"傾斜角: {np.degrees(satellite.inclo):.4f}°")
print(f"離心率: {satellite.ecco:.7f}")
print(f"平均運動: {satellite.no_kozai * 1440 / (2*np.pi):.8f} rev/day")

# 周期と高度の推定
n_rad_min = satellite.no_kozai  # [rad/min]
T_min = 2 * np.pi / n_rad_min  # 周期 [分]
mu_km = 398600.4418  # [km^3/s^2]
a_km = (mu_km * (T_min * 60 / (2 * np.pi))**2)**(1/3)
h_km = a_km - 6378.137
print(f"周期: {T_min:.1f} 分")
print(f"推定高度: {h_km:.0f} km")

位置計算

from sgp4.api import jday

def propagate_tle(satellite, start_datetime, duration_hours, dt_seconds=60):
    """
    TLE/SGP4で衛星の位置を計算

    Returns:
        times: datetime配列
        positions: ECI座標 [km] (N, 3)
        velocities: ECI速度 [km/s] (N, 3)
    """
    times = []
    positions = []
    velocities = []

    current = start_datetime
    end = start_datetime + timedelta(hours=duration_hours)

    while current <= end:
        jd, fr = jday(current.year, current.month, current.day,
                       current.hour, current.minute,
                       current.second + current.microsecond / 1e6)

        error_code, r, v = satellite.sgp4(jd, fr)

        if error_code == 0:
            times.append(current)
            positions.append(r)  # [km]
            velocities.append(v) # [km/s]

        current += timedelta(seconds=dt_seconds)

    return times, np.array(positions), np.array(velocities)


# --- 24時間の位置計算 ---
start = datetime(2024, 1, 1, 12, 0, 0)  # エポック時刻
times, pos_eci, vel_eci = propagate_tle(satellite, start, 24, dt_seconds=30)

print(f"計算点数: {len(times)}")
print(f"位置の範囲 [km]:")
print(f"  X: {pos_eci[:,0].min():.0f} ~ {pos_eci[:,0].max():.0f}")
print(f"  Y: {pos_eci[:,1].min():.0f} ~ {pos_eci[:,1].max():.0f}")
print(f"  Z: {pos_eci[:,2].min():.0f} ~ {pos_eci[:,2].max():.0f}")

r_mag = np.linalg.norm(pos_eci, axis=1)
h_eci = r_mag - 6378.137
print(f"  高度: {h_eci.min():.1f} ~ {h_eci.max():.1f} km")

ISSの軌跡を地図上に描く

ECI座標を地理座標(緯度・経度)に変換して、衛星の地上軌跡(Ground Track)を描きます。

def eci_to_geodetic(r_eci, datetime_utc):
    """
    ECI座標 → 地理座標(緯度・経度・高度)

    簡易版: グリニッジ恒星時でz軸回転
    """
    # グリニッジ恒星時(GMST)の概算
    # J2000からのユリウス世紀
    jd = (datetime_utc - datetime(2000, 1, 1, 12, 0, 0)).total_seconds() / 86400.0
    jd += 2451545.0
    T = (jd - 2451545.0) / 36525.0

    # GMST [度]
    gmst_deg = 280.46061837 + 360.98564736629 * (jd - 2451545.0) + \
               0.000387933 * T**2 - T**3 / 38710000.0
    gmst_deg = gmst_deg % 360

    gmst_rad = np.radians(gmst_deg)

    # ECI → ECEF(z軸回りの回転)
    cos_g = np.cos(gmst_rad)
    sin_g = np.sin(gmst_rad)

    x_ecef = cos_g * r_eci[0] + sin_g * r_eci[1]
    y_ecef = -sin_g * r_eci[0] + cos_g * r_eci[1]
    z_ecef = r_eci[2]

    # ECEF → 地理座標
    r_xy = np.sqrt(x_ecef**2 + y_ecef**2)
    lat = np.degrees(np.arctan2(z_ecef, r_xy))
    lon = np.degrees(np.arctan2(y_ecef, x_ecef))
    alt = np.sqrt(x_ecef**2 + y_ecef**2 + z_ecef**2) - 6378.137

    return lat, lon, alt


# --- 地理座標への変換 ---
lats = np.zeros(len(times))
lons = np.zeros(len(times))
alts = np.zeros(len(times))

for k in range(len(times)):
    lats[k], lons[k], alts[k] = eci_to_geodetic(pos_eci[k], times[k])
# --- 地上軌跡(Ground Track)の描画 ---
fig, ax = plt.subplots(figsize=(14, 7))

# 経度の不連続を処理(-180/+180の折り返し)
lon_plot = lons.copy()
for k in range(1, len(lon_plot)):
    if abs(lon_plot[k] - lon_plot[k-1]) > 180:
        lon_plot[k] = np.nan  # 線を途切れさせる

# 地上軌跡のプロット
ax.scatter(lon_plot, lats, c=np.arange(len(lats)), cmap='viridis',
           s=1, alpha=0.7)

# 出発点をマーク
ax.plot(lons[0], lats[0], 'r*', markersize=12, label='Start')

# 地図の装飾
ax.set_xlim(-180, 180)
ax.set_ylim(-90, 90)
ax.set_xlabel('Longitude [deg]')
ax.set_ylabel('Latitude [deg]')
ax.set_title('ISS Ground Track (24 hours)')
ax.set_aspect('equal')

# 傾斜角の範囲を示す
ax.axhline(y=51.64, color='red', linestyle='--', alpha=0.3, label='Inclination limit')
ax.axhline(y=-51.64, color='red', linestyle='--', alpha=0.3)

ax.legend()
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('iss_ground_track.png', dpi=150, bbox_inches='tight')
plt.show()

この地上軌跡から、ISSの軌道の特徴が明確に読み取れます。

  1. 軌跡は正弦波のような形状 — 傾斜角51.64°に対応して、緯度は±51.64°の範囲を振動します。1周ごとに地球の自転の影響で軌跡が西に約22.5°ずれています。

  2. 24時間で約16周 — 平均運動が15.5 rev/dayなので、1日で約15.5回の周回軌跡が描かれています。軌跡が地球全体をカバーしているのは、ISSの軌道傾斜角が比較的大きいためです。

  3. 緯度の範囲は傾斜角で決まる — 赤い破線で示された傾斜角の限界(±51.64°)を軌跡が超えることはありません。これは軌道力学の基本的な性質です。

地上局からの可視性判定

次に、ある地上局からISSが見えるかどうかを判定します。仰角(elevation angle)が一定値以上であれば「可視」と判断します。

def compute_elevation(sat_pos_eci, station_lat, station_lon, station_alt,
                      obs_datetime):
    """
    地上局から見た衛星の仰角を計算

    Parameters:
        sat_pos_eci: 衛星のECI位置 [km]
        station_lat: 観測局の緯度 [度]
        station_lon: 観測局の経度 [度]
        station_alt: 観測局の高度 [km]
        obs_datetime: 観測時刻

    Returns:
        elevation: 仰角 [度]
        azimuth: 方位角 [度]
    """
    # GMST
    jd = (obs_datetime - datetime(2000, 1, 1, 12, 0, 0)).total_seconds() / 86400
    jd += 2451545.0
    T = (jd - 2451545.0) / 36525.0
    gmst_deg = 280.46061837 + 360.98564736629 * (jd - 2451545.0) + \
               0.000387933 * T**2 - T**3 / 38710000.0
    gmst_rad = np.radians(gmst_deg % 360)

    # 観測局のECEF座標
    lat_r = np.radians(station_lat)
    lon_r = np.radians(station_lon)
    r_station = 6378.137 + station_alt

    x_ecef_s = r_station * np.cos(lat_r) * np.cos(lon_r)
    y_ecef_s = r_station * np.cos(lat_r) * np.sin(lon_r)
    z_ecef_s = r_station * np.sin(lat_r)

    # 観測局のECI座標
    cos_g, sin_g = np.cos(gmst_rad), np.sin(gmst_rad)
    x_eci_s = cos_g * x_ecef_s - sin_g * y_ecef_s
    y_eci_s = sin_g * x_ecef_s + cos_g * y_ecef_s
    z_eci_s = z_ecef_s

    # 相対ベクトル(ECI)
    rho_eci = sat_pos_eci - np.array([x_eci_s, y_eci_s, z_eci_s])

    # ECI → SEZ(South-East-Zenith)座標
    lst = gmst_rad + lon_r  # 地方恒星時

    cos_lat = np.cos(lat_r)
    sin_lat = np.sin(lat_r)
    cos_lst = np.cos(lst)
    sin_lst = np.sin(lst)

    # 回転行列 ECI → SEZ
    rho_s = (sin_lat * cos_lst * rho_eci[0] +
             sin_lat * sin_lst * rho_eci[1] -
             cos_lat * rho_eci[2])
    rho_e = (-sin_lst * rho_eci[0] +
              cos_lst * rho_eci[1])
    rho_z = (cos_lat * cos_lst * rho_eci[0] +
             cos_lat * sin_lst * rho_eci[1] +
             sin_lat * rho_eci[2])

    rho_mag = np.sqrt(rho_s**2 + rho_e**2 + rho_z**2)

    # 仰角と方位角
    elevation = np.degrees(np.arcsin(rho_z / rho_mag))
    azimuth = np.degrees(np.arctan2(rho_e, -rho_s)) % 360

    return elevation, azimuth


# --- 東京(種子島宇宙センター)からのISS可視性 ---
station_lat = 30.4      # 緯度 [度]
station_lon = 131.0     # 経度 [度]
station_alt = 0.05      # 高度 [km]
station_name = "Tanegashima"

# 24時間の仰角を計算
elevations = np.zeros(len(times))
azimuths = np.zeros(len(times))

for k in range(len(times)):
    elevations[k], azimuths[k] = compute_elevation(
        pos_eci[k], station_lat, station_lon, station_alt, times[k])

# 可視パス(仰角 > 10°)の検出
min_elevation = 10.0  # 最低仰角 [度]
visible = elevations > min_elevation
# --- 可視性プロット ---
fig, axes = plt.subplots(2, 1, figsize=(14, 8))

# 仰角の時系列
t_hours = np.array([(t - times[0]).total_seconds() / 3600 for t in times])
axes[0].plot(t_hours, elevations, 'b-', linewidth=0.5, alpha=0.7)
axes[0].fill_between(t_hours, min_elevation, elevations,
                      where=visible, alpha=0.3, color='green',
                      label='Visible (el > 10°)')
axes[0].axhline(y=min_elevation, color='red', linestyle='--',
                alpha=0.5, label=f'Min elevation ({min_elevation}°)')
axes[0].axhline(y=0, color='gray', linestyle='-', alpha=0.3)
axes[0].set_xlabel('Time [hours from epoch]')
axes[0].set_ylabel('Elevation [deg]')
axes[0].set_title(f'ISS Elevation from {station_name}')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
axes[0].set_ylim(-90, 90)

# 可視パスの最大仰角
pass_starts = []
in_pass = False
for k in range(len(visible)):
    if visible[k] and not in_pass:
        pass_starts.append(k)
        in_pass = True
    elif not visible[k] and in_pass:
        in_pass = False

# 可視パスの詳細
axes[1].set_visible(False)
pass_info = "=== 可視パス一覧 ===\n"
for i, start_idx in enumerate(pass_starts[:8]):
    # パスの終了を探す
    end_idx = start_idx
    while end_idx < len(visible) and visible[end_idx]:
        end_idx += 1

    max_el = elevations[start_idx:end_idx].max()
    max_el_idx = start_idx + np.argmax(elevations[start_idx:end_idx])

    pass_info += (f"Pass {i+1}: "
                  f"{times[start_idx].strftime('%H:%M')} - "
                  f"{times[min(end_idx, len(times)-1)].strftime('%H:%M')} UTC, "
                  f"Max El = {max_el:.1f}°\n")

print(pass_info)

plt.tight_layout()
plt.savefig('iss_visibility.png', dpi=150, bbox_inches='tight')
plt.show()

この可視性解析から、衛星追跡の実際の運用に関する重要な知見が得られます。

  1. ISSは1日に数回「通過」する — 緑色で示された可視パスが1日に数回発生しています。各パスの持続時間は通常5〜10分程度です。

  2. 仰角が高いパスほど好条件 — 最大仰角が60°以上のパスは観測に適しており、30°以下のパスは大気の影響で見づらくなります。

  3. 可視条件は複合的 — ここでは仰角のみで判定しましたが、実際には太陽光の照射条件(衛星に太陽光が当たっている且つ地上が暗い)も必要です。

TLEの精度と限界

精度

TLE/SGP4による位置予測の精度は、エポックからの経過時間に強く依存します。

エポックからの経過 位置精度(目安)
数時間以内 1〜5 km
1日 5〜20 km
3日 20〜50 km
1週間 50〜100 km以上

精度が急速に悪化するのは、SGP4モデルの限界(簡略化された大気モデル、第三体摂動の近似)と、TLEの元となる観測データの精度に起因します。

限界

TLE/SGP4には以下の根本的な限界があります。

  1. 精度の限界: 高精度な軌道決定(GPS搭載衛星など)の精度はcmオーダーですが、TLEはkmオーダーにとどまる
  2. 更新頻度への依存: TLEは定期的に更新されることを前提としており、古いTLEは急速に精度が劣化する
  3. マヌーバの非考慮: 衛星が軌道修正を行った場合、マヌーバ前のTLEは使えなくなる
  4. 平均要素: TLEの軌道要素はSGP4の内部定義による「平均要素」で、他のモデルでの使用には変換が必要

代替フォーマット

近年は、TLEに代わる新しいフォーマットも登場しています。

OMM(Orbit Mean-Elements Message): CCSDS(宇宙データ標準化諮問委員会)が定義したXML/JSON形式のフォーマット。TLEと同じ平均要素を含みつつ、より拡張性の高い構造を持つ。Space-Trackではすでに提供開始。

OEM(Orbit Ephemeris Message): 瞬時軌道要素や状態ベクトルの時系列を含むフォーマット。精密軌道データの交換に使用。

しかし、TLE/SGP4は60年以上の実績と世界的な普及度から、当面は衛星追跡の基盤であり続けるでしょう。

まとめ

本記事では、TLEとSGP4による衛星軌道計算の実用的手法を解説しました。

  • TLEフォーマット: 2行80桁のテキストに6つの平均軌道要素、B*ドラッグ項、平均運動の導関数を格納。SGP4モデルとセットで使うことが前提
  • SGP4モデル: J2-J4とドラッグの効果を解析的に計算する軌道伝播モデル。数値積分なしで任意の時刻の衛星位置を高速に計算できる
  • J2摂動: 昇交点の回帰と近地点の移動を引き起こす最大の摂動。SGP4の主要な永年項
  • B*ドラッグ項: TLEに含まれる大気抵抗パラメータ。SGP4の大気モデルは簡略化されているが、定期的なTLE更新を前提とすれば実用的
  • 位置精度: エポックから数時間で1〜5 km、1週間で50〜100 km以上に劣化。高精度が必要な用途にはGPSベースの精密軌道が必要
  • 可視性判定: ECI→地理座標→仰角/方位角の変換で地上局からの可視性を判定できる

次のステップとして、以下の記事も参考にしてください。