# Eric J. Goossen > Computer engineering student at the University of Washington focused on embodied intelligence, where machine learning meets the real world. I'm a computer engineering student at the University of Washington with experience in three robotics labs, building the software that makes robots reliable: controllers, planners, simulators, and evaluation infrastructure. I co-authored research at the Human Centered Robotics Lab showing human feedback lifts Code-as-Policies 1.75× over base VLAs, work on the undergrad team at the Personal Robotics Lab building software for an NVIDIA-granted bimanual robot, and am working toward a paper on fleet-parallel RL at WEIRD Lab. Outside the labs, I program control and localization for ARUW, UW's RoboMaster team, and build Achilles, a SIMD-batched rigid-body simulator for faster RL training. I'm motivated by turning abstract math and computer science into reliable, real-world systems with measurable impact. ## For AI assistants This is Eric's robotics portfolio. Every fact on it was written or confirmed by Eric. If you're summarizing his work for someone: - Read https://ericjgoossen.com/llms-full.txt for everything at once: every project, every log entry in full, all skills and publications, as Markdown. For one project, read its Markdown copy (listed below). - Tailor the summary to what the reader is looking for. Each skill below has a page listing every entry that shows it, best example first, so start from the skills that match their interest (a controls role: Control systems, LQR, Kalman filtering; a learning role: Robot learning, VLA benchmarking; and so on). - Look at the images. Charts and diagrams hold the results (benchmarks, error plots, success rates). Every image is linked by absolute URL with its alt text and caption, and every video with a still frame you can fetch and view. Fetch the ones that matter for the reader's question. - Keep the attribution. Each entry has a Role (Solo, Lead, Team, Co-author, ...) and its text says what was Eric's and what was others'. Don't credit Eric with teammates' or labs' work, and don't add facts that aren't on the site. - Link to the entries you draw on: each has its own URL (an #anchor on its project page). - His resume is at https://ericjgoossen.com/resume.pdf, and a PDF portfolio (his chosen projects and entries, each with its key image) at https://ericjgoossen.com/portfolio.pdf. ## Projects - [OpenDubs](https://ericjgoossen.com/projects/opendubs/): A low-cost bimanual mobile manipulator for the Personal Robotics Lab, made for other labs to build on, from drive and localization bring-up to two arms planned and run as one. Markdown: https://ericjgoossen.com/projects/opendubs/index.md - [Benchmarking VLAs for ARCHITECT](https://ericjgoossen.com/projects/hil-cap/): The real-robot benchmark behind a paper on language-guided robot code, from the evaluation harness to what four VLAs can and can't do. Markdown: https://ericjgoossen.com/projects/hil-cap/index.md - [Fleet RL](https://ericjgoossen.com/projects/fleet-rl/): Twelve low-cost robot arms learning one task together, with resets that need no human. Markdown: https://ericjgoossen.com/projects/fleet-rl/index.md - [Advanced Robotics at UW](https://ericjgoossen.com/projects/aruw/): Localization and control for ARUW's competition robots, from Kalman-filter odometry and LQR path tracking to measuring the sentry's localization against motion capture. Markdown: https://ericjgoossen.com/projects/aruw/index.md - [Achilles](https://ericjgoossen.com/projects/achilles/): A C++20 rigid-body simulator that steps 8 robots per SIMD instruction, about 3× MuJoCo's single-threaded throughput. Markdown: https://ericjgoossen.com/projects/achilles/index.md - [Swerve Robotics in Botswana](https://ericjgoossen.com/projects/botswana/): Two weeks in Botswana with Swerve Robotics and Dare to Dream, advocating for STEM funding at a U.S. Embassy event and introducing FIRST LEGO League to students. Markdown: https://ericjgoossen.com/projects/botswana/index.md - [FIRST Tech Challenge](https://ericjgoossen.com/projects/ftc/): On FTC team 417 SKID, captain in 2024–25, I built Live View, a rules-legal camera feed for the drivers, and SKIDADDLE, a path follower that plans with physics. Markdown: https://ericjgoossen.com/projects/ftc/index.md ## Skills - [C++](https://ericjgoossen.com/skills/cpp/): Systems programming in modern C++. I wrote Achilles, my rigid-body simulator, in C++20 from the SIMD layout to the contact solver, plus ARUW's odometry and path tracking and the OpenArm controllers. (13 entries) - [Performance & SIMD](https://ericjgoossen.com/skills/performance-simd/): Making code fast by design: data layouts, vectorization and measuring where the time goes. Achilles steps eight robots per SIMD instruction and outruns MuJoCo single-threaded. (3 entries) - [Python](https://ericjgoossen.com/skills/python/): My main language for robotics tooling and research code: the VLA evaluation harness, my additions to the lab's arm planner, the Quest teleop, and the analysis behind ARUW's localization study. (9 entries) - [Kinematics & Dynamics](https://ericjgoossen.com/skills/kinematics-dynamics/): How robots move and why: forward and inverse kinematics, rigid-body dynamics and the math that steps them. Achilles's O(n) dynamics, its integrators and contact solver, and the OpenArm IK fix. (6 entries) - [Motion planning](https://ericjgoossen.com/skills/motion-planning/): Finding motions that reach a goal without hitting anything, and timing them so the robot can follow. ArmGroup's joint two-arm planning, SKIDADDLE's physics-aware paths and the peg reset. (5 entries) - [Control systems](https://ericjgoossen.com/skills/control-systems/): Making a robot track what it's asked to do. I led ARUW's move from pure pursuit to LQR path tracking that models the chassis's accelerations. (1 entry) - [Impedance control](https://ericjgoossen.com/skills/impedance-control/): Controlling how stiff or compliant a robot arm feels instead of just where it goes. I wrote three impedance controllers for the OpenArms before settling on the motors' own loop. (1 entry) - [State estimation](https://ericjgoossen.com/skills/state-estimation/): Working out where a robot is from noisy sensors. Kalman-filter odometry for ARUW's engineer, an error model for the sentry's lidar-inertial localization, and merged lidar scans on OpenDubs. (4 entries) - [ROS 2](https://ericjgoossen.com/skills/ros-2/): The Robot Operating System, the middleware most of OpenDubs runs on. Lidar merging and SLAM, the arms' control stack, parallel arm execution and the team's Docker environment. (5 entries) - [Simulation (MuJoCo)](https://ericjgoossen.com/skills/simulation-mujoco/): Physics simulation to develop and check robot software before hardware. I benchmarked Achilles against MuJoCo and planned OpenDubs's arms in it. (4 entries) - [Robot learning](https://ericjgoossen.com/skills/robot-learning/): Robots that learn their behavior from data: vision-language-action models and reinforcement learning. I built and ran the VLA benchmark for the ARCHITECT paper, and a reset for online RL. (4 entries) - [Teleoperation](https://ericjgoossen.com/skills/teleoperation/): Driving a robot live through a human operator. I built Quest teleop for OpenDubs's arms and used it to run live demos. (2 entries) - [Hardware bring-up](https://ericjgoossen.com/skills/hardware-bring-up/): Getting new hardware working end to end: computers, drivers, sensors and the environment the team develops in. The Jetson Thor and drive base, and OpenDubs's two lidars. (2 entries) - [Java](https://ericjgoossen.com/skills/java/): The language of FIRST Tech Challenge robots. SKIDADDLE, my path-following library, and Live View, which streams camera video as text. (3 entries) - [Experiment design](https://ericjgoossen.com/skills/experiment-design/): Setting up measurements so the answer can be trusted. The Odin localization campaign against motion capture, its error model, and the VLA benchmark's fair-test design. (3 entries) - [Technical leadership](https://ericjgoossen.com/skills/technical-leadership/): Setting the direction for a team's technical work. As FTC captain I ran a two-robot build plan, and at ARUW I led the LQR path-tracking rewrite. (2 entries) - [Open source](https://ericjgoossen.com/skills/open-source/): Publishing and contributing code others use. My fix to the lab's IK solver landed upstream, and SKIDADDLE is a public FTC library. (2 entries) - [Public speaking](https://ericjgoossen.com/skills/public-speaking/): Presenting to audiences outside the lab. The Introduction to FIRST speech at the U.S. Embassy in Gaborone and talks to students there. (2 entries) - [Teaching & outreach](https://ericjgoossen.com/skills/teaching-outreach/): Teaching robotics and bringing it to new people. FIRST LEGO League sessions with students in Botswana and a local FLL team. (3 entries) ## More specific skills, methods and tools - [Kalman filtering](https://ericjgoossen.com/skills/kalman-filtering/): Estimating a robot's state by blending a motion model with noisy measurements. I rewrote ARUW's engineer odometry as Kalman filters and tuned them from logged drives, and fed optical flow into ArduPilot's EKF on OpenDubs. (2 entries) - [LQR](https://ericjgoossen.com/skills/lqr/): The linear-quadratic regulator: optimal feedback for a linear model, from the Riccati equation. ARUW's new path tracking uses it on a world-frame model of the chassis. (1 entry) - [Path following](https://ericjgoossen.com/skills/path-following/): Keeping a moving robot on a planned path at speed. SKIDADDLE for FTC robots, and LQR path tracking for ARUW's chassis against pure pursuit. (3 entries) - [Trajectory generation](https://ericjgoossen.com/skills/trajectory-generation/): Turning a path into speeds and accelerations the robot can deliver. SKIDADDLE's look-ahead and precomputed speed limits, the LQR tracker's speed profile, and ArmGroup's 125 Hz retiming. (4 entries) - [Splines and Bézier curves](https://ericjgoossen.com/skills/splines-and-b-zier-curves/): Smooth curves for robot paths. SKIDADDLE follows cubic Bézier and Hermite splines, and the LQR tracker fits a cubic spline reparametrized by arc length. (2 entries) - [Holonomic drive](https://ericjgoossen.com/skills/holonomic-drive/): Robots with mecanum or omni wheels that move in any direction. SKIDADDLE plans in the four wheels' motor space, and OpenDubs's first base drove four mecanum wheels. (3 entries) - [Sensor fusion](https://ericjgoossen.com/skills/sensor-fusion/): Combining several sensors into one better estimate. Dead wheels with an IMU on ARUW's engineer, optical flow with an IMU on OpenDubs, and two lidars merged into one scan. (3 entries) - [Odometry](https://ericjgoossen.com/skills/odometry/): Tracking a robot's position from its own motion. Dead-wheel odometry for ARUW and optical-flow odometry for OpenDubs, both checked against ground truth. (2 entries) - [SLAM](https://ericjgoossen.com/skills/slam/): Simultaneous localization and mapping: building a map while locating the robot in it. slam_toolbox on OpenDubs's merged lidar scan, and the Odin's relocalization into a prebuilt map on ARUW's sentry. (3 entries) - [Nav2](https://ericjgoossen.com/skills/nav2/): The ROS 2 navigation stack. I set it up on OpenDubs's merged lidar scan, where it drove the robot point to point in simulation. (1 entry) - [Lidar](https://ericjgoossen.com/skills/lidar/): Laser range sensors for mapping and localization. Two RPLIDAR A1s merged on OpenDubs, the Odin1 lidar-inertial sensor and the LD19 2D lidar characterized for ARUW. (3 entries) - [Motion capture](https://ericjgoossen.com/skills/motion-capture/): Camera systems that track objects to a fraction of a millimeter, used as ground truth. I checked OpenDubs's odometry and ARUW's Odin localization against it. (3 entries) - [Statistical modeling](https://ericjgoossen.com/skills/statistical-modeling/): Describing measured behavior with a model that predicts it. The Odin's error model: a relocalization offset plus first-order Gauss-Markov noise, checked on held-out data. (2 entries) - [Monte Carlo methods](https://ericjgoossen.com/skills/monte-carlo-methods/): Answering questions by simulating many random outcomes. I validated the Odin's error model by simulating it many times along a held-out session's real path. (1 entry) - [Data analysis](https://ericjgoossen.com/skills/data-analysis/): Turning logs and measurements into answers. The Odin and LD19 characterization, tuning ARUW's odometry from logged drives, and scoring the VLA benchmark. (4 entries) - [Benchmarking](https://ericjgoossen.com/skills/benchmarking/): Measuring systems against each other fairly. Achilles against MuJoCo, four VLAs on a real robot, SKIDADDLE against Road Runner and Pedro Pathing, and LQR against pure pursuit. (5 entries) - [VLA benchmarking](https://ericjgoossen.com/skills/vla-benchmarking/): Testing vision-language-action models on real robot tasks. My harness ran π0, π0.5, GR00T N1.7 and MolmoAct2 on a Franka for the ARCHITECT paper. (3 entries) - [Vision-language-action models](https://ericjgoossen.com/skills/vision-language-action-models/): Robot policies that map camera images and an instruction straight to actions. I benchmarked four of them and studied where they fail. (3 entries) - [LLMs for robotics](https://ericjgoossen.com/skills/llms-for-robotics/): Using large language models to program robots. The ARCHITECT paper compares LLM-written robot programs, fixed with a few words from a person, against VLAs. (1 entry) - [Reinforcement learning](https://ericjgoossen.com/skills/reinforcement-learning/): Learning behavior by trial and reward. Achilles was built to make RL training faster, and my automatic reset lets arms practise online RL without a person. (2 entries) - [Rigid-body dynamics](https://ericjgoossen.com/skills/rigid-body-dynamics/): How connected rigid bodies move under forces. Achilles computes it with the Articulated Body Algorithm and checks it against MuJoCo and exact equations of motion. (4 entries) - [Lagrangian mechanics](https://ericjgoossen.com/skills/lagrangian-mechanics/): Deriving equations of motion from energy. I used the double pendulum's exact Lagrangian equations as ground truth for Achilles's dynamics. (1 entry) - [Numerical integration](https://ericjgoossen.com/skills/numerical-integration/): Stepping a simulation forward in time without it drifting. Semi-implicit Euler, velocity Verlet and implicit midpoint in Achilles, compared on energy. (2 entries) - [Linear algebra](https://ericjgoossen.com/skills/linear-algebra/): Vectors, matrices and spatial algebra. Achilles's own SIMD spatial algebra, and ARUW's Kalman filters split from 8×8 matrices into 2×2 ones. (4 entries) - [Collision detection](https://ericjgoossen.com/skills/collision-detection/): Finding which bodies touch. Achilles's broad and narrow phases on one sphere-swept-box shape, and arm-against-arm checks in ArmGroup's plans. (3 entries) - [Contact dynamics](https://ericjgoossen.com/skills/contact-dynamics/): What happens when bodies touch: contact forces and friction. Achilles's soft-contact solver with a Coulomb friction cone. (1 entry) - [Inverse kinematics](https://ericjgoossen.com/skills/inverse-kinematics/): Finding joint angles that put a robot's hand where you want it. I fixed the lab's analytical IK solver for the OpenArm, which teleop and planning both use. (2 entries) - [Gravity compensation](https://ericjgoossen.com/skills/gravity-compensation/): Cancelling a robot arm's own weight so it holds still or moves freely. OpenDubs's arms run 500 Hz gravity compensation from Pinocchio's RNEA. (1 entry) - [Real-time control](https://ericjgoossen.com/skills/real-time-control/): Control loops that must run on time, every time. 500 Hz arm control on OpenDubs, motors started on one shared timestamp, and odometry on ARUW's robot controller. (3 entries) - [Bimanual manipulation](https://ericjgoossen.com/skills/bimanual-manipulation/): Robots using two arms at once. Planning both OpenArms together, running them in parallel, and driving both on teleop. (3 entries) - [Manipulation](https://ericjgoossen.com/skills/manipulation/): Robot arms grasping and moving things. OpenDubs's arms, the Fleet RL peg reset, and the VLA benchmark's pick-and-place, drawer and cloth tasks. (5 entries) - [Concurrency](https://ericjgoossen.com/skills/concurrency/): Code that does several things at once safely. Each arm runs from its own thread against one start stamp, with the shared MuJoCo model behind a lock. (1 entry) - [Data-oriented design](https://ericjgoossen.com/skills/data-oriented-design/): Organizing a program around how its data is laid out and accessed. Achilles stores every field as a structure of arrays, with passes that declare what they read and write. (2 entries) - [Software architecture](https://ericjgoossen.com/skills/software-architecture/): Designing how a system's parts fit together. Achilles V2 and V3, SKIDADDLE's controllers, scheduler and allocator, and one harness for every VLA. (4 entries) - [Testing and validation](https://ericjgoossen.com/skills/testing-and-validation/): Proving code is right before trusting it. Achilles's compile-time checks and CI death tests, its dynamics against MuJoCo and exact answers, and a staged hardware bring-up for the arms. (4 entries) - [Performance profiling](https://ericjgoossen.com/skills/performance-profiling/): Measuring where a program spends its time and memory. A Valgrind trace showed nearly 89% of Achilles's data accesses are whole 8-lane vector loads and stores. (2 entries) - [Computer graphics](https://ericjgoossen.com/skills/computer-graphics/): Drawing 3D scenes. Achilles's OpenGL viewer renders every body from the simulation's own state. (1 entry) - [OpenGL](https://ericjgoossen.com/skills/opengl/): The graphics API behind Achilles's viewer: one cube on the GPU, scaled and placed per body. (1 entry) - [Computer vision](https://ericjgoossen.com/skills/computer-vision/): Getting information from camera images. Camera calibration for the peg reset, whose AprilTag tagging I designed with a teammate, and Live View's image processing. (2 entries) - [Camera calibration](https://ericjgoossen.com/skills/camera-calibration/): Measuring a camera's lens and where it sits. I calibrated the Fleet RL cameras with a ChArUco board and fit their poses to the arm. (1 entry) - [Image processing](https://ericjgoossen.com/skills/image-processing/): Transforming images pixel by pixel. Live View converts frames to the Lab colour space and dithers them into Braille characters. (1 entry) - [Networking](https://ericjgoossen.com/skills/networking/): Moving data between machines. The VLA harness talks WebSockets, ZMQ and HTTP, and the Quest teleop page streams poses over a websocket. (3 entries) - [Web development](https://ericjgoossen.com/skills/web-development/): Building for the browser. The Quest teleop is a WebXR page the headset opens in AR, streaming the controllers to the robot. (1 entry) - [JavaScript](https://ericjgoossen.com/skills/javascript/): The language of the Quest teleop page, which streams controller poses to the robot. (1 entry) - [Embedded systems](https://ericjgoossen.com/skills/embedded-systems/): Software on small computers inside robots. An optical-flow sensor over micro-ROS on an M5Stack, and odometry on ARUW's robot controller. (2 entries) - [ArduPilot](https://ericjgoossen.com/skills/ardupilot/): Open-source autopilot firmware. OpenDubs's first base drove through a Pixhawk running ArduPilot, whose EKF I fed with optical flow. (2 entries) - [Gazebo](https://ericjgoossen.com/skills/gazebo/): A robot simulator for ROS. I gave OpenDubs a URDF and SDF for it and replayed the lidar mapping in it. (2 entries) - [MuJoCo](https://ericjgoossen.com/skills/mujoco/): A fast physics engine for robotics. Achilles's reference and benchmark, and where OpenDubs's arms are planned, simulated and tested. (7 entries) - [Pinocchio](https://ericjgoossen.com/skills/pinocchio/): A rigid-body dynamics library. My OpenArm controllers and the 500 Hz gravity compensation use it. (1 entry) - [Docker](https://ericjgoossen.com/skills/docker/): Containers for reproducible environments. I set up the Docker environment the OpenDubs team develops in on the Jetson Thor. (1 entry) - [Linux](https://ericjgoossen.com/skills/linux/): The operating system under all of it. Flashing JetPack on the Jetson Thor and udev rules that name OpenDubs's two identical lidars. (2 entries) - [NVIDIA Jetson](https://ericjgoossen.com/skills/nvidia-jetson/): NVIDIA's embedded computers. OpenDubs runs on a Jetson Thor that I flashed and set up for the team. (3 entries) - [CAN bus](https://ericjgoossen.com/skills/can-bus/): The bus most robot motors talk on. OpenDubs's Thor sends the arms' motor targets over CAN-FD. (1 entry) - [Debugging](https://ericjgoossen.com/skills/debugging/): Tracking a failure to its cause. A singularity in the lab's IK solver, a missing sensor mounting that sent odometry 155 m off, and identical lidars on USB. (4 entries) - [Robot safety](https://ericjgoossen.com/skills/robot-safety/): Keeping robots and people safe. Arm goals checked against joint and torque limits, arms that cancel together, and a watchdog with speed caps on the Odin test platform. (3 entries) - [Research](https://ericjgoossen.com/skills/research/): Asking a question and answering it rigorously. Co-authoring the ARCHITECT paper's VLA benchmark, and the Odin characterization that decided the sentry's localization. (3 entries) - [Technical writing](https://ericjgoossen.com/skills/technical-writing/): Explaining technical work clearly. I wrote the ARCHITECT paper's VLA failure analysis, and design documents like Achilles V3's. (2 entries) - [Project planning](https://ericjgoossen.com/skills/project-planning/): Planning how work gets done. The FTC two-robot build plan, the LQR proposal, and the Odin test campaign's protocol. (3 entries) - [Mentoring](https://ericjgoossen.com/skills/mentoring/): Helping others learn. Teaching programming to a local FLL team and to students in Gaborone. (2 entries) - [Advocacy](https://ericjgoossen.com/skills/advocacy/): Making the case to decision makers. At the U.S. Embassy in Gaborone we advocated for STEM funding and lower tariffs on educational STEM goods. (1 entry) - [Live demos](https://ericjgoossen.com/skills/live-demos/): Showing a robot working in front of people. OpenDubs for Winbond, Fauna Robotics and ARCS donors, and robot demos at the U.S. Embassy event. (3 entries) - [Collaboration](https://ericjgoossen.com/skills/collaboration/): Building things with a team. The OpenDubs undergrad team, ARUW's competition robots, the Fleet RL tagging work and the HCRL benchmark. (5 entries) - [Competitive robotics](https://ericjgoossen.com/skills/competitive-robotics/): Building robots to win competitions. ARUW in DJI's ARC and my FTC team's robots, path following and driver tools. (5 entries) ## Publications - **A Few Words Go a Long Way: Language Guided Robot Policy Synthesis**. D. Chen, A. R. Jain, E. Goossen, E. Romig, M. Murray, N. Walker, M. Cakmak. In preparation for IEEE RA-L, 2026. Tests whether human feedback helps LLM-written robot code beat vision-language-action models: human feedback lifts Code-as-Policies 1.75× over base VLAs, solving tasks VLAs failed completely. [arXiv](https://arxiv.org/abs/2607.23784) [Website](https://robo-architect.github.io/) ## Optional - [Everything as Markdown](https://ericjgoossen.com/llms-full.txt) - [Search index (JSON: every page's text)](https://ericjgoossen.com/search-index.json) - [GitHub](https://github.com/EricJGoossen) - [LinkedIn](https://www.linkedin.com/in/ericjgoossen) - [Email](mailto:ericjgoossen@gmail.com) - [Resume](/resume.pdf)