Laikad preperation (#26800)
* laikad update, renaming * update locationd * address PR comments * draft to fix replay * fix process relay to allow no response for messages * bump cereal * update process replay ref commit * move laikad helpers to laika * fix ublox test * update refs * add proper qcom replay support * fix gnss support if both is available * update refs * move laika back to master * move cereal back to master Co-authored-by: Kurt Nistelberger <kurt.nistelberger@gmail.com>pull/26573/head
parent
ab797588f8
commit
981532f0c3
10 changed files with 197 additions and 179 deletions
@ -1 +1 @@ |
||||
Subproject commit 22b1431132b038253a24ab3fbbe3af36ef93b95b |
||||
Subproject commit f200875ca300d3a7b9293c4effcc9456e359e505 |
@ -1 +1 @@ |
||||
Subproject commit e1049cde0a68f7d4a70b1ebd76befdc0e163ad55 |
||||
Subproject commit 5eb0c3c2596dd12a232b83bdb057a716810e89cf |
@ -1,89 +0,0 @@ |
||||
import numpy as np |
||||
import sympy |
||||
|
||||
from laika.constants import EARTH_ROTATION_RATE, SPEED_OF_LIGHT |
||||
from laika.helpers import ConstellationId |
||||
|
||||
|
||||
def calc_pos_fix_gauss_newton(measurements, posfix_functions, x0=None, signal='C1C', min_measurements=6): |
||||
''' |
||||
Calculates gps fix using gauss newton method |
||||
To solve the problem a minimal of 4 measurements are required. |
||||
If Glonass is included 5 are required to solve for the additional free variable. |
||||
returns: |
||||
0 -> list with positions |
||||
''' |
||||
if x0 is None: |
||||
x0 = [0, 0, 0, 0, 0] |
||||
n = len(measurements) |
||||
if n < min_measurements: |
||||
return [], [] |
||||
|
||||
Fx_pos = pr_residual(measurements, posfix_functions, signal=signal) |
||||
x = gauss_newton(Fx_pos, x0) |
||||
residual, _ = Fx_pos(x, weight=1.0) |
||||
return x.tolist(), residual.tolist() |
||||
|
||||
|
||||
def pr_residual(measurements, posfix_functions, signal='C1C'): |
||||
def Fx_pos(inp, weight=None): |
||||
vals, gradients = [], [] |
||||
|
||||
for meas in measurements: |
||||
pr = meas.observables[signal] |
||||
pr += meas.sat_clock_err * SPEED_OF_LIGHT |
||||
|
||||
w = (1 / meas.observables_std[signal]) if weight is None else weight |
||||
|
||||
val, *gradient = posfix_functions[meas.constellation_id](*inp, pr, *meas.sat_pos, w) |
||||
vals.append(val) |
||||
gradients.append(gradient) |
||||
return np.asarray(vals), np.asarray(gradients) |
||||
|
||||
return Fx_pos |
||||
|
||||
|
||||
def gauss_newton(fun, b, xtol=1e-8, max_n=25): |
||||
for _ in range(max_n): |
||||
# Compute function and jacobian on current estimate |
||||
r, J = fun(b) |
||||
|
||||
# Update estimate |
||||
delta = np.linalg.pinv(J) @ r |
||||
b -= delta |
||||
|
||||
# Check step size for stopping condition |
||||
if np.linalg.norm(delta) < xtol: |
||||
break |
||||
return b |
||||
|
||||
|
||||
def get_posfix_sympy_fun(constellation): |
||||
# Unknowns |
||||
x, y, z = sympy.Symbol('x'), sympy.Symbol('y'), sympy.Symbol('z') |
||||
bc = sympy.Symbol('bc') |
||||
bg = sympy.Symbol('bg') |
||||
var = [x, y, z, bc, bg] |
||||
|
||||
# Knowns |
||||
pr = sympy.Symbol('pr') |
||||
sat_x, sat_y, sat_z = sympy.Symbol('sat_x'), sympy.Symbol('sat_y'), sympy.Symbol('sat_z') |
||||
weight = sympy.Symbol('weight') |
||||
|
||||
theta = EARTH_ROTATION_RATE * (pr - bc) / SPEED_OF_LIGHT |
||||
val = sympy.sqrt( |
||||
(sat_x * sympy.cos(theta) + sat_y * sympy.sin(theta) - x) ** 2 + |
||||
(sat_y * sympy.cos(theta) - sat_x * sympy.sin(theta) - y) ** 2 + |
||||
(sat_z - z) ** 2 |
||||
) |
||||
|
||||
if constellation == ConstellationId.GLONASS: |
||||
res = weight * (val - (pr - bc - bg)) |
||||
elif constellation == ConstellationId.GPS: |
||||
res = weight * (val - (pr - bc)) |
||||
else: |
||||
raise NotImplementedError(f"Constellation {constellation} not supported") |
||||
|
||||
res = [res] + [sympy.diff(res, v) for v in var] |
||||
|
||||
return sympy.lambdify([x, y, z, bc, bg, pr, sat_x, sat_y, sat_z, weight], res, modules=["numpy"]) |
@ -1 +1 @@ |
||||
05ba201bcf97b6c1067dbcde2a60f71f43469c56 |
||||
557ffbf5a1c9cafba1ff8d6f3e2642df98b2d6e6 |
Loading…
Reference in new issue