Pool Test 04/28/24

This is our last pool test of the semester.

We spent the first half of the pool test testing out a few different issues with our robot:

  • New CV gate model: Max recently trained our new CV gate model for this year, which we tested out today. The model is supposed to distinguish and detect the red clockwise arrow and the blue counter-clockwise arrow, along with the gate frame and ticks. However, when we tested the model on the two arrows held side-by-side, the model consistently classifies both arrows as the red CW arrow, along with their reflections on the water surface, with at least 80% confidence. The issue still persists as we tried rotating both arrows independently, as well as moving the robot further away from the arrows. Later on, when we put the red buoy underwater, the model would also mistakenly classify the buoy as the red arrow, with about 70% confidence. Other than that, there were no false positive predictions when there were no arrows present. We think that the reason for this is because the two arrows are reflections of each other with the same shape, curvature, only differing in their colors and arrow heads. Since the two arrows are too similar, the YOLO segmentation model is unable to distinguish between them. We would need HSV filtering for color detection and/or a different approach to deal with this issue.
  • Sonar 1D:  we tested the values reported by the 1D sonar at different depths. At the pool surface (6ft ~ 1.83m), the values vary wildly from 3m to 4m, and continue to vary as we submerge the robot. At the bottom of the pool, the values are consistently at 1.8m. We recorded a bag file for future debugging.
  • Marker dropper: we tested the new servo horn design, which dropped both markers straight down instantly on request, as expected.
  • Adjustable buoyancy system: both our swimmers, Ethan and Raul, tested it out, and remarked that it was very straightforward to use.
  • Joystick: we tested the latest version of the joystick panel on the master branch. The joystick worked as expected.
  • Sonar for the buoy: we weighed the buoy down with 2 10lb weights using a clinch knot (as suggested by the illustrious Vedarsh Shah), and compared the distances reported by the sonar with the actual distances that we measured. We tested with various distances in the range 2 – 4m, and found that the distances reported by the sonar are extremely accurate (less than 1% error) throughout the range. 

Our main goal for the second half of the pool test was to complete the prequal. We first used dead reckoning for both going around the marker and reversing back to the gate, however by the time the robot starts to reverse, it has again already yawed clockwise about 15 – 30 degrees, causing it to miss the gate. We then switched to a new plan which consists of yawing 180 degrees and using CV to track the gate glyphs for the return leg. We finally had our first successful tethered run, however task planning couldn’t register that the robot had reached the glyph, and so even after passing through the gate, the robot continued moving forward until it hit the wall on the shallow end of the pool.

With about 30 minutes left, we attempted a few untethered runs but fell short of completing the prequal. On the first run, the robot over-rotated and hit the wall when it tried to move forward. On the second run, we decreased the yaw amount. The robot successfully detected the glyph and started moving forwards with the correct heading, however, it couldn’t maintain depth and gradually surfaced. We then made the robot moved down slightly while yawing for the third run, however the robot ended up scraping the pool floor instead.

Here are the observations during the prequal attempts:

  • On two attempts, after the initial submerge and moving forward towards the gate, the robot inexplicably moved backward and to the right until it hit the wall.
  • On all other attempts, the robot could consistently pass through the gate using dead reckoning, and move past the marker using CV. During this portion of the run, many times the robot was essentially crawling very close to the right wall, but eventually it moved away from the wall towards the buoy. While circling around the marker, it would always move into the other lane (which admittedly might have frightened a few swimmers). These issues will be solved by reserving two lanes for the prequal.
  • After moving around the marker (and right before yawing 180 degrees), on about half of the runs, the robot managed to return to the correct orientation (straight in line with the gate) on its own, while it would yaw clockwise about 15 – 30 degrees for the other runs. This inconsistent behavior makes it very difficult to determine in the code how much to yaw so that the robot would face the glyph directly afterwards.
  • While yawing, we faced the same issues as yesterday’s pool test. The robot consistently over-rotates by about 10 – 15 degrees, and experience significant roll and pitch oscillations.
  • The fiber tether was very helpful in helping the swimmer disconnect and reconnect.
  • After some expert drilling and ziptie-ing by Raul, the gate stayed together throughout the pool test. The marker was also stable.

Humidity started out at 62%, and never got over 70% for the entire pool test, so we did not have to take off the capsule.


  • First successful tethered run. We should be set to complete the prequal in the summer.
  • Marker dropper and joystick work as expected.
  • Sonar reports very accurate distance to the buoy.


  • New CV gate model cannot distinguish between the two arrows.
  • Significant roll and pitch oscillations while yawing.
  • Task planning couldn’t detect whether it had reached the CV gate target.

Watch the recording of our best autonomous run to date: