Table Of Contents
Robotics Lab - EAGER
Self Balancing Platform
6 DOF Robot Arm
Orientation Estimation using IMU
Robotics Lab - EAGER
Self Balancing Platform
6 DOF Robot Arm
Orientation Estimation using IMU
Neural Network Control for robotic manipulation. GOAL: Push a box up a step. Jax/Equinox design, Mujoco simulation.
For a comprehensive report of all my contributions to this project, see this paper.
When training our neural network controllers, it was critical to understand how well each model performed across different tasks.
Originally, our evaluation process only printed a single average loss value and generated four random simulation videos — which made it nearly impossible to see why a model succeeded or failed.
To fix this, I built the interactive web dashboard shown in the video.
It lets us easily compare multiple models across a range of metrics such as loss, effort, and success rate.
The app gives both a high-level overview of overall performance and the ability to drill down into specific trajectories to visualize exactly how a model behaved in simulation.
Video showcasing interactive evaluation website.
Our neural network’s loss function had to balance many competing goals — penalizing instability, rewarding progress, and encouraging smooth control.
If it was too specific, the AI wouldn’t generalize; if it was too vague, it wouldn’t learn anything useful.
Because each term in the loss function affected training in unpredictable ways, it was hard to know what to adjust or why a model behaved the way it did.
To solve this, my teammate and I built a loss visualization tool that shows how each term contributes to the overall loss.
It displays a live bar graph that updates as you move the box and manipulator in simulation, letting us see exactly how position and speed influence the loss landscape.
This helped us tune and debug the loss function much faster — and actually understand why the network was learning the way it did.
For a comprehensive report of all my contributions to this project, see this paper.
Video showing Loss Function Visualization tool with interactive controls.
After building my evaluation visualization tool, I was able to isolate individual trajectories — and discovered that some runs had major physics glitches where the box would suddenly launch into space.
These glitched runs heavily skewed the loss calculations and caused the model to learn unstable behaviors, so I needed a way to detect and exclude them during training.
I experimented with several detection methods, starting with angular acceleration and contact force. Both correlated with glitches, but I found angular velocity to be the most reliable indicator. Any run where the box’s angular velocity exceeded 30 rad/s was considered glitched.
I implemented a masking system in JAX that flags these runs during training instead of removing them, keeping batch sizes consistent for GPU efficiency.
This prevented the model from updating on invalid data and reduced the glitch rate in evaluation from ~1% to ~0.25%.
For a comprehensive report of all my contributions to this project, see this paper.
Video showing glitched run
Table showing glitched runs with high angular velocity and low contact force.
Designed and analyzed a self-balancing platform using an IMU and a PID controller.
Implemented a PID controller to stabilize the platform using IMU angle feedback.
Tuned proportional, integral, and derivative gains experimentally to balance responsiveness and stability.
Used sensor fusion to estimate tilt angle and reduce noise in the control loop.
I learned how real-world noise and latency impact PID control, especially the importance of filtering sensor data for the derivative term to prevent unstable oscillations.
To see a comprehensive report on this project, look here.
Roll angle of the platform estimated using accelerometer-only data compared to a fused accelerometer–gyroscope estimate using the Madgwick filter.
Image showing breadboard Implementation
Early PID tuning phase showing oscillatory behavior. The system was later stabilized after further gain refinement, though no final video was captured.
I derived full position- and velocity-level kinematics for a 6-DOF arm: forward kinematics via Denavit–Hartenberg (DH), closed-form inverse kinematics (geometric method), and the spatial Jacobian to map end-effector twists to joint rates. I validated multiple IK solutions numerically and verified the Jacobian by reconstructing the commanded twist.
This project shows end-to-end manipulator math: from frame assignment and FK to multiple IK branches and Jacobian-based velocity control. It’s the core foundation for motion planning and real-time control.
Python, matrix transforms, DH convention, geometric IK, Jacobian-based velocity control.
MiniBOT6-R Robot Arm
DH Table for Forwark Kinematics
3D View of Robot Arm from Base to Spherical Wrist Center
Authors: Charles Friley, Caleb Hottes
https://github.com/Xman34/ME467_Robotics_Project2
Built and compared Naïve, Mahony, and TRIAD estimators on phone IMU streams (~100 Hz). Added two custom variants: a Mahony-TRIAD fusion (TRIAD-driven innovation) and a motion-aware hybrid switch. Verified with quaternion math, RPY plots, bias tracking, and MuJoCo 3D viz; Mahony was most robust in real-world driving, TRIAD best when static, Naïve drifts.
Estimators: Naïve gyro integration, Mahony filter, TRIAD, plus two custom variants
Caleb’s Mahony-TRIAD: Uses TRIAD to compute the innovation term for Mahony to reduce drift without integration.
Charles’ Hybrid: Switches between Mahony and Mahony-TRIAD based on gyro magnitude (≈0.1 rad/s threshold).
Why: Dead-reckoning drifts; magnetometers can be noisy; no single filter wins in all regimes.
How we validated: Quaternion math + axis-angle checks, RPY plots, bias tracking, and MuJoCo 3D visualization.
Python, quaternion/so(3) math, CSV pipelines, MuJoCo visualization, Plotly/Matplotlib for plots
Mahony Filter Implementation
TRIAD filter implementation
Naive filter implementation