Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Possible wrong time correction factor on navigation solution #15

Open
minecraft2048 opened this issue Feb 5, 2025 · 1 comment
Open

Comments

@minecraft2048
Copy link

Someone asked me why FGI-GSRx gave wrong position for a IF capture from a receiver flying on an low Earth orbit satellite.
The error between FGI-GSRx and our onboard GPS receiver seems familiar, this looks like wrong sign on the time correction.
I've seen this before on JuliaGNSS/PositionVelocityTime.jl#8

If we go with the navigation problem according to Kaplan and Hegarty:

Image

If I read these code correctly:

pos(4:end) = DeltaPos(4:end)/SPEED_OF_LIGHT; % In seconds

Pos.dt = pos(4:end);

DeltaPos(4:end) corresponds to -c*Δtu in the navigation problem.

The navigation solution timestamp is then corrected in

Time.receiverTow(signalNr) = obs.(signal).receiverTow + Pos.dt(signalNr);

But this means that pos.dt will have the wrong sign, because we're currently dividing it by +c instead of -c.
It will then apply the time correction to the wrong way, so we will have correct solution but at wrong time.
At static scenario this won't do anything, but at low Earth orbit speed, which is around 6 km/s, a 100ms error translates to 600m error in position

Can you please confirm the speed of light sign?

@nlspaakkoi
Copy link
Contributor

Hey,

I can confirm that there is an error here. The clock bias (if we define it as receiver time minus system time) ends up having the correct sign but then the corrected receiver TOW is incorrect since the bias is added and not subtracted.

The fix to get the receiver TOW to be correct is to simply change the sign in the correction step:

Time.receiverTow(signalNr) = obs.(signal).receiverTow + Pos.dt(signalNr); -> Time.receiverTow(signalNr) = obs.(signal).receiverTow - Pos.dt(signalNr);

The way I read the section in Kaplan & Hegarty, DeltaPos(4:end) in FGI-GSRx actually corresponds to c*Δtu. Its the correction step that should be changed to get the correct receiver TOW included in the solution.

Best regards,
Into

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants