Le 15/11/2017 à 11:01, Ignacio Grande a
écrit :
Hi Ignacio, Thank you for the kind words! For this one I think you ran in a bug we fixed this summer. If I remember well it is related to issue 360 in Orekit forge. There was a huge number of calls to the observers in the ParameterDriversList class, growing exponentially with the number of iterations of the estimator. It's been fixed now so I guess you must be using the latest release of Orekit (9.0.1) and not the development version. To get the fix you can either: - If you're using Maven: Link your project to Orekit version "9.1-SNAPSHOT" in your "pom.xml" file - If you pulled Orekit from the git repository: check-out the "develop" branch and use this one - Download the development version from the forge. Regardless of this bug in Orekit, the convergence on your test case is hard to obtain. I ran the test case and it did not converge after 40 iterations. I'm not sure why. Maybe it's the sigma of 1 degree in azel that is too high and the Gauss-Newton optimizer cannot converge with the threshold you put. I think the optimizer is moving around a set of solutions that have almost the same RMS but the distance between two consecutive solutions is too high for it to tag the estimation as converged. I found three ways to make it converge. You can either: - Set the sigma to a lower value: 0.5 degree seems to work - Lower the convergence threshold: 0.1 (instead of 0.01) seems to work - Use the Levenberg-Marquardt optimizer. For example replace in your code: GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(Decomposition.QR); with: double initialStepBoundFactor = 100.; LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer().withInitialStepBoundFactor(initialStepBoundFactor); It is converging on my machine with any of these fixes. I haven't actually tested these two with the test cases you provided but I think I know where the errors come from. When you're producing the range rate measurements, you calculate a doppler value using the TopocentricFrame class. Then you input this value in a "Range" measurement instead of a "RangeRate" measurement. So for the 1st measurement you have for example a doppler value of 6000 m/s and you put this value as a Range. So Orekit thinks the satellite is at a distance of only 60km from the station... hence the re-entering orbit. If you just replace the "Range" by "RangeRate" it should work fine. I think you're in the right place. Your issues and their fixes can very well help other users who may be struggling with the orbit determination of Orekit. You are very welcome. I hope my answers help you! Maxime |