SkyTraq Dual GNSS board

Hi!

I havent been on this forum due to a lot of other things I had to do the last months… Theres still a lot on my other stuff, but I really want to give some thoughts and experience about SkyTraq receivers I made the last years.

As you can read here, I was kind of responsible for the code parsing SkyTraq PSTI messages in AOG. 5 years ago it did work as you could read in that post, but there are some changes to be done:

In 2022 I bought one PX1172RH EVB board from navspark and edited the parsing code for my needs to get DualGPS Heading and Roll. This does work pretty well with just some lines of code for already about 3 years now on my setup. Problem is just, that I did it with AOG version 5.5.0 and never updated and therefor never got all the new functionalities etc. Now I plan on putting AOG on a second tractor, maybe redo it on the first as my auto steering is a real mess with cable everywhere. But still I would like to stay with SkyTraq receivers, as they are a lot cheaper and they output directly heading and roll, there is no need to do any further calculation to get these data.
I also think this is in my opinion the best receiver for new project as you get RTK position, heading and roll with 8Hz for just 85$ (plus shipment and two antennas, maybe 30$ each).

Maybe one dev likes to do the following changes in AgIO source code for the next update?
AgIO/Source/Forms/NMEA.Designer.cs

lines 212-215

            else if (words[0] == "$PSTI" && (words[1] == "032" || words[1] == "035") )
            {
                ParseSTI032(); //there is also an $PSTI,030,... wich contains different data!
            }

to be replaced with

            else if (words[0] == "$PSTI" && words[1] == "036") //Heading, Pitch and Roll Messages from SkyTraq PX1172RH modules... only available if RTK
            {
                ParseSTI036(); //there are also different $PSTI,0XX,... sentences which contain compete different data!
                if (isGPSSentencesOn) sti036Sentence = nextNMEASentence;
            }

and lines 814-861 (function ParseSTI032()) to be replaced with:

    private void ParseSTI036()
    {
        #region STI036 Message
        //$PSTI,036,hhmmss.sss,ddmmyy,x.xx,x.xx,x.xx,R*hh<CR><LF>
        //$PSTI,036,054314.000,030521,191.69,-16.35,0.00,R*4D

        //(1) 036 heading, pitch and roll message indicator
        //(2) UTC time hhmmss.sss
        //(3) UTC date ddmmyy
        //(4) Heading, 0~359.99 when mode indicator is ‘R’
        //(5) Pitch:
        //    -90~90 degree when mode indicator is ‘R’, else null
        //    0: when absolute value of “heading offset” > 45 && < 135; i.e.
        //    antenna baseline toward perpendicular to vehicle centerline.
        //    Heading offset is the angle between the baseline course from north
        //    and vehicle centerline.
        //(6) Roll:
        //    -90~90 degree when mode indicator is ‘R’, else null
        //    0: when absolute value of “heading offset” <= 45 or >= 135; i.e.
        //    antenna baseline toward parallel to vehicle centerline.
        //    Heading offset is the angle between the baseline course from north
        //    and vehicle centerline.
        //(7) Mode indicator
        //    ‘N’ = Data not valid
        //    ‘A’ = Autonomous mode
        //    ‘D’ = Differential mode
        //    ‘E’ = Estimated(dead reckoning) mode
        //    ‘M’ = Manual input mode
        //    ‘S’ = Simulator mode
        //    ‘F’ = Float RTK.Satellite system used in RTK mode, floating integers
        //    ‘R’ = Real Time Kinematic. System used in RTK mode with fixed
        //    integers
        //(8) * Checksum
        #endregion STI036 Message

        if (!string.IsNullOrEmpty(words[4])) //Heading Dual GPS; 0 if no RTK
        {
            //True heading
            float.TryParse(words[4], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual);
            headingTrueDualData = headingTrueDual;
        }

        if (!string.IsNullOrEmpty(words[6])) //Roll Dual GPS; 0 if no RTK or “heading offset” <= 45 or >= 135
        {
            float.TryParse(words[6], NumberStyles.Float, CultureInfo.InvariantCulture, out rollK);

            if(words[7]=="R") //Mode Indicator
            {
                roll = (float)(rollK);
                rollData = roll;
            } else
            {
                roll = float.MinValue;
                rollData = 0;
            }
        }
    }

Regards Tim