//--------------------------------------------------------------------------- void SpiceAttitudeKernelReader::GetTargetOrientation(const wxString &objectName, Integer naifID, Integer forFrameNaifId, const A1Mjd &atTime, // Real tolerance, Rmatrix33 &r33, Rvector3 &angVel, const wxString &referenceFrame) { #ifdef DEBUG_CK_READING MessageInterface::ShowMessage(wxT("Entering GetTargetOrientation for object %s, with NAIF ID %d, at time %12.10f, with frame = %s\n"), objectName.c_str(), naifID, atTime.Get(), referenceFrame.c_str()); #endif wxString objectNameToUse = objectName; objectNameToUse = GmatStringUtil::ToUpper(objectNameToUse); objectNameSPICE = objectNameToUse.char_str(); naifIDSPICE = naifID; frameNaifIDSPICE = forFrameNaifId; referenceFrameSPICE = referenceFrame.char_str(); etSPICE = A1ToSpiceTime(atTime.Get()); // boddef_c(objectNameSPICE, naifIDSPICE); // CSPICE method to set NAIF ID for an object - is this valid for spacecraft? // Convert the time (in TDB) to spacecaft ticks SpiceDouble scTime; sce2c_c(naifIDSPICE, etSPICE, &scTime); if (failed_c()) { ConstSpiceChar option[] = "LONG"; // retrieve long error message, for now SpiceInt numChar = MAX_LONG_MESSAGE_VALUE; //SpiceChar err[MAX_LONG_MESSAGE_VALUE]; SpiceChar *err = new SpiceChar[MAX_LONG_MESSAGE_VALUE]; getmsg_c(option, numChar, err); wxString errStr(wxString::FromAscii(err)); wxString errmsg = wxT("Error getting spacecraft time (ticks) for object \""); errmsg += objectName + wxT("\". Message received from CSPICE is: "); errmsg += errStr + wxT("\n"); reset_c(); delete [] err; throw UtilityException(errmsg); } // get the tolerance in spacecraft clock ticks wxString tolerance = wxT("01"); // this should probably be user input, or set as a constant ConstSpiceChar *tol = tolerance.char_str(); SpiceDouble tolTicks; sctiks_c(naifIDSPICE, tol, &tolTicks); if (failed_c()) { ConstSpiceChar option[] = "LONG"; // retrieve long error message, for now SpiceInt numChar = MAX_LONG_MESSAGE_VALUE; //SpiceChar err[MAX_LONG_MESSAGE_VALUE]; SpiceChar *err = new SpiceChar[MAX_LONG_MESSAGE_VALUE]; getmsg_c(option, numChar, err); wxString errStr(wxString::FromAscii(err)); wxString errmsg = wxT("Error getting tolerance (ticks) for object \""); errmsg += objectName + wxT("\". Message received from CSPICE is: "); errmsg += errStr + wxT("\n"); reset_c(); delete [] err; throw UtilityException(errmsg); } #ifdef DEBUG_CK_READING MessageInterface::ShowMessage(wxT("First, check for coverage for object \"%s\", with NAIF ID %d\n"), objectName.c_str(), naifID); #endif Real beginCov = 0.0; Real endCov = 0.0; GetCoverageStartAndEnd(loadedKernels, forFrameNaifId, beginCov, endCov, false); // Now get the C-matrix and angular velocity at the requested time SpiceDouble cmat[3][3]; SpiceDouble av[3]; SpiceBoolean found; SpiceDouble clkout; #ifdef DEBUG_CK_READING MessageInterface::ShowMessage(wxT("about to call ckgpav: \n")); MessageInterface::ShowMessage(wxT(" NAIF ID = %d\n") wxT(" etSPICE = %12.10f\n") wxT(" scTime = %12.10fn") wxT(" tolTicks = %12.10f\n") wxT(" refFrame = %s\n"), (Integer) naifIDSPICE, (Real) etSPICE, (Real) scTime, (Real) tolTicks, referenceFrame.c_str()); #endif ckgpav_c(frameNaifIDSPICE, scTime, tolTicks, referenceFrameSPICE, cmat, av, &clkout, &found); // ckgpav_c(naifIDSPICE, scTime, tolTicks, referenceFrameSPICE, cmat, av, &clkout, &found); if (failed_c()) { ConstSpiceChar option[] = "LONG"; // retrieve long error message, for now SpiceInt numChar = MAX_LONG_MESSAGE_VALUE; //SpiceChar err[MAX_LONG_MESSAGE_VALUE]; SpiceChar *err = new SpiceChar[MAX_LONG_MESSAGE_VALUE]; getmsg_c(option, numChar, err); wxString errStr(wxString::FromAscii(err)); wxString errmsg = wxT("Error getting C-matrix and/or angular velocity for object \""); errmsg += objectName + wxT("\". Message received from CSPICE is: "); errmsg += errStr + wxT("\n"); reset_c(); delete [] err; throw UtilityException(errmsg); } if (found == SPICEFALSE) { wxString errmsg = wxT("Pointing data for object "); errmsg += objectName + wxT(" not found on loaded CK/SCLK kernels.\n"); throw UtilityException(errmsg); } #ifdef DEBUG_CK_READING MessageInterface::ShowMessage(wxT("results from ckgpav: \n")); MessageInterface::ShowMessage(wxT(" cosMat = %12.10f %12.10f %12.10f\n") wxT(" %12.10f %12.10f %12.10f\n") wxT(" %12.10f %12.10f %12.10f\n"), (Real)cmat[0][0], (Real)cmat[0][1], (Real)cmat[0][2], (Real)cmat[1][0], (Real)cmat[1][1], (Real)cmat[1][2], (Real)cmat[2][0], (Real)cmat[2][1], (Real)cmat[2][2]); MessageInterface::ShowMessage(wxT(" angvel = %12.10f %12.10f %12.10f\n"), (Real)av[0], (Real)av[1], (Real)av[2]); MessageInterface::ShowMessage(wxT(" and clkout = %12.10f\n"), (Real) clkout); #endif // Set output values r33.Set(cmat[0][0], cmat[0][1], cmat[0][2], cmat[1][0], cmat[1][1], cmat[1][2], cmat[2][0], cmat[2][1], cmat[2][2]); angVel.Set(av[0], av[1], av[2]); }
//------------------------------------------------------------------------------ Rvector6 SpiceOrbitKernelReader::GetTargetState(const wxString &targetName, const Integer targetNAIFId, const A1Mjd &atTime, const wxString &observingBodyName, const wxString &referenceFrame, const wxString &aberration) { #ifdef DEBUG_SPK_READING MessageInterface::ShowMessage( wxT("Entering SPKReader::GetTargetState with target = %s, naifId = %d, time = %12.10f, observer = %s\n"), targetName.c_str(), targetNAIFId, atTime.Get(), observingBodyName.c_str()); Real start, end; GetCoverageStartAndEnd(loadedKernels, targetNAIFId, start, end); MessageInterface::ShowMessage(wxT(" coverage for object %s : %12.10f --> %12.10f\n"), targetName.c_str(), start, end); #endif wxString targetNameToUse = GmatStringUtil::ToUpper(targetName); if (targetNameToUse == wxT("LUNA")) // We use Luna, instead of Moon, for GMAT targetNameToUse = wxT("MOON"); if (targetNameToUse == wxT("SOLARSYSTEMBARYCENTER")) targetNameToUse = wxT("SSB"); objectNameSPICE = targetNameToUse.char_str(); observingBodyNameSPICE = observingBodyName.char_str(); referenceFrameSPICE = referenceFrame.char_str(); aberrationSPICE = aberration.char_str(); // convert time to Ephemeris Time (TDB) etSPICE = A1ToSpiceTime(atTime.Get()); naifIDSPICE = targetNAIFId; boddef_c(objectNameSPICE, naifIDSPICE); // CSPICE method to set NAIF ID for an object #ifdef DEBUG_SPK_READING MessageInterface::ShowMessage(wxT("SET NAIF Id for object %s to %d\n"), targetNameToUse.c_str(), targetNAIFId); // MessageInterface::ShowMessage( // wxT("In SPKReader::Converted (to TBD) time = %12.10f\n"), etMjdAtTime); // MessageInterface::ShowMessage(wxT(" then the full JD = %12.10f\n"), // (etMjdAtTime + GmatTimeConstants::JD_JAN_5_1941)); MessageInterface::ShowMessage(wxT("So time passed to SPICE is %12.14f\n"), (Real) etSPICE); #endif SpiceDouble state[6]; SpiceDouble oneWayLightTime; spkezr_c(objectNameSPICE, etSPICE, referenceFrameSPICE, aberrationSPICE, observingBodyNameSPICE, state, &oneWayLightTime); #ifdef DEBUG_SPK_PLANETS Real ttMjdAtTime = TimeConverterUtil::Convert(atTime.Get(), TimeConverterUtil::A1MJD, TimeConverterUtil::TTMJD, GmatTimeConstants::JD_JAN_5_1941); // Real etJd = etMjdAtTime + GmatTimeConstants::JD_JAN_5_1941; Real ttJd = ttMjdAtTime + GmatTimeConstants::JD_JAN_5_1941; MessageInterface::ShowMessage(wxT("Asking CSPICE for state of body %s, with observer %s, referenceFrame %s, and aberration correction %s\n"), objectNameSPICE, observingBodyNameSPICE, referenceFrameSPICE, aberrationSPICE); MessageInterface::ShowMessage( wxT(" Body: %s TT Time: %12.10f TDB Time: %12.10f state: %12.10f %12.10f %12.10f %12.10f %12.10f %12.10f\n"), targetName.c_str(), ttJd, /*etJd,*/ state[0], state[1], state[2], state[3], state[4], state[5]); #endif if (failed_c()) { // ConstSpiceChar option[] = wxT("SHORT"); // retrieve short error message, for now // SpiceInt numChar = MAX_SHORT_MESSAGE; // SpiceChar err[MAX_SHORT_MESSAGE]; ConstSpiceChar option[] = "LONG"; // retrieve long error message, for now SpiceInt numChar = MAX_LONG_MESSAGE_VALUE; //SpiceChar err[MAX_LONG_MESSAGE_VALUE]; SpiceChar *err = new SpiceChar[MAX_LONG_MESSAGE_VALUE]; getmsg_c(option, numChar, err); wxString errStr(wxString::FromAscii(err)); wxString errmsg = wxT("Error getting state for body \""); errmsg += targetName + wxT("\". Message received from CSPICE is: "); errmsg += errStr + wxT("\n"); reset_c(); delete [] err; throw UtilityException(errmsg); } #ifdef DEBUG_SPK_READING MessageInterface::ShowMessage( wxT("In SPKReader::Called spkezr_c and got state out\n")); #endif Rvector6 r6(state[0],state[1],state[2],state[3],state[4],state[5]); return r6; }