About Me

I am a computer programmer passionate about Graphics, Physically-Based Simulation and Machine Learning, a bass player since 1983 afflicted with a 30+ year fetish for too-many-strings; a collector of Pixar teapots and Carrera slot-cars; a husband, father and crazy cat-dude. I live in Roswell, Georgia, I've been married since 2001, I have 3 wonderful minions kids (my daughter was born in 2007 and my twin boys in 2011) and, currently, 7 pampered, indoor cats.

Recent Professional Accomplishments

Meta AI Research

In March of 2020 I joined the Habitat team on the first of 2 two year contracts as a Research Engineer. While my title was Research Engineer, most of my job description was focused on C++ and Python development in the Habitat-Sim platform, reworking and expanding its functionality, flexibility, stability, tooling and dataset support to make it a more complete, accurate and excellent simulation platform to be used for Embodied AI agent training. Basically Habitat-Sim is a game engine for robots to learn how to navigate, find things and generally help people in their homes. The 250 approved and merged Pull Requests I authored during this first contract can be seen here

Among my proudest accomplishments during this first contract is the design and implementation of a hierarchical Configuration system that can hold any number of values of various types in a single string-keyed map, along with any number of string-keyed Configurations, and a Managed Container class template that provides a pseudo-database/map-like construct withCRUD-like access to collections of similar Managed Objects, which can be Configurations or other constructs.

With these tools I made the JSON-based Metadata layout definitions that provide the recipe for implementing all assets and scenes used by all Habitat Scene Datasets, and the commensurate C++ Configuration-based Attributes and their owning Managed Containers, all collected and managed in the Metadata subsystem that is used to manage and serve the metadata to users in Python via Pybind11 bindings for the attributes and managers as well as internal C++ consumers via the MetadataMediator directly, which owns and manages the metadata for all loaded scene datasets. This facilitated the complete rewrite of the scene load procedure used to instantiate all assets and scenes in the simulator engine to a unified single pathway. The ManagedObject/ManagedContainer tools were also very useful for implementing a weak-pointer-based wrapper interface system to the internal representations of the rigid and articulated objects to provide safe access to these constructs, again either for users in Python via bindings of the Physics Object wrappers and the Managers who manage them, as well as internally through direct access to the owning managers. I also rebuilt vertex-based and added texture-based support of semantic segmentation, implemented Catmull-Rom-based trajectory tube mesh synthesis based on a point list, and other various fun physics and graphics related tasks.

On the dataset authoring/management side, I was responsible for aggregating, editing and finalizing the ReplicaCAD, ReplicaCAD Baked Lighting,(which included building Python and Blender scripts to deconstruct the original authored scenes to their constituent assets, saving all the assets in appropriate formats, and subsequently rebuilding the scenes in Habitat Scene Dataset format), along with the HM3D and HM3D-Semantics datasets.

My first contract at Meta ended at the end of March 2022, but Meta accelerated the usually required 1-year down time to get me back in February of 2023, which was very flattering. The 111+ approved and merged Pull Requests I authored for this second contract can be seen here. During this second contract I was very excited to be able to rewrite Habitat-Sim's material handling pipeline, along with the PBR (PRs 1 2 3 Main) and IBL shaders it uses to render observations, all from scratch. I implemented all KHR material extensions support in the PBR shader other than those that are transparency-based, which would be somewhat difficult in Habitat since it manages assets in a scene graph. Another fun graphics implementation was adding HBAO+ support based on the NVidia reference implementation. I also added semantic annotation region support 1 2 (i.e. room level annotations).

On a purely engineering front, I also reworked the system build mechanism to merge most of the various namespaces/libraries to a single library to obviate long-standing circular linkage issues that had plagued Habitat-Sim since the beginning, removed the redundant Eigen math library dependency, and reworked many of the asset creation pathways to be more efficient and concise. I also greatly expanded the python-based accessibility and functionality tied to the C++ simulator's internals, which facilitated building multiple python-based editing tools and stand-alone applications that enable the editing and construction of viable scenes using existing dataset assets in the Habitat-Sim engine itself. With regard to dataset work, one of the big projects for this contract was adding articulated furnishing support and assets to the HSSD dataset, and one of my projects on this front was going through all of the 200+ scenes to find those that fit the desired criteria (i.e. having the necessary annotated rooms) and making sure that the articulated assets in these rooms were properly oriented to work as expected. This often involved completely rebuilding a kitchen, for instance, if assets that fit (due to artist tricks such as scaling) when they were rigid bodies now did not fit after their conversion to articulated objects. Much of the tooling for scene editing was originally built to facilitate this effort.

Other Recent Work

In November of 2023 I did a most enjoyable contract for a small consulting firm named VisionWrights where I helped them implement a solution for proposing solar panel layouts for roofs based on satellite or images of the roof in question. They had a good design for a solution but it wasn't working how they thought it should, and brought me in to help them out. The day before I was to being, I read the paper that was the basis for their chosen solution, Pix2Pix, and since for me reading a paper is never sufficient to truly understand what is going on, I implemented the Pix2Pix network in PyTorch that day. Turns out their solution was reasonable, but they were improperly conditioning their input, and their model had a few other minor bugs that were ruining their results. Using the model I build we implemented an end-to-end solution that worked surprisingly well at inferring roof orientation and geometry so that reasonable proposals for panel placement, type and orientation could be made, with the panels procedurally placed on the roof. This was a real change from the mostly engineering work I'd been doing for the past few years at Meta AI, and it was great fun - a throwback to my various research projects at Tech, where I'd have to implement something from a paper rapidly and then build on it to work on some active research question.

From October 2013 to November 2016 I also worked full time as a Data Scientist at IgnitionOne, an independent online marketing company.

Back to School

I graduated from Georgia Tech in 1992, and although my first degree was in Electrical Engineering, professionally I've always been a programmer. Through the 90's I worked in client-server development (One of the systems I wrote was a code generator in Pascal that took screen descriptions from AS400 COBOL and generated early Windows 3.1/95 UI code) and telecom (writing IVR/VRU scripts, among many other things). In the 2000's I worked as a contractor/consultant on client-server and web-based business applications, mostly in C# or various early active webpage technologies, using various Microsoft platforms such as ASP and ASP.NET, but not always. Pretty much whatever language or system was required, I would figure it out and work in it.

Still, I grew tired of and disinterested in the nature of the positions it seemed I was being limited to (business application development) and felt that, despite being self-taught since the early 80s (or perhaps because of this), I needed to "legitimize" my knowledge to expand my career opportunities in more interesting directions, so in 2010, at 42 years of age, I decided to go back to school and re-enrolled at Tech as a full-time Undergraduate CS student.

Although Tech gave me credit for the classes I took for my first degree (a mixed blessing since I was a mediocre student the first time around) I decided to retake all my undergraduate Calculus classes. After all, it had been 18 years since I had been in a class room, and the most complex math I had to perform since then was calculating a tip. Surprisingly enough, I discovered that I loved math, and was surprisingly good at it too, much better than the first time around. Good enough that I felt I had to find a way to fold math into my career and my life, somehow. And then, along came graphics, which is just Linear Algebra and Trigonometry visualized as digital art, and then physically-based simulation - discrete approximations of Differential Calculus used to animate those graphics in a physically plausible way, and I found the loves of my intellectual life.

Academically, for me at least, the 2nd time was the charm. As both an Undergraduate and a Master's student, I earned a 4.0 GPA and TA'ed 9 different Computer Science classes (6 as undergrad, 3 as GTA). In April 2015 I was awarded both the Outstanding Graduate Teaching Assistant and The Donald V. Jackson Fellowship by the Georgia Tech College of Computing and in December 2016 I received my Master's degree from Georgia Institute of Technology with a specialization in Graphics and Physically-based Simulation.

Georgia Tech Computer Science Classes I've TA'ed as an undergrad and graduate student

Class Instructor Date
CS 1050 Introduction to Discrete Math for CS Monica Sweat Spring 2011
CS 1331 Introduction to Object-Oriented Programming Olufisayo Omojokun Summer 2011
CS 2110 Computing Organization and Programming Bill Leahy and Tom Conti Fall 2011
CS 2200 Computer Systems and Networks Bill Leahy Summer 2012
CS 3451 Computer Graphics Jarek Rossignac Fall 2012
CS 3600 Introduction to Artificial Intelligence Andrea Thomaz Fall 2013
CS 4496 Computer Animation Karen Liu Spring 2015 (As Graduate TA)
CS 6491 Computer Graphics (Graduate) Jarek Rossignac Fall 2015 (As Graduate TA)
CS 4496 Computer Animation Karen Liu Spring 2016 (As Graduate TA)
CS 7496 Graduate Computer Animation Karen Liu Fall 2016 (As Graduate TA)

PhD Adventure

In Fall of 2017 I started pursuing a PhD with Professor Karen Liu, focusing on learning an RL control policy for a biped we called ANA (Agent Needing Assistance) to get up with help from another agent (via TRPO), which took the form of a randomly synthesized force vector applied to one of ANA's hands. The policy's state/observation space consisted of this force vector along with the biped's proprioceptive joint state (q, q-dot), and the derived action the policy provided was joint torques for control. ANA's policy was trained along with a value function "baseline" estimator, used for variance reduction, which took a given state and estimated the "value" of that state. Once the policy was trained, with ANA being able to get up with assistance, the value function estimator was then used as part of an optimization process, where for any given (q, q-dot), the assistive force that maximized the value of the state was found, via back propagation, which in turn was fed to an optimization process to derive the appropriate control torques for the assisting robot to provide this force subject to various constraints such as max joint torque allowed. Interesting results can be found here.

To fund my PhD, I was head TA for the Online Master's Degree program's version of CS 6505/6515, the Graduate Algorithms class, where I was solely in charge of the various programming assignments given to the students to implement complex and interesting algorithms and solvers (PageRank, Bloom Filter, Knapsack, Kruskals), which necessitated me designing the assignment requirements and developing the python framework code provided to the students (and full ground truth implementations used to grade) along with a multi-process autograder. I was also solely responsible for grading the 300-400 submissions for each assignment, which consisted of the code and also a 2 page report. Lastly, I also recorded YouTube instructional/"office hours" videos to assist with the projects.

Unfortunately, I lost my advisor to Stanford in the Spring of 2019, (she has a cool lab over there, check it out) and I had a very hard time finding a suitable replacement. As I was trying, the following Fall, I got very sick, (pneumonia was the least of my diagnoses). Apparently spending nearly a decade working 18-20 hour days 6-7 days a week without any exercise and eating like a poor grad student was the recipe for health disaster for me. Who knew? Coupled with trying to find a new advisor, which I absolutely had to do, and get both a new research publication out from scratch and take my quals before the end of Fall semester, which my acting advisor was pressuring me to do, and it all just became too much. I cannot remember a time in my life when I was even close to how sick as I was from the end of November 2019 to the beginning of January 2020.

Needless to say, this forced me to either flat-out leave the program or at least take a Leave of Absence, which I did at the end of 2019. Then Covid-19 happened, and then my wonderful Contingent Worker Research Engineering job with Habitat came along, and that was that, as far as the PhD goes. I still miss it - I truly loved working with Karen (she advised me on various research projects for almost 8 years, nearly every semester) and I have many awesome programs and projects to show for it, not to mention acquiring the skills that made working on Habitat possible, but I don't think I'll ever be able to resume it, unfortunately.