frmchg |
Table of contents
ProcedureFRMCHG (Frame Change) SUBROUTINE FRMCHG ( FRAME1, FRAME2, ET, XFORM ) AbstractReturn the state transformation matrix from one frame to another. Required_ReadingNone. KeywordsFRAMES DeclarationsIMPLICIT NONE INCLUDE 'errhnd.inc' INCLUDE 'frmtyp.inc' INTEGER FRAME1 INTEGER FRAME2 DOUBLE PRECISION ET DOUBLE PRECISION XFORM ( 6, 6 ) Brief_I/OVARIABLE I/O DESCRIPTION -------- --- -------------------------------------------------- FRAME1 I the frame id-code for some reference frame FRAME2 I the frame id-code for some reference frame ET I an epoch in TDB seconds past J2000. XFORM O a state transformation matrix Detailed_InputFRAME1 is the frame id-code in which some states are known. FRAME2 is the frame id-code for some frame in which you would like to represent states. ET is the epoch at which to compute the state transformation matrix. This epoch should be in TDB seconds past the ephemeris epoch of J2000. Detailed_OutputXFORM is a 6 x 6 state transformation matrix that can be used to transform states relative to the frame corresponding to frame FRAME2 to states relative to the frame FRAME2. More explicitly, if STATE is the state of some object relative to the reference frame of FRAME1 then STATE2 is the state of the same object relative to FRAME2 where STATE2 is computed via the subroutine call below CALL MXVG ( XFORM, STATE, 6, 6, STATE2 ) ParametersNone. Exceptions1) If either of the reference frames is unrecognized, the error SPICE(UNKNOWNFRAME) is signaled. 2) If the auxiliary information needed to compute a non-inertial frame is not available, an error is signaled by a routine in the call tree of this routine. FilesNone. ParticularsThis routine allows you to compute the state transformation matrix between two reference frames. The currently supported reference frames are IAU bodyfixed frames and inertial reference frames. ExamplesExample 1. Suppose that you have a state STATE1 at epoch ET relative to FRAME1 and wish to determine its representation STATE2 relative to FRAME2. The following subroutine calls would suffice to make this transformation. CALL FRMCHG ( FRAME1, FRAME2, ET, XFORM ) CALL MXVG ( XFORM, STATE1, 6, 6, STATE2 ) Example 2. Suppose that you have the angular velocity, W, of some rotation relative to FRAME1 at epoch ET and that you wish to express this angular velocity with respect to FRAME2. The following subroutines will suffice to perform this computation. CALL FRMCHG ( FRAME1, FRAME2, ET, STXFRM ) Recall that a state transformation matrix has the following form. - - | | | R 0 | | | | | | dR | | -- R | | dt | | | - - The velocity of an arbitrary point P undergoing rotation with the angular velocity W is W x P Thus the velocity of P in FRAME2 is: dR -- P + R*(W x P ) dt dR t = ( -- R R P + R*(W x P) ) ( 1 ) dt dR t t But -- R is skew symmetric (simply differentiate R*R to see dt dR t this ). Hence -- R R P can be written as Ax(R*P) for some fixed dt vector A. Moreover the vector A can be read from the upper dR t triangular portion of -- R . So that equation (1) above can dt be re-written as dR t = ( -- R R*P + R*(WxP) ) dt = Ax(R*P) + R*W x R*P = ( [A+R*W] x R*P ) From this final expression it follows that in FRAME2 the angular velocity vector is given by [A+R*W]. The code below implements these ideas. CALL FRMCHG ( FRAME1, FRAME2, ET, STXFRM ) DO I = 1, 3 DO J = 1, 3 RT ( I, J ) = STXFRM ( I, J ) DRDT( I, J ) = STXFRM ( I+3, J ) END DO END DO CALL MXMT ( DRDT, R, AMATRIX ) Read the angular velocity of R from the skew symmetric matrix dR t -- R dt Recall that if A has components A1, A2, A3 then the matrix corresponding to the cross product linear mapping is: - - | 0 -A3 A2 | | | | A3 0 -A1 | | | | -A2 A1 0 | - - A(1) = -AMATRIX(2,3) A(2) = AMATRIX(1,3) A(3) = -AMATRIX(1,2) CALL MXV ( R, W1, W ) CALL VADD ( A, W, W2 ) RestrictionsNone. Literature_ReferencesNone. Author_and_InstitutionN.J. Bachman (JPL) J. Diaz del Rio (ODC Space) W.L. Taber (JPL) VersionSPICELIB Version 2.1.0, 08-OCT-2021 (JDR) (NJB) Bug fix: added calls to FAILED after each call to FRINFO and to FRMGET. Edited the header to comply with NAIF standard. SPICELIB Version 2.0.1, 16-JAN-2014 (NJB) Corrected equation 1 in header comments. Corrected numerous spelling errors in comments. SPICELIB Version 2.0.0, 14-DEC-2008 (NJB) Upgraded long error message associated with frame connection failure. SPICELIB Version 1.1.0, 25-JUL-1996 (WLT) Bug Fix: The previous edition of the routine had a bug in the first pass of the DO WHILE that looks for a frame in the chain of frames associated with FRAME2 that is in common with the chain of frames for FRAME1. On machines where variables are created as static variables, this error could lead to finding a frame when a legitimate path between FRAME1 and FRAME2 did not exist. SPICELIB Version 1.0.1, 06-MAR-1996 (WLT) An typo was fixed in the Brief I/O section. It used to say TDT instead of the correct time system TDB. SPICELIB Version 1.0.0, 28-SEP-1994 (WLT) |
Fri Dec 31 18:36:22 2021