Git Product home page Git Product logo

gogps_java's People

Contributors

dependabot[bot] avatar ege010 avatar nro2dai avatar zigliouk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gogps_java's Issues

Position validation of UBX files?

I have a few ubx rawx files, but some of them seem not to work with goGPS, even after your recommendations (#27). The result is:
"Valid LS position? false Coord ECEF: X:0.0 Y:0.0 Z:0.0
ENU: E:0.0 N:0.0 U:0.0
GEOD: Lon:0.0 Lat:0.0 H:0.0"
I thought that some of them may be too short, but now I see that's not the case. I tried to parse and compare satellite data from different files with my own C# app, but I cannot see what is causing the problem. What makes a position valid? Can you identify any problems with these files?
I'm attaching a file that processes successfully and one that fails.

rawx.zip

KF mode bugs

There are still bugs in the Kalman filtering mode since we have implemented to support multi-constellation.

Partial Rinex files

Some daily Rinex files, especially the ones from NASA (see below), are gradually updated and it's a problem when we cache the file, as goGPS won't retry to download a partial file if it's already been cached.
I'm looking for ways to catch this situation and force a reload

public final static String NASA_NAVIGATION_DAILY = "ftp://cddis.gsfc.nasa.gov/pub/gps/data/daily/${yyyy}/${ddd}/${yy}n/brdc${ddd}0.${yy}n.Z";

Serial Connection types should implement an interface

Classes such as NVSerialConnection and UBXSerialConnection should implement a common interface. That would make my life easier while building a GUI :-)

Methods such as

    public void init() throws Exception;
    public boolean isConnected() ;
    public static Vector getPortList(boolean showList);
    public void release(boolean waitForThread, long timeoutMs);
       ...

are common. Also, or alternatively, both classes should extend an abstract class in order to avoid code duplication.

Ambiguities as state variables

I've been thinking again about treating "code ambiguities" as state variables, just like goGPS does with "phase ambiguities".
Code-wise there are two cases: 1.sub-ms (snapshot) ambiguities and 2.sub-20ms (after bit synch) ambiguities (see, as usual, Van Diggelen).
In the first case, we solve the code ambiguities based on a priori within 150km max from the true position, depending on the clock error.
In the second case, the a priori position has to be 3,000km max away.
As in the "phase ambiguity" case, cycles slips can occur and we compensate (in the snapshot case) by keeping reconstructed pseudoranges within 150km from a chosen reference (or pivot I suppose) pseudorange.

Now I like the way goGPS treats phase ambiguities as state variable. It's really elegant.
But is it really useful? As far as I understand, those ambiguities are not supposed to change from epoch to epoch, a part from cycle slips. And they're not solved by the system, either, or are they?
I hope my question makes sense.

Here's my current development branch:
https://github.com/Sirtrack/goGPS/blob/snapshotGPS/src/main/java/org/gogpsproject/ReceiverPosition.java

Notice, I've also added a DTM option.

[Edit] Fixed limits for a priori location

Add DTM Module

The DTM module is missing from goGPS Java. Actually I would be happy just with adding a "soft constraint" to make an under-determined system a full rank one, or to make a full rank system over-determined, perhaps based on an a priori estimate of height.
I'm not sure how that works with the design matrix in ECEF coordinates.

Consider renaming this project to goGPS_Java (or similar)

Let's make room for goGPS Matlab :-)
Also, I don't know whether there's a tool to export SVN history from Sourceforge to Git. I've used Git-svn in the past, it's supported by Git's command line.
Not easy to use, it does work though

Add ability to pass a list of NavigationProducers

Currently we can only set one single NavigationProducer.
Add the ability to pass a list of NavigationProducers, so that if the first one fails to return Ephemeris, the second one is tried and so on.
I'll personally work on this feature

Weight Matrix

Hi everyone, quick questions:

  1. what's the range of expected values for the Weight Matrix based on satellite elevation?
  2. when you add a height constraint, using a DTM, how do you weight that contribution?

Thank you as usual

Improve error reporting with findEph()

Currently when findEph() is called, that returns null for all sorts of reasons, for example because when the Health status of a satellite for a given timestamp is != 0 (not healthy).
For that reason it's hard to know why findEph() has failed, was the file not there? or rather that file was there but the satellite was unhealthy.
Those are very different cases and currently we have no easy way to discriminate between the two.
If an observation contains, say, 4 sats and one is unhealthy (really unlucky but it can happen), there should be a way to know so we can mark that fix as failed.

Question about Tropospheric Corrections

One thing I've just learnt is that tropospheric corrections are actually computed using a model.
But also I've discovered that they seem to be highly dependent on the clock error.
That's especially true in the case of coarse time navigation, with the local clock error in the order of seconds or even minutes.
So I've put a cap on those computed tropospheric corrections, so that they wouldn't screw the system (I've also noticed that those corrections are excluded when computing an a priori position).
It's curious that they seem to minimize around the true time. How's that happening?
Also: what maximum correction should one expect?

UnhealthyEph and UnhealthySat, breaking change!

I've started merging a lot of my changes so please bear with me.

A problem I had was that when a satellite is marked as unhealthy, its ephemeris was returned as null, the same if the ephemeris wasn't simply available.
To mark a satellite as unhealthy, I've created two singletons: one for the ephemeris and one for the satellite, so instead of returning null, I return that singleton. See these changes:

0213dd2

2c142cb

That certainly requires some changes in the rest of the code, so please check and see what you think.

Example usage in satelectSatellitesStandalone

      pos[i] = goGPS.getNavigation()
          .getGpsSatPosition( roverObs, id, 'G', this.getReceiverClockError() );
      
      if(  pos[i] == SatellitePosition.UnhealthySat ) {
        pos[i] = null;
        continue;
      }
      
      if( pos[i] == null  || Double.isNaN(pos[i].getX() )) {
//        if(debug) System.out.println("Not useful sat "+roverObs.getSatID(i));
        if( i == 0 || satAvail.size()> 0 )
          continue;
        else {
          status = Status.EphNotFound;
          return;
        }
      }

Here I know why the returned pos was null, because a satellite was marked unhealthy, vs Ephmeris not found. We could similarly create a singleton to mark EphNotFound, I'm just trying to move away from simply returning null.
Throwing an exception could be another option but I'm not a big fan

too old Ephemeris being used

I've seen this happening when trying to process some recent data.
The daily Rinex file was not available yet so we backed off an hour and loaded the Rinex from the previous day:

http://garner.ucsd.edu/pub/rinex/2016/314/auto3140.16n.Z from the net.
URL: http://garner.ucsd.edu/pub/rinex/2016/314/auto3140.16n.Z
404 Not Found
http://garner.ucsd.edu/pub/rinex/2016/313/auto3130.16n.Z from the net.
URL: http://garner.ucsd.edu/pub/rinex/2016/313/auto3130.16n.Z

Unfortunately it appears that the the Ephemeris in use from the older Rinex were just too old (168 minutes).
As a quick&dirty fix, I've added this check to RinexNavigationParser.findEph():

	if( dtMin/1000/60>120 )
	  return null;

Have you seen this happening too? I've noticed goGPS using old ephemeris a few times when doing processing in real time, but that was long time ago

Kalman dops

Question for @ege010 , any special reason why there's a set of dops specific to the Kalman Filter?
See RoverPosition:

/** Kalman-derived position dilution of precision (KPDOP) */
double kpDop; 

/** Kalman-derived horizontal dilution of precision (KHDOP) */
double khDop; 

/** Kalman-derived vertical dilution of precision (KVDOP) */
double kvDop; 

Also, do we need a dopType?

  private int dopType = DOP_TYPE_NONE;
  public final static int DOP_TYPE_NONE = 0;
  public final static int DOP_TYPE_STANDARD = 1; /* Standard DOP values (satellite geometry only) */
  public final static int DOP_TYPE_KALMAN = 2; /* Kalman DOP values (KDOP), based on the Kalman filter error covariance matrix */

A graphical user interface for goGPS Java

Wouldn't it be nice to have a fully fledged GUI for goGPS Java?
I don't have a full license for goGPS Matlab and its GUI doesn't work well on Matlab for Linux and doesn't work at all on Octave.

Now, desktop applications is difficult, something crossplatform desktop/mobile would be nice.
But Java doesn't run in a browser and browser apps are second rate citizens on mobile.
I'm not aware of any proposed development in this area.

How to convert .dat files?

Hi guys!
how's everyone?

I'm logging some real time data to roverOut.data and navigationOut.dat.
That doesn't look like any particular format, it looks to me just java serialization.
Do you know how to convert those files to something more useful, rinex navigation and observation files?
Even better, shouldn't ObservationBuffer produce Rinex files instead of .dat files?

Introduction of LAMBDA method for integer ambiguity resolution

It would be useful to add the use of the LAMBDA method to resolve integer values for phase ambiguities after the Kalman filter update on phase double differences. Reference code in goGPS MATLAB:

http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/positioning/kalman/goGPS_KF_DD_code_phase_loop.m#l843

http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/positioning/lambda/lambdafix.m

The latest MATLAB implementation of LAMBDA (v3) can be downloaded from here: http://gnss.curtin.edu.au/research/lambda.cfm

Not sure if a Java implementation of LAMBDA already exists somewhere...

Handle .z rinex files that are compressed in Gzip format

I've run into a strange exception

org.gogpsproject.parser.rinex.RinexNavigation getRNPByTimestamp: Input not in compress format (read magic number 0x1f8b)
java.io.IOException: Input not in compress format (read magic number 0x1f8b)
at org.gogpsproject.util.UncompressInputStream.parse_header(UncompressInputStream.java:373)
at org.gogpsproject.util.UncompressInputStream.(UncompressInputStream.java:62)
at org.gogpsproject.parser.rinex.RinexNavigation.getFromHTTP(RinexNavigation.java:316)
at org.gogpsproject.parser.rinex.RinexNavigation.getRNPByTimestamp(RinexNavigation.java:214)

It turns out this rinex file (ending with .z), looks like it's been compressed in gzip, not z, format:
http://garner.ucsd.edu/pub/rinex/2017/071/auto0710.17n.Z

I've verified it using 7zip:

image

This change in RinexNavigation seems to work for me. I'll integrate it when I get around to doing it, hopefully soon...

        if(remoteFile.endsWith(".Z")){
          try{
            InputStream is = new ByteArrayInputStream(res.getContent());
            InputStream uis = new UncompressInputStream(is);
            rnp = new RinexNavigationParser(uis,rnf);
            rnp.init();
            uis.close();
          }
          catch( IOException e ){
            InputStream is = new ByteArrayInputStream(res.getContent());
            InputStream uis = new GZIPInputStream(is);
            rnp = new RinexNavigationParser(uis,rnf);
            rnp.init();
            uis.close();
          }
        }
        else {
          InputStream is = new ByteArrayInputStream(res.getContent());
          rnp = new RinexNavigationParser(is,rnf);
          rnp.init();
          is.close();
        }

Message type in RTCMClient

Dear Colleagues,

I am using goGPS and trying to read messages type 1015,1016,1017 from RTCM 3 mountpoint.

However I am only receiving messages type 1004,1012, 1019, 1020 and other even though the mountpoint is setup to send message types state above.

In RTCMClient.java there is condition

if (c == 211) { // header
readMessage(in);
}

Which is used to determine the start of message (header).

Can you please tell me why is character code 211 being used for this condition and does is apply also to the messages I am trying to read ?

Do you have any idea how to catch these messages ?

Any suggestion / advised would be helpful

Thanks in advance

Couldn't get messages with Ntrip user. Java GoGPS

Hi!

We are a researcher team trying to correct the mobile position with Ntrip and data from sattelites.

We saw your open code some weeks ago and it helped to connect through Ntrip. One problem we have is that we can get connected to the public interface with no user and get some messages which we have decodified. When we try to connect with our own user we are able to do it but it does not go through a condicional similar you have in your
code line 726 in goGPS_Java/src/main/java/org/gogpsproject/producer/parser/rtcm3/RTCM3Client.java

I don't know if you could have any idea why this is happening has the only error reported is Connetion reset.

This is te part of the code where we have the problem we think.

Also, one question we have, it is, if goGPS corrects the positions or the observations from the rover when it corrects in RTK.

Thank you in advanced.

Is it possible to use this code with the u-blox M8N receiver?

Is it possible to use this code with the u-blox M8N receiver? If so, could you please give any instructions -- where to start or anything you would consider relevant?

I'm promarily interested in getting the coordinates, altitude, accuracy and dilution info. From the cursory reading of the manual I know that there is some kind of anti-jamming support, but I'm not sure yet whether it needs to be turned on explicitly; I would also be interested in that, because sometimes I have to deal USB3 interference.

Real time processing

Hello, I am planning to get the hardware to try to do realtime processing, so I would like to know if it is possible with this version?
it is for my study project.

Rinex observation datas

axpv241z.zip

Hello,
There is an issue when reading an observation rinex data files with several lines for TYPES OF OBSERV in the rinex header.

 2.11           OBSERVATION DATA    M (MIXED)           RINEX VERSION / TYPE

teqc 2018Jun8 20180830 15:05:13UTCPGM / RUN BY / DATE
Linux 2.6.32-573.12.1.x86_64|x86_64|gcc -static|Linux 64|=+ COMMENT
teqc 2018Jun8 20180830 15:05:07UTCCOMMENT
teqc 2018Jun8 IGN-RGP 20180829 08:03:05UTCCOMMENT
teqc 2016Nov7 IGN-RGP 20180829 08:03:03UTCCOMMENT
Linux 2.4.21-27.ELsmp|Opteron|gcc|Linux x86_64|=+ COMMENT
0.0000 (antenna height) COMMENT
+43.49121148 (latitude) COMMENT
+5.33319240 (longitude) COMMENT
0229.378 (elevation) COMMENT
BIT 2 OF LLI FLAGS DATA COLLECTED UNDER A/S CONDITION COMMENT
10057M001 (COGO code) COMMENT
AXPV MARKER NAME
10057M001 MARKER NUMBER
Automatic IGN OBSERVER / AGENCY
5117K75341 TRIMBLE NETR9 4.85 REC # / TYPE / VERS
1441107437 TRM57971.00 NONE ANT # / TYPE
4614667.1540 430786.2340 4367411.3070 APPROX POSITION XYZ
0.0000 0.0000 0.0000 ANTENNA: DELTA H/E/N
1 1 WAVELENGTH FACT L1/2
22 L1 L2 C1 C2 P1 P2 D1 D2 S1# / TYPES OF OBSERV
S2 L5 C5 D5 S5 L7 C7 D7 S7# / TYPES OF OBSERV
L8 C8 D8 S8 # / TYPES OF OBSERV
18 LEAP SECONDS
SNR is mapped to RINEX snr flag value [0-9] COMMENT
L1 & L2: min(max(int(snr_dBHz/6), 0), 9) COMMENT
2018 8 29 7 0 0.0000000 GPS TIME OF FIRST OBS
END OF HEADER
18 8 29 7 0 0.0000000 0 26G29G02R23R13G16G23G31R05S25G21R22R11
R12R04G25G05G26R21E01E18E24E31E26S23
S20S36
109215334.384 8 85102842.727 7 20782987.617 20782991.949
20782992.215 49.700 46.900

135451937.622 5 105546902.72842 25775636.422
25775639.125 33.300 15.600

122008667.772 6 94895646.647 5 22808230.359 22808234.863 22808229.691
22808235.332 40.500 33.300

121763752.265 5 94705156.548 5 22802441.125 22802443.938 22802439.238
22802442.824 34.000 34.000

124343375.073 6 96890926.19343 23661755.586
23661757.758 41.000 21.300

@+

Tophe

A truly modular design (refactoring ReceiverPosition)

I don't know about goGPS Matlab but in the Java version there's a lot of copy&paste.
It's true that the design of goGPS is modular but that is not reflected in the code: each module basically copies and extends another one.
That makes it very easy to read, but harder to maintain because when something changes, all those copies have to change too.
Perhaps we could create a branch called "modular redesign" and experiment there, what do you guys think?

Can't decode observations from u-blox 6P

I'm having trouble decoding observations from our u-blox evaluation kit.
It's "u-blox 6 GPS Engine", model "EVU-6P-0-001".
goGPS decodes the Ephemeris but I can't see any message being decoded with observations.
It's the first time I try, so I don't know much about different u-blox receiver models and versions.
Any suggestion would be appreciated!

Usage of SP3 ephemeris and satellite clocks

In order to use ephemeris and satellite clocks in SP3 format (e.g. to exploit IGS precise products) the following needs to be implemented:

  1. interpolation of SP3 satellite positions (typically by Lagrange polynomials): http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/utility/gps/interpolate_SP3_coord.m
  2. interpolation of SP3 satellite clocks (typically a linear interpolation is enough): http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/utility/gps/interpolate_SP3_clock.m
  3. computation of the Sun position in ECEF coordinates (in order to do this, an already existing Java implementation of JPL ephemeris would be very welcome!): http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/utility/sun_moon/sun_moon_pos.m
  4. reading of (at least) satellite antenna phase center offsets from PCO/PCV files (ATX format): http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/input_output/ATX/read_antenna_PCV.m
  5. application of satellite antenna phase center offsets, by computing the rotation of each satellite towards the Sun: http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/utility/gps/interpolate_SP3_coord.m#l91
  6. reading of differential code biases (DCBs): http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/input_output/DCB/load_dcb.m
  7. application of DCBs: http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/positioning/satellite_positions.m#l96
  8. the complete procedure then will be as follows: http://sourceforge.net/p/gogps/code/HEAD/tree/trunk/positioning/satellite_positions.m#l86

Decode 1077 Message

Hello!

We are a researcher team trying to correct the mobile position with Ntrip and data from satellites.

We are trying to decode 1077 message but we have a problem with the length of bits (parameter that receive the function decode: ).

In RTCM put that sometimes the size of 1077 is bigger than supported and you have to split it. Split it and without it we have the follow error (the same message but change the numbers):

Process: com.rtklib.rtklib, PID: 7242
java.lang.ArrayIndexOutOfBoundsException: Invalid subset: exceeds length of 3576:
start of subset: 3492, length of subset: 190

And we have the dude about if we have to split bits or bits is already splitted and we have to read the next bits.

Thank you for your help.

Use passive FTP

Currently goGPS uses active FTP in order to fetch Rinex files.
Active FTP has many limitations and is not supported on some cloud web server, for example Google App Engine.
The only change that is required is to switch to passive mode after logging in:

ftp.connect(server);
 ftp.login("anonymous", "[email protected]");
 reply = ftp.getReplyCode();
...
 ftp.enterLocalPassiveMode();

Set up goGPS_java to real-time porecessing (ublox serial port input data)

hello, I am not at all familiar with eclipse IDE and java projects but I would like to know if there is somewhere a tutorial on how to configure this version to do real-time processing.
because in the wiki if I understood correctly it is configuration to do post processing only.

Thank's for your help and have a good day.

Use fluent API

Simple change, make all setters "return this;" so we can chain initialization, for example:

goGPS = GoGPS.create(navigationIn, roverIn, masterIn) 
  .addPositionConsumerListener(kml) 
  .setDynamicModel(dynamicModel);

instead of

goGPS = new GoGPS(navigationIn, roverIn, masterIn); 
goGPS.addPositionConsumerListener(kml); 
goGPS.setDynamicModel(dynamicModel);

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.