}/>
{/* We'll add a footer component later */}
diff --git a/src/Pages/VehiclePages/Subjugator7.jsx b/src/Pages/VehiclePages/Subjugator7.jsx
new file mode 100644
index 0000000..c934271
--- /dev/null
+++ b/src/Pages/VehiclePages/Subjugator7.jsx
@@ -0,0 +1,250 @@
+import React, {useState, useEffect, useRef} from "react";
+import "../../styles/Subjugator7.css";
+import Image from "../../assets/Sub7.jpg";
+
+const SUBJUGATOR7SPECS = [
+ {title: "Dry Weight", value: "110 lbs"},
+ {title: "Thrusters", value: "6 Seabotix BTD150 | 2 VideoRay GTO"},
+ {title: "Dimensions", value: "50″ x 18″ x 18″"},
+ {title: "Max Depth", value: "150 feet"},
+ {title: "Navigation", value: "Teledyne Explorer DVL | Analog Devices IMU"},
+ {title: "Max Speed", value: "1 m/s"},
+ {title: "Battery Life", value: "6 hours"},
+ {title: "Cameras", value: "2 IDS uEye SE"},
+];
+
+const SUBJUGATOR7LINKS = {
+ mechanicalLink: "#subjugator-mechanical-section",
+ electricalLink: "#subjugator-electrical-section",
+ softwareLink: "#subjugator-software-section",
+}
+
+const COMPETITIONTABLE = [
+ {
+ version: "7.4",
+ year: 2014,
+ competition: "RoboSub 17",
+ place: "2nd",
+ photosLink: "http://subjugator.org/?page_id=2372",
+ teamLink: "http://subjugator.org/?page_id=2275",
+ publicationLink: "http://subjugator.org/wp-content/uploads/2014/09/subjugator_2014.pdf",
+ },
+ {
+ version: "7.3",
+ year: 2013,
+ competition: "RoboSub 16",
+ place: "2nd",
+ photosLink: "http://subjugator.org/?page_id=1912",
+ teamLink: "http://subjugator.org/?page_id=1717",
+ publicationLink: "http://subjugator.org/wp-content/uploads/2013/07/subjugator_2013.pdf",
+ },
+ {
+ version: "7.2",
+ year: 2012,
+ competition: "RoboSub 15",
+ place: "2nd",
+ photosLink: "http://subjugator.org/?page_id=1063",
+ teamLink: "http://subjugator.org/?page_id=1045",
+ publicationLink: "http://subjugator.org/wp-content/uploads/2012/06/SubjuGator-2012.pdf",
+ },
+ {
+ version: "7.1",
+ year: 2011,
+ competition: "RoboSub 14",
+ place: "3rd",
+ photosLink: "http://subjugator.org/?page_id=387",
+ teamLink: "http://subjugator.org/?page_id=187",
+ publicationLink: "http://subjugator.org/wp-content/uploads/2011/06/AUVSI-Publication-2011.pdf",
+ fcrarLink: "http://subjugator.org/wp-content/uploads/2012/05/FCRAR-Publication-2011.pdf",
+ },
+];
+
+const CAMERAINFO = "Machine vision is incorporated into the AUV through the use of independently housed IDS uEye machine vision cameras. The decision to design a separate pressure vessel for each camera is beneficial since both the number and location of cameras is freely adaptable up to the limit of the number of USB connections exposed by the main hull.";
+
+const SONSARINFO = "The ability to track a acoustic source in the water is encapsulated into the passive sonar pressure vessel. Also included in the system design is the capabilities to utilize multiple pneumatic driven actuators. The currently integrated actuators include a dropper mechanism, a projectile shooting mechanism, and two grabbing manipulators.";
+function InfoCard({title, spec}) {
+ return
+
{title}
+
{spec ?? "Unknown"}
+
+}
+
+function ExtraLinks({mechanicalLink, electricalLink, softwareLink}) {
+ return
+}
+
+function SubjugatorMechanicalSection() {
+ return
+
Mechanical
+
A primary objective of SubjuGator 7 is the ability to sustain operation after a failure has occurred. To facilitate this goal, the vehicle is designed so that during a failure event (e.g., mechanical or electrical), the faulted system as a whole is still capable of completing a task, or at the very least, safely returning to a recovery point to be removed from the environment. A fault tolerant design motivates a modular system structure, with each module performing specific tasks while communicating with other modules via an ethernet medium. Modules are typically encapsulated in their own pressure vessel, but there is no requirement for all modules to be isolated. Each pressure vessel is designed to meet the desired shallow water depth rating of 150 feet(~45 meters). To achieve this constraint, all pressure vessels in the current configuration are manufactured from 6061-T6 aluminum alloy which is hard-anodized for electrical insulation and corrosion resistance. Interconnections between modules are made using wet-mate-able connectors, allowing for easy addition or removal in the work environment.
+
To incorporate the different modules into a suitable AUV platform, a 6061-T6 aluminum bottom hull was designed and manufactured. It is split into three folding weldments for easy access to the main pressure vessel or shipping, and acts to both streamline the underside of the AUV, as well as protect it from collision.
+
+}
+
+function SubjugatorElectricalSection() {
+ return
+
Electrical
+
The main pressure vessel of the SubjuGator 7 AUV contains vehicle specific electrical hardware, and connections to environment sensors, e.g., cameras, passive sonar,water temperature sensors, etc. It contains the following major components:
+
+ - COTS Intel Xeon Mainboard in Mini-ITX form factor
+ - COTS Dual 8 port Ethernet Switches
+ - 8 Motor Control Modules
+ - Power management and monitoring circuitry
+
+
The primary computer performs environment sensing and mission level tasks. It also allows for the connectivity of USB peripherals, such as cameras and specialized data acquisition devices.
+
The navigation computer consists of the following major components:
+
+ - Gumstix Overo Computer-On-Module (COM) containing a Texas Instruments OMAP3530 application processor at 720MHz
+ - Altera Cyclone II FPGA
+ - Analog Devices ADIS16405 9 degree of freedom IMU
+ - GPS receiver capable of 14 channel tracking and 10Hz update rate
+ - RS-232 connections to additional sensors
+ - 10/100BASE-TX Ethernet Communication
+
+
The components are combined on a custom printed circuit board (PCB) with a small form factor of 3″x2.5″ and weigh-ing less than 2 ounces excluding the GPS antenna. Despite its compact size, the board exposes enough processing power and sensor inputs to allow for accurate navigation of the AUV.
+
+}
+
+function SubjuGatorSoftwareSection() {
+ return
+
Software
+
SubjuGator 7’s software stack is built on the Robot Operating System (ROS) Fuerte. ROS is an open source framework that combines many libraries, simulators, and algorithms useful for robots, and defines a simple publish/subscribe communication framework to allow for easy interoperation. By porting our existing algorithms to ROS, we gained access to its vehicle-agnostic logging, visualization, state machine, and debugging tools. Similarly, we strived to keep our in-house algorithms as general as possible, and through ROS, were able to use several SubjuGator algorithms on PropaGator, our univerity’s entry into the RoboBoat competition. After RoboSub 2013, we intend to contribute our repositories to the greater ROS community in hopes that even more projects will make use of them.
+
Key components of SubjuGator 7 software include:
+
+ - Thruster Mapper: Responsible for translating a wrench onto an arbitrary set of thruster efforts using a least squares regression.
+ - State Estimator: Determines vehicle pose utilizing an inertial navigation system and an indirect (error-state) extended Kalman filter.
+ - Trajectory Generator: Based on a nonlinear filter that produces 3rd order continuous trajectories given vehicle constraints on velocity, acceleration, and jerk.
+ - Controller: Responsible for keeping the vehicle on the trajectory and correcting for disturbances such as drag and thruster variation.
+ - Mission Planner: Responsible for high level autonomy and completing the competition tasks. Based around a ROS framework called SMACH, which implements a hierarchical state machine.
+ - Vision Processing: Novel approach for robustly finding objects in varying lighting and water conditions using a particle filter.
+ - Simulation: Combines a graphics and physics engine with a virtual submarine, creating a closed loop with sensor data flowing to our software stack and actuator data returning to create responses in the simulation.
+
+
For additional information about SubjuGator 7, please see our latest AUVSI Publication, or the publications listed above.
+
+}
+
+function SubjugatorInfoGeneral({title, info}) {
+ return
+}
+
+function SubjugatorInfo({name, specs, info, photo, links, ref}) {
+ return
+
+
{name}
+
{info && info.trim() ? info : "See More Info Below."}
+
+
+
+

+
{name}
+
+
+ {specs.map((spec, index) => (
+
+ ))}
+
+
+}
+
+function CompetitionTable({table, ref}) {
+ return
+
+
+
+ | Version |
+ Year |
+ Competition |
+ Place |
+ Photos |
+ Team |
+ Publication |
+
+
+
+ {table.map((row) => (
+
+ | {row.version} |
+ {row.year} |
+ {row.competition} |
+ {row.place} |
+
+ Photos {row.year}
+ |
+
+ Team {row.year}
+ |
+
+ {row.publicationLink && (
+ <>
+ AUVSI
+ >
+ )}
+ {row.fcrarLink && (
+ <>
+ |
+ FCRAR
+ >
+ )}
+ |
+
+ ))}
+
+
+
+}
+
+function Subjugator7() {
+
+ const infoRef = useRef(null);
+ const sub1Ref = useRef(null);
+ const tableRef = useRef(null);
+ const moreInfoRef = useRef(null);
+
+ useEffect(() => {
+ const info = infoRef.current;
+ const sub1 = sub1Ref.current;
+ const table = tableRef.current;
+ const moreInfo = moreInfoRef.current;
+
+ const tids = [];
+ tids.push(setTimeout(() => info?.classList.add("animate-slideUp"), 100));
+ tids.push(setTimeout(() => sub1?.classList.add("animate-slideUp"), 200));
+ tids.push(setTimeout(() => table?.classList.add("animate-slideUp"), 300));
+ tids.push(setTimeout(() => moreInfo?.classList.add("animate-slideUp"), 400));
+
+ return () => tids.forEach(clearTimeout);
+ }, []);
+
+ return <>
+
+
+
Subjugator 7
+
UF’s seventh generation vehicle, SubjuGator 7, competed in the 2011, 2012, 2013, and 2014 RoboSub competition.
+
+
+
+
+
+
+
+
+
+
+
+ >
+}
+
+export default Subjugator7;
\ No newline at end of file
diff --git a/src/assets/Sub7.jpg b/src/assets/Sub7.jpg
new file mode 100644
index 0000000..0b3bec5
Binary files /dev/null and b/src/assets/Sub7.jpg differ
diff --git a/src/styles/Subjugator7.css b/src/styles/Subjugator7.css
new file mode 100644
index 0000000..b5d1692
--- /dev/null
+++ b/src/styles/Subjugator7.css
@@ -0,0 +1,385 @@
+.subjugator5-page, .subjugator7-page {
+ margin-top: 50px;
+ padding: var(--space-xl);
+ display: flex;
+ flex-direction: column;
+ gap: calc(var(--space-xl) + 0.5rem);
+}
+
+.subjugator5-page-header, .subjugator7-page-header {
+ text-align: center;
+ margin-bottom: 0.5rem;
+}
+.subjugator5-page-title, .subjugator7-page-title {
+ margin: 0.25rem 0;
+ font-size: 2.4rem;
+}
+.subjugator-page-info {
+ margin: 0.25rem auto 0;
+ max-width: 76ch;
+ color: var(--color-text-secondary);
+}
+
+.subjugator-info-wrapper {
+ display: grid;
+ grid-template-columns: 1fr 360px;
+ grid-template-rows: auto 1fr;
+ grid-template-areas:
+ "info image"
+ "specs specs";
+ gap: 1rem;
+ column-gap: 2rem;
+ align-items: start;
+ padding: 1.25rem;
+ border-radius: 12px;
+ background: linear-gradient(135deg, #000000 0%, #2b2b2b 100%);
+ backdrop-filter: blur(6px) saturate(1.02);
+ -webkit-backdrop-filter: blur(6px) saturate(1.02);
+ border: 1px solid rgba(255,255,255,0.06);
+ box-shadow: 0 10px 34px rgba(0,0,0,0.6);
+ position: relative;
+ z-index: 1;
+}
+
+.subjugator-info-box {
+ padding: 1rem 1rem;
+ text-align: left;
+ grid-area: info;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.subjugator-title {
+ margin: 0 0 0.5rem 0;
+ font-size: 1.9rem;
+ font-weight: 700;
+ color: var(--color-primary);
+ letter-spacing: 0.6px;
+ text-transform: uppercase;
+ display: inline-block;
+}
+
+.subjugator-title::after {
+ content: '';
+ display: block;
+ width: 72px;
+ height: 4px;
+ margin-top: 0.6rem;
+ border-radius: 2px;
+ background: var(--color-primary);
+}
+
+.subjugator-info {
+ margin: 0 0 1rem 0;
+ color: rgba(255,255,255,0.85);
+}
+
+.subjugator-image-box {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ grid-area: image;
+ padding-left: 0.5rem;
+}
+
+.subjugator-image {
+ width: 100%;
+ height: auto;
+ max-width: 420px;
+ border-radius: 8px;
+ box-shadow: 0 8px 20px rgba(0,0,0,0.5);
+ object-fit: cover;
+ display: block;
+ margin: 0 auto;
+}
+
+.subjugator-image {
+ transition: transform 220ms cubic-bezier(.2,.9,.25,1), box-shadow 220ms ease;
+ transform-origin: center;
+ will-change: transform, box-shadow;
+}
+
+.subjugator-image-box:hover .subjugator-image,
+.subjugator-image:focus,
+.subjugator-image:focus-visible {
+ transform: translateY(-6px) scale(1.04);
+ box-shadow: 0 18px 36px rgba(0,0,0,0.6);
+}
+
+.subjugator-image:active {
+ transform: translateY(-2px) scale(1.02);
+}
+
+.subjugator7-more-info {
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+ margin-top: 1.5rem;
+ padding: 0.8rem;
+}
+
+.subjugator7-more-info h3 {
+ margin: 0 0 0.5rem 0;
+ text-align: left;
+ color: var(--color-primary);
+ font-size: 1.25rem;
+}
+.subjugator7-more-info p {
+ margin: 0 0 1rem 0;
+ text-align: left;
+ color: rgba(255,255,255,0.92);
+ line-height: 1.6;
+}
+.subjugator7-more-info ul {
+ margin: 0 0 1rem 0;
+ padding-left: 1.35rem;
+ text-align: left;
+}
+.subjugator7-more-info li {
+ margin-bottom: 0.6rem;
+}
+
+.subjugator7-more-info p + p,
+.subjugator7-more-info p + ul,
+.subjugator7-more-info ul + p,
+.subjugator7-more-info ul + ul {
+ margin-top: 0.6rem;
+}
+
+#subjugator-mechanical-section,
+#subjugator-electrical-section,
+#subjugator-software-section {
+ scroll-margin-top: 96px;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .subjugator-image {
+ transition: none;
+ will-change: auto;
+ }
+ .subjugator-image-box:hover .subjugator-image,
+ .subjugator-image:focus,
+ .subjugator-image:focus-visible,
+ .subjugator-image:active {
+ transform: none;
+ box-shadow: 0 8px 20px rgba(0,0,0,0.5);
+ }
+}
+
+.subjugator-image-label {
+ margin: 0;
+ font-size: 1rem;
+ color: var(--color-primary);
+}
+
+.subjugator-specs-box {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(140px, 1fr));
+ gap: 0.75rem;
+ padding: 0.75rem 0.75rem 0 0.75rem;
+ grid-area: specs;
+}
+
+.table-wrapper {
+ margin-top: 1rem;
+ padding: 0.8rem;
+ background: linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01));
+ border-radius: 10px;
+ border: 1px solid rgba(255,255,255,0.04);
+ box-shadow: 0 8px 30px rgba(0,0,0,0.35);
+}
+.results-table {
+ width: 100%;
+ border-collapse: collapse;
+ color: rgba(255,255,255,0.9);
+ font-size: 0.95rem;
+}
+.results-table thead th {
+ text-align: left;
+ padding: 0.6rem 0.75rem;
+ font-weight: 700;
+ color: var(--color-primary);
+ border-bottom: 1px solid rgba(255,255,255,0.04);
+}
+.results-table tbody td {
+ padding: 0.6rem 0.75rem;
+ border-bottom: 1px dashed rgba(255,255,255,0.03);
+ vertical-align: middle;
+}
+.results-table a {
+ color: rgba(255,255,255,0.9);
+ text-decoration: underline;
+}
+
+.results-table tbody tr {
+ border-left: 4px solid rgba(250,70,22,0.06);
+ transition: border-color 180ms ease, background-color 180ms ease, transform 180ms ease;
+}
+.results-table tbody tr:hover {
+ border-left-color: var(--color-primary);
+ background: rgba(250,70,22,0.02);
+ transform: translateY(-2px);
+}
+.results-table tbody tr:nth-child(odd) {
+ background: rgba(0,0,0,0.01);
+}
+
+@media (max-width: 800px) {
+ .results-table thead {
+ display: none;
+ }
+ .results-table, .results-table tbody, .results-table tr, .results-table td {
+ display: block;
+ width: 100%;
+ }
+ .results-table tr {
+ margin-bottom: 0.85rem;
+ background: rgba(0,0,0,0.03);
+ border-radius: 8px;
+ padding: 0.6rem;
+ border-left: 4px solid rgba(250,70,22,0.06);
+ }
+ .results-table td {
+ padding: 0.35rem 0.5rem;
+ }
+}
+
+.info-card {
+ background-color: var(--color-ui-dark);
+ border-radius: 8px;
+ padding: 0.6rem;
+ text-align: left;
+ border: 1px solid rgba(255,255,255,0.03);
+ transition: transform 220ms cubic-bezier(.2,.9,.25,1), box-shadow 220ms ease, border-color 220ms ease, background-color 220ms ease;
+ transform-origin: center;
+ will-change: transform, box-shadow;
+ box-shadow: 0 6px 18px rgba(0,0,0,0.35);
+ position: relative;
+ overflow: hidden;
+ border-left: 4px solid var(--color-primary);
+}
+
+.info-card-title {
+ margin: 0 0 0.25rem 0;
+ font-size: 0.95rem;
+ color: var(--color-primary);
+ font-weight: 600;
+}
+
+.info-card-spec {
+ margin: 0;
+ font-size: 0.9rem;
+ color: var(--color-text-secondary);
+}
+
+.info-card:hover,
+.info-card:focus-within,
+.info-card:focus {
+ transform: translateY(-6px) scale(1.04);
+ box-shadow: 0 18px 36px rgba(0,0,0,0.5);
+ border-color: rgba(250,70,22,0.16);
+ background-color: rgba(250,70,22,0.03);
+}
+
+.info-card:active {
+ transform: translateY(-2px) scale(1.02);
+}
+
+@keyframes subcard-pop {
+ from {
+ opacity: 0;
+ transform: translateY(6px) scale(0.99);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0) scale(1);
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .info-card {
+ transition: none;
+ animation: none;
+ will-change: auto;
+ }
+ .info-card:hover,
+ .info-card:focus-within,
+ .info-card:focus,
+ .info-card:active {
+ transform: none;
+ box-shadow: 0 6px 18px rgba(0,0,0,0.35);
+ }
+}
+
+.extra-links {
+ display: flex;
+ gap: 0.6rem;
+ margin-top: 0.6rem;
+ flex-wrap: wrap;
+}
+
+.extra-link {
+ display: inline-flex;
+ align-items: center;
+ padding: 0.45rem 0.7rem;
+ border-radius: 8px;
+ border: 1px solid rgba(250,70,22,0.12);
+ background: transparent;
+ text-decoration: none;
+}
+
+.extra-link:hover {
+ background: rgba(250,70,22,0.06);
+ transform: translateY(-1px);
+}
+
+.extra-link-text {
+ margin: 0;
+ font-size: 0.95rem;
+ color: inherit;
+}
+
+@media (max-width: 980px) {
+ .subjugator-info-wrapper {
+ grid-template-columns: 1fr;
+ gap: 1rem;
+ }
+ .subjugator-image {
+ max-width: 480px;
+ }
+}
+
+@media (max-width: 900px) {
+ .subjugator-specs-box {
+ grid-template-columns: repeat(2, minmax(140px, 1fr));
+ }
+}
+
+@media (max-width: 480px) {
+ .subjugator-specs-box {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ .subjugator-info-wrapper {
+ border: 1px solid rgba(100,108,255,0.08);
+ background: linear-gradient(180deg, rgba(0,0,0,0.02), rgba(0,0,0,0.01));
+ }
+ .info-card {
+ background: rgba(255,255,255,0.96);
+ color: #213547;
+ border: 1px solid rgba(33,53,71,0.04);
+ border-left: 4px solid var(--color-primary);
+ }
+ .extra-link {
+ border: 1px solid rgba(250,70,22,0.08);
+ }
+}
\ No newline at end of file