Monday, April 9, 2018

Tisserand's Parameter in 2 Dimensions

Here is another interactive graph about Tisserand's parameter. My first post about it has the explanation what it is, and also a line graph that adapted to the set orbital parameters semimajor axis a, eccentricity e and inclination i of a perturbed body and the chosen perturber, any giant planet. First, here is the definition again, where Tp is the Tisserand parameter:

Tp = ap a +2 a ap ( 1 - e2 ) cos i

As stated in the above post, the nice thing about it is that it is a quasi-conserved quantity that stays more or less the same before and after a close encounter of an asteroid, a comet or a space probe with a large body. Even nicer would be to see a whole lot of parameter-combinations at once, as a Tp-heat map combining any two parameters in a plane. Like this:

As you can see, the graph lets you select the parameter combination a vs. i, a vs. e, or e vs. i, and chose a value for the third one separtely, for each of the giant outer planets, which are represented by a red circle in the plane. The currently selected parameters are indicated in the resulting formula at the lower right. The Tisserand value below the crosshair is indicated close to it, along with the peri- and aphelion (closest and farthest distance to the Sun) for the given combination of parameters.

So that means paths along the same line of Tisserand values indicate changes of the plotted parameters achievable by a flyby of the respective giant planet, be it for a spacecraft, asteroid or comet. At least that's what I think it means.

The graph uses D3.js for display and interactions, and MathJax for math-formatting. Check out the source code on GitHub

Friday, March 30, 2018

Solar System Missions Update 04/2018

Here's my map of all active and future Solar System Missions as of April 1st 2018.

Until last month I had the Chandrayaan 2 launch imminent, but that got delayed until later this year. OTOH Hayabusa 2 is getting really close now to Asteroid Ryugu, and also getting close are the launches of InSIGHT and the Chang‘e 4 relay orbiter.

Data, images and documentation are available on my space exploration history GitHub repository and the associated website.

Saturday, March 24, 2018

How To Put Your Own Data on the Celestial Map

I have added a simple example of how to add your own data to my interactive celestial map. Specifically, how to display the Summer Triangle at its proper position. It'll look like this:

First we need to add the proper libraries and stylesheet:

<script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
<script type="text/javascript" src="http://d3js.org/d3.geo.projection.v0.min.js"></script>
<script type="text/javascript" src="http://ofrohn.github.io/celestial.min.js"></script>
<link rel="stylesheet" href="http://ofrohn.github.io/celestial.css">

Whatever you add needs to be valid geoJSON. The various types of objects are described in the readme of the data folder in the GitHub repository. This can be a separate file or a JSON object filled at runtime or defined inline. Like so:

  var jsonLine = {
    "type":"FeatureCollection",
    // this is an array, add as many objects as you want
    "features":[
      {"type":"Feature",
       "id":"SummerTriangle",
       "properties": {
         // Name
         "n":"Summer Triangle",
         // Location of name text on the map
         "loc": [-67.5, 52]
       }, "geometry":{
         // the line object as an array of point coordinates, 
         // always as [ra -180..180 degrees, dec -90..90 degrees]
         "type":"MultiLineString",
         "coordinates":[[
           [-80.7653, 38.7837],
           [-62.3042, 8.8683],
           [-49.642, 45.2803],
           [-80.7653, 38.7837]
         ]]
       }
      }  
    ]
  }; 

As you can see, this defines the Summer Triangle asterism, consisting of the bright stars Vega (Alpha Lyr), Deneb (Alpha Cyg) and Altair (Alpha Aql).

You also need to define how the triangle is going to look like with some styles (see documentation on GitHub):

  var lineStyle = { 
    stroke:"#f00", 
    fill: "rgba(255, 204, 204, 0.4)",
    width:3 
  };
  var textStyle = { 
    fill:"#f00", 
    font: "bold 15px Helvetica, Arial, sans-serif", 
    align: "center", 
    baseline: "bottom" 
  };

Lastly, we need some settings for the proper map, also documented on the GitHub repository:

  var config = { 
    width: 640,
    projection: "airy", 
    center: [-65, 0],
    background: { fill: "#fff", stroke: "#000", opacity: 1, width: 1 },
    datapath: "http://ofrohn.github.io/data/",
    stars: { 
      colors: false, 
      names: false, 
      style: { fill: "#000", opacity:1 }, 
      limit: 6, 
      size:5 
    },
    dsos: { show: false },
    mw: { 
      style: { fill:"#996", opacity: 0.1 } 
    },
  };

Now we can get to work, with the function

Celestial.add({file:string, type:"line", callback:function, redraw:function)

The file argument is optional for providing an external geoJSON file, since we already defingd our data, we don't need it. Type is 'line', that leaves two function definiions, the first one gets called at loading, this is where we add our data to the d3-celestial data container, and redraw is called at every redraw event for the map. so here you need to define how to display the added object(s).

  callback: function(error, json) {
    if (error) return console.warn(error);
    // Load the geoJSON file and transform to correct coordinate system, if necessary
    var asterism = Celestial.getData(jsonLine, config.transform);

    // Add to celestial objects container in d3
    Celestial.container.selectAll(".asterisms")
      .data(asterism.features)
      .enter().append("path")
      .attr("class", "ast"); 
    // Trigger redraw to display changes
    Celestial.redraw();
  }

The callback funtion is pretty straight forward: Load the data with Celestial.getData, add to Celestial.container in te usual d3 manner, and redraw. It also provides a json parameter that contains the parsed JSON if a file property is given, but we already have defined jsonLine above, so we use that.

  redraw: function() {   
    // Select the added objects by class name as given previously
    Celestial.container.selectAll(".ast").each(function(d) {
      // Set line styles 
      Celestial.setStyle(lineStyle);
      // Project objects on map
      Celestial.map(d);
      // draw on canvas
      Celestial.context.fill();
      Celestial.context.stroke();
      
      // If point is visible (this doesn't work automatically for points)
      if (Celestial.clip(d.properties.loc)) {
        // get point coordinates
        pt = Celestial.mapProjection(d.properties.loc);
        // Set text styles       
        Celestial.setTextStyle(textStyle);
        // and draw text on canvas
        Celestial.context.fillText(d.properties.n, pt[0], pt[1]);
      }      
    })
  }

And the redraw function with the actual display of the elements, contained in a d3.selectAll call on the previously set class property of the added objects. Celestial.setStyle applies the predefined canvas styles, Celestial.map projects each line on the map. However, that doesn't work for points, so that is done manually with Celestial.clip (true if point is currently visible) and Celestial.mapProjection. and the rest are standard canvas fill and stroke operations. The beginPath and closePath commands are done automatically.

  Celestial.display(config);

Finally, the whole map is displayed. Check out the documentation or download/fork the D3-Celestial source in the GitHub repository. The complete sample code is in the file triangle.html in the demo folder.

Wednesday, February 28, 2018

Solar System Missions Update 03/2018

Here's my map of all active and future Solar System Missions as of March 1st 2018.

This month with a cameo of a certain car. Like there was any chance I'd pass on the chance to put that in..

Data, images and documentation are available on my space exploration history GitHub repository and the associated website.

Wednesday, January 31, 2018

Solar System Missions Update 02/2018

Here's my map of all active and future Solar System Missions as of February 1st 2018.

Still waiting to see when car tossing event is going to happen. Meanwhile I descoped showing SDO in geostationary orbit, the bugging of inconsistency with my inclusion criteria finally got overwhelming.

Data, images and documentation are available on my space exploration history GitHub repository and the associated website.

Friday, January 19, 2018

Tisserand's Parameter

One topic that comes up frequently in orbital dynamics is the Tisserand parameter. So as an interested layman, I'm curious about it, and have several questions about it, like "what is the Tisserand parameter?" or "how is it useful?". Well, first, here is it's definition:

Tp = ap a +2 a ap ( 1 - e2 ) cos i

As you can see, it relates the orbital parameters semimajor axis a, eccentricity e and inclination i of a perturbed body (i.e. a small body encountering a larger body) to each other and to the semimajor axis of the perturber ap, like, say, Jupiter, or any larger body in the Solar System. The result is the dimensionless value called the Tisserand parameter Tp, or Tisserand's criterion.

The nice thing about it is that it is a quasi-conserved quantity that stays more or less the same before and after a close encounter of an asteroid, a comet or a space probe with a large body. That makes it a useful tool to identify prior visits of periodic comets, whose orbital parameters may have changed in the mean time, but since the Tisserand parameter stays about the same, old observations can be searched for a similar value.

Another use is the shaping of spacecraft trajectories, since each of the orbital parameters changes through a flyby in a predictable way. It is in fact this property of the Tisserand parameter that made achievements like the Voyager's Grand Tour or Cassini's epic tour of the Saturn system, possible. The former through flybys of all the giant planets, the latter case through regular flybys of Saturn's largest moon Titan.

OK, that's what it does, but I had a hard time visualizing how it behaves for each of the parameters. So I made the formula interactive:

As you can see, the graph lets you select each parameter a, e, and i separately, and chose a value for the other two. Select any kind of trajectory and see how it's Tisserand parameter changes relative to each of the outer planets, which are represented by a red circle. The currently selected parameters are indicated in the resulting formula at the lower right.

For asteroids the value relative to Jupiter is normally Tj < 3 and for comets within 2 < Tj < 3. If you select semimajor axis, you'll see that Tj only gets close to these values if the bodies' orbit goes anywhere close to Jupiter, and if you play around with e or i, the higher you chose them /(i.e. more comet-like) the lower Tj gets.

Maybe this helps somebody else as well.

The graph uses D3.js for display and interactions, and MathJax for consistent math-formatting. Check out the source code on GitHub

Sunday, January 14, 2018

New IAU Star Names for D3-Celestial

As the IAU has recently approved a lot of official star names, so I updated d3-celestial to reflect these. Some are comletely new, others now have an officially approved spelling. I changed all those I previously spelled differently.

Here are those that have completely new names I didn't have before:

Name         Designation  ID    Con #    Vmag    HIP#    HD#  RA(J2000) Dec(J2000)
Alkarab      HR 8905      ups   Peg -    4.42  115623 220657 351.344931  23.404100
Athebyne     HR 6132      eta   Dra A    2.73   80331 148387 245.997858  61.514214
Beemim       HR 1393      ups03 Eri -    3.97   20535  28028  66.009239 -34.016848
Brachium     HR 5603      sig   Lib A    3.25   73714 133216 226.017567 -25.281961
Castula      HR 265       ups02 Cas -    4.62    4422   5395  14.166271  59.181055
Chamukuy     HR 1412      tet02 Tau Aa   3.73   20894  28319  67.165586  15.870882
Dalim        HR 963       alf   For A    3.86   14879  20010  48.018864 -28.987620
Fang         HR 5944      pi    Sco Aa   2.89   78265 143018 239.712972 -26.114108
Fulu         HR 153       zet   Cas -    3.69    2920   3360   9.242851  53.896908
Fuyue        HR 6630      -     Sco -    3.19   87261 161892 267.464503 -37.043305
Ginan        HR 4700      eps   Cru -    3.59   60260 107446 185.340039 -60.401147
Iklil        HR 5928      rho   Sco Aa   3.87   78104 142669 239.221151 -29.214073
Jishui       HR 2930      omi   Gem -    4.89   37265  61110 114.791387  34.584346
Kang         HR 5315      kap   Vir -    4.18   69427 124294 213.223939 -10.273704
Larawag      HR 6241      eps   Sco -    2.29   82396 151680 252.540878 -34.293232
Lilii Borea  HR 824       39    Ari -    4.52   13061  17361  41.977256  29.247115
Mahasim      HR 2095      tet   Aur A    2.65   28380  40312  89.930292  37.212585
Nembus       HR 464       51    And -    3.59    7607   9927  24.498154  48.628214
Pipirima     HR 6252      mu02  Sco A    3.56   82545 151985 253.083939 -38.017535
Revati       HR 361       zet   Psc A    5.21    5737   7344  18.432864   7.575354
Saclateni    HR 1612      zet   Aur A    3.69   23453  32068  75.619531  41.075839
Taiyangshou  HR 4518      chi   UMa -    3.69   57399 102224 176.512559  47.779406
Tianguan     HR 1910      zet   Tau A    2.97   26451  37202  84.411189  21.142544
Tiaki        HR 8636      bet   Gru -    2.12  112122 214952 340.666876 -46.884576
Tianyi       HR 4863      7     Dra -    5.43   62423 111335 191.893099  66.790305
Unurgunite   HR 2646      sig   CMa -    3.49   33856  52877 105.429782 -27.934830
Wurren       HR 338       zet   Phe Aa   4.02    5348   6882  17.096173 -55.245758
Xamidimura   HR 6247      mu01  Sco Aa   3.00   82514 151890 252.967630 -38.047380
Xuange       HR 5351      lam   Boo -    4.18   69732 125162 214.095912  46.088306
Zhang        HR 3903      ups01 Hya A    4.11   48356  85444 147.869558 -14.846603

See some more d3-celestial examples here, play with it here or check out the documentation and/or fork/download the source from the GitHub repository.