All projects

Internship - Summer 2024

Symbotic

During the summer of 2024, I worked as a Software Engineering Intern on the Cognitive Tools team at Symbotic.

C#WPFReact.js
§ 01 - OVERVIEW

What is Symbotic?

Symbotic builds AI-powered robotic systems that automate warehouse operations for large retailers, including Walmart. Fleets of autonomous robots, called SymBots, drive around multi-level steel structures to store and retrieve cases.

The Cognitive Tools team builds the internal software that engineers and technicians use to develop, debug, and validate that system. This includes tools for replaying and visualizing robot logs, editing warehouse structure data, and commissioning and validating a warehouse before it goes live.

§ 02 - THE WORK

What I Did

I worked mostly on the Bot Playback Tool, a WPF desktop application that takes recorded robot logs and warehouse structure data and plays them back as a 2D or 3D simulation. This lets engineers see exactly what a bot was doing at any point in time. I also spent time in PrimaryData, which visualizes and edits warehouse site layouts, and the Commissioning Tool, a React application used to validate that a warehouse is set up correctly.

Over 50 work days, I closed 25 issues across 31 merge requests, adding around 10,500 lines and removing around 2,600.

Dataset and Plot Templates

Engineers spend a lot of time in the playback tool building the same graphs from robot log data over and over. I designed and then implemented a templating system that lets a graph configuration, meaning which properties to plot, how to modify them, and how they're grouped, be saved to disk and reloaded later, or shared as a one-click "Quick Graph."

I presented the initial design to the team and incorporated their feedback: parallelizable implementation steps, warnings for mismatched types and missing properties, and an option to load a template without immediately plotting it. Then I implemented it, which included JSON serialization with custom converters for the property tree, version-mismatch warnings, and a full unit test suite covering serialization, round-tripping, and the converters themselves. The templating system became the foundation for a set of built-in "Quick Graphs" covering common bot diagnostics like caster angles, lift force, and slot sensors.

3D Rendering of Multi-Level Maps

The Bot Playback Tool could only render flat, single-level warehouse maps in 3D. I added support for rendering multi-level structures, including ramps connecting levels, which the existing code had no support for since it only knew how to draw flat planes. To orient a ramp correctly, I took the cross product of the ramp's normal vector and the z-axis to get the axis of rotation, then used the dot product between the two vectors to find the angle between them. I combined the two into a quaternion to build the rotation transform. I also switched the level-selection UI from single-select to multi-select so engineers could view any combination of levels at once.

Memory Leak Investigation

The playback tool would eventually crash with an out-of-memory error if an engineer plotted enough graphs in one session. I traced the leak to graph objects from the charting library that were going unrooted but never being garbage collected. Digging into how the .NET garbage collector handles the Large Object Heap (LOH), I found the large graph objects were ending up there and fragmenting it over time. I tried forcing LOH compaction and using MemoryFailPoint to pre-emptively block new graphs when memory was low before landing on the fix that actually held up: explicitly cleaning up chart references and event handlers when a graph window closes, so the objects can be collected normally.

Other Issues

Here are a few of the other issues I worked on:

  • Added a command-line argument to the Ion log parser to trim a root path when generating output file paths, with unit tests.
  • Fixed the Commissioning Tool's playlist editor so pagination no longer closed the modal you were paging through.
  • Cached loaded 3D models in the playback tool so re-rendering a scene didn't reload every model from disk each time.
  • Restored point-value tooltips on graph hover using a trackball component, replacing a broken crosshair-only view.
  • Compiled and fixed a native dependency (MappingShared.dll) after tracking down a crash to a library that had been updated in one repo but never recompiled into the shared package.
  • Rebuilt part of a physical warehouse test deck's map data, including taking manual measurements on-site to fill in missing values.
§ 03 - REFLECTION

Take Aways

Technically, I got a lot more comfortable with C# and WPF, and picked up practical experience with dependency injection, event-driven UI programming, and how .NET's garbage collector actually manages memory under the hood. I had only read about that in the abstract before this internship.

Just as valuable were the non-technical lessons: working inside an established Agile/Scrum team, writing designs and taking feedback before implementing, and collaborating across teams. Several of my issues depended on input from the Bot Controls team or on physically visiting a test deck to get measurements right. I also got to see the product in the field, touring a live Symbotic installation at a Walmart site in Raymond, NH.

§ 04 - SOURCE

Where to view

Symbotic's codebase is proprietary, so I'm not able to link to it here. If you'd like to hear more about the work in detail, feel free to reach out.