Today our goal was to try to complete the prequal by any means necessary. While we didn’t complete the prequal, we’ve made quite a bit of progress towards this goal.

We picked up from where we left off yesterday, which was to try to keep the robot level whilst moving forward, especially when tracking a CV target. I had written some new code last night to try to solve this, but it didn’t work particularly well.

Furthermore, the original plan called for the robot to go around the marker, then yaw 180 degrees so the camera would face the gate and the robot could begin tracking the gate glyph. However, the robot wasn’t able to perform this accurately. We tried yawing various amounts, but every time the robot would end up rotating more than it should have. If the robot was commanded to rotate 70 degrees twice, the total true rotation would be 180 degrees on average – with a margin of error of about 15 degrees. Additionally, whilst yawing, the robot would also experience significant roll and pitch oscillations. We tuned roll, pitch, and yaw PID, and changed the control effort limits to 0.5 for all angular axes; these changes mitigated these issues, but didn’t solve them completely.

Additionally, we independently tested tracking the gate glyph. While the robot moved to the correct location, the distance to the gate glyph that was computed from the glyph’s pose as provided by CV/Sonar was frequently inaccurate; thus, it was impossible for task planning to accurately know if the robot had actually reached the target.

Completely fixing the issues in the previous three paragraphs would require many hours of debugging. Instead of spending time on that today, we pivoted to an new plan:

  1. Using dead reckoning, move forward about halfway between the gate and the marker.
  2. Use CV to track one of the buoy glyphs behind the marker (buoy was placed about 2 meters behind the marker).
  3. Go around the marker using dead reckoning.
  4. Come back in reverse using dead reckoning.

The furthest we got in executing this new plan was the following: The robot completed the first 3 steps. By that point, however, the robot had yawed about 15 degrees. Thus, when it started moving in reverse, its trajectory wasn’t parallel to the lane; instead it was moving into the other lane and would have completely missed the gate.

Near the end of the test, we attempted to perform a few runs autonomously. The fiber tether was very helpful for this purpose as it is much easier to disconnect and reconnect than the ethernet tether. The robot behaved erratically during the autonomous runs – no idea why this was the case.

Throughout the pool test, we frequently had issues with the PVC joints on the gate coming apart and needing to be reassembled; the joints need to be held in place by something stronger than just friction. Also, the marker wasn’t particularly stable; putting weights on top of the marker base would be helpful.

To reliably go around the marker, the robot has to go entirely into the other lane before coming back to our lane. This hasn’t been too much of a problem as the robot is typically much deeper than the swimmers in the other lane, who are at the surface. But, it would be helpful to reserve two lanes to do the prequal so the robot has plenty of space to move comfortably.

Humidity was in the 80s for most of the pool test. We took the capsule off once and there a few small pools of water inside. We also took the capsule off after the test and again there were several pools of water.


  • Most progress we’ve ever made towards completing the prequal.


  • Robot still leaks. It could be that the capsule simply isn’t forming a great seal with the o-ring, slowly leaking some water.
  • Robot doesn’t stay level when tracking a CV target.
  • Robot can’t yaw accurately and stably.
  • Would be helpful to remove the buoyancy pieces from the fiber tether so it’s easier to roll and unroll. We don’t need the pieces anymore since we’ll be using the fiber tether exclusively for autonomous runs.