Пример #1
0
        static void Main(string[] args)
        {
            int    bases_number  = 4;   // number of base points
            double start_bases_z = 1.5; // initial z-coordinate of base points
            double base_z_step   = 5;   // base z-coordinate step

            // actual target location
            double actual_target_lat_deg = 44.505455; // singed degrees
            double actual_target_lon_deg = 48.547659; // signed degrees
            double actual_target_z       = 25;        // meters

            double start_dst_projection = 500;        // start distance from target, meters
            double dst_inc_step         = 50;         // distance increment

            // azimuth step
            double az_step = Math.PI * 2 / bases_number;
            double actual_target_lat_rad = Algorithms.Deg2Rad(actual_target_lat_deg);
            double actual_target_lon_rad = Algorithms.Deg2Rad(actual_target_lon_deg);

            // signal propagation speed
            double velocity = 1450.0; // m/s

            double az           = 0;
            double base_lat_rad = 0;
            double base_lon_rad = 0;
            double rev_az_rad   = 0;
            int    it_cnt       = 0;
            double dst_projection;
            double slant_range;
            double dZ;// = actual_target_z - start_bases_z;
            bool   res         = false;
            double dst_proj    = 0;
            double fwd_az_rad  = 0;
            double target_lat  = 0;
            double target_lon  = 0;
            double radialError = 0;
            double dst_error   = 0;
            double target_z    = 0;
            double base_z;

            GeoPoint3DD[] toaBases  = new GeoPoint3DD[bases_number];
            GeoPoint3DT[] tdoaBases = new GeoPoint3DT[bases_number];


            #region Vincenty equations testing

            Console.WriteLine();
            Console.WriteLine("* Testing Vincenty equations...");
            Console.WriteLine("Generating base points...");
            for (int baseIdx = 0; baseIdx < bases_number; baseIdx++)
            {
                dst_projection = start_dst_projection + dst_inc_step * baseIdx;
                res            = Algorithms.VincentyDirect(actual_target_lat_rad, actual_target_lon_rad,
                                                           az, dst_projection,
                                                           Algorithms.WGS84Ellipsoid,
                                                           Algorithms.VNC_DEF_EPSILON, Algorithms.VNC_DEF_IT_LIMIT,
                                                           out base_lat_rad, out base_lon_rad, out rev_az_rad, out it_cnt);

                base_z      = start_bases_z + base_z_step * baseIdx;
                dZ          = actual_target_z - base_z;
                slant_range = Math.Sqrt(dst_projection * dst_projection + dZ * dZ);

                toaBases[baseIdx]  = new GeoPoint3DD(Algorithms.Rad2Deg(base_lat_rad), Algorithms.Rad2Deg(base_lon_rad), base_z, slant_range);
                tdoaBases[baseIdx] = new GeoPoint3DT(toaBases[baseIdx].Latitude, toaBases[baseIdx].Longitude, toaBases[baseIdx].Depth, toaBases[baseIdx].SlantRange / velocity);

                Console.WriteLine(string.Format("Base #{0}", baseIdx));
                Console.WriteLine(string.Format("Distance projection: {0:F03} m", dst_projection));
                Console.WriteLine(string.Format("Azimuth: {0:F03}°", Algorithms.Rad2Deg(az)));

                Console.WriteLine(string.Format("Vincenty direct ({0}): LAT: {1:F07}°, LON: {2:F07}°, Iterations: {3}",
                                                res,
                                                toaBases[baseIdx].Latitude,
                                                toaBases[baseIdx].Longitude,
                                                it_cnt));

                it_cnt = 0;
                res    = Algorithms.VincentyInverse(actual_target_lat_rad, actual_target_lon_rad,
                                                    base_lat_rad, base_lon_rad,
                                                    Algorithms.WGS84Ellipsoid,
                                                    Algorithms.VNC_DEF_EPSILON, Algorithms.VNC_DEF_IT_LIMIT,
                                                    out dst_proj, out fwd_az_rad, out rev_az_rad, out it_cnt);

                Console.WriteLine("Checking with Vincenty inverse:");
                Console.WriteLine(string.Format("Vincenty inverse ({0}): DST: {1:F03} m ({2:F03}), AZM: {3:F03}° ({4:F03})°, Iterations: {5}",
                                                res,
                                                dst_proj, dst_projection,
                                                Algorithms.Rad2Deg(fwd_az_rad), Algorithms.Rad2Deg(az),
                                                it_cnt));

                az += az_step;
            }

            #endregion

            Console.WriteLine("\r\nPress a key to start TOA 2D test...");
            Console.ReadKey();

            #region TOA_Locate2D testing

            Console.WriteLine();
            Console.WriteLine("* Solving a TOA problem with TOA_Locate2D...");
            Navigation.TOA_Locate2D(toaBases,
                                    double.NaN, double.NaN,
                                    actual_target_z,
                                    Algorithms.NLM_DEF_IT_LIMIT, Algorithms.NLM_DEF_PREC_THRLD, 10.0,
                                    Algorithms.WGS84Ellipsoid,
                                    out target_lat, out target_lon, out radialError, out it_cnt);

            Console.WriteLine("LAT: {0:F07}° (Actual {1:F07}°), LON: {2:F07}° (Actual {3:F07}°), Estimated radial error: {4:F03} m, Iterations: {5}",
                              target_lat, actual_target_lat_deg, target_lon, actual_target_lon_deg, radialError, it_cnt);

            Algorithms.VincentyInverse(actual_target_lat_rad, actual_target_lon_rad,
                                       Algorithms.Deg2Rad(target_lat), Algorithms.Deg2Rad(target_lon),
                                       Algorithms.WGS84Ellipsoid, Algorithms.VNC_DEF_EPSILON, Algorithms.VNC_DEF_IT_LIMIT,
                                       out dst_error, out fwd_az_rad, out rev_az_rad, out it_cnt);
            Console.WriteLine(string.Format("Distance on the ellipsoid between actual target location and calculated: {0:F03} m", dst_error));

            #endregion

            Console.WriteLine("\r\nPress a key to start TDOA test...");
            Console.ReadKey();

            #region TDOA_Locate2D testing

            Console.WriteLine();
            Console.WriteLine("* Solving a TDOA problem with TDOA_Locate2D...");

            for (int i = 0; i < tdoaBases.Length; i++)
            {
                tdoaBases[i] = new GeoPoint3DT(toaBases[i].Latitude, toaBases[i].Longitude, toaBases[i].Depth, toaBases[i].SlantRange / velocity);
            }

            Navigation.TDOA_Locate2D(tdoaBases,
                                     double.NaN, double.NaN,
                                     actual_target_z,
                                     Algorithms.NLM_DEF_IT_LIMIT, Algorithms.NLM_DEF_PREC_THRLD, 10,
                                     Algorithms.WGS84Ellipsoid,
                                     velocity,
                                     out target_lat, out target_lon, out radialError, out it_cnt);

            Console.WriteLine("LAT: {0:F07}° (Actual {1:F07}°), LON: {2:F07}° (Actual {3:F07}°), Estimated radial error: {4:F03} m, Iterations: {5}",
                              target_lat, actual_target_lat_deg, target_lon, actual_target_lon_deg, radialError, it_cnt);

            Algorithms.VincentyInverse(actual_target_lat_rad, actual_target_lon_rad,
                                       Algorithms.Deg2Rad(target_lat), Algorithms.Deg2Rad(target_lon),
                                       Algorithms.WGS84Ellipsoid, Algorithms.VNC_DEF_EPSILON, Algorithms.VNC_DEF_IT_LIMIT,
                                       out dst_error, out fwd_az_rad, out rev_az_rad, out it_cnt);
            Console.WriteLine(string.Format("Distance on the ellipsoid between actual target location and calculated: {0:F03} m", dst_error));

            #endregion

            Console.WriteLine("\r\nPress a key to start TOA 3D test...");
            Console.ReadKey();

            #region TOA_Locate3D testing

            Console.WriteLine();
            Console.WriteLine("* Solving a TOA problem with TOA_Locate3D...");
            Navigation.TOA_Locate3D(toaBases,
                                    double.NaN, double.NaN, double.NaN,
                                    Algorithms.NLM_DEF_IT_LIMIT, Algorithms.NLM_DEF_PREC_THRLD, 10.0,
                                    Algorithms.WGS84Ellipsoid,
                                    out target_lat, out target_lon, out target_z, out radialError, out it_cnt);

            Console.WriteLine("LAT: {0:F07}° (Actual {1:F07}°), LON: {2:F07}° (Actual {3:F07}°), DPT: {4:F03} m ({5:F03}), Estimated radial error: {6:F03} m, Iterations: {7}",
                              target_lat, actual_target_lat_deg, target_lon, actual_target_lon_deg, target_z, actual_target_z, radialError, it_cnt);

            Algorithms.VincentyInverse(actual_target_lat_rad, actual_target_lon_rad,
                                       Algorithms.Deg2Rad(target_lat), Algorithms.Deg2Rad(target_lon),
                                       Algorithms.WGS84Ellipsoid, Algorithms.VNC_DEF_EPSILON, Algorithms.VNC_DEF_IT_LIMIT,
                                       out dst_error, out fwd_az_rad, out rev_az_rad, out it_cnt);
            Console.WriteLine(string.Format("Distance on the ellipsoid between actual target location and calculated: {0:F03} m", dst_error));

            #endregion

            Console.WriteLine("\r\nPress a key to start TDOA 3D test...");
            Console.ReadKey();

            #region TDOA_Locate3D testing

            Console.WriteLine();
            Console.WriteLine("* Solving a TDOA problem with TOA_Locate3D...");

            Navigation.TDOA_Locate3D(tdoaBases,
                                     double.NaN, double.NaN,
                                     double.NaN,
                                     Algorithms.NLM_DEF_IT_LIMIT, Algorithms.NLM_DEF_PREC_THRLD, 10,
                                     Algorithms.WGS84Ellipsoid,
                                     velocity,
                                     out target_lat, out target_lon, out target_z, out radialError, out it_cnt);

            Console.WriteLine("LAT: {0:F07}° (Actual {1:F07}°), LON: {2:F07}° (Actual {3:F07}°), DPT: {4:F02} m, Estimated radial error: {4:F03} m, Iterations: {5}",
                              target_lat, actual_target_lat_deg, target_lon, actual_target_lon_deg, radialError, it_cnt);

            Algorithms.VincentyInverse(actual_target_lat_rad, actual_target_lon_rad,
                                       Algorithms.Deg2Rad(target_lat), Algorithms.Deg2Rad(target_lon),
                                       Algorithms.WGS84Ellipsoid, Algorithms.VNC_DEF_EPSILON, Algorithms.VNC_DEF_IT_LIMIT,
                                       out dst_error, out fwd_az_rad, out rev_az_rad, out it_cnt);
            Console.WriteLine(string.Format("Distance on the ellipsoid between actual target location and calculated: {0:F03} m", dst_error));

            #endregion


            Console.WriteLine("\r\nPress a key to start VLBL tests...");
            Console.ReadKey();

            #region Testing VLBL

            int        vlbl_fifoSize             = 256;
            int        vlbl_baseSize             = 3;
            double     vlbl_radialErrorThreshold = 7;
            double     vlbl_simplexSize          = 10;
            GeoPoint3D actual_target_location    = new GeoPoint3D(actual_target_lat_deg, actual_target_lon_deg, actual_target_z);

            Console.WriteLine(string.Format("Number of base points: {0}", vlbl_baseSize));
            Console.WriteLine(string.Format("VLBL FIFO size: {0}", vlbl_fifoSize));

            VLBLCore <VLBLTOAMeasurement> vlblCore = new VLBLCore <VLBLTOAMeasurement>(vlbl_fifoSize, vlbl_baseSize, vlbl_radialErrorThreshold,
                                                                                       vlbl_simplexSize, Algorithms.WGS84Ellipsoid);
            vlblCore.BaseUpdatedEventHandler += (o, e) =>
            {
                Console.WriteLine(string.Format("Base updated, refPoint: {0}", e.ReferencePoint));
                Console.WriteLine("Base points:");
                foreach (var basePoint in e.BasePoints)
                {
                    Console.WriteLine(basePoint.ToString());
                }
            };

            vlblCore.TargetDepth = actual_target_z;

            vlblCore.ReferencePointUpdatedEventHandler += (o, e) =>
            {
                Console.WriteLine(string.Format("Reference point updated: {0}", vlblCore.ReferencePoint));
            };

            vlblCore.TargetPositionUpdatedEventHandler += (o, e) =>
            {
                Console.WriteLine(string.Format("Target position updated: {0}, RERR: {1:F03} m, Iterations: {2}", e.TargetPosition, e.RadialError, e.Iterations));
                Console.WriteLine(string.Format("Actual target position: {0}", actual_target_location));

                Algorithms.VincentyInverse(actual_target_lat_rad, actual_target_lon_rad,
                                           Algorithms.Deg2Rad(e.TargetPosition.Latitude), Algorithms.Deg2Rad(e.TargetPosition.Longitude),
                                           Algorithms.WGS84Ellipsoid, Algorithms.VNC_DEF_EPSILON, Algorithms.VNC_DEF_IT_LIMIT,
                                           out dst_error, out fwd_az_rad, out rev_az_rad, out it_cnt);
                Console.WriteLine(string.Format("Distance on the ellipsoid between actual target location and calculated: {0:F03} m", dst_error));
            };

            for (int i = 0; i < bases_number; i++)
            {
                Console.WriteLine(string.Format("Adding new base point: {0}", toaBases[i]));
                vlblCore.AddMeasurement(new VLBLTOAMeasurement(toaBases[i].Latitude, toaBases[i].Longitude, toaBases[i].Depth, toaBases[i].SlantRange));
            }

            #endregion

            Console.WriteLine();



            #region Misc

            Console.WriteLine("\r\nPress a key to start TOA_NLM3D_Solve() tests...");
            Console.ReadKey();

            List <TOABasePoint> base_points = new List <TOABasePoint>();

            // random relevant values for actual point position
            double actual_x = 20.0;
            double actual_y = -20.0;
            double actual_z = 20.0;

            double x_prev = 0.0;
            double y_prev = 0.0;
            double z_prev = 0.0;

            double x, y, z, d;

            x = -60.0;
            y = 20.0;
            z = 10.0;
            d = Algorithms.Dist3D(x, y, z, actual_x, actual_y, actual_z);
            base_points.Add(new TOABasePoint(x, y, z, d));

            x = -20.0;
            y = 60.0;
            z = 15.0;
            d = Algorithms.Dist3D(x, y, z, actual_x, actual_y, actual_z);
            base_points.Add(new TOABasePoint(x, y, z, d));

            x = 20.0;
            y = 60.0;
            z = 20.0;
            d = Algorithms.Dist3D(x, y, z, actual_x, actual_y, actual_z);
            base_points.Add(new TOABasePoint(x, y, z, d));

            x = 40.0;
            y = 10.0;
            z = 25.0;
            d = Algorithms.Dist3D(x, y, z, actual_x, actual_y, actual_z);
            base_points.Add(new TOABasePoint(x, y, z, d));

            x = 50.0;
            y = -20.0;
            z = 30.0;
            d = Algorithms.Dist3D(x, y, z, actual_x, actual_y, actual_z);
            base_points.Add(new TOABasePoint(x, y, z, d));

            x = 30.0;
            y = -50.0;
            z = 35.0;
            d = Algorithms.Dist3D(x, y, z, actual_x, actual_y, actual_z);
            base_points.Add(new TOABasePoint(x, y, z, d));

            x = -20.0;
            y = -40.0;
            z = 40.0;
            d = Algorithms.Dist3D(x, y, z, actual_x, actual_y, actual_z);
            base_points.Add(new TOABasePoint(x, y, z, d));

            x = -50.0;
            y = -20.0;
            z = 45.0;
            d = Algorithms.Dist3D(x, y, z, actual_x, actual_y, actual_z);
            base_points.Add(new TOABasePoint(x, y, z, d));


            foreach (var base_point in base_points)
            {
                x_prev += base_point.X;
                y_prev += base_point.Y;
                z_prev += base_point.Z;
            }

            x_prev /= base_points.Count;
            y_prev /= base_points.Count;
            z_prev /= base_points.Count;

            double simplexSize = 10.0;
            double x_best      = x_prev;
            double y_best      = y_prev;
            double z_best      = z_prev;


            Algorithms.TOA_NLM3D_Solve(base_points.ToArray(), x_prev, y_prev, z_prev, Algorithms.NLM_DEF_IT_LIMIT, Algorithms.NLM_DEF_PREC_THRLD, simplexSize,
                                       out x_best, out y_best, out z_best, out radialError, out it_cnt);

            Console.WriteLine();
            Console.WriteLine(string.Format("Actual location (x, y, z): ({0:F03}, {1:F03}, {2:F03})", actual_x, actual_y, actual_z));
            Console.WriteLine(string.Format("First approximation (x, y, z): ({0:F03}, {1:F03}, {2:F03})", x_prev, y_prev, z_prev));
            Console.WriteLine(string.Format("Estimated location (x, y, z): ({0:F03}, {1:F03}, {2:F03})", x_best, y_best, z_best));
            Console.WriteLine(string.Format("Radial error: {0:F03} m, iterations: {1}", radialError, it_cnt));

            Console.WriteLine();
            Console.WriteLine("\r\nPress a key to start TDOA_NLM3D_Solve() tests...");
            Console.ReadKey();

            //
            List <TDOABaseline> base_lines = new List <TDOABaseline>();

            for (int i = 0; i < base_points.Count - 1; i++)
            {
                for (int j = i + 1; j < base_points.Count; j++)
                {
                    base_lines.Add(new TDOABaseline(base_points[i].X, base_points[i].Y, base_points[i].Z,
                                                    base_points[j].X, base_points[j].Y, base_points[j].Z, base_points[i].D - base_points[j].D));
                }
            }

            radialError = 0.0;
            it_cnt      = 0;
            Algorithms.TDOA_NLM3D_Solve(base_lines.ToArray(), x_prev, y_prev, z_prev, Algorithms.NLM_DEF_IT_LIMIT,
                                        Algorithms.NLM_DEF_PREC_THRLD, simplexSize, out x_best, out y_best, out z_best, out radialError, out it_cnt);

            Console.WriteLine();
            Console.WriteLine(string.Format("Actual location (x, y, z): ({0:F03}, {1:F03}, {2:F03})", actual_x, actual_y, actual_z));
            Console.WriteLine(string.Format("First approximation (x, y, z): ({0:F03}, {1:F03}, {2:F03})", x_prev, y_prev, z_prev));
            Console.WriteLine(string.Format("Estimated location (x, y, z): ({0:F03}, {1:F03}, {2:F03})", x_best, y_best, z_best));
            Console.WriteLine(string.Format("Radial error: {0:F03} m, iterations: {1}", radialError, it_cnt));

            //
            Console.WriteLine();
            Console.WriteLine("\r\nPress a key to start TDOA_AOA_NG_2d_Solve() tests...");
            Console.ReadKey();

            double aoa_max_error = 0;

            double aoa_target_range_m = 1000.0;
            int    aoa_n_base_points  = 4;
            double aoa_base_size_m    = 1.5;

            base_points = new List <TOABasePoint>();

            for (int i = 0; i < aoa_n_base_points; i++)
            {
                double az_    = i * 2.0 * Math.PI / aoa_n_base_points;
                double base_x = aoa_base_size_m * Math.Cos(az_);
                double base_y = aoa_base_size_m * Math.Sin(az_);
                base_z = 0.0;
                base_points.Add(new TOABasePoint(base_x, base_y, base_z, 0.0));
            }

            var bpoints = base_points.ToArray();

            for (int actual_angle = 180; actual_angle <= 359; actual_angle++)
            {
                double actual_angle_rad = actual_angle * Math.PI / 180;
                double target_x         = aoa_target_range_m * Math.Cos(actual_angle_rad);
                double target_y         = aoa_target_range_m * Math.Sin(actual_angle_rad);
                target_z = 0.0;

                for (int n = 0; n < bpoints.Length; n++)
                {
                    bpoints[n].D = Algorithms.Dist3D(base_points[n].X, base_points[n].Y, base_points[n].Z,
                                                     target_x, target_y, target_z) / velocity;
                }

                double a_result_rad = 0;
                Algorithms.TDOA_AOA_NG_2d_Solve(bpoints, velocity, Algorithms.AOA_NG_DEF_IT_LIMIT, Algorithms.AOA_NG_DEF_PREC_THRLD,
                                                out a_result_rad, out it_cnt);

                double aoa_angular_error = actual_angle_rad - a_result_rad;

                if (aoa_angular_error > Math.PI)
                {
                    aoa_angular_error = Math.PI * 2 - aoa_angular_error;
                }

                aoa_angular_error *= (180 / Math.PI);

                if (Math.Abs(aoa_angular_error) > Math.Abs(aoa_max_error))
                {
                    aoa_max_error = aoa_angular_error;
                }
            }


            Console.WriteLine(string.Format("AOA baseline size: {0:F03} m", aoa_base_size_m));
            Console.WriteLine(string.Format("AOA mean distance to target: {0:F03} m", aoa_target_range_m));
            Console.WriteLine(string.Format("AOA Full circle maximal error: {0:F06}°", aoa_max_error));


            Console.WriteLine();
            Console.WriteLine("Press a key to exit...");
            Console.ReadKey();

            #endregion
        }
Пример #2
0
        public MainForm()
        {
            InitializeComponent();

            #region filenames

            DateTime startTime = DateTime.Now;
            settingsFileName = Path.ChangeExtension(Application.ExecutablePath, "settings");
            loggerFileName   = StrUtils.GetTimeDirTreeFileName(startTime, Application.ExecutablePath, "LOG", "log", true);
            snapshotsPath    = StrUtils.GetTimeDirTree(startTime, Application.ExecutablePath, "SNAPSHOTS", false);

            #endregion

            #region logger

            logger = new TSLogProvider(loggerFileName);
            logger.WriteStart();
            logger.TextAddedEvent += (o, e) =>
            {
                if (geoPlotCartesian.InvokeRequired)
                {
                    geoPlotCartesian.Invoke((MethodInvoker) delegate
                    {
                        geoPlotCartesian.AppendHistoryLine(e.Text);
                        geoPlotCartesian.Invalidate();
                    });
                }
                else
                {
                    geoPlotCartesian.AppendHistoryLine(e.Text);
                    geoPlotCartesian.Invalidate();
                }
            };

            #endregion

            #region settingsProvider

            settingsProvider = new SimpeSettingsProviderXML <SettingsContainer>();
            settingsProvider.isSwallowExceptions = false;

            try
            {
                settingsProvider.Load(settingsFileName);
            }
            catch (Exception ex)
            {
                ProcessException(ex, true);
            }

            settingsProvider.isSwallowExceptions = true;

            logger.Write(settingsProvider.Data.ToString());

            #endregion

            #region NMEA

            NMEAParser.AddManufacturerToProprietarySentencesBase(ManufacturerCodes.VLB);
            NMEAParser.AddProprietarySentenceDescription(ManufacturerCodes.VLB, "L", "x.x,x.x,x.x,x.x,x,x.x,x.x,x.x");

            #endregion

            #region agingValues

            targetLatitude    = new AgingValue <double>(3, 20, (x) => string.Format(CultureInfo.InvariantCulture, "LAT: {0:F06}°", x));
            targetLongitude   = new AgingValue <double>(3, 20, (x) => string.Format(CultureInfo.InvariantCulture, "LON: {0:F06}°", x));
            targetRadialError = new AgingValue <double>(3, 300, (x) => string.Format(CultureInfo.InvariantCulture, "RER: {0:F03} m", x));
            targetTemperature = new AgingValue <double>(3, 600, (x) => string.Format(CultureInfo.InvariantCulture, "TMP: {0:F01} °C", x));
            targetDepth       = new AgingValue <double>(3, 60, (x) => string.Format(CultureInfo.InvariantCulture, "DPT: {0:F03} m", x));
            targetBatVoltage  = new AgingValue <double>(3, 300, (x) => string.Format(CultureInfo.InvariantCulture, "BAT: {0:F01} V", x));
            targetMSR         = new AgingValue <double>(3, 20, (x) => string.Format(CultureInfo.InvariantCulture, "MSR: {0:F01} dB", x));
            targetPTime       = new AgingValue <double>(3, 20, (x) => string.Format(CultureInfo.InvariantCulture, "TIM: {0:F04} sec", x));

            ownLatitude       = new AgingValue <double>(3, 20, (x) => string.Format(CultureInfo.InvariantCulture, "LAT: {0:F06}°", x));
            ownLongitude      = new AgingValue <double>(3, 20, (x) => string.Format(CultureInfo.InvariantCulture, "LON: {0:F06}°", x));
            ownDepth          = new AgingValue <double>(3, 20, (x) => string.Format(CultureInfo.InvariantCulture, "DPT: {0:F03} m", x));
            ownBatteryVoltage = new AgingValue <double>(3, 20, (x) => string.Format(CultureInfo.InvariantCulture, "BAT: {0:F01} V", x));

            #endregion

            #region geoPlotCartesian

            geoPlotCartesian.AddTrack("Rover", Color.Gray, 2, 2, settingsProvider.Data.MeasurementsFIFOSize, true);
            geoPlotCartesian.AddTrack("Measurements", Color.Blue, 2, 2, settingsProvider.Data.MeasurementsFIFOSize, true);
            geoPlotCartesian.AddTrack("Reference point", Color.Magenta, 4, 4, 1, false);
            geoPlotCartesian.AddTrack("Base", Color.Green, 4, 4, settingsProvider.Data.BaseSize, false);
            geoPlotCartesian.AddTrack("Target", Color.Red, 6, 6, settingsProvider.Data.TargetLocationFIFOSize, true);

            #endregion

            #region vlblCore

            vlblCore = new VLBLCore <VLBLTOAMeasurement>(settingsProvider.Data.MeasurementsFIFOSize,
                                                         settingsProvider.Data.BaseSize,
                                                         settingsProvider.Data.RadialErrorThreshold,
                                                         settingsProvider.Data.SimplexSize,
                                                         UCNLNav.Algorithms.WGS84Ellipsoid);

            vlblCore.BaseUpdatedEventHandler           += (o, e) => { UpdateTrack("Base", e.BasePoints); };
            vlblCore.ReferencePointUpdatedEventHandler += (o, e) => { UpdateTrack("Reference point", vlblCore.ReferencePoint); };

            vlblCore.TargetPositionUpdatedEventHandler += (o, e) =>
            {
                UpdateTrack("Target", e.TargetPosition);

                if (InvokeRequired)
                {
                    Invoke((MethodInvoker) delegate
                    {
                        targetLatitude.Value    = e.TargetPosition.Latitude;
                        targetLongitude.Value   = e.TargetPosition.Longitude;
                        targetRadialError.Value = e.RadialError;
                    });
                }
                else
                {
                    targetLatitude.Value    = e.TargetPosition.Latitude;
                    targetLongitude.Value   = e.TargetPosition.Longitude;
                    targetRadialError.Value = e.RadialError;
                }
            };

            #endregion

            #region tracks

            tracks = new Dictionary <string, List <GeoPoint3D> >();

            #endregion

            #region InPort

            inPort = new NMEASerialPort(new SerialPortSettings(settingsProvider.Data.InPortName, settingsProvider.Data.InPortBaudrate,
                                                               System.IO.Ports.Parity.None,
                                                               DataBits.dataBits8,
                                                               System.IO.Ports.StopBits.One,
                                                               System.IO.Ports.Handshake.None));

            inPort.NewNMEAMessage += new EventHandler <NewNMEAMessageEventArgs>(inPort_NewNMEAMessage);

            #endregion

            #region OutPort

            if (settingsProvider.Data.IsUseOutPort)
            {
                outPort = new SerialPort(settingsProvider.Data.OutPortName, (int)settingsProvider.Data.OutPortBaudrate);
            }

            #endregion

            #region timer

            timer        = new PrecisionTimer();
            timer.Period = 1000;
            timer.Mode   = Mode.Periodic;
            timer.Tick  += new EventHandler(timer_Tick);
            timer.Start();

            #endregion
        }