Sunday, April 22, 2018

Space Observatories Update 04/2018

A new observatory in space, TESS! Time for an update to the Space Observatories page. Also some delays and the Chinese "Two Meter Space Telescope" got the proper name Xuntian, "Sky Survey", and will be deployed close to the future multiple segment Chinese Space Station for easy maintenance.

The source data are now available on my space exploration history github repository, together with the included infographics.

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