What project did I work on?

I worked on LunaNet, a project to facilitate lunar networking. The main goal of LunaNet is to create a communications architecture to provide networking, positioning, and navigation services to the moon.

The goal of our project was to demonstrate that we could perform a custody transfer – a handoff of data – between a satellite and a ground node. This custody transfer would be an implementation of the bundle protocol, an experimental disruption tolerant networking (DTN) protocol designed for unstable communication networks. The DTN protocol is superior to the terrestrial internet protocol in areas with intermittent connectivity because of its store-and-forward technique. The store-and-forward framework ensures subnets can store bundles for long periods to minimize data loss. These bundles contain packets adherent to the Consultative Committee for Space Data Systems packet telemetry service specification. This specification is an agreement among the space agencies of the world to define how information sent through space should be formatted.

What was my role?

My role was to build a Core Flight System (cFS) app to send commands to the Iridium modem over serial port. cFS is a framework to implement flight software solutions. The Iridium modem communicates with the satellite by transmitting data to it and receiving data from it. I could test the cFS app using Ball Aerospace COSMOS, a suite of applications that can be used to test embedded systems. NASA uses COSMOS to test its satellite software. COSMOS implements a client server architecture which my internship mentor explained to me as a publish / subscribe model; the Command Telemetry server sends commands and receives status data from its flight software targets. In this case, the software target was my cFS app.

To achieve this goal, I first needed to learn about AT commands. AT commands are instructions used to control a modem. Using AT commands over a serial connection, I could understand if the modem was configured properly and gauge its GPS location. I wrote a C script to open the serial connection and write the AT commands that I documented in a markdown file. Afterwards, I received and parsed the input data which I passed back to the ground node as a bundle.

Next, I used a python templating tool to spin up a cFS application and integrated my C script with this application. I tested the cFS application in COSMOS, sending it no-op commands and making sure they registered in the Command Telemetry server to ensure functionality.

Because the ground node was operating on the TCP internet protocol and the satellite on UDP internet protocol, I created a Python app that served as a bridge between these two ports. This bridge facilitated communication between the ground and satellite nodes. It also implemented the store-and-forward functionality I mentioned earlier, so that we could test our systems ability to securely provide the custody transfer in an unstable environment.

How did I grow as a result of my internship?

I learned how to learn new things. In the first few weeks of my internship, I found myself knee-deep in documentation, looking at acronyms that made no sense. I went through and tried to explain every part of the project to myself in my own words. This experience was invaluable.

I learned how to resolve issues myself. In the beginning, I had to download NASA's OpenSatKit, and this process required dependencies that I didn't have. I had to search the Github issue tracker and stack overflow, but I downloaded what I needed and successfully installed the package.

I learned how to test software iteratively. When I was given a specification for a project, I immediately wanted to swing for the fences; build everything and then see if it worked. This approach lead to much frustration. I stripped down my python app and focused on achieving one working feature at a time. Not only was this a better development strategy, but I also felt like I was making more progress.

What lessons will I take to my next internship?

Here is the advice I would give myself before any internship opportunity.

  • In the beginning, set up active touchpoints with my mentor on a recurring schedule.
  • At the end of every meeting, set reasonable and real goals for the next one.
  • Understand the thesis of every task before undertaking it. This process involves asking questions often and asking for clarification constantly. Don't be afraid to sound wrong.
  • Most importantly, try to explain the ideas I'm working with to myself first and later to others. These explanations will reveal areas of growth and areas where there is the potential for more growth.