Aerie Mission Data Storage Architecture #883
-
Hello! I'm writing as part of a team working on building a mission operations toolkit and came across Aerie recently. The first aspect which was not entirely clear to me is how does Aerie access and store any mission specific data such as the orbit information and any specifications of the spacecraft required by the mission model. I see that the mission model is a JAR file with constituent classes of relevant attributes. I also referred to the FireSat template but I did not come across any files in the mission model which house specific information about the orbit, spacecraft, instruments etc. Is there a separate database which hosts this information (i.e. the values for these parameters) for Aerie to map the corresponding class attributes? Does this happen when the mission model is uploaded to the Aerie-UI? How does Aerie unpack the JAR mission model and map the data? Thanks and I look forward to a response. Since I'm posting the first message in the Q&A section, please let me know if there's another more applicable page where this should be posted instead. |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment
-
This is a perfectly appropriate place to ask these questions! The other avenues for discussion are our slack channel and direct email.
You’re spot on that the mission model is responsible for encoding mission-specific data. The way in which that data is encoded is somewhat up to the mission, and what level of fidelity they want to put into their model. Aerie expects missions to designate one Java class as their “model”, but the structure of that class is up to the specific mission. A good example is the aerie-lander model, which is composed of a dozen sub-models, some of which refer to instruments, while others refer to other spacecraft subsystems or behaviors: public final class Mission {
public final Configuration config;
public final Clocks clocks;
public final DataModel dataModel;
public final DSNModel dsnModel;
public final WakeModel wakeModel;
public final CommModel commModel;
public final PowerModel powerModel;
public final EngModel engModel;
public final HeatProbeModel HeatProbeModel;
public final IDSModel idsModel;
public final APSSModel apssModel;
public final SeisModel seisModel;
public Mission(final Registrar registrar, final Instant planStart, final Configuration config) {
this.config = config;
this.clocks = new Clocks(Mars_Time_Origin);
this.dataModel = new DataModel();
this.dsnModel = new DSNModel();
this.wakeModel = new WakeModel();
this.commModel = new CommModel();
this.powerModel = new PowerModel();
this.engModel = new EngModel();
this.HeatProbeModel = new HeatProbeModel();
this.idsModel = new IDSModel();
this.apssModel = new APSSModel();
this.seisModel = new SeisModel(); Instrument capabilities, behaviors, and specifications can be encoded in these sub-models in Java code. These models can declare resources, and publish values to them throughout a simulation run. These resources can then be visualized in the UI or used to check constraints, or read into other tools. Non-java files can also be included in a mission model using Java’s resources feature (not to be confused with Aerie’s resources) https://docs.oracle.com/javase/8/docs/technotes/guides/lang/resources.html This can be useful if aspects of the spacecraft specification are best expressed in a different file format. The mission model will need to include code that can parse that file, and use its contents to influence a simulation run. Similarly, if there are files that describe an orbit (SPICE kernels, for example), these files can be uploaded to Aerie separately from the mission model. The mission model can be configured to read these files from the file system. This technique is useful if the orbit information is expected to be updated at a different cadence from the mission model itself - it allows the user to update one without updating the other.
Yes, absolutely - an Aerie deployment includes a postgres database that stores all of the data produced by planners - including the values for any activity parameters in a given plan. The mission model provides the set of activity type definitions, and a planner can choose from those activity types when they are working on a plan via the UI. Simulation results and constraint definitions are more examples of data stored in this database. One goal that Aerie set for itself is to move certain concepts, including constraints, out of the mission model and into the UI, which allows constraint definitions to be updated without necessarily updating the mission model as well.
When a mission model is uploaded, Aerie will load it, and ask it to provide its set of activity type definitions. These definitions are cached in the database, so that they can be referenced without re-loading the JAR.
Aerie expects the JAR to declare the services it provides using the Java service provider standard. In effect, that means it must contain a That interface defines all of the functionality that Aerie expects from a mission model. The top level of that interface is pretty sparse, but you can dig deeper into ModelType: Notably, all Aerie expects from a mission model is
Most of these details are abstracted away by the mission modeling framework - annotating classes with the @ActivityType and related annotations helps the framework generate Java code that conforms to the MerlinPlugin interface. https://nasa-ammos.github.io/aerie-docs/mission-modeling/activity-types/introduction/ Thanks for the great questions, keep them coming! 🎉 |
Beta Was this translation helpful? Give feedback.
This is a perfectly appropriate place to ask these questions! The other avenues for discussion are our slack channel and direct email.
You’re spot on that the mission model is responsible for encoding mission-specific data. The way in which that data is encoded is somewhat up to the mission, and what level of fidelity they want to put into their model. Aerie expects missions to designate one Java class as their “model”, but the structure…