CoUGARs is a low-cost, configurable AUV platform designed for multi-agent autonomy research by the Field Robotic Systems Lab (FROST Lab) at Brigham Young University.
Prerequisites: 64-bit Linux, 15+ GB of free disk space, and a dedicated NVIDIA GPU (for HoloOcean simulation).
-
Install Docker and VSCode Dev Containers.
-
Add a GitHub SSH key and clone the
cougars-devrepository.git clone git@github.com:cougars-auv/cougars-dev.git
-
Choose a development workflow:
Simulation (HoloOcean):
-
Build the runtime image from the
cougars-auvfork of HoloOcean-ROS. When prompted to run./build_container.sh, specify thenelson/cougars-devbranch with./build_container.sh -b nelson/cougars-dev. -
Open the
cougars-devrepository in VSCode and use the Command Palette (Ctrl + Shift + P) to select "Dev Containers: Reopen in Container." When prompted to choose adevcontainer.jsonfile, click "CoUGARs Dev (GPU)." -
Once the containers load, open a new terminal window using
Ctrl + Alt + Shift + `and launch a HoloOcean scenario in thecougars-holoocean-ctcontainer using./holoocean_launch.sh.cd ~/cougars-dev/scripts && ./holoocean_launch.sh
-
Open a new terminal, build the
ros2_wsworkspace, and select the matching launch configuration with./sim_launch.sh.cd ~/cougars-dev/ros2_ws && colcon build cd ~/cougars-dev/scripts && ./sim_launch.sh
Recorded Data (
rosbag2):-
Open the
cougars-devrepository in VSCode and use the Command Palette (Ctrl + Shift + P) to select "Dev Containers: Reopen in Container." When prompted to choose adevcontainer.jsonfile, click "CoUGARs Dev." -
Once the containers load, copy your
rosbag2bag into the repository'sbagsfolder. -
Open a new terminal window using
Ctrl + Alt + Shift + `, build theros2_wsworkspace, and select a bag with./bag_launch.sh.cd ~/cougars-dev/ros2_ws && colcon build cd ~/cougars-dev/scripts && ./bag_launch.sh
-
If you run into crashes or out-of-memory errors while building the workspace, restrict the compiler to a single worker using
colcon build --parallel-workers 1.
If not all repositories appear in the Git sidebar in VSCode, open settings (
Ctrl + ,), set "Git: Repository Scan Max Depth" to 3, and reload the window.
- Bill of Materials
- Assembly Instructions
- Base Station Software Setup
- CougUV Software Setup
For small changes confined to one package, the full
cougars-devbranch workflow is unnecessary. Simply create a new package branch and PR.
-
Create a Branch: Create a new
cougars-devbranch (e.g.,nelson/repo-docs). -
Create Package Branches: For each package you plan to modify, create a new branch with the same name. In your new
cougars-devbranch, temporarily update the relevant.reposfiles to reference those branches. -
Make Changes: Develop, debug, and test your changes.
If you need to add dependencies, update the relevant
package.xmlfiles, Dockerfiles under.docker/,runtime.repos,dev.repos, ordependencies.repos. Test building the Docker images locally. -
Sync Frequently: Regularly update your branches with the latest
main(via rebase or merge) to catch conflicts early. -
Submit Package PRs: Open a pull request for each package branch. Ensure required tests pass, then merge once approved. After merging, delete the branch and create a new branch from
mainfor any follow-up work.All pull requests must use squash and merge.
-
Submit Final PR: After all package PRs have merged, revert the temporary
.reposchanges in yourcougars-devbranch and open a pull request. Once merged, GitHub Actions will build and push the updated Docker images to Docker Hub. Delete the branch after merging.
This repository follows the Semantic Versioning (SemVer 2.0.0) standard:
Given a version number
MAJOR.MINOR.PATCH, increment the:
- MAJOR version when you make incompatible API changes
- MINOR version when you add functionality in a backward compatible manner
- PATCH version when you make backward compatible bug fixes
-
Create a Release Branch: Create a minor release branch (e.g.,
release/v1.2.x) frommain.Do not create separate branches for patch versions (e.g.,
v1.2.0tov1.2.1). Merge fixes into the minor release branch, then bump the patch version in a new tag when ready to release. -
Tag Packages: Check the packages listed in
runtime.reposanddev.repos. For packages with untagged updates, update the<version>in theirpackage.xmlfiles and push a new tag (e.g.,v2.3.4). Since packages are versioned independently ofcougars-dev, use an existing up-to-date tag or create a new one. -
Lock Dependencies: On the release branch, pin each package in the
.reposfiles to a specific tag instead of a branch such asmain. Commit these updates. -
Tag and Push: Create and push a version tag (e.g.,
v1.2.3) on your release commit:git tag v1.2.3 git push origin v1.2.3
Pushing the tag automatically rebuilds and publishes Docker images using the
<target>-<version>format (e.g.,frostlab/cougars:runtime-v1.2.3) and creates a draft GitHub Release with auto-generated notes. -
Publish a GitHub Release: Review the draft release in GitHub and click Publish.
If you use this repository in your research, please cite the following publications:
@misc{durrant2025lowcostmultiagentfleetacoustic,
title={Low-cost Multi-agent Fleet for Acoustic Cooperative Localization Research},
author={Nelson Durrant and Braden Meyers and Matthew McMurray and Clayton Smith and Brighton Anderson and Tristan Hodgins and Kalliyan Velasco and Joshua G. Mangelson},
year={2025},
eprint={2511.08822},
archivePrefix={arXiv},
primaryClass={cs.RO},
url={https://arxiv.org/abs/2511.08822},
}@misc{meyers2025testingevaluationunderwatervehicle,
title={Testing and Evaluation of Underwater Vehicle Using Hardware-In-The-Loop Simulation with HoloOcean},
author={Braden Meyers and Joshua G. Mangelson},
year={2025},
eprint={2511.07687},
archivePrefix={arXiv},
primaryClass={cs.RO},
url={https://arxiv.org/abs/2511.07687},
}@inproceedings{potokar2022holooceanunderwaterroboticssim,
author={Easton Potokar and Spencer Ashford and Michael Kaess and Joshua G. Mangelson},
title={Holo{O}cean: An Underwater Robotics Simulator},
booktitle={Proc. IEEE Intl. Conf. on Robotics and Automation, ICRA},
address={Philadelphia, PA, USA},
month={May},
year={2022}
}