Aquadrone is a new student robotics team at the University of Waterloo, started with the goal of creating an autonomous underwater robot to compete in the Robosub challenge. In the spring of 2019, I joined the team as the lead of software development.
Before discussing my roles further, I must say I’m grateful for the effort and assistance from many Aquadrone team members throughout this project.
Based on my experience and conversations with other robotics teams, I decided to opt for developing the software for Aquadrone in ROS. In addition to this, I also began creating:
- A Gazebo simulation environment, using the uuv_sim packages
- Github repositories
- TravisCI automated testing
The current version of our sub runs on an Nvidia Jetson Nano. We use ROS libraries for interfacing with some sensors and a variety of Python libraries for other sensor and actuator integration. Notable hardware includes:
- Zed Mini Camera
- BNO 055 IMU
- 30-Bar Pressure Sensor
- Thrusters (6 BlueRobotics T100 thrusters, 2 custom-made by the club)
A particular challenge in this work (and still in some development) has been creating a stable network connection to the Jetson Nano.
I formed my design of the full software system around 6 components:
- Sensors and actuators
- Core Control System (low-level)
- State Estimation (robot- and world-states)
- Competition Logic (high-level controls)
- Vision and Machine Learning
- Arm and Torpedos Controls
The sub’s current design consists of 8 thrusters. PID controllers control the sub’s depth and orientation. Each controller outputs a wrench, which it ‘desires’ to act on the robot. Then a centralized controller solves the following minimization problem to find the minimum vector of thrsuts ‘T’ which can be applied to fulfill the summation of these requests, ‘F’.
is solved by
We perform state estimation using an Extended Kalman Filter. By using the autograd library, we can avoid needing to calculate the required derivatives by hand, which I hope will simplify the process for future developments.
Our world-state estimation is currently under development by other members of the team and will combine feedback from the sub’s vision system with the robot-state estimation system.
Our competition logic controls the sub’s movements on a high level while in operation. This system is implemented as a state machine, with each state representing some task to be completed or condition to wait for. This system is under development.
Vision and Machine Learning
Vision and Machine Learning is technically a sub-team of Aquadrone’s software team, but practically a team in its own right. Members of this team have worked to interface with the Zed Mini camera, and trained machine learning models to recognize specific objects during the competition.
We’re nearing the point where this work will need to be integrated with the overall system, which I anticipate will require:
- Developing a ROS node to run ML models on camera outputs
- Developing/expanding a library of competition objects for Gazebo
- Developing a fake vision node to detect objects in simulation, to test/allow world-state estimation without ML models
In addition to the technical challenges of developing the software for Aquadrone, this role has presented interesting challenges in managing the team.
First and foremost has been trying to provide a baseline of education to new members each term on the technologies we use. This includes brief tutorials on Git and ROS, and providing links to online resources. It also includes reviewing team practices such as Pull Requests.
Creating Development Environments
Perhaps the most significant challenge for a new member of the team is being able to develop and run software for the team. ROS officially supports Ubuntu, which not many students run as an OS. This presents a barrier. I’ve explored some ways to reduce this difficulty:
- Online development with TheConstructSim
- Virtual Machines
- Docker (can achieve some results on Apple computers)
- Bootable Ubuntu hard drives
Currently, we’ve reviewed TheConstructSim and Virtual Machines as options for team members, and I’m favouring the use of Virtual Machines
(while installing Ubuntu on each student’s computer would be idea technically, and an excellent learning experience, I have experience computer problems when performing it in the past, and am not comfortable recommend it to other students)
Task Distribution and Support
Aquadrone uses Trello to track our current to-do items. I’ve reviewed outlines of our primary goals for each term with new members so they can know where each task stands. Team members can then select tasks they’re interested in from the board. Beyond this, I try to leave the selection of tasks to each student, while I attempt to cover and remaining significant tasks.
I try to be in contact with team members regularly. During the regular term, we have had work sessions on weekends to discuss educational items, plan work as a team, or work on individual tasks. I have also tried to keep in touch with members over Slack, so I can provide feedback and advice as needed.
One of the final projects which I’ll be working on with Aquadrone is helping to find, train, and prepare another member to lead the team after my graduation. I plan to step down early from my position to allow other members to take on the position as they desire. In that situation, I can provide any needed guidance, technical or otherwise, while I’m still present on campus.
“Wesley has helped to build both our on-sub software and team infrastructure from scratch. The simulation environment he set up allowed us to develop our code without having a constructed sub. He has also been persistent in addressing important issues such as testing, networking, and member education.“
– Amaar Quadri, UW Aquadrone Software Lead