ASTRAL
Arcane System for Tabletop Roleplaying from Any Location
Jan 2020 – Mar 2020
Even before the COVID-19 pandemic, I was interested in ways to improve the telepresence/video-conferencing experience. In particular, I wanted to empower remote D&D players participating in a local session. To do so, I made ASTRAL. From a web app, video-conferencing individuals can move the camera they're seeing through, allowing them to control where it looks. ASTRAL is a full-stack project: an HTML/CSS/JavaScript front end sends HTTP requests to a NodeJS webserver and a Python handler which sends serial commands to the camera.
ASTRAL being used in a virtual D&D session.
The Front End
The ASTRAL webapp is hosted on GitHub Pages at https://astral.duerst.me/
The GitHub repo for it is https://github.com/paduerst/astral
The webapp sends a GET request to a randomly-generated Cloudflare URL that is given to the webapp user by the person running the ASTRAL back end. The URL query includes the requested command name ("pan", "tilt", etc) and the relevant value(s) for executing that command, such as the number of degrees to pan or tilt by.
The Back End
The GitHub repo for the back end is https://github.com/paduerst/astral-backend
I run the back end on an Intel NUC 6 (NUC6CAYH) which is attached to the back of my living-room TV by mounting hardware I machined: a laser-cut acrylic sheet and a CNC-milled Delrin plastic plank.
The back end uses a free Cloudflare service (trycloudflare.com) to redirect HTML requests sent to a unique subdomain. A new subdomain is generated every time the back end starts up. This is a limitation of the free version of this Cloudflare service, but it helps to enforce security, since the back end is shut down whenever it's not actively being used.
Those HTML requests are redirected to a NodeJS webserver which is on localhost. The NodeJS webserver parses the URL query into the command and its values, which are passed to a Python script that handles the serial communication with the camera.
The serial communication library is an expansion of python-visca by Sciguymjm. I ported it to Python 3 and adjusted the available commands to match the model of camera used in this project.
The Camera
The camera used in this project is a Sony EVI-D30. This camera is over 20 years old, but its output resolution is an impressive 720p. Most video-call platforms limit resolution to 720p even when someone has a higher resolution camera, so the image from this camera is surprisingly good.
I've had this camera since 2014 when I saved it from being thrown out. This is actually the second project I've used the camera in! The first was in 2016 when I incorporated it into the set as Technical Director of a sci-fi adaptation of The Tempest.
The physical "back end" of ASTRAL.
ASTRAL being used during Passover 2020.
< Back to my Engineering Portfolio
Photos on this page were taken by me or my partner, Tal S.