Here is some Matlab code that should be runnable by itself and produces the error I’m wondering about:
outputBaseName = ‘spacebased-tracking’;
%make an intersatellites range log
interSatsRangeLog.evaluations = java.util.TreeSet(java.util.Comparator.naturalOrder());
interSatsRangeLog.name = ‘intersatsrange’;
outputFileName = [FOLDER outputBaseName ‘-’ interSatsRangeLog.name ‘-residuals.out’];
fileIDInterSatsRange = fopen(outputFileName,‘w’);
%gravity field
degree = 1;
order = org.hipparchus.util.FastMath.min(degree, 1);
org.orekit.forces.gravity.potential.GravityFieldFactory.clearPotentialCoefficientsReaders();
org.orekit.forces.gravity.potential.GravityFieldFactory.addDefaultPotentialCoefficientsReaders(); %addPotentialCoefficientsReader(org.orekit.forces.gravity.potential.ICGEMFormatReader(‘eigen-6s.gfc’, true));
gravityField = org.orekit.forces.gravity.potential.GravityFieldFactory.getNormalizedProvider(degree, order);
mu = gravityField.getMu();
%frame
frame = org.orekit.frames.FramesFactory.getEME2000();
%Cartesian orbit
initialDate = org.orekit.time.AbsoluteDate(“2022-10-01T00:00:00.000Z”,…
org.orekit.time.TimeScalesFactory.getUTC());
pos = org.hipparchus.geometry.euclidean.threed.Vector3D(5.850993249432947e6,…
3.829300407173921e7, 1.664684004389338e7);
vel = org.hipparchus.geometry.euclidean.threed.Vector3D(3.045144586341892e3, -394.5787, 164.2226);
orbitGuess = org.orekit.orbits.CartesianOrbit(org.orekit.utils.PVCoordinates(pos,vel),…
frame,initialDate,mu);
%IERS conventions
conventions = org.orekit.utils.IERSConventions.valueOf([‘IERS_’, num2str(2010)]);
%central body (earth) body data
bodyFrame = org.orekit.frames.FramesFactory.getITRF(org.orekit.utils.IERSConventions.IERS_2010, true);
equatorialRadius = 6378137;
flattening = 1.0/298.2572;
body = org.orekit.bodies.OneAxisEllipsoid(equatorialRadius, flattening, bodyFrame);
%initialize propagator builder
integratorBuilder = org.orekit.propagation.conversion.DormandPrince853IntegratorBuilder(1e-3,…
300,0.0100);
%propagator builder
%Put the propagator builders together in a java array for use in the
%estimator.
propagatorBuilders = javaArray(‘org.orekit.propagation.conversion.NumericalPropagatorBuilder’,1);
%% The following propagator builder handles only the remote satellite (to be tracked).
builder = org.orekit.propagation.conversion.NumericalPropagatorBuilder(orbitGuess,…
integratorBuilder, org.orekit.orbits.PositionAngle.MEAN, double(0.001));
%mass
mass = 6100;
builder.setMass(mass);
%gravity
builder.addForceModel(org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel(body.getBodyFrame(), gravityField));
%third body attraction without solid tides force model
builder.addForceModel(org.orekit.forces.gravity.ThirdBodyAttraction(org.orekit.bodies.CelestialBodyFactory.getBody(“Sun”)));
builder.addForceModel(org.orekit.forces.gravity.ThirdBodyAttraction(org.orekit.bodies.CelestialBodyFactory.getBody(“Moon”)));
propagatorBuilders(1) = builder;
clear builder
%% This propagator builder handles local satellite 1.
posObserver = org.hipparchus.geometry.euclidean.threed.Vector3D(-2747606.681, 22572091.306, 13522761.402);
velObserver = org.hipparchus.geometry.euclidean.threed.Vector3D(-2729.515, 1142.663, -2523.906);
orbitObserver = org.orekit.orbits.CartesianOrbit(org.orekit.utils.PVCoordinates(posObserver,velObserver),…
frame,initialDate,mu);
builder = org.orekit.propagation.conversion.NumericalPropagatorBuilder(orbitObserver,…
integratorBuilder, org.orekit.orbits.PositionAngle.MEAN, double(0.001));
%mass
mass = 1630;
builder.setMass(mass);
%gravity
builder.addForceModel(org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel(body.getBodyFrame(), gravityField));
%third body attraction without solid tides force model
builder.addForceModel(org.orekit.forces.gravity.ThirdBodyAttraction(org.orekit.bodies.CelestialBodyFactory.getBody(“Sun”)));
builder.addForceModel(org.orekit.forces.gravity.ThirdBodyAttraction(org.orekit.bodies.CelestialBodyFactory.getBody(“Moon”)));
propagatorBuilders(2) = builder;
clear builder
%% This propagator builder handles local satellite 2.
posObserver = org.hipparchus.geometry.euclidean.threed.Vector3D(-2.250761046779056E+07, -3.265981444411464E+07, 1.425697642659360E+07);
velObserver = org.hipparchus.geometry.euclidean.threed.Vector3D(2.600250545517001E+03, -1.510417306700876E+03, 6.457897224694455E+02);
orbitObserver = org.orekit.orbits.CartesianOrbit(org.orekit.utils.PVCoordinates(posObserver,velObserver),…
frame,initialDate,mu);
builder = org.orekit.propagation.conversion.NumericalPropagatorBuilder(orbitObserver,…
integratorBuilder, org.orekit.orbits.PositionAngle.MEAN, double(0.001));
%mass
mass = 1630;
builder.setMass(mass);
%gravity
builder.addForceModel(org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel(body.getBodyFrame(), gravityField));
%third body attraction without solid tides force model
builder.addForceModel(org.orekit.forces.gravity.ThirdBodyAttraction(org.orekit.bodies.CelestialBodyFactory.getBody(“Sun”)));
builder.addForceModel(org.orekit.forces.gravity.ThirdBodyAttraction(org.orekit.bodies.CelestialBodyFactory.getBody(“Moon”)));
propagatorBuilders(3) = builder;
clear builder
%% This propagator builder handles local satellite 3.
posObserver = org.hipparchus.geometry.euclidean.threed.Vector3D(1.490552681049923E+06, -1.893933999024528E+06, 6.346234394324024E+06);
velObserver = org.hipparchus.geometry.euclidean.threed.Vector3D(7.429417575444744E+03, -3.505320122965324E+02, -1.845105264954836E+03);
orbitObserver = org.orekit.orbits.CartesianOrbit(org.orekit.utils.PVCoordinates(posObserver,velObserver),…
frame,initialDate,mu);
builder = org.orekit.propagation.conversion.NumericalPropagatorBuilder(orbitObserver,…
integratorBuilder, org.orekit.orbits.PositionAngle.MEAN, double(0.001));
%mass
mass = 1630;
builder.setMass(mass);
%gravity
builder.addForceModel(org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel(body.getBodyFrame(), gravityField));
%third body attraction without solid tides force model
builder.addForceModel(org.orekit.forces.gravity.ThirdBodyAttraction(org.orekit.bodies.CelestialBodyFactory.getBody(“Sun”)));
builder.addForceModel(org.orekit.forces.gravity.ThirdBodyAttraction(org.orekit.bodies.CelestialBodyFactory.getBody(“Moon”)));
% builder.getSelectedNormalizedParameters()
% drivers = builder.getOrbitalParametersDrivers().getDrivers()
% for ii = 1:1:6
% drivers.get(ii-1).setSelected(false);
% end
propagatorBuilders(4) = builder;
clear builder
%estimator
initialStepBoundFactor = 1.0e6;
optimizer = org.hipparchus.optim.nonlinear.vector.leastsquares.LevenbergMarquardtOptimizer().withInitialStepBoundFactor(initialStepBoundFactor);
convergenceThreshold = 1.0e-3;
maxIterations = 30;
maxEvaluations = 35;
estimator = org.orekit.estimation.leastsquares.BatchLSEstimator(optimizer, propagatorBuilders);
estimator.setParametersConvergenceThreshold(convergenceThreshold);
estimator.setMaxIterations(maxIterations);
estimator.setMaxEvaluations(maxEvaluations);
%local sat name
localSatName(1) = “LocalSat1”;
localSatName(2) = “LocalSat2”;
localSatName(3) = “LocalSat3”;
generator = org.orekit.estimation.measurements.generation.Generator;
%intersatellitesrange data
for ii = 1:1:3
localSats{ii}.name = localSatName(ii);
localSats{ii}.satellite = generator.addPropagator(propagatorBuilders(ii+1).buildPropagator(propagatorBuilders(ii+1).getSelectedNormalizedParameters()));
localSats{ii}.intersatellitesRangeSigma = 1.0;
end
satellite = org.orekit.estimation.measurements.ObservableSatellite(0);
%build measurements based on text file
fileName = ‘measurements.aer’;
%set up filtering for measurements files
%nd = org.orekit.data.DataSource(fileName, () → java.io.FileInputStream(java.io.File(FOLDER, fileName)));
nd = org.orekit.data.DataSource(java.io.File(FOLDER, fileName));
filterArray = javaArray(‘org.orekit.data.DataFilter’,3);
filterArray(1) = org.orekit.data.GzipFilter();
filterArray(2) = org.orekit.data.UnixCompressFilter();
filterArray(3) = org.orekit.gnss.HatanakaCompressFilter();
filterArrayAsList = java.util.Arrays.asList(filterArray);
for jj = 1:1:filterArrayAsList.size()
filter = filterArrayAsList.get(jj-1);
nd = filter.filter(nd);
end
%the measurements come from an Orekit custom file
measurements = java.util.ArrayList();
reader = nd.getOpener().openReaderOnce();
br = java.io.BufferedReader(reader);
lineNumber = 1;
line = br.readLine();
while ~isempty(line)
line = line.trim();
if line.length() > 0 && ~line.startsWith(“#”)
fields = line.split(“\s+”);
fields2 = char(fields(2));
if (fields.length < 2)
disp(org.orekit.errors.OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE);
end
if min([size(localSats,1),size(localSats,2)]) > 0
if fields.length ~= 4
disp([‘OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE’, lineNumber, filename, line]);
end
for jj = 1:1:size(localSats,2)
satString = char(localSats{1,jj}.name);
if contains(satString, char(fields(3)))
satelliteLocal = localSats{1,jj}.satellite;
end
end
if ~exist(‘localSats’) || isempty(localSats)
disp(['unknown local satellite ', char(line), ’ from ', char(filename)]);
end
thisDate = org.orekit.time.AbsoluteDate(fields(1), org.orekit.time.TimeScalesFactory.getUTC());
thisInterSatellitesRange = java.lang.Double.parseDouble(fields(4));
intersatellitesrange = org.orekit.estimation.measurements.InterSatellitesRange(satelliteLocal,…
satellite,false,thisDate,thisInterSatellitesRange,…
1.0,1.0);
sum = 0;
for ii = 1:1:size(intersatellitesrange.getBaseWeight(),2)
w = intersatellitesrange.getBaseWeight();
sum = sum + org.hipparchus.util.FastMath.abs(w(ii));
end
if sum > org.hipparchus.util.Precision.SAFE_MIN
%we only consider measurements with non-zero
%weight
measurements.add(intersatellitesrange);
end
end
end
line = br.readLine();
lineNumber = lineNumber + 1;
end
%add measurements to estimator
for ii = 1:1:measurements.size()
measurement = measurements.get(ii-1);
estimator.addMeasurement(measurement);
end
%Print some info about the parameters drivers for this estimator
measurementsParametersDrivers = estimator.getMeasurementsParametersDrivers(1).getDrivers()
orbitalParametersDrivers = estimator.getOrbitalParametersDrivers(1).getDrivers()
propagatorParametersDrivers = estimator.getPropagatorParametersDrivers(1).getDrivers()
%set the observer and estimate orbit
estimator.setObserver(org.orekit.tutorials.estimation.common.OrbitDeterminationObserver(orbitGuess,…
[],…
estimator));
thisPropagator = estimator.estimate();