Skip to content

jamesgrimmett/geolocation_solver

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

geolocation_solver

Multilateration solver for the geolocation of an emitting object given the TDoA alone, or in combination with FDoA, of the signal measured by multiple recievers. Implemented in Python.

Solvers:

Algorithm Constraints Notes Status
TDoA algorithm[1] Emitter altitude must be known (can be zero). Limited to max. 3 receivers. Will be extended to allow > 3 recievers Functional
FDoA algorithm[1] Emitter altitude must be known (can be zero). Satellite velocities must be known. In-progress
Least squares Planned

[1] The geolocation solution outlined by Ho & Chan (1997).

Usage example

Simple example using the data given in Section VI of Ho & Chan (1997). With a known emitter location and three receivers, generate TDoA data and re-calculate the emitter location.

  from geolocation.solver import verify, solver, system
  from geolocation.utils import earth_model
  # Emitter location
  h_emitter = 0.0 # meters above sea level
  lat_emitter = 45.35
  lon_emitter = 75.9
  # Satellite locations
  sat_r = [42164, 42164, 42164] #km
  sat_lat = [2.0, 0.0, 0.0]
  sat_lon = [-50.0, -47.0, -53.0]
  # dummy tdoa  
  tdoa = [0.0, 0.0, 0.0]
 
  # Find emitter distance from origin
  r_local = earth_model.local_earth_radius(lat = lat_emitter, lon = lon_emitter)
  r_emitter = r_local + h_emitter
  # Pass satellite data and dummy TDoA to set sat_data dataframe and convert units.
  sys = system.System(satellite_positions = np.array([sat_r,sat_lat,sat_lon]).T,
                        is_geographic_coords = True,
                        r_emitter = r_emitter,
                        TDoA_data = tdoa,
                        scale_distance = 1000.0, 
                        )

  sat_data = sys.sat_data

  # Generate TDoA data using the known emitter location and 
  # some assumed measurement error
  tdoa = verify.generate_TDOA(sat_data = sat_data, 
              r_emitter = r_emitter,
              lat_emitter = lat_emitter,
              lon_emitter = lon_emitter,
              tdoa_var = 1.e-11)

  # Reinitialise the system with new TDoA data
  sys = system.System(satellite_positions = np.array(sat_data[['r','latitude','longitude']]),
                      is_geographic_coords = True,
                      r_emitter = r_emitter,
                      TDoA_data = tdoa,
                      )

  # Solve.
  s = solver.Solver(sys) 
  s.TDoA_solve()

About

Geolocation using TDOA and FDOA

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages