An AUV simulator developed for Palouse RoboSub based on ROS 2 Jazzy and Gazebo Harmonic, featuring custom C++ plugins for thrust allocation, buoyancy compensation, and hydrodynamic drag modeling. The simulator supports real-time 6-DOF teleoperation, autonomy modules for depth and altitude regulation, and integrated onboard perception through a forward-facing camera and 3D LiDAR sensor for image and point cloud generation, enabling environmental mapping, navigation, and autonomy testing in dynamic underwater environments.
Screencast.from.2025-08-31.23-32-31.mp4
Screencast.from.2025-08-29.22-30-01.mp4
Assuming ROS2 jazzy and gazebo harmonic is installed, other dependencies need to be installed to run this project
cd GNCea
sudo apt update && sudo apt install -y \
ros-jazzy-desktop ros-jazzy-ros-gz-sim ros-jazzy-ros-gz-bridge ros-jazzy-xacro \
python3-colcon-common-extensions python3-rosdep git && \
sudo rosdep init || true && rosdep update && \
rosdep install --from-paths src --ignore-src -r -y --rosdistro jazzy
To build:
colcon build
source install/setup.bash
Use whatever commands below to launch any desired launch file.
To launch
ros2 launch auv_description cube_thrust_test.launch.py
ros2 launch auv_description cube_thrust_test_water.launch.py
To activate teleoperation
ros2 run auv_description wasd_teleop.py --ros-args -p topic:=/auve1/force_body -p force:=50.0 -p decay:=1.0 -p rate_hz:=500000000.0
force, decay and rate_hz can be edited as you see fit, just change the number in the teleop launch command.
Some commands I used to test stuff out:
ros2 run auv_description wasd_teleop.py --ros-args -p force_topic:=/auve1/force_body -p force:=100.0 -p decay:=1.0 -p rate_hz:=12000000000.0 -p torque:=1.0
ros2 run auv_description wasd_teleop.py --ros-args -p force_topic:=/auve1/force_body -p force:=500.0 -p decay:=1.0 -p rate_hz:=1200000000.0
To launch auv.urdf
ros2 launch auv_description testing.launch.py
Activate camera bridge
ros2 run ros_gz_bridge parameter_bridge /cube/image_raw@sensor_msgs/msg/Image@gz.msgs.Image /cube/camera_info@sensor_msgs/msg/CameraInfo@gz.msgs.CameraInfo --ros-args -r /cube/image_raw:=/camera/image_raw -r /cube/camera_info:=/camera/camera_info
Show camera feed
ros2 run image_tools showimage -r image:=/camera/image_raw
Activate teleop using the previous commands
To test lidar
ros2 launch auv_description view_lidar.launch.py
Rviz will open up automatically, set fixed frame to auv/cube_link/lidar_link_sensor. Add pointcloud2 by topic, and set topic to scan/points.
Teleoperate using previous commands.
To fire torpedos
ros2 topic pub /shoot_torpedo std_msgs/msg/Bool "data: true"
To launch guppy:
ros2 launch auv_description guppy_display.launch.py
To launch slider teleoperation:
ros2 run auv_description guppy_control_test.py
To launch experimental control world:
ros2 launch auv_description controlsystemExperimental.launch.py
To use sliders:
ros2 run auv_description guppy_control_test.py
To launch Woollet pool world:
ros2 launch auv_description guppy_woolletpool.launch.py
To use sliders:
ros2 run auv_description guppy_control_test.py
activate IMU bridge:
ros2 run ros_gz_bridge parameter_bridge \
/imu@sensor_msgs/msg/Imu@gz.msgs.IMU
activate altimeter bridge:
ros2 run ros_gz_bridge parameter_bridge \
/altimeter@ros_gz_interfaces/msg/Altimeter@gz.msgs.Altimeter
bridge both IMU & altimeter at the same time:
ros2 run ros_gz_bridge parameter_bridge \
/imu@sensor_msgs/msg/Imu@gz.msgs.IMU \
/altimeter@ros_gz_interfaces/msg/Altimeter@gz.msgs.Altimeter
bridge rgbd on guppy:
ros2 run ros_gz_bridge parameter_bridge /guppy/camera/points@sensor_msgs/msg/PointCloud2@gz.msgs.PointCloudPacked /guppy/camera/image@sensor_msgs/msg/Image@gz.msgs.Image /guppy/camera/depth_image@sensor_msgs/msg/Image@gz.msgs.Image /guppy/camera/camera_info@sensor_msgs/msg/CameraInfo@gz.msgs.CameraInfo
bridge corner cameras on guppy:
ros2 run ros_gz_bridge parameter_bridge \
/guppy/raw_1/image@sensor_msgs/msg/Image@gz.msgs.Image \
/guppy/raw_1/camera_info@sensor_msgs/msg/CameraInfo@gz.msgs.CameraInfo \
/guppy/raw_2/image@sensor_msgs/msg/Image@gz.msgs.Image \
/guppy/raw_2/camera_info@sensor_msgs/msg/CameraInfo@gz.msgs.CameraInfo \
/guppy/raw_3/image@sensor_msgs/msg/Image@gz.msgs.Image \
/guppy/raw_3/camera_info@sensor_msgs/msg/CameraInfo@gz.msgs.CameraInfo \
/guppy/raw_4/image@sensor_msgs/msg/Image@gz.msgs.Image \
/guppy/raw_4/camera_info@sensor_msgs/msg/CameraInfo@gz.msgs.CameraInfo
gz topic -e -t /guppy/dvl
Please not that a node will be neccesary to bridge dvl data so that you can listen to the topic.
This is my attempt at 2025s game. This was made so I could test opencv navigation and slaloming.
https://drive.google.com/file/d/1oP0x0Nx4gbNLD_p_7pBtzQwXXJvDacup/view?usp=sharing
To test autonomy test 2:
ros2 launch auv_autonomy autonomytest2.py
Need to get in touch? Reach out to robosub.vcea@wsu.edu.
We are sponsored by many generous companies and people, including:
- OSH Park PCBs
- Blue Robotics
- Real Digital
- Solidworks
- Vectornav
- JoeScan
- WaterLinked
- LattePanda
- Tektronix
- And many many other personal supporters through their generous donations!
Do you like our work? Consider sponsoring our team!
