Dealing with sensor noise was one of the biggest challenges. The control system samples at 100 hz, which seems fast enough to stabilize the robot. The stepper-motors are very responsive, but induce lots of vibration. So the accelerometers and gyros both have analog anti-alias-filters with a ~100hz cutoff. In software, the gyro signals are filtered further with a butterworth at 10hz. Lower cutoff results make an unstable controller.
Tilt angle from just accelerometers is not practical because the measurements are just too noisy. They pick up everything. The robot-frame resonant frequencies feedback into the sensors and cause the steppers to vibrate the robot-frame further. It does not diverge. It hits a Limit Cycle Oscillation. You can put in strong filters with very low cutoffs, but then you end up with too much lag and an unstable controller.
There are many ways to fuse the accel & gyro measurements to get a clean tilt angle. A Kalman filter is probably overkill for this robot. But because the Kalman filter is ubiquitous in aircraft and spacecraft, I wanted to learn about it by coding it and using it. And I wanted to practice using the Eigen library. I highly recommend it if you need to do matrix operations. It's almost as simple as Matlab.