We got to the pool with only a small delay (we cut and drilled buoyancy blocks at the Foundry before leaving). We adjusted the buoyancy, making the robot almost level. We tuned x, y, z, and yaw PID. The robot can hold depth and rotate (yaw) with great accuracy. X and Y movement is also pretty accurate, but it could use some more tuning. Overall, robot movement is very smooth and quite accurate. All the work we put into controls, nonlinear thrusters, state, and GUI last semester came together and delivered the results we wanted.


  • PID tuning is a breeze compared to last year.
  • Through the setpoint and control effort graphs in Foxglove we can precisely observe oscillations and make more educated guesses on how to adjust the PID constants.
  • Through the PID panel and the functionality provided by the new controls system, we can change PID constants on the fly without needing to restart motion.launch, making PID tuning much faster.
  • Unlike when using the joystick, when autonomous, the robot doesn’t significantly pitch or roll when moving laterally. This is due to the pitch and roll PID control correcting for any deviations from level.
  • We used a PVC pipe to measure the robot’s depth when commanded to submerge one meter. The top of the robot was about 1 meter + 2 inches below the surface of the water. Thus, Z position is quite accurate.
  • Nonlinear thrusters and controls have been tested thoroughly, so they’re ready to be merged in.
  • Robot’s movement is quite good; we’ll be ready for the pre-qual after 2-3 pool tests.
  • We developed the following procedure to easily “reset” the pressure arduino through software when the robot is submerged. It’s the quickest way to reupload to the arduino. We found it to be effective at resuming the pressure arduino when stuck.
    • SSH into the robot with -XY flags
    • We installed the latest version of the Arduino IDE on the robot. Open it by running the arduino_ide executable located at ~/arduino_ide
    • Select the port the pressure arduino is located on.
    • Upload the sketch to the pressure arduino.
    • Use serial monitor to check if the arduino has started printing to serial.
    • If the arduino has not yet started printing, repeat the last two steps until it does (it typically takes 2-5 reuploads)


  • Top front left thruster cover broke while transporting the robot from Foundry to the pool. It needs to be replaced.
  • Front right corner is slightly higher than other corners when the robot is in water. There are no buoyancy blocks near it, so it was difficult for us to fix this issue, and we moved forward with the pool test in spite of it.
  • When the robot is at the surface and then is commanded to submerge, it moves erratically for a few seconds before stabilizing.
    • This is because not all thrusters are fully submerged when the robot is floating at the surface.
    • In task planning, when first submerging, we need to set the control types for all axes except Z to be desired power and set desired power to zero for all axes. That way, the robot would activate only the bottom thrusters(which are always submerged) and move down. After the robot is fully submerged, switch all control types back to position PID.
  • Sometimes, the robot very slowly yaws with no changes to its setpoint. This is due to the robot’s yaw angle in state remaining the same.
  • The pressure sensor filtering algorithm sometimes filters out a series of good values. We need to develop a more robust algorithm.
  • The pressure sensor outputs bad values quite often. We may want to consider replacing the sensor entirely.
  • An underwater communication system would be quite helpful 🙂 It’s always pretty loud at the pool. The water polo team was especially loud today so it was difficult to communicate with the swimmers.

We’ll continue PID tuning at the next pool test, with the main focus on X and Y PID. We’ll be ready for pre qual by February.