Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import RoboSub from "./Pages/RoboSub";
import AUVTechnology from "./Pages/AUVTechnology";
import Sponsors from "./Pages/Sponsors";
import OurTeam from "./Pages/OurTeam";
import Subjugator7 from "./Pages/VehiclePages/Subjugator7";
import "./App.css";

function App() {
Expand All @@ -24,6 +25,7 @@ function App() {
<Route path="/ourteam" element={<OurTeam />} />
<Route path="/sponsors" element={<Sponsors />} />
<Route path="/contact" element={<Contact />} />
<Route path="/subjugator7" element={<Subjugator7/>}/>
</Routes>
</main>
{/* We'll add a footer component later */}
Expand Down
250 changes: 250 additions & 0 deletions src/Pages/VehiclePages/Subjugator7.jsx
Original file line number Diff line number Diff line change
@@ -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 <div className="info-card">
<h5 className="info-card-title">{title}</h5>
<p className="info-card-spec">{spec ?? "Unknown"}</p>
</div>
}

function ExtraLinks({mechanicalLink, electricalLink, softwareLink}) {
return <div className="extra-links">
<a href={mechanicalLink} className="extra-link">
<h5 className="extra-link-text">Mechanical</h5>
</a>
<a href={electricalLink} className="extra-link">
<h5 className="extra-link-text">Electrical</h5>
</a>
<a href={softwareLink} className="extra-link">
<h5 className="extra-link-text">Software</h5>
</a>
</div>
}

function SubjugatorMechanicalSection() {
return <div id="subjugator-mechanical-section" className="subjugator-mechanical-section">
<h3>Mechanical</h3>
<p>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.</p>
<p>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.</p>
</div>
}

function SubjugatorElectricalSection() {
return <div id="subjugator-electrical-section" className="subjugator-electrical-section">
<h3>Electrical</h3>
<p>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:</p>
<ul>
<li>COTS Intel Xeon Mainboard in Mini-ITX form factor</li>
<li>COTS Dual 8 port Ethernet Switches</li>
<li>8 Motor Control Modules</li>
<li>Power management and monitoring circuitry</li>
</ul>
<p>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.</p>
<p>The navigation computer consists of the following major components:</p>
<ul>
<li>Gumstix Overo Computer-On-Module (COM) containing a Texas Instruments OMAP3530 application processor at 720MHz</li>
<li>Altera Cyclone II FPGA</li>
<li>Analog Devices ADIS16405 9 degree of freedom IMU</li>
<li>GPS receiver capable of 14 channel tracking and 10Hz update rate</li>
<li>RS-232 connections to additional sensors</li>
<li>10/100BASE-TX Ethernet Communication</li>
</ul>
<p>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.</p>
</div>
}

function SubjuGatorSoftwareSection() {
return <div id="subjugator-software-section" className="subjugator-software-section">
<h3>Software</h3>
<p>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.</p>
<p>Key components of SubjuGator 7 software include:</p>
<ul>
<li>Thruster Mapper: Responsible for translating a wrench onto an arbitrary set of thruster efforts using a least squares regression.</li>
<li>State Estimator: Determines vehicle pose utilizing an inertial navigation system and an indirect (error-state) extended Kalman filter.</li>
<li>Trajectory Generator: Based on a nonlinear filter that produces 3rd order continuous trajectories given vehicle constraints on velocity, acceleration, and jerk.</li>
<li>Controller: Responsible for keeping the vehicle on the trajectory and correcting for disturbances such as drag and thruster variation.</li>
<li>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.</li>
<li>Vision Processing: Novel approach for robustly finding objects in varying lighting and water conditions using a particle filter.</li>
<li>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.</li>
</ul>
<p>For additional information about SubjuGator 7, please see our latest <a href="http://subjugator.org/wp-content/uploads/2013/07/subjugator_2013.pdf">AUVSI Publication</a>, or the publications listed above.</p>
</div>
}

function SubjugatorInfoGeneral({title, info}) {
return <div className="subjugator-info-section">
<h3>{title}</h3>
<p>{info}</p>
</div>
}

function SubjugatorInfo({name, specs, info, photo, links, ref}) {
return <div className="subjugator-info-wrapper" ref={ref}>
<div className="subjugator-info-box">
<h2 className="subjugator-title">{name}</h2>
<p className="subjugator-info">{info && info.trim() ? info : "See More Info Below."}</p>
<ExtraLinks mechanicalLink={links.mechanicalLink} electricalLink={links.electricalLink} softwareLink={links.softwareLink}/>
</div>
<div className="subjugator-image-box">
<img src={photo} className="subjugator-image"/>
<h3 className="subjugator-image-label">{name}</h3>
</div>
<div className="subjugator-specs-box">
{specs.map((spec, index) => (
<InfoCard key={index} title={spec.title} spec={spec.value}/>
))}
</div>
</div>
}

function CompetitionTable({table, ref}) {
return <div className="table-wrapper" ref={ref}>
<table className="results-table">
<thead>
<tr>
<th>Version</th>
<th>Year</th>
<th>Competition</th>
<th>Place</th>
<th>Photos</th>
<th>Team</th>
<th>Publication</th>
</tr>
</thead>
<tbody>
{table.map((row) => (
<tr key={row.version}>
<td>{row.version}</td>
<td>{row.year}</td>
<td>{row.competition}</td>
<td>{row.place}</td>
<td>
<a href={row.photosLink}>Photos {row.year}</a>
</td>
<td>
<a href={row.teamLink}>Team {row.year}</a>
</td>
<td>
{row.publicationLink && (
<>
<a href={row.publicationLink} target="_blank" rel="noreferrer">AUVSI</a>
</>
)}
{row.fcrarLink && (
<>
<span className="publication-sep"> &nbsp;|&nbsp; </span>
<a href={row.fcrarLink} target="_blank" rel="noreferrer">FCRAR</a>
</>
)}
</td>
</tr>
))}
</tbody>
</table>
</div>
}

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 <>
<div className="subjugator7-page">
<div className="subjugator7-page-header" ref={infoRef}>
<h1 className="subjugator7-page-title">Subjugator 7</h1>
<p className="subjugator-page-info">UF’s seventh generation vehicle, SubjuGator 7, competed in the 2011, 2012, 2013, and 2014 RoboSub competition.</p>
</div>
<SubjugatorInfo name="Subjugator 7" specs={SUBJUGATOR7SPECS} photo={Image} links={SUBJUGATOR7LINKS} ref={sub1Ref}/>
<CompetitionTable table={COMPETITIONTABLE} ref={tableRef}/>
<div className="subjugator7-more-info" ref={moreInfoRef}>
<SubjugatorMechanicalSection/>
<SubjugatorInfoGeneral title="Cameras" info={CAMERAINFO}/>
<SubjugatorInfoGeneral title="Passive Sonar and Actuators" info={SONSARINFO}/>
<SubjugatorElectricalSection/>
<SubjuGatorSoftwareSection/>
</div>
</div>
</>
}

export default Subjugator7;
Binary file added src/assets/Sub7.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading