|
15 | 15 |
|
16 | 16 | from gnss_lib_py.parsers.navdata import NavData |
17 | 17 | from gnss_lib_py.utils.coordinates import geodetic_to_ecef |
| 18 | +from gnss_lib_py.utils.coordinates import ecef_to_geodetic |
18 | 19 | from gnss_lib_py.utils.time_conversions import unix_to_gps_millis |
| 20 | +from gnss_lib_py.utils.time_conversions import gps_to_unix_millis |
19 | 21 |
|
20 | 22 | class AndroidDerived2021(NavData): |
21 | 23 | """Class handling derived measurements from Android dataset. |
@@ -491,3 +493,71 @@ def make_csv(input_path, output_directory, field, show_path=False): |
491 | 493 | print(output_path) |
492 | 494 |
|
493 | 495 | return output_path |
| 496 | + |
| 497 | +def solve_kaggle_baseline(navdata): |
| 498 | + """Convert Decimeter challenge baseline into state_estimate. |
| 499 | +
|
| 500 | + The baseline solution was provided in 2022, but not in 2021. |
| 501 | +
|
| 502 | + Parameters |
| 503 | + ---------- |
| 504 | + navdata : gnss_lib_py.parsers.android.AndroidDerived2022 |
| 505 | + Instance of the AndroidDerived2022 class. |
| 506 | +
|
| 507 | + """ |
| 508 | + |
| 509 | + columns = ["unix_millis", |
| 510 | + "x_rx_m", |
| 511 | + "y_rx_m", |
| 512 | + "z_rx_m", |
| 513 | + ] |
| 514 | + data_df = (navdata.pandas_df().drop_duplicates(subset='unix_millis')[columns] |
| 515 | + .reset_index(drop=True)) |
| 516 | + lat,lon,alt = ecef_to_geodetic(data_df[["x_rx_m", |
| 517 | + "y_rx_m", |
| 518 | + "z_rx_m", |
| 519 | + ]].to_numpy().T) |
| 520 | + |
| 521 | + state_estimate = NavData() |
| 522 | + state_estimate["gps_millis"] = unix_to_gps_millis( |
| 523 | + data_df["unix_millis"].to_numpy()) |
| 524 | + state_estimate["lat_rx_deg"] = lat |
| 525 | + state_estimate["lon_rx_deg"] = lon |
| 526 | + state_estimate["alt_rx_deg"] = alt |
| 527 | + |
| 528 | + return state_estimate |
| 529 | + |
| 530 | +def prepare_kaggle_submission(state_wls, trip_id): |
| 531 | + """Converts from gnss_lib_py receiver state to Kaggle submission. |
| 532 | +
|
| 533 | +
|
| 534 | + receiver_state : gnss_lib_py.parsers.navdata.NavData |
| 535 | + Estimated receiver position in latitude and longitude as an |
| 536 | + instance of the NavData class with the following |
| 537 | + rows: ``lat_*_deg``, ``lon_*_deg``. |
| 538 | + tripId : string |
| 539 | + Value for the tripId column in kaggle submission which is a |
| 540 | + fusion of the data and phone type |
| 541 | +
|
| 542 | + Returns |
| 543 | + ------- |
| 544 | + output : gnss_lib_py.parsers.navdata.NavData |
| 545 | + NavData structure ready for Kaggle submission |
| 546 | +
|
| 547 | + """ |
| 548 | + |
| 549 | + state_wls.in_rows("gps_millis") |
| 550 | + wildcards = state_wls.find_wildcard_indexes(["lat_*_deg", |
| 551 | + "lon_*_deg"],max_allow = 1) |
| 552 | + |
| 553 | + output = NavData() |
| 554 | + output["tripId"] = np.array([trip_id] * state_wls.shape[1]) |
| 555 | + output["UnixTimeMillis"] = gps_to_unix_millis(state_wls["gps_millis"]) |
| 556 | + output.orig_dtypes["UnixTimeMillis"] = np.int64 |
| 557 | + output["LatitudeDegrees"] = state_wls[wildcards["lat_*_deg"]] |
| 558 | + output["LongitudeDegrees"] = state_wls[wildcards["lon_*_deg"]] |
| 559 | + |
| 560 | + output.interpolate("UnixTimeMillis",["LatitudeDegrees", |
| 561 | + "LongitudeDegrees"]) |
| 562 | + |
| 563 | + return output |
0 commit comments