Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

HideElements
metastrue
breadcrumbtrue
sidebartrue
titletrue
labelstrue
likestrue

Panel
borderColor#e65101
bgColor#fffbf9
borderWidth1
borderStylesolid


HTML
<div id="forum-link-text" style="text-align:center">
   <font color="#e65101"><i>What do you think? Discuss, post comments, or ask questions at the end of this article</i></font>
</div>



Info


HTML
<div id="tkb-link-text" style="text-align:center">
   See my <a href="https://confluence.jaytaala.com/display/TKB">Tech Knowledge Base</a> for solutions to various tech related issues and implementation guides I've written.</br>
</div>


Section


Column
width50%

Recently Updated
typespage
max3
spacesTKB
hideHeadingtrue
themeconcise
labelskb-how-to-article


Column
width50%

Recently Updated
typespage
max3
spacesTKB
hideHeadingtrue
themeconcise
labelskb-troubleshooting-article





Current work

I work for the Australian Federal Government.


Prior work

Previously I worked at UNSW Canberra Space where I developed software systems and operator-focused software platforms for various engineering and space related purposes. 

I'm also the developer of UNSW Canberra Space' OperationsToolkit: a multi-user, secured cloud-based space mission operator platform. Allows safe communication with our satellites, decoding & processing of received data (telemetry data and image processing) - and also provides 3D orbit propagation visualisation and tracking of satellites in real (or simulated) time.

OperationsToolkit is a user/operator focused web based platform built with modern frameworks/standards and includes as a fully developed REST API.

Finally, I also designed and managed the IT infrastructure and DevOps toolchain for around 40 engineers within UNSW Canberra Space.



HTML
<div style="max-width:300px; display:block; margin:auto">


HTML
</div>



Panel
bgColor#f8f8f8
borderWidth0
titleBGColor#efefef
borderStylesolid
titleLive orbital position tracking of our satellite (plus a few other space bodies)

As a software and user/operator platforms developer, I usually work in various languages (Java, JavaScript, python, CSS, HTML, SQL, JPQL, etc.) and with several frameworks and many libraries.

One such library (which has been very nice to work with) is cesium.js: an open-source JavaScript library we use in some of our platforms to visualise and track satellites (ours and others).  See below for a small example of using this js library to track several satellites and estimate their current (and future) positions using an orbit propagator (not part of the cesium.js library, but a propagator is used to generate the data (used below) that cesium.js renders). Here, propagation (for the next 48 hours) is updated every night and cached on one of my servers. On a larger platform (such as the one I develop) we allow on-demand propagation calculation and querying via REST api.

HTML
<div style="color:darkorange; border:3px solid darkorange;padding:10px;text-align:center; margin-top:18px; margin-bottom:0px;">Interact with the world below by <strong>click-dragging</strong>.  Zoom in/out with <strong>mouse-scroll</strong>. <strong>Click</strong> (or <strong>double-click to focus</strong>) on a satellite to report it's estimated position. Use the time-control bar to propagate satellite orbits over time.</em></div>
<div id="cesiumContainer" style="width:100%; height:600px"></div>
 <script src="https://cesium.com/downloads/cesiumjs/releases/1.53/Build/Cesium/Cesium.js"></script>
  <link href="https://cesium.com/downloads/cesiumjs/releases/1.53/Build/Cesium/Widgets/widgets.css" rel="stylesheet">

<script>
// set home view (Australia)
let west = 112.0;
let south = -45.0;
let east = 155.0;
let north = -9.0;
let extent = Cesium.Rectangle.fromDegrees(west, south, east, north);
Cesium.Camera.DEFAULT_VIEW_RECTANGLE = extent;
Cesium.Camera.DEFAULT_VIEW_FACTOR = 1.7;

cesiumViewer = new Cesium.Viewer('cesiumContainer', {
    shouldAnimate : true,
});

// remove geocoder
cesiumViewer.geocoder.destroy();

// if canvas less than... don't show lighting
let showLighting = true;
if (cesiumViewer.canvas.width <= 1000) {
	showLighting = false;
}

// enable eclipse shadow
cesiumViewer.scene.globe.enableLighting = showLighting;

// add buttons
function getshowHideBtnHtml(show, appendText, functionName) {
    value = ((show) ? 'Show':'Hide') + ' ' + appendText;
    return '<button onclick="' + functionName + '()" class="cesium-button cesium-toolbar-button" style="width:auto;border-radius:3px;padding:0px 7px;font-size:15px;">' + value + '</button>';
}

let toggleEclipseBtn = document.createElement('span');
toggleEclipseBtn.innerHTML = getshowHideBtnHtml(!showLighting, 'Day / Night', 'toggleEclipse');
parent = document.getElementsByClassName('cesium-viewer-toolbar')[0];
parent.insertBefore(toggleEclipseBtn, parent.children[1]);
toggleEclipse = function() {
    let state = cesiumViewer.scene.globe.enableLighting;
    toggleEclipseBtn.innerHTML = getshowHideBtnHtml(state, 'Day / Night', 'toggleEclipse');
    cesiumViewer.scene.globe.enableLighting = !state;
}

let showOrbits = true;
let toggleOrbitsBtn = document.createElement('span');
toggleOrbitsBtn.innerHTML = getshowHideBtnHtml(!showOrbits, 'Orbits', 'toggleOrbits');
parent.insertBefore(toggleOrbitsBtn, parent.children[1]);
toggleOrbits = function() {
    showOrbits = !showOrbits;
    // iterate through spacecrafts and hide path
    for (let i = 0; i < spacecrafts.length; i++) {
        let entity = spacecrafts[i];
        entity.path.show = showOrbits;
    }
    toggleOrbitsBtn.innerHTML = getshowHideBtnHtml(!showOrbits, 'Orbits', 'toggleOrbits');
}

let showNames = true;
let toggleNamesBtn = document.createElement('span');
toggleNamesBtn.innerHTML = getshowHideBtnHtml(!showNames, 'Names', 'toggleNames');
parent.insertBefore(toggleNamesBtn, parent.children[1]);
toggleNames = function() {
    showNames = !showNames;
    // iterate through spacecrafts and hide label
    for (let i = 0; i < spacecrafts.length; i++) {
        let entity = spacecrafts[i];
        entity.label.show = showNames;
    }
    toggleNamesBtn.innerHTML = getshowHideBtnHtml(!showNames, 'Names', 'toggleNames');
}
// load default layer picker
let baseLayerPickerViewModel = cesiumViewer.baseLayerPicker.viewModel;

// rarrange models (in picker)
let arrModels = baseLayerPickerViewModel.imageryProviderViewModels.slice();
let defaultModel = arrModels[6]; // ERSI world imagery
arrModels.splice(3,4) // remove mapbox models
arrModels.splice(0,0,defaultModel); // move defaultmodel to first one
arrModels = arrModels.filter((model) => model.category == "Other"); // filter out cesium ion
baseLayerPickerViewModel.imageryProviderViewModels = arrModels;

// set default model
baseLayerPickerViewModel.selectedImagery = defaultModel;

// global hander for load promise
spacecrafts = [];
czmlLoadPromise = function(url) {
    let promise = cesiumViewer.dataSources.add(Cesium.CzmlDataSource.load(url));
    promise.then(function(dataSource) {

        spacecrafts = dataSource.entities.values;
        for (let i = 0; i < spacecrafts.length; i++) {

            let entity = spacecrafts[i];
            entity.description = new Cesium.CallbackProperty(updateDescription.bind(undefined, entity), false);
        }
    })
}

// execute and load data
czmlLoadPromise('https://confluence.jaytaala.com/tle2czml');

cesiumViewer.camera.flyHome(0);

// update description to show when clicking on satellite.
function updateDescription(entity) {

    try {
        // Compute latitude, longitude (degrees) and altitude
        let cartographicPosition = Cesium.Cartographic.fromCartesian(entity.position.getValue(cesiumViewer.clock.currentTime));
        let latitude = Cesium.Math.toDegrees(cartographicPosition.latitude).toFixed(1);
        let longitude = Cesium.Math.toDegrees(cartographicPosition.longitude).toFixed(1);
        let altitude = (cartographicPosition.height / 1000).toFixed(1);

        // Modify description
        let description = '<table class="cesium-infoBox-defaultTable"><tbody>';
        description += '<tr><th>' + "Latitude" + '</th><td>' + latitude + '\xB0</td></tr>';
        description += '<tr><th>' + "Longitude" + '</th><td>' + longitude + '\xB0</td></tr>';
        description += '<tr><th>' + "Altitude" + '</th><td>' + altitude + ' km</td></tr>';
        description += '</tbody></table>';

        return description;
    } catch(err) {
        return "";
    }
}
</script>





Section


Column
width5%



Column


HTML
<div id="htmlblock-ancdf" align="center">
<h2 style="text-align:left">NASA's Charlie Duke and Gerry Griffin visit the team at UNSW Canberra Space</h2>


<p style="text-align:justify">
Former NASA astronaut <a href="https://en.wikipedia.org/wiki/Charles_Duke">Charlie Duke</a> and NASA Mission Control Flight Director <a href="https://en.wikipedia.org/wiki/Gerald_D._Griffin">Gerry Griffin</a> sat down with our team (in the ANCDF) and spoke about their roles and experiences as part of the Apollo Program.</p>


<p style="text-align:justify">
I was really impressed with how down-to-earth (pun?) they were.  Very approachable and very relaxed as they spoke frankly about the Apollo program, how the incredible was achieved, what obstacles they ran into (note: there were lots...), and what we can take away from their experiences.</p>

<p style="text-align:justify">
They then had a look around our facilities, and even signed our next satellite.  Many thanks to Charlie and Gerry for taking the time to speak with us.</p>

<p style="text-align:justify">
You can read more about Charlie and Gerry, and their visit to us <a href="https://www.unsw.adfa.edu.au/apollo-legends-tour-unsw-canberra-space-international-space-day-0">here</a>.
</p>

</div>



Column
width5%





Panel
bgColor#f8f8f8
borderWidth0
titleBGColor#efefef
borderStylesolid
titleApollo Astronaut Charlie Duke (left), myself (middle), and Apollo Flight Director Gerry Griffin (right)


HTML
<link  href="https://cdnjs.cloudflare.com/ajax/libs/viewerjs/1.3.2/viewer.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/viewerjs/1.3.2/viewer.min.js"></script>

<div class="dynamic-image-640">
<img src="https://confluence.jaytaala.com/download/attachments/6029493/20180504_ADFA_NASA_Charlie_Gerry_Jay.jpg"  id="viewerjs-image" width="100%" style="cursor:-moz-zoom-in; cursor:-webkit-zoom-in; cursor: zoom-in;">

<script>
const viewer = new Viewer(document.getElementById('viewerjs-image'), {
  zIndex:20000,
  navbar: false,
  toolbar: {
    zoomIn:1,
    zoomOut:1,
    oneToOne:1,
    reset:1,
    prev:0,
    play:0,
    next:0,
    rotateLeft:1,
    rotateRight:1,
    flipHorizontal:1,
    flipVertical:1,
  },
  viewed() {
  },
});
</script>



HTML
</div>





Section


Column
width5%



Column


HTML
<div id="htmlblock-ancdf" align="center">
<h2 style="text-align:left">Australian National Concurrent Design Facility (ANCDF)</h2>


<p style="text-align:justify">
I was the technical architect (IT, AV, software systems) for the Australian National Concurrent Design Facility (ANCDF) located at UNSW Canberra (ADFA).  The ANCDF is Australia's first Space Mission Planning Concurrent Design Facility.</p>


<p style="text-align:justify">
I designed and implemented the tech infrastructure for the facility which was officially opened on the 27th of November 2017 by ACT Chief Minister Andrew Barr.</p>


<p style="text-align:justify">
You can read more about the ANCDF <a href="https://newsroom.unsw.edu.au/news/science-tech/unsw-canberra-opens-australia%E2%80%99s-first-space-mission-design-facility">here</a>.
</p>

<p style="text-align:justify">
<i>Note: you can see me (very) briefly at 21 seconds at the back before I return to monitoring the systems I implemented (the day before) and controlling room displays via our network-based display system.</i></p>

</div>



Column
width5%





Panel
bgColor#f8f8f8
borderWidth0
titleBGColor#efefef
borderStylesolid
titleANCDF Opening by Andrew Barr, Chief Minister ACT


HTML
<div class="container-640">
    <div class="video-container">
         <iframe src="https://www.youtube.com/embed/j1wzMn8iH2s?rel=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>
     </div>
</div>




Section


Column
width5%



Column


HTML
<div id="htmlblock-launch" align="center">
<h2 style="text-align:left">UNSW Canberra Space's first CubeSat Satellite Launch</h2>


<p style="text-align:justify">
After scrubbing the two previous launches due to launch check anomalies and upper level winds, the Delta II rocket carrying UNSW Canberra Space's first satellite "Buccaneer" was launched from <a href="http://www.military.com/base-guide/vandenberg-air-force-base">Vandenberg Air Force Base</a> California on the 18th November 2017. </p>

</div>



Column
width5%





Panel
bgColor#f8f8f8
borderWidth0
titleBGColor#efefef
borderStylesolid
titleUNSW Canberra Space Satellite launch


HTML
<div class="container-640">
    <div class="video-container">
        <iframe src="https://www.youtube.com/embed/6Kri0NNUck0?rel=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>
    </div>
</div>





Previous Work

Some samples of previous work, particularly some of the simulation systems I've developed and worked on:



Panel
bgColor#f8f8f8
borderWidth0
titleBGColor#efefef
borderStylesolid
titleAgent-based Port Hedland Simulation


HTML
<div class="container-640">
    <div class="video-container">
        <iframe src="https://www.youtube-nocookie.com/embed/gmlY89kP2a8?rel=0&amp;showinfo=0" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>
    </div>
</div>

Developed in Java using Eclipse + Anylogic (my preferred IDEs for OO/Agent-based simulation) and uses own developed class libraries for the heavy computational aspects (like vessel and tidal scheduling) and other libraries (like JFreeChart) for some of the custom visualisations (see charting window at around 1:05 mins into video).



Panel
bgColor#f8f8f8
borderWidth0
titleBGColor#efefef
borderStylesolid
titleDiscrete-rate Sample station simulation


HTML
<div class="container-640">
    <div class="video-container">
        <iframe src="https://www.youtube-nocookie.com/embed/Az-rri-55YI?rel=0&amp;showinfo=0" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>
    </div>
</div>

Developed in Java using Eclipse + Anylogic.  The simulation approach is fairly hybrid here and uses discrete-rate methods heavily, along with OOP for the design and data structures.  NOTE: the above is an excerpt from an overview session I did and contains audio.




Panel
bgColor#f8f8f8
borderWidth0
titleBGColor#efefef
borderStylesolid
titleHay Point Visualisation of Simulated Port Operations


HTML
<div class="container-640">
    <div class="video-container">
        <iframe src="https://www.youtube-nocookie.com/embed/W6CVmOOXR_0?rel=0&amp;showinfo=0" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>
    </div>
</div>

Developed in Unity / C# using the Unity and Visual Studio IDEs.

Worked on this with the fantastic developers at The Simulation Group (I was employed there 2016-2017).



Panel
bgColor#f8f8f8
borderWidth0
titleBGColor#efefef
borderStylesolid
titleBlast-hole (Iron Ore) Sample lab simulation


HTML
<div class="container-640">
    <div class="video-container">
<iframe src="https://www.youtube-nocookie.com/embed/X3qxu9qKiS4?rel=0&amp;showinfo=0" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>
    </div>
</div>

I developed this simulation in  ExtendSim  some years ago.