|
35 | 35 | "id": "3bc6b5dd", |
36 | 36 | "metadata": {}, |
37 | 37 | "source": [ |
38 | | - "Solve for the Weighted Least Squares position estimate simply by passing the measurement data." |
| 38 | + "Solve for the Weighted Least Squares position estimate simply by passing the measurement data.\n", |
| 39 | + "\n", |
| 40 | + "When obtaining WLS estimates for real measurements, the rotation of the Earth between the signal transmission and reception has to be accounted for.\n", |
| 41 | + "`solve_wls` accounts for this by default and rotates the given SV positions into the ECEF frame of reference when the signals were received.\n", |
| 42 | + "\n", |
| 43 | + "In case you assume that the satellite positions are given for the ECEF frame of reference when the signals were received,\n", |
| 44 | + "this can be accomplished by setting the parameter `tx_time = False` in the function call." |
39 | 45 | ] |
40 | 46 | }, |
41 | 47 | { |
|
45 | 51 | "metadata": {}, |
46 | 52 | "outputs": [], |
47 | 53 | "source": [ |
48 | | - "state_wls = glp.solve_wls(derived_data)" |
| 54 | + "state_wls = glp.solve_wls(derived_data)\n", |
| 55 | + "# When assuming that SV positions are given in the ECEF frame when signals are received use\n", |
| 56 | + "# state_wls = glp.solve_wls(derived_data, use_tx_time=True)" |
49 | 57 | ] |
50 | 58 | }, |
51 | 59 | { |
|
101 | 109 | "id": "0387e03e", |
102 | 110 | "metadata": {}, |
103 | 111 | "source": [ |
104 | | - "Solve for the Weighted Least Squares position estimate simply by passing the measurement data." |
| 112 | + "Solve for the Weighted Least Squares position estimate simply by passing the measurement data.\n", |
| 113 | + "\n", |
| 114 | + "The implemented EKF also assumes that the satellite positions are given for when the signals were transmitted and that\n", |
| 115 | + "they must be rotated to account for the change in the ECEF frame of reference.\n", |
| 116 | + "\n", |
| 117 | + "In this case, to change this default behaviour, pass a dictionary `init_dict` with the key-value pair `\"use_tx_time\": True`." |
| 118 | + ] |
| 119 | + }, |
| 120 | + { |
| 121 | + "cell_type": "markdown", |
| 122 | + "id": "31e7b493", |
| 123 | + "metadata": {}, |
| 124 | + "source": [ |
| 125 | + "To prevent accidental usage of untuned process and measurement noises, `solve_gnss_ekf` requires an initialization \\\n", |
| 126 | + "dictionary containing values for the process noise `\"Q\"` and the measurement noise `\"R\"`.\n", |
| 127 | + "\n", |
| 128 | + "In the naive implementation, the noise matrix is set to the size of the measurement vector using the scalar value `\"R\"`." |
| 129 | + ] |
| 130 | + }, |
| 131 | + { |
| 132 | + "cell_type": "code", |
| 133 | + "execution_count": null, |
| 134 | + "id": "2dfb8d75", |
| 135 | + "metadata": {}, |
| 136 | + "outputs": [], |
| 137 | + "source": [ |
| 138 | + "import numpy as np\n", |
| 139 | + "init_dict = {\"Q\": np.eye(7),\n", |
| 140 | + " \"R\" : np.eye(1)}" |
105 | 141 | ] |
106 | 142 | }, |
107 | 143 | { |
|
113 | 149 | }, |
114 | 150 | "outputs": [], |
115 | 151 | "source": [ |
116 | | - "state_ekf = glp.solve_gnss_ekf(derived_data)" |
| 152 | + "state_ekf = glp.solve_gnss_ekf(derived_data, init_dict)" |
117 | 153 | ] |
118 | 154 | }, |
119 | 155 | { |
|
209 | 245 | "source": [ |
210 | 246 | "figs = glp.plot_metric_by_constellation(galileo_data, \"gps_millis\", \"residuals_m\")" |
211 | 247 | ] |
| 248 | + }, |
| 249 | + { |
| 250 | + "cell_type": "code", |
| 251 | + "execution_count": null, |
| 252 | + "id": "fdc6d9cb", |
| 253 | + "metadata": {}, |
| 254 | + "outputs": [], |
| 255 | + "source": [] |
212 | 256 | } |
213 | 257 | ], |
214 | 258 | "metadata": { |
|
0 commit comments