In-situ Sensing Hands-On Lesson, using BepiColombo MPO (MATLAB) |
Table of ContentsIn-situ Sensing Hands-On Lesson, using BepiColombo MPO (MATLAB) Overview Note About HTML Links References Tutorials Required Readings The Permuted Index Mice API Documentation Kernels Used Mice Modules Used Step-1: ``UTC to ET'' ``UTC to ET'' Task Statement ``UTC to ET'' Hints ``UTC to ET'' Solution Steps ``UTC to ET'' Code Step-2: ``SCLK to ET'' ``SCLK to ET'' Task Statement ``SCLK to ET'' Hints ``SCLK to ET'' Solution Steps ``SCLK to ET'' Code Step-3: ``Spacecraft State'' ``Spacecraft State'' Task Statement ``Spacecraft State'' Hints ``Spacecraft State'' Solution Steps ``Spacecraft State'' Code Step-4: ``Sun Direction'' ``Sun Direction'' Task Statement ``Sun Direction'' Hints ``Sun Direction'' Solution Steps ``Sun Direction'' Code Step-5: ``Sub-Spacecraft Point'' ``Sub-Spacecraft Point'' Task Statement ``Sub-Spacecraft Point'' Hints ``Sub-Spacecraft Point'' Solution Steps ``Sub-Spacecraft Point'' Code Step-6: ``Spacecraft Velocity'' ``Spacecraft Velocity'' Task Statement ``Spacecraft Velocity'' Hints ``Spacecraft Velocity'' Solution Steps ``Spacecraft Velocity'' Code Program ``scvel.m'': In-situ Sensing Hands-On Lesson, using BepiColombo MPO (MATLAB)
Overview
Note About HTML Links
In order for the links to be resolved, if not done already by installing the lessons package under the Toolkit's ``doc/html'' directory, create a subdirectory called ``lessons'' under the ``doc/html'' directory of the ``mice/'' tree and copy this document to that subdirectory before loading it into a Web browser. References
Of these documents, the ``Tutorials'' contains the highest level descriptions with the least number of details while the ``Required Reading'' documents contain much more detailed specifications. The most complete specifications are provided in the ``API Documentation''. In some cases the lesson explanations also refer to the information provided in the meta-data area of the kernels used in the lesson examples. It is especially true in case of the FK and IK files, which often contain comprehensive descriptions of the frames, instrument FOVs, etc. Since both FK and IK are text kernels, the information provided in them can be viewed using any text editor, while the meta information provided in binary kernels -- SPKs and CKs -- can be viewed using ``commnt'' or ``spacit'' utility programs located in ``mice/exe'' of Toolkit installation tree. Tutorials
Name Lesson steps/functions it describes ---------------- ----------------------------------------------- Time UTC to ET and SCLK to ET Loading Kernels Loading SPICE kernels SCLK SCLK to ET time conversion SPK Computing positions and velocities Frames Computing transformations between framesThese tutorials are available from the NAIF server at JPL:
https://naif.jpl.nasa.gov/naif/tutorials.html Required Readings
Name Lesson steps/functions that it describes --------------- ----------------------------------------- kernel.req Loading SPICE kernels naif_ids.req Body and reference frame names spk.req Computing positions and velocities sclk.req SCLK to ET time conversion time.req UTC to ET time conversion mice.req The Mice API The Permuted Index
This text document provides a simple mechanism by which users can discover which Mice functions perform functions of interest, as well as the names of the source files that contain these functions.
Mice API Documentation
For example, the document
mice/doc/html/mice/cspice_str2et.htmldescribes the cspice_str2et routine. Kernels Used
1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc 3. Solar System Ephemeris SPK, subsetted to cover only the time range of interest: de432s.bsp 4. BepiColombo MPO Spacecraft Trajectory SPK, subsetted to cover only the time range of interest: bc_mpo_mlt_50037_20260314_20280529_v05.bsp 5. BepiColombo MPO FK: bc_mpo_v32.tf 6. BepiColombo MPO Spacecraft CK, subsetted to cover only the time range of interest: bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc 7. Generic PCK: pck00011.tpcThese SPICE kernels are included in the lesson package. Mice Modules Used
CHAPTER EXERCISE FUNCTIONS NON-VOID KERNELS ------- --------- ------------- ------------- ---------- 1 convrt cspice_furnsh cspice_str2et 1 cspice_unload 2 sclket cspice_furnsh cspice_str2et 1,2 cspice_unload cspice_scs2e 3 getsta cspice_furnsh cspice_str2et 1-4 cspice_unload cspice_scs2e cspice_spkezr 4 soldir cspice_furnsh cspice_str2et 1-6 cspice_unload cspice_scs2e cspice_spkezr cspice_spkpos 5 sscpnt cspice_furnsh cspice_str2et 1-7 cspice_unload cspice_scs2e cspice_spkezr cspice_spkpos cspice_subpnt cspice_reclat cspice_pxform cspice_dpr 6 scvel cspice_furnsh cspice_str2et 1-7 cspice_unload cspice_scs2e cspice_spkezr cspice_spkpos cspice_subpnt cspice_reclat cspice_pxform cspice_dprRefer to the Mice HTML API documentation pages located under ``mice/doc/html/mice'' for detailed interface specifications of these functions. Step-1: ``UTC to ET''``UTC to ET'' Task Statement
``UTC to ET'' Hints
Find out what routine should be called to load necessary kernel(s). Reference the ``kernel.req'' and/or ``Loading Kernels'' tutorial. Find the ``loader'' routine calling sequence specification. Look at the ``time.req'' and that routine's source code header. This routine may be an entry point, in which case there will be no source file with the same name. To find out in which source file this entry point is, search for its name in the ``Permuted Index''. Find the routine(s) used to convert time between UTC and ET. Look at the ``time.req'' and/or ``Time'' tutorial. Find the ``converter'' routine(s) calling sequence specification. Look in the ``time.req'' and the routine's source code header. Put all calls together in a program, add variable declarations (the routine header's ``Declarations'' and ``Examples'' sections are a good place to look for declaration specification and examples) and output print statements. ``UTC to ET'' Solution Steps
As any other SPICE kernel this file can be loaded by the cspice_furnsh routine. For that, the name of the file can be provided as a sole argument of this routine:
... lskfle = 'naif0012.tls'; cspice_furnsh( lskfle )or it can be listed in a meta-kernel:
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' ) \begintextthe name of which, let's call it ``convrt.tm'', can be then provided as a sole argument of the cspice_furnsh routine:
mkfile = 'convrt.tm'; cspice_furnsh( mkfile )While the second option seems to involve a bit more work -- it requires making an extra file -- it is a much better way to go if you plan to load more kernels as you extend the program. With the meta-kernel approach simply adding more kernels to the list in KERNEL_TO_LOAD without changing the program code will accomplish that. The highest level Mice time routine converting UTC to ET is cspice_str2et (``mice/doc/html/mice/cspice_str2et.html''). It has two arguments -- input time string representing UTC in a variety of formats (see cspice_str2et header's section ``Particulars'' for the complete description of input time formats) and output DP number of ET seconds past J2000. A call to cspice_str2et converting a given UTC to ET could look like this:
utc = '2027 JAN 05 02:04:36'; et = cspice_str2et( utc );By combining cspice_furnsh and cspice_str2et calls and required declarations and by adding a simple print statement, one would get a complete program that prints ET for the given UTC epoch. Use of Mice calls in a MATLAB script requires the MATLAB search path include the Mice source, ``mice/src/mice'', and Mice library, ``mice/lib'', directories. Add those directories to the path using the ``addpath'' command. When you execute the script, ``convrt'', it produces the following output:
>> convrt UTC = 2027 JAN 05 02:04:36 ET = 852386745.184031 ``UTC to ET'' Code
function convrt() mkfile = 'convrt.tm'; cspice_furnsh( mkfile ) utc = '2027 JAN 05 02:04:36'; et = cspice_str2et( utc ); fprintf( 'UTC = %s\n', utc ); fprintf( 'ET = %20.6f\n', et ); cspice_unload( mkfile )Meta-kernel file ``convrt.tm'':
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' ) \begintext Step-2: ``SCLK to ET''``SCLK to ET'' Task Statement
``SCLK to ET'' Hints
Modify the program or meta-kernel to load this(these) kernels. Find the routine(s) needed to convert time between SCLK and ET. Look at the ``sclk.req'' and/or ``Time'' and ``SCLK'' tutorials. Find the ``converter'' routine's calling sequence specification. Look in the ``sclk.req'' and the routine's source code header. Look at ``naif_ids.req'' and the comments in the additional kernel(s) that you have loaded for information on proper values of input arguments of this routine. Add calls to the ``converter'' routine(s), necessary variable declarations (the routine header's ``Declarations'' and ``Examples'' sections are a good place to look for declaration specification and examples), and output print statements to the program. ``SCLK to ET'' Solution Steps
No code change is needed in the loading portion of the program if a meta-kernel approach was used in the Step-1. The program will load the file if it will be added to the list of kernels in the KERNELS_TO_LOAD variable:
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' 'kernels/sclk/bc_mpo_step_20230117.tsc' ) \begintextThe highest level Mice routine converting SCLK to ET is cspice_scs2e (``mice/doc/html/mice/cspice_scs2e.html''). It has three arguments -- NAIF ID for BepiColombo MPO s/c (-121 as described by ``naif_ids.req'' document), input time string representing BepiColombo MPO SCLK, and output DP number of ET seconds past J2000. A call to cspice_str2et converting given SCLK to ET could look like this:
scid = -121; sclk = '863834674:28127'; et = cspice_scs2e( scid, sclk);By adding the cspice_scs2e call, required declarations and a simple print statement, one would get a complete program that prints ET for the given SCLK epoch. When you execute the script, ``sclket'', it produces the following output:
>> sclket UTC = 2027 JAN 05 02:04:36 ET = 852386745.184031 SCLK = 863834674:28127 ET = 852386745.184037 ``SCLK to ET'' Code
function sclket() mkfile = 'sclket.tm'; cspice_furnsh( mkfile ) utc = '2027 JAN 05 02:04:36'; et = cspice_str2et( utc ); fprintf( 'UTC = %s\n', utc ); fprintf( 'ET = %20.6f\n', et ); scid = -121; sclk = '863834674:28127'; et = cspice_scs2e( scid, sclk); fprintf( 'SCLK = %s\n', sclk ); fprintf( 'ET = %20.6f\n', et ); cspice_unload( mkfile )Meta-kernel file ``sclket.tm'':
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' 'kernels/sclk/bc_mpo_step_20230117.tsc' ) \begintext Step-3: ``Spacecraft State''``Spacecraft State'' Task Statement
``Spacecraft State'' Hints
Verify that the kernels contain enough data to compute the state of interest. Use ``brief'' utility program located under ``toolkit/exe'' directory for that. Modify the meta-kernel to load this(these) kernels. Determine the routine(s) needed to compute states. Look at the ``spk.req'' and/or ``SPK'' tutorial presentation. Find the the routine(s) calling sequence specification. Look in the ``spk.req'' and the routine's source code header. Reference the ``naif_ids.req'' and ``frames.req'' and the routine(s) header ``Inputs'' and ``Particulars'' sections to determine proper values of the input arguments of this routine. Add calls to the routine(s), necessary variable declarations and output print statements to the program. ``Spacecraft State'' Solution Steps
The file names can be added to the meta-kernel to get them loaded into the program:
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc 3. Solar System Ephemeris SPK, subsetted to cover only the time range of interest: de432s.bsp 4. BepiColombo MPO Spacecraft Trajectory SPK, subsetted to cover only the time range of interest: bc_mpo_mlt_50037_20260314_20280529_v05.bsp \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' 'kernels/sclk/bc_mpo_step_20230117.tsc' 'kernels/spk/bc_mpo_mlt_50037_20260314_20280529_v05.bsp' 'kernels/spk/de432s.bsp' ) \begintextThe highest level Mice routine computing states is cspice_spkezr (``mice/doc/html/mice/cspice_spkezr.html''). We are interested in computing BepiColombo MPO position and velocity with respect to the Sun, therefore the target and observer names should be set to 'MPO' and 'Sun' (both names can be found in ``naif_ids.req''). The state should be in ecliptic frame, therefore the name of the frame in which the state should be computed is 'ECLIPJ2000' (see ``frames.req'' document.) Since we need only the geometric position, the `abcorr' argument of the routine should be set to 'NONE' (see aberration correction discussion in the (``mice/src/cspice/spkezr_c.c''). header). Putting it all together, we get:
target = 'MPO'; frame = 'ECLIPJ2000'; corrtn = 'NONE'; observ = 'SUN'; [state, ltime] = cspice_spkezr( target, et, frame, ... corrtn, observ );When you execute the script, ``getsta'', it produces the following output:
>> getsta UTC = 2027 JAN 05 02:04:36 ET = 852386745.184031 SCLK = 863834674:28127 ET = 852386745.184037 X = 23439067.896105 Y = -62315194.638947 Z = -7240868.738598 VX = 35.799323 VY = 18.151988 VZ = 0.890570 ``Spacecraft State'' Code
function getsta() mkfile = 'getsta.tm'; cspice_furnsh( mkfile ) utc = '2027 JAN 05 02:04:36'; et = cspice_str2et( utc ); fprintf( 'UTC = %s\n', utc ); fprintf( 'ET = %20.6f\n', et ); scid = -121; sclk = '863834674:28127'; et = cspice_scs2e( scid, sclk); fprintf( 'SCLK = %s\n', sclk ); fprintf( 'ET = %20.6f\n', et ); target = 'MPO'; frame = 'ECLIPJ2000'; corrtn = 'NONE'; observ = 'SUN'; [state, ltime] = cspice_spkezr( target, et, frame, ... corrtn, observ ); fprintf( ' X = %20.6f\n', state(1) ) fprintf( ' Y = %20.6f\n', state(2) ) fprintf( ' Z = %20.6f\n', state(3) ) fprintf( 'VX = %20.6f\n', state(4) ) fprintf( 'VY = %20.6f\n', state(5) ) fprintf( 'VZ = %20.6f\n', state(6) ) cspice_unload( mkfile )Meta-kernel file ``getsta.tm'':
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc 3. Solar System Ephemeris SPK, subsetted to cover only the time range of interest: de432s.bsp 4. BepiColombo MPO Spacecraft Trajectory SPK, subsetted to cover only the time range of interest: bc_mpo_mlt_50037_20260314_20280529_v05.bsp \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' 'kernels/sclk/bc_mpo_step_20230117.tsc' 'kernels/spk/bc_mpo_mlt_50037_20260314_20280529_v05.bsp' 'kernels/spk/de432s.bsp' ) \begintext Step-4: ``Sun Direction''``Sun Direction'' Task Statement
``Sun Direction'' Hints
Verify that the orientation data in the kernels have adequate coverage to support computation of the direction of interest. Use ``ckbrief'' utility program located under ``toolkit/exe'' directory for that. Modify the meta-kernel to load this(these) kernels. Determine the proper input arguments for the cspice_spkpos call to calculate the direction (which is the position portion of the output state). Look through the Frames Kernel find the name of the frame to used. Add calls to the routine(s), necessary variable declarations and output print statements to the program. ``Sun Direction'' Solution Steps
The file names can be added to the meta-kernel to get them loaded into the program:
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc 3. Solar System Ephemeris SPK, subsetted to cover only the time range of interest: de432s.bsp 4. BepiColombo MPO Spacecraft Trajectory SPK, subsetted to cover only the time range of interest: bc_mpo_mlt_50037_20260314_20280529_v05.bsp 5. BepiColombo MPO FK: bc_mpo_v32.tf 6. BepiColombo MPO Spacecraft CK, subsetted to cover only the time range of interest: bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' 'kernels/sclk/bc_mpo_step_20230117.tsc' 'kernels/spk/de432s.bsp' 'kernels/spk/bc_mpo_mlt_50037_20260314_20280529_v05.bsp' 'kernels/fk/bc_mpo_v32.tf' 'kernels/ck/bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc' 'kernels/ck/bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc' ) \begintextThe same highest level Mice routine computing positions, cspice_spkpos, can be used to compute this direction. Since this is the direction of the Sun as seen from the s/c, the target argument should be set to 'Sun' and the observer argument should be set to 'MPO'. The name of the SERENA STROFIO +X Buffle frame is 'MPO_SERENA_STROFIO+X', the definition and description of this frame are provided in the BepiColombo MPO FK file, ``bc_mpo_v32.tf''. Since the apparent, or ``as seen'', position is sought for, the `abcorr' argument of the routine should be set to 'LT+S' (see aberration correction discussion in the (``mice/src/cspice/spkpos_c.c'') header). Putting it all together, we get:
target = 'SUN'; frame = 'MPO_SERENA_STROFIO+X'; corrtn = 'LT+S'; observ = 'MPO'; [ sundir, ltime ] = cspice_spkpos( target, et, frame, ... corrtn, observ ); sundir = sundir/norm(sundir);When you execute the script, ``soldir'', it produces the following output:
>> soldir UTC = 2027 JAN 05 02:04:36 ET = 852386745.184031 SCLK = 863834674:28127 ET = 852386745.184037 X = 23439067.896105 Y = -62315194.638947 Z = -7240868.738598 VX = 35.799323 VY = 18.151988 VZ = 0.890570 SUNDIR(X) = 0.711937 SUNDIR(Y) = 0.549505 SUNDIR(Z) = -0.437252 ``Sun Direction'' Code
function soldir() mkfile = 'soldir.tm'; cspice_furnsh( mkfile ) utc = '2027 JAN 05 02:04:36'; et = cspice_str2et( utc ); fprintf( 'UTC = %s\n', utc ); fprintf( 'ET = %20.6f\n', et ); scid = -121; sclk = '863834674:28127'; et = cspice_scs2e( scid, sclk); fprintf( 'SCLK = %s\n', sclk ); fprintf( 'ET = %20.6f\n', et ); target = 'MPO'; frame = 'ECLIPJ2000'; corrtn = 'NONE'; observ = 'SUN'; [state, ltime] = cspice_spkezr( target, et, frame, ... corrtn, observ ); fprintf( ' X = %20.6f\n', state(1) ) fprintf( ' Y = %20.6f\n', state(2) ) fprintf( ' Z = %20.6f\n', state(3) ) fprintf( 'VX = %20.6f\n', state(4) ) fprintf( 'VY = %20.6f\n', state(5) ) fprintf( 'VZ = %20.6f\n', state(6) ) target = 'SUN'; frame = 'MPO_SERENA_STROFIO+X'; corrtn = 'LT+S'; observ = 'MPO'; [ sundir, ltime ] = cspice_spkpos( target, et, frame, ... corrtn, observ ); sundir = sundir/norm(sundir); fprintf( 'SUNDIR(X) = %20.6f\n', sundir(1) ) fprintf( 'SUNDIR(Y) = %20.6f\n', sundir(2) ) fprintf( 'SUNDIR(Z) = %20.6f\n', sundir(3) ) cspice_unload( mkfile )Meta-kernel file ``soldir.tm'':
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc 3. Solar System Ephemeris SPK, subsetted to cover only the time range of interest: de432s.bsp 4. BepiColombo MPO Spacecraft Trajectory SPK, subsetted to cover only the time range of interest: bc_mpo_mlt_50037_20260314_20280529_v05.bsp 5. BepiColombo MPO FK: bc_mpo_v32.tf 6. BepiColombo MPO Spacecraft CK, subsetted to cover only the time range of interest: bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' 'kernels/sclk/bc_mpo_step_20230117.tsc' 'kernels/spk/de432s.bsp' 'kernels/spk/bc_mpo_mlt_50037_20260314_20280529_v05.bsp' 'kernels/fk/bc_mpo_v32.tf' 'kernels/ck/bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc' 'kernels/ck/bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc' ) \begintext Step-5: ``Sub-Spacecraft Point''``Sub-Spacecraft Point'' Task Statement
``Sub-Spacecraft Point'' Hints
Refer to the routine's header to determine the additional kernels needed for this direction computation. Modify the meta-kernel to load this(these) kernels. Determine the proper input arguments for the routine. Refer to the routine's header for that information. Convert the surface point Cartesian vector returned by this routine to latitudinal coordinates. Use ``Permuted Index'' to find the routine that does this conversion. Refer to the routine's header for input/output argument specifications. Since the Cartesian vector from the spacecraft to the sub-spacecraft point is computed in the Mercury body-fixed frame, it should be transformed into the instrument frame get the direction we are looking for. Refer to ``frames.req'' and/or ``Frames'' tutorial to determine the name of the routine computing transformations and use it to compute transformation from Mercury body-fixed to the SERENA STROFIO +X Buffle frame. Using ``Permuted Index'' find the routine that multiplies 3x3 matrix by 3d vector and use it to rotate the vector to the instrument frame. Add calls to the routine(s), necessary variable declarations and output print statements to the program. ``Sub-Spacecraft Point'' Solution Steps
Since the s/c is close to Mercury, light time does not need to be taken into account and, therefore, the `abcorr' argument can be set to 'NONE'. In order for cspice_subpnt to compute the nearest point location, a PCK file containing Mercury radii has to be loaded into the program (see ``Files'' section of the routine's header.) All other files required for this computation are already being loaded by the program. With PCK file name added to it, the updated meta-kernel will look like this:
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc 3. Solar System Ephemeris SPK, subsetted to cover only the time range of interest: de432s.bsp 4. BepiColombo MPO Spacecraft Trajectory SPK, subsetted to cover only the time range of interest: bc_mpo_mlt_50037_20260314_20280529_v05.bsp 5. BepiColombo MPO FK: bc_mpo_v32.tf 6. BepiColombo MPO Spacecraft CK, subsetted to cover only the time range of interest: bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc 7. Generic PCK: pck00011.tpc \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' 'kernels/sclk/bc_mpo_step_20230117.tsc' 'kernels/spk/de432s.bsp' 'kernels/spk/bc_mpo_mlt_50037_20260314_20280529_v05.bsp' 'kernels/fk/bc_mpo_v32.tf' 'kernels/ck/bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc' 'kernels/pck/pck00011.tpc' ) \begintextThe sub-spacecraft point Cartesian vector can be converted to planetocentric radius, longitude and latitude using the cspice_reclat routine (``mice/doc/html/mice/cspice_reclat.html''). The vector from the spacecraft to the sub-spacecraft point returned by cspice_subpnt has to be rotated from the body-fixed frame to the instrument frame. The name of the routine that computes 3x3 matrices rotating vectors from one frame to another is cspice_pxform (``mice/doc/html/mice/cspice_pxform.html''). In our case the `from' argument should be set to 'IAU_MERCURY' and the `to' argument should be set to 'MPO_SERENA_STROFIO+X' The vector should be then multiplied by this matrix to rotate it to the instrument frame. After applying the rotation, normalize the resultant vector by dividing the vector by its norm. For output the longitude and latitude angles returned by cspice_reclat in radians can be converted to degrees by multiplying by cspice_dpr function (``mice/doc/html/mice/cspice_dpr.html''). Putting it all together, we get:
method = 'NEAR POINT: ELLIPSOID'; target = 'MERCURY'; frame = 'IAU_MERCURY'; corrtn = 'NONE'; observ = 'MPO'; [spoint, trgepc, srfvec] = cspice_subpnt( method, target, ... et, frame, corrtn, observ); [srad, slon, slat] = cspice_reclat( spoint ); fromfr = 'IAU_MERCURY'; tofr = 'MPO_SERENA_STROFIO+X'; m2imat = cspice_pxform( fromfr, tofr, et); sbpdir = m2imat * srfvec; sbpdir = sbpdir/norm(sbpdir); fprintf( 'LON = %20.6f\n', slon * cspice_dpr ) fprintf( 'LAT = %20.6f\n', slat * cspice_dpr )When you execute the script, ``sscpnt'', it produces the following output:
>> sscpnt UTC = 2027 JAN 05 02:04:36 ET = 852386745.184031 SCLK = 863834674:28127 ET = 852386745.184037 X = 23439067.896105 Y = -62315194.638947 Z = -7240868.738598 VX = 35.799323 VY = 18.151988 VZ = 0.890570 SUNDIR(X) = 0.711937 SUNDIR(Y) = 0.549505 SUNDIR(Z) = -0.437252 LON = 17.944077 LAT = 31.521072 SBPDIR(X) = -1.000000 SBPDIR(Y) = 0.000000 SBPDIR(Z) = -0.000864 ``Sub-Spacecraft Point'' Code
function sscpnt() mkfile = 'sscpnt.tm'; cspice_furnsh( mkfile ) utc = '2027 JAN 05 02:04:36'; et = cspice_str2et( utc ); fprintf( 'UTC = %s\n', utc ); fprintf( 'ET = %20.6f\n', et ); scid = -121; sclk = '863834674:28127'; et = cspice_scs2e( scid, sclk); fprintf( 'SCLK = %s\n', sclk ); fprintf( 'ET = %20.6f\n', et ); target = 'MPO'; frame = 'ECLIPJ2000'; corrtn = 'NONE'; observ = 'SUN'; [state, ltime] = cspice_spkezr( target, et, frame, ... corrtn, observ ); fprintf( ' X = %20.6f\n', state(1) ) fprintf( ' Y = %20.6f\n', state(2) ) fprintf( ' Z = %20.6f\n', state(3) ) fprintf( 'VX = %20.6f\n', state(4) ) fprintf( 'VY = %20.6f\n', state(5) ) fprintf( 'VZ = %20.6f\n', state(6) ) target = 'SUN'; frame = 'MPO_SERENA_STROFIO+X'; corrtn = 'LT+S'; observ = 'MPO'; [ sundir, ltime ] = cspice_spkpos( target, et, frame, ... corrtn, observ ); sundir = sundir/norm(sundir); fprintf( 'SUNDIR(X) = %20.6f\n', sundir(1) ) fprintf( 'SUNDIR(Y) = %20.6f\n', sundir(2) ) fprintf( 'SUNDIR(Z) = %20.6f\n', sundir(3) ) method = 'NEAR POINT: ELLIPSOID'; target = 'MERCURY'; frame = 'IAU_MERCURY'; corrtn = 'NONE'; observ = 'MPO'; [spoint, trgepc, srfvec] = cspice_subpnt( method, target, ... et, frame, corrtn, observ); [srad, slon, slat] = cspice_reclat( spoint ); fromfr = 'IAU_MERCURY'; tofr = 'MPO_SERENA_STROFIO+X'; m2imat = cspice_pxform( fromfr, tofr, et); sbpdir = m2imat * srfvec; sbpdir = sbpdir/norm(sbpdir); fprintf( 'LON = %20.6f\n', slon * cspice_dpr ) fprintf( 'LAT = %20.6f\n', slat * cspice_dpr ) fprintf( 'SBPDIR(X) = %20.6f\n', sbpdir(1) ) fprintf( 'SBPDIR(Y) = %20.6f\n', sbpdir(2) ) fprintf( 'SBPDIR(Z) = %20.6f\n', sbpdir(3) ) cspice_unload( mkfile )Meta-kernel file ``sscpnt.tm'':
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc 3. Solar System Ephemeris SPK, subsetted to cover only the time range of interest: de432s.bsp 4. BepiColombo MPO Spacecraft Trajectory SPK, subsetted to cover only the time range of interest: bc_mpo_mlt_50037_20260314_20280529_v05.bsp 5. BepiColombo MPO FK: bc_mpo_v32.tf 6. BepiColombo MPO Spacecraft CK, subsetted to cover only the time range of interest: bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc 7. Generic PCK: pck00011.tpc \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' 'kernels/sclk/bc_mpo_step_20230117.tsc' 'kernels/spk/de432s.bsp' 'kernels/spk/bc_mpo_mlt_50037_20260314_20280529_v05.bsp' 'kernels/fk/bc_mpo_v32.tf' 'kernels/ck/bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc' 'kernels/pck/pck00011.tpc' ) \begintext Step-6: ``Spacecraft Velocity''``Spacecraft Velocity'' Task Statement
``Spacecraft Velocity'' Hints
Since the velocity vector is computed in the inertial frame, it should be rotated to the instrument frame. Look at the previous step the routine that compute necessary rotation and rotate vectors. Add calls to the routine(s), necessary variable declarations and output print statements to the program. ``Spacecraft Velocity'' Solution Steps
The spacecraft velocity vector is the last three components of the state returned by cspice_spkezr. To compute velocity of BepiColombo MPO with respect to Mercury in the J2000 inertial frame the cspice_spkezr arguments should be set to 'MPO' (TARG), 'MERCURY' (OBS), 'J2000' (REF) and 'NONE' (ABCORR). The computed velocity vector has to be rotated from the J2000 frame to the instrument frame. The cspice_pxform routine used in the previous step can be used to compute the rotation matrix needed for that. In this case the frame name arguments should be set to 'J2000' (FROM) and 'MPO_SERENA_STROFIO+X' (TO). As in the previous step the difference vector should be then multiplied by this rotation matrix. After applying the rotation, normalize the resultant vector by dividing the vector by its norm. Putting it all together, we get:
target = 'MPO'; frame = 'J2000'; corrtn = 'NONE'; observ = 'MERCURY'; [state, ltime] = cspice_spkezr( target, et, frame, ... corrtn, observ ); scvdir = state(4:6); fromfr = 'J2000'; tofr = 'MPO_SERENA_STROFIO+X'; j2imat = cspice_pxform( fromfr, tofr, et ); scvdir = j2imat * scvdir; scvdir = scvdir/norm(scvdir);When you execute the script, ``scvel'', it produces the following output:
>> scvel UTC = 2027 JAN 05 02:04:36 ET = 852386745.184031 SCLK = 863834674:28127 ET = 852386745.184037 X = 23439067.896105 Y = -62315194.638947 Z = -7240868.738598 VX = 35.799323 VY = 18.151988 VZ = 0.890570 SUNDIR(X) = 0.711937 SUNDIR(Y) = 0.549505 SUNDIR(Z) = -0.437252 LON = 17.944077 LAT = 31.521072 SBPDIR(X) = -1.000000 SBPDIR(Y) = 0.000000 SBPDIR(Z) = -0.000864 SCVDIR(X) = 0.105745 SCVDIR(Y) = 0.000009 SCVDIR(Z) = 0.994393Note that computing the spacecraft velocity in the instrument frame by a single call to cspice_spkezr by specifying 'MPO_SERENA_STROFIO+X' in the `ref' argument returns an incorrect result. Such computation will take into account the spacecraft angular velocity from the CK files, which should not be considered in this case. ``Spacecraft Velocity'' Code Program ``scvel.m'':
function scvel() mkfile = 'scvel.tm'; cspice_furnsh( mkfile ) utc = '2027 JAN 05 02:04:36'; et = cspice_str2et( utc ); fprintf( 'UTC = %s\n', utc ); fprintf( 'ET = %20.6f\n', et ); scid = -121; sclk = '863834674:28127'; et = cspice_scs2e( scid, sclk); fprintf( 'SCLK = %s\n', sclk ); fprintf( 'ET = %20.6f\n', et ); target = 'MPO'; frame = 'ECLIPJ2000'; corrtn = 'NONE'; observ = 'SUN'; [state, ltime] = cspice_spkezr( target, et, frame, ... corrtn, observ ); fprintf( ' X = %20.6f\n', state(1) ) fprintf( ' Y = %20.6f\n', state(2) ) fprintf( ' Z = %20.6f\n', state(3) ) fprintf( 'VX = %20.6f\n', state(4) ) fprintf( 'VY = %20.6f\n', state(5) ) fprintf( 'VZ = %20.6f\n', state(6) ) target = 'SUN'; frame = 'MPO_SERENA_STROFIO+X'; corrtn = 'LT+S'; observ = 'MPO'; [ sundir, ltime ] = cspice_spkpos( target, et, frame, ... corrtn, observ ); sundir = sundir/norm(sundir); fprintf( 'SUNDIR(X) = %20.6f\n', sundir(1) ) fprintf( 'SUNDIR(Y) = %20.6f\n', sundir(2) ) fprintf( 'SUNDIR(Z) = %20.6f\n', sundir(3) ) method = 'NEAR POINT: ELLIPSOID'; target = 'MERCURY'; frame = 'IAU_MERCURY'; corrtn = 'NONE'; observ = 'MPO'; [spoint, trgepc, srfvec] = cspice_subpnt( method, target, ... et, frame, corrtn, observ); [srad, slon, slat] = cspice_reclat( spoint ); fromfr = 'IAU_MERCURY'; tofr = 'MPO_SERENA_STROFIO+X'; m2imat = cspice_pxform( fromfr, tofr, et); sbpdir = m2imat * srfvec; sbpdir = sbpdir/norm(sbpdir); fprintf( 'LON = %20.6f\n', slon * cspice_dpr ) fprintf( 'LAT = %20.6f\n', slat * cspice_dpr ) fprintf( 'SBPDIR(X) = %20.6f\n', sbpdir(1) ) fprintf( 'SBPDIR(Y) = %20.6f\n', sbpdir(2) ) fprintf( 'SBPDIR(Z) = %20.6f\n', sbpdir(3) ) target = 'MPO'; frame = 'J2000'; corrtn = 'NONE'; observ = 'MERCURY'; [state, ltime] = cspice_spkezr( target, et, frame, ... corrtn, observ ); scvdir = state(4:6); fromfr = 'J2000'; tofr = 'MPO_SERENA_STROFIO+X'; j2imat = cspice_pxform( fromfr, tofr, et ); scvdir = j2imat * scvdir; scvdir = scvdir/norm(scvdir); fprintf( 'SCVDIR(X) = %20.6f\n', scvdir(1) ) fprintf( 'SCVDIR(Y) = %20.6f\n', scvdir(2) ) fprintf( 'SCVDIR(Z) = %20.6f\n', scvdir(3) ) cspice_unload( mkfile )Meta-kernel file ``scvel.tm'':
KPL/MK The names and contents of the kernels referenced by this meta-kernel are as follows: 1. Generic LSK: naif0012.tls 2. BepiColombo MPO SCLK: bc_mpo_step_20230117.tsc 3. Solar System Ephemeris SPK, subsetted to cover only the time range of interest: de432s.bsp 4. BepiColombo MPO Spacecraft Trajectory SPK, subsetted to cover only the time range of interest: bc_mpo_mlt_50037_20260314_20280529_v05.bsp 5. BepiColombo MPO FK: bc_mpo_v32.tf 6. BepiColombo MPO Spacecraft CK, subsetted to cover only the time range of interest: bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc 7. Generic PCK: pck00011.tpc \begindata KERNELS_TO_LOAD = ( 'kernels/lsk/naif0012.tls' 'kernels/sclk/bc_mpo_step_20230117.tsc' 'kernels/spk/de432s.bsp' 'kernels/spk/bc_mpo_mlt_50037_20260314_20280529_v05.bsp' 'kernels/fk/bc_mpo_v32.tf' 'kernels/ck/bc_mpo_sc_slt_50028_20260314_20280529_f20181127_v03.bc' 'kernels/pck/pck00011.tpc' ) \begintext |