2023-01-29 21:03:26 -06:00
<!DOCTYPE HTML>
<!-- NewPage -->
< html lang = "en" >
< head >
2023-01-31 10:52:13 -06:00
<!-- Generated by javadoc (11.0.13) on Tue Jan 31 10:51:37 CST 2023 -->
2023-01-29 21:03:26 -06:00
< title > SwerveModule< / title >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >
2023-01-31 10:52:13 -06:00
< meta name = "dc.created" content = "2023-01-31" >
2023-01-29 21:03:26 -06:00
< link rel = "stylesheet" type = "text/css" href = "../../../../../stylesheet.css" title = "Style" >
< link rel = "stylesheet" type = "text/css" href = "../../../../../jquery/jquery-ui.css" title = "Style" >
< script type = "text/javascript" src = "../../../../../script.js" > < / script >
< script type = "text/javascript" src = "../../../../../jquery/jszip/dist/jszip.min.js" > < / script >
< script type = "text/javascript" src = "../../../../../jquery/jszip-utils/dist/jszip-utils.min.js" > < / script >
<!-- [if IE]>
< script type = "text/javascript" src = "../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js" > < / script >
<![endif]-->
< script type = "text/javascript" src = "../../../../../jquery/jquery-3.5.1.js" > < / script >
< script type = "text/javascript" src = "../../../../../jquery/jquery-ui.js" > < / script >
< / head >
< body >
< script type = "text/javascript" > < ! - -
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="SwerveModule";
}
}
catch(err) {
}
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":9,"i28":10};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');< / script >
< noscript >
< div > JavaScript is disabled on your browser.< / div >
< / noscript >
< header role = "banner" >
< nav role = "navigation" >
< div class = "fixedNav" >
<!-- ========= START OF TOP NAVBAR ======= -->
< div class = "topNav" > < a id = "navbar.top" >
<!-- -->
< / a >
< div class = "skipNav" > < a href = "#skip.navbar.top" title = "Skip navigation links" > Skip navigation links< / a > < / div >
< a id = "navbar.top.firstrow" >
<!-- -->
< / a >
< ul class = "navList" title = "Navigation" >
< li > < a href = "../../../../../index.html" > Overview< / a > < / li >
< li > < a href = "package-summary.html" > Package< / a > < / li >
< li class = "navBarCell1Rev" > Class< / li >
2023-01-31 10:52:13 -06:00
< li > < a href = "class-use/SwerveModule.html" > Use< / a > < / li >
2023-01-29 21:03:26 -06:00
< li > < a href = "package-tree.html" > Tree< / a > < / li >
< li > < a href = "../../../../../deprecated-list.html" > Deprecated< / a > < / li >
< li > < a href = "../../../../../index-files/index-1.html" > Index< / a > < / li >
< li > < a href = "../../../../../help-doc.html" > Help< / a > < / li >
< / ul >
< / div >
< div class = "subNav" >
< ul class = "navList" id = "allclasses_navbar_top" >
< li > < a href = "../../../../../allclasses.html" > All Classes< / a > < / li >
< / ul >
< ul class = "navListSearch" >
< li > < label for = "search" > SEARCH:< / label >
< input type = "text" id = "search" value = "search" disabled = "disabled" >
< input type = "reset" id = "reset" value = "reset" disabled = "disabled" >
< / li >
< / ul >
< div >
< script type = "text/javascript" > < ! - -
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
< / script >
< noscript >
< div > JavaScript is disabled on your browser.< / div >
< / noscript >
< / div >
< div >
< ul class = "subNavList" >
< li > Summary: < / li >
< li > < a href = "#nested.class.summary" > Nested< / a > | < / li >
< li > < a href = "#field.summary" > Field< / a > | < / li >
< li > < a href = "#constructor.summary" > Constr< / a > | < / li >
< li > < a href = "#method.summary" > Method< / a > < / li >
< / ul >
< ul class = "subNavList" >
< li > Detail: < / li >
< li > < a href = "#field.detail" > Field< / a > | < / li >
< li > < a href = "#constructor.detail" > Constr< / a > | < / li >
< li > < a href = "#method.detail" > Method< / a > < / li >
< / ul >
< / div >
< a id = "skip.navbar.top" >
<!-- -->
< / a > < / div >
<!-- ========= END OF TOP NAVBAR ========= -->
< / div >
< div class = "navPadding" > < / div >
< script type = "text/javascript" > < ! - -
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
< / script >
< / nav >
< / header >
<!-- ======== START OF CLASS DATA ======== -->
< main role = "main" >
< div class = "header" >
< div class = "subTitle" > < span class = "packageLabelInType" > Package< / span > < a href = "package-summary.html" > frc.robot.subsystems.swervedrive.swerve< / a > < / div >
< h2 title = "Class SwerveModule" class = "title" > Class SwerveModule< DriveMotorType extends edu.wpi.first.wpilibj.motorcontrol.MotorController,​ AngleMotorType extends edu.wpi.first.wpilibj.motorcontrol.MotorController,​ AbsoluteEncoderType> < / h2 >
< / div >
< div class = "contentContainer" >
< ul class = "inheritance" >
< li > java.lang.Object< / li >
< li >
< ul class = "inheritance" >
< li > frc.robot.subsystems.swervedrive.swerve.SwerveModule< DriveMotorType,​ AngleMotorType,​ AbsoluteEncoderType> < / li >
< / ul >
< / li >
< / ul >
< div class = "description" >
< ul class = "blockList" >
< li class = "blockList" >
< dl >
< dt > < span class = "paramLabel" > Type Parameters:< / span > < / dt >
< dd > < code > DriveMotorType< / code > - Main motor type that drives the wheel.< / dd >
< dd > < code > AngleMotorType< / code > - Motor that controls the angle of the wheel.< / dd >
< dd > < code > AbsoluteEncoderType< / code > - Absolute encoder for the swerve drive module.< / dd >
< / dl >
< dl >
< dt > All Implemented Interfaces:< / dt >
< dd > < code > edu.wpi.first.util.sendable.Sendable< / code > , < code > edu.wpi.first.wpilibj.motorcontrol.MotorController< / code > , < code > java.lang.AutoCloseable< / code > < / dd >
< / dl >
< hr >
< pre > public class < span class = "typeNameLabel" > SwerveModule< DriveMotorType extends edu.wpi.first.wpilibj.motorcontrol.MotorController,​ AngleMotorType extends edu.wpi.first.wpilibj.motorcontrol.MotorController,​ AbsoluteEncoderType> < / span >
extends java.lang.Object
implements edu.wpi.first.wpilibj.motorcontrol.MotorController, edu.wpi.first.util.sendable.Sendable, java.lang.AutoCloseable< / pre >
< div class = "block" > Swerve module for representing a single swerve module of the robot.< / div >
< / li >
< / ul >
< / div >
< div class = "summary" >
< ul class = "blockList" >
< li class = "blockList" >
<!-- ======== NESTED CLASS SUMMARY ======== -->
< section role = "region" >
< ul class = "blockList" >
< li class = "blockList" > < a id = "nested.class.summary" >
<!-- -->
< / a >
< h3 > Nested Class Summary< / h3 >
< table class = "memberSummary" >
< caption > < span > Nested Classes< / span > < span class = "tabEnd" > < / span > < / caption >
< tr >
< th class = "colFirst" scope = "col" > Modifier and Type< / th >
< th class = "colSecond" scope = "col" > Class< / th >
< th class = "colLast" scope = "col" > Description< / th >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > static class < / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.SwerveModuleLocation< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Swerve Module location on the robot.< / div >
< / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > static class < / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "SwerveModule.Verbosity.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.Verbosity< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Verbosity levels for data publishing,< / div >
< / td >
< / tr >
< / table >
< / li >
< / ul >
< / section >
<!-- =========== FIELD SUMMARY =========== -->
< section role = "region" >
< ul class = "blockList" >
< li class = "blockList" > < a id = "field.summary" >
<!-- -->
< / a >
< h3 > Field Summary< / h3 >
< table class = "memberSummary" >
< caption > < span > Fields< / span > < span class = "tabEnd" > < / span > < / caption >
< tr >
< th class = "colFirst" scope = "col" > Modifier and Type< / th >
< th class = "colSecond" scope = "col" > Field< / th >
< th class = "colLast" scope = "col" > Description< / th >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > private < a href = "SwerveEncoder.html" title = "class in frc.robot.subsystems.swervedrive.swerve" > SwerveEncoder< / a > < ?> < / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#absoluteEncoder" > absoluteEncoder< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Absolute encoder for the swerve module.< / div >
< / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#angleOffset" > angleOffset< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Angle offset of the CANCoder at initialization.< / div >
< / td >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > private edu.wpi.first.math.controller.SimpleMotorFeedforward< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#driveFeedforward" > driveFeedforward< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Drive feedforward for PID when driving by velocity.< / div >
< / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > < a href = "SwerveMotor.html" title = "class in frc.robot.subsystems.swervedrive.swerve" > SwerveMotor< / a > < / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#driveMotor" > driveMotor< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Motor Controllers for drive motor of the swerve module.< / div >
< / td >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > private double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#drivePower" > drivePower< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Power to drive motor from -1 to 1.< / div >
< / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > private double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#driveTrainWidth" > driveTrainWidth< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > The Distance between centers of right and left wheels in meters.< / div >
< / td >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > private boolean< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#invertedDrive" > invertedDrive< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Inverted drive motor.< / div >
< / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > private boolean< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#invertedTurn" > invertedTurn< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Inverted turning motor.< / div >
< / td >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#maxDriveSpeedMPS" > maxDriveSpeedMPS< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Maximum speed in meters per second, used to eliminate unnecessary movement of the module.< / div >
< / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > private edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#moduleTab" > moduleTab< / a > < / span > < / code > < / th >
< td class = "colLast" > < / td >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > private java.util.HashMap< java.lang.String,​ edu.wpi.first.wpilibj.shuffleboard.SimpleWidget> < / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#NT4Entries" > NT4Entries< / a > < / span > < / code > < / th >
< td class = "colLast" > < / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > private double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#steeringKV" > steeringKV< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > kV for steering feedforward.< / div >
< / td >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > private < a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.SwerveModuleLocation< / a > < / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#swerveLocation" > swerveLocation< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Enum representing the swerve module's location on the robot, assuming square.< / div >
< / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > edu.wpi.first.math.geometry.Translation2d< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#swerveModuleLocation" > swerveModuleLocation< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Swerve Module location object relative to the center of the robot.< / div >
< / td >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > private double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#targetAngle" > targetAngle< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Store the last angle for optimization.< / div >
< / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > private double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#targetAngularVelocityRPS" > targetAngularVelocityRPS< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Angular velocity in radians per second.< / div >
< / td >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > private double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#targetVelocity" > targetVelocity< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Target velocity for the swerve module.< / div >
< / td >
< / tr >
< tr class = "rowColor" >
< td class = "colFirst" > < code > < a href = "SwerveMotor.html" title = "class in frc.robot.subsystems.swervedrive.swerve" > SwerveMotor< / a > < / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#turningMotor" > turningMotor< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > Motor Controller for the turning motor of the swerve drive module.< / div >
< / td >
< / tr >
< tr class = "altColor" >
< td class = "colFirst" > < code > private double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#wheelBase" > wheelBase< / a > < / span > < / code > < / th >
< td class = "colLast" >
< div class = "block" > The Distance between front and back wheels of the robot in meters.< / div >
< / td >
< / tr >
< / table >
< / li >
< / ul >
< / section >
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
< section role = "region" >
< ul class = "blockList" >
< li class = "blockList" > < a id = "constructor.summary" >
<!-- -->
< / a >
< h3 > Constructor Summary< / h3 >
< table class = "memberSummary" >
< caption > < span > Constructors< / span > < span class = "tabEnd" > < / span > < / caption >
< tr >
< th class = "colFirst" scope = "col" > Constructor< / th >
< th class = "colLast" scope = "col" > Description< / th >
< / tr >
< tr class = "altColor" >
< th class = "colConstructorName" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#%3Cinit%3E(DriveMotorType,AngleMotorType,AbsoluteEncoderType,frc.robot.subsystems.swervedrive.swerve.SwerveModule.SwerveModuleLocation,double,double,double,double,double,double,double,double,double,double,double,boolean,boolean)" > SwerveModule< / a > < / span > ​ (< a href = "SwerveModule.html" title = "type parameter in SwerveModule" > DriveMotorType< / a > mainMotor,
< a href = "SwerveModule.html" title = "type parameter in SwerveModule" > AngleMotorType< / a > angleMotor,
< a href = "SwerveModule.html" title = "type parameter in SwerveModule" > AbsoluteEncoderType< / a > encoder,
< a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.SwerveModuleLocation< / a > swervePosition,
double driveGearRatio,
double steerGearRatio,
double steeringOffsetDegrees,
double wheelDiameterMeters,
double wheelBaseMeters,
double driveTrainWidthMeters,
double steeringMotorFreeSpeedRPM,
double maxSpeedMPS,
double maxDriveAcceleration,
double drivingPowerLimit,
double steeringPowerLimit,
boolean steeringInverted,
boolean drivingInverted)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Swerve module constructor.< / div >
< / td >
< / tr >
< / table >
< / li >
< / ul >
< / section >
<!-- ========== METHOD SUMMARY =========== -->
< section role = "region" >
< ul class = "blockList" >
< li class = "blockList" > < a id = "method.summary" >
<!-- -->
< / a >
< h3 > Method Summary< / h3 >
< table class = "memberSummary" >
< caption > < span id = "t0" class = "activeTableTab" > < span > All Methods< / span > < span class = "tabEnd" > < / span > < / span > < span id = "t1" class = "tableTab" > < span > < a href = "javascript:show(1);" > Static Methods< / a > < / span > < span class = "tabEnd" > < / span > < / span > < span id = "t2" class = "tableTab" > < span > < a href = "javascript:show(2);" > Instance Methods< / a > < / span > < span class = "tabEnd" > < / span > < / span > < span id = "t4" class = "tableTab" > < span > < a href = "javascript:show(8);" > Concrete Methods< / a > < / span > < span class = "tabEnd" > < / span > < / span > < / caption >
< tr >
< th class = "colFirst" scope = "col" > Modifier and Type< / th >
< th class = "colSecond" scope = "col" > Method< / th >
< th class = "colLast" scope = "col" > Description< / th >
< / tr >
< tr id = "i0" class = "altColor" >
< td class = "colFirst" > < code > boolean< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#activeCAN()" > activeCAN< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Check that the link is good on the swerve module and CAN bus is able to retrieve data.< / div >
< / td >
< / tr >
< tr id = "i1" class = "rowColor" >
< td class = "colFirst" > < code > private edu.wpi.first.wpilibj.shuffleboard.SimpleWidget< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#addEntry(java.lang.String,java.lang.Object)" > addEntry< / a > < / span > ​ (java.lang.String name,
java.lang.Object defaultValue)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Create a widget and add the entry to the hashmap of entries for network tables.< / div >
< / td >
< / tr >
< tr id = "i2" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#close()" > close< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Closes this resource, relinquishing any underlying resources.< / div >
< / td >
< / tr >
< tr id = "i3" class = "rowColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#disable()" > disable< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Disable the motor controller.< / div >
< / td >
< / tr >
< tr id = "i4" class = "altColor" >
< td class = "colFirst" > < code > double< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#get()" > get< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Common interface for getting the current set speed of a motor controller.< / div >
< / td >
< / tr >
< tr id = "i5" class = "rowColor" >
< td class = "colFirst" > < code > boolean< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#getInverted()" > getInverted< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Common interface for returning if a motor controller is in the inverted state or not.< / div >
< / td >
< / tr >
< tr id = "i6" class = "altColor" >
< td class = "colFirst" > < code > edu.wpi.first.math.kinematics.SwerveModulePosition< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#getPosition()" > getPosition< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Get the swerve module position based off the sensors.< / div >
< / td >
< / tr >
< tr id = "i7" class = "rowColor" >
< td class = "colFirst" > < code > < a href = "kinematics/SwerveModuleState2.html" title = "class in frc.robot.subsystems.swervedrive.swerve.kinematics" > SwerveModuleState2< / a > < / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#getState()" > getState< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Get the module state.< / div >
< / td >
< / tr >
< tr id = "i8" class = "altColor" >
< td class = "colFirst" > < code > private edu.wpi.first.math.geometry.Translation2d< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#getSwerveModulePosition(frc.robot.subsystems.swervedrive.swerve.SwerveModule.SwerveModuleLocation)" > getSwerveModulePosition< / a > < / span > ​ (< a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.SwerveModuleLocation< / a > swerveLocation)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Get the swerve module position in < code > Translation2d< / code > from the enum passed.< / div >
< / td >
< / tr >
< tr id = "i9" class = "rowColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#initSendable(edu.wpi.first.util.sendable.SendableBuilder)" > initSendable< / a > < / span > ​ (edu.wpi.first.util.sendable.SendableBuilder builder)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Initializes this < code > Sendable< / code > object.< / div >
< / td >
< / tr >
< tr id = "i10" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#publish(frc.robot.subsystems.swervedrive.swerve.SwerveModule.Verbosity)" > publish< / a > < / span > ​ (< a href = "SwerveModule.Verbosity.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.Verbosity< / a > level)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Publish data to the smart dashboard relating to this swerve module.< / div >
< / td >
< / tr >
< tr id = "i11" class = "rowColor" >
< td class = "colFirst" > < code > boolean< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#remoteIntegratedEncoder()" > remoteIntegratedEncoder< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Checks if the absolute encoder is able to be read directly by the motor controller instead of using the
synchronizeEncoder() function periodically.< / div >
< / td >
< / tr >
< tr id = "i12" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#resetEncoders()" > resetEncoders< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Reset the REV encoders onboard the SparkMax's to 0, and set's the drive motor to position to 0 and synchronizes the
internal steering encoders with the absolute encoder.< / div >
< / td >
< / tr >
< tr id = "i13" class = "rowColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#set(double)" > set< / a > < / span > ​ (double speed)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Common interface for setting the speed of a motor controller.< / div >
< / td >
< / tr >
< tr id = "i14" class = "altColor" >
< td class = "colFirst" > < code > private void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setAngle(double)" > setAngle< / a > < / span > ​ (double angle)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Set the angle of the swerve module without feedforward.< / div >
< / td >
< / tr >
< tr id = "i15" class = "rowColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setAngle(double,double)" > setAngle< / a > < / span > ​ (double angle,
double feedforward)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Set the angle of the swerve module.< / div >
< / td >
< / tr >
< tr id = "i16" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setAngleOffset(double)" > setAngleOffset< / a > < / span > ​ (double offset)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Configure the magnetic offset in the CANCoder.< / div >
< / td >
< / tr >
< tr id = "i17" class = "rowColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setCurrentLimit(int,frc.robot.subsystems.swervedrive.swerve.SwerveMotor.ModuleMotorType)" > setCurrentLimit< / a > < / span > ​ (int currentLimit,
< a href = "SwerveMotor.ModuleMotorType.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveMotor.ModuleMotorType< / a > type)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Set the current limit for the swerve drive motor, remember this may cause jumping if used in conjunction with
voltage compensation.< / div >
< / td >
< / tr >
< tr id = "i18" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setInverted(boolean)" > setInverted< / a > < / span > ​ (boolean isInverted)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Common interface for inverting direction of a motor controller.< / div >
< / td >
< / tr >
< tr id = "i19" class = "rowColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setInvertedAbsoluteEncoder(boolean)" > setInvertedAbsoluteEncoder< / a > < / span > ​ (boolean isInverted)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Invert the absolute encoder.< / div >
< / td >
< / tr >
< tr id = "i20" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setInvertedTurn(boolean)" > setInvertedTurn< / a > < / span > ​ (boolean isInverted)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Set the steering motor to be inverted.< / div >
< / td >
< / tr >
< tr id = "i21" class = "rowColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setPIDF(double,double,double,double,double,frc.robot.subsystems.swervedrive.swerve.SwerveMotor.ModuleMotorType)" > setPIDF< / a > < / span > ​ (double p,
double i,
double d,
double f,
double integralZone,
< a href = "SwerveMotor.ModuleMotorType.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveMotor.ModuleMotorType< / a > moduleMotorType)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Set the PIDF coefficients for the closed loop PID onboard the motor controller.< / div >
< / td >
< / tr >
< tr id = "i22" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setState(frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveModuleState2)" > setState< / a > < / span > ​ (< a href = "kinematics/SwerveModuleState2.html" title = "class in frc.robot.subsystems.swervedrive.swerve.kinematics" > SwerveModuleState2< / a > state)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Set the module speed and angle based off the module state.< / div >
< / td >
< / tr >
< tr id = "i23" class = "rowColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setVelocity(double)" > setVelocity< / a > < / span > ​ (double velocity)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Set the drive motor velocity in MPS.< / div >
< / td >
< / tr >
< tr id = "i24" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#setVoltageCompensation(double)" > setVoltageCompensation< / a > < / span > ​ (double nominalVoltage)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Set the voltage compensation for the swerve module motor.< / div >
< / td >
< / tr >
< tr id = "i25" class = "rowColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#stopMotor()" > stopMotor< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Stops motor movement.< / div >
< / td >
< / tr >
< tr id = "i26" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#subscribe()" > subscribe< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Subscribe from data within smart dashboard to make changes to the swerve module.< / div >
< / td >
< / tr >
< tr id = "i27" class = "rowColor" >
< td class = "colFirst" > < code > static java.lang.String< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#SwerveModuleLocationToString(frc.robot.subsystems.swervedrive.swerve.SwerveModule.SwerveModuleLocation)" > SwerveModuleLocationToString< / a > < / span > ​ (< a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.SwerveModuleLocation< / a > swerveLocation)< / code > < / th >
< td class = "colLast" >
< div class = "block" > Convert < a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > < code > SwerveModule.SwerveModuleLocation< / code > < / a > to < code > String< / code > representation.< / div >
< / td >
< / tr >
< tr id = "i28" class = "altColor" >
< td class = "colFirst" > < code > void< / code > < / td >
< th class = "colSecond" scope = "row" > < code > < span class = "memberNameLink" > < a href = "#synchronizeSteeringEncoder()" > synchronizeSteeringEncoder< / a > < / span > ()< / code > < / th >
< td class = "colLast" >
< div class = "block" > Synchronizes the internal encoder for the steering motor with the value from the absolute encoder.< / div >
< / td >
< / tr >
< / table >
< ul class = "blockList" >
< li class = "blockList" > < a id = "methods.inherited.from.class.java.lang.Object" >
<!-- -->
< / a >
< h3 > Methods inherited from class java.lang.Object< / h3 >
< code > clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait< / code > < / li >
< / ul >
< ul class = "blockList" >
< li class = "blockList" > < a id = "methods.inherited.from.class.edu.wpi.first.wpilibj.motorcontrol.MotorController" >
<!-- -->
< / a >
< h3 > Methods inherited from interface edu.wpi.first.wpilibj.motorcontrol.MotorController< / h3 >
< code > setVoltage< / code > < / li >
< / ul >
< / li >
< / ul >
< / section >
< / li >
< / ul >
< / div >
< div class = "details" >
< ul class = "blockList" >
< li class = "blockList" >
<!-- ============ FIELD DETAIL =========== -->
< section role = "region" >
< ul class = "blockList" >
< li class = "blockList" > < a id = "field.detail" >
<!-- -->
< / a >
< h3 > Field Detail< / h3 >
< a id = "swerveModuleLocation" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > swerveModuleLocation< / h4 >
< pre > public final edu.wpi.first.math.geometry.Translation2d swerveModuleLocation< / pre >
< div class = "block" > Swerve Module location object relative to the center of the robot.< / div >
< / li >
< / ul >
< a id = "driveMotor" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > driveMotor< / h4 >
< pre > public final < a href = "SwerveMotor.html" title = "class in frc.robot.subsystems.swervedrive.swerve" > SwerveMotor< / a > driveMotor< / pre >
< div class = "block" > Motor Controllers for drive motor of the swerve module.< / div >
< / li >
< / ul >
< a id = "turningMotor" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > turningMotor< / h4 >
< pre > public final < a href = "SwerveMotor.html" title = "class in frc.robot.subsystems.swervedrive.swerve" > SwerveMotor< / a > turningMotor< / pre >
< div class = "block" > Motor Controller for the turning motor of the swerve drive module.< / div >
< / li >
< / ul >
< a id = "swerveLocation" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > swerveLocation< / h4 >
< pre > private final < a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.SwerveModuleLocation< / a > swerveLocation< / pre >
< div class = "block" > Enum representing the swerve module's location on the robot, assuming square.< / div >
< / li >
< / ul >
< a id = "absoluteEncoder" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > absoluteEncoder< / h4 >
< pre > private final < a href = "SwerveEncoder.html" title = "class in frc.robot.subsystems.swervedrive.swerve" > SwerveEncoder< / a > < ?> absoluteEncoder< / pre >
< div class = "block" > Absolute encoder for the swerve module.< / div >
< / li >
< / ul >
< a id = "driveTrainWidth" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > driveTrainWidth< / h4 >
< pre > private final double driveTrainWidth< / pre >
< div class = "block" > The Distance between centers of right and left wheels in meters.< / div >
< / li >
< / ul >
< a id = "wheelBase" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > wheelBase< / h4 >
< pre > private final double wheelBase< / pre >
< div class = "block" > The Distance between front and back wheels of the robot in meters.< / div >
< / li >
< / ul >
< a id = "driveFeedforward" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > driveFeedforward< / h4 >
< pre > private final edu.wpi.first.math.controller.SimpleMotorFeedforward driveFeedforward< / pre >
< div class = "block" > Drive feedforward for PID when driving by velocity.< / div >
< / li >
< / ul >
< a id = "steeringKV" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > steeringKV< / h4 >
< pre > private final double steeringKV< / pre >
< div class = "block" > kV for steering feedforward.< / div >
< / li >
< / ul >
< a id = "moduleTab" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > moduleTab< / h4 >
< pre > private final edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab moduleTab< / pre >
< / li >
< / ul >
< a id = "NT4Entries" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > NT4Entries< / h4 >
< pre > private final java.util.HashMap< java.lang.String,​ edu.wpi.first.wpilibj.shuffleboard.SimpleWidget> NT4Entries< / pre >
< / li >
< / ul >
< a id = "angleOffset" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > angleOffset< / h4 >
< pre > public double angleOffset< / pre >
< div class = "block" > Angle offset of the CANCoder at initialization.< / div >
< / li >
< / ul >
< a id = "maxDriveSpeedMPS" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > maxDriveSpeedMPS< / h4 >
< pre > public double maxDriveSpeedMPS< / pre >
< div class = "block" > Maximum speed in meters per second, used to eliminate unnecessary movement of the module.< / div >
< / li >
< / ul >
< a id = "invertedDrive" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > invertedDrive< / h4 >
< pre > private boolean invertedDrive< / pre >
< div class = "block" > Inverted drive motor.< / div >
< / li >
< / ul >
< a id = "invertedTurn" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > invertedTurn< / h4 >
< pre > private boolean invertedTurn< / pre >
< div class = "block" > Inverted turning motor.< / div >
< / li >
< / ul >
< a id = "drivePower" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > drivePower< / h4 >
< pre > private double drivePower< / pre >
< div class = "block" > Power to drive motor from -1 to 1.< / div >
< / li >
< / ul >
< a id = "targetAngle" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > targetAngle< / h4 >
< pre > private double targetAngle< / pre >
< div class = "block" > Store the last angle for optimization.< / div >
< / li >
< / ul >
< a id = "targetAngularVelocityRPS" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > targetAngularVelocityRPS< / h4 >
< pre > private double targetAngularVelocityRPS< / pre >
< div class = "block" > Angular velocity in radians per second.< / div >
< / li >
< / ul >
< a id = "targetVelocity" >
<!-- -->
< / a >
< ul class = "blockListLast" >
< li class = "blockList" >
< h4 > targetVelocity< / h4 >
< pre > private double targetVelocity< / pre >
< div class = "block" > Target velocity for the swerve module.< / div >
< / li >
< / ul >
< / li >
< / ul >
< / section >
<!-- ========= CONSTRUCTOR DETAIL ======== -->
< section role = "region" >
< ul class = "blockList" >
< li class = "blockList" > < a id = "constructor.detail" >
<!-- -->
< / a >
< h3 > Constructor Detail< / h3 >
< a id = "<init>(edu.wpi.first.wpilibj.motorcontrol.MotorController,edu.wpi.first.wpilibj.motorcontrol.MotorController,java.lang.Object,frc.robot.subsystems.swervedrive.swerve.SwerveModule.SwerveModuleLocation,double,double,double,double,double,double,double,double,double,double,double,boolean,boolean)" >
<!-- -->
< / a > < a id = "<init>(DriveMotorType,AngleMotorType,AbsoluteEncoderType,frc.robot.subsystems.swervedrive.swerve.SwerveModule.SwerveModuleLocation,double,double,double,double,double,double,double,double,double,double,double,boolean,boolean)" >
<!-- -->
< / a >
< ul class = "blockListLast" >
< li class = "blockList" >
< h4 > SwerveModule< / h4 >
< pre > public SwerveModule​ (< a href = "SwerveModule.html" title = "type parameter in SwerveModule" > DriveMotorType< / a > mainMotor,
< a href = "SwerveModule.html" title = "type parameter in SwerveModule" > AngleMotorType< / a > angleMotor,
< a href = "SwerveModule.html" title = "type parameter in SwerveModule" > AbsoluteEncoderType< / a > encoder,
< a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.SwerveModuleLocation< / a > swervePosition,
double driveGearRatio,
double steerGearRatio,
double steeringOffsetDegrees,
double wheelDiameterMeters,
double wheelBaseMeters,
double driveTrainWidthMeters,
double steeringMotorFreeSpeedRPM,
double maxSpeedMPS,
double maxDriveAcceleration,
double drivingPowerLimit,
double steeringPowerLimit,
boolean steeringInverted,
boolean drivingInverted)< / pre >
< div class = "block" > Swerve module constructor. Both motors < b > MUST< / b > be a < code > MotorController< / code > class. It is recommended to create
a command to reset the encoders when triggered and< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > mainMotor< / code > - Main drive motor. Must be a < code > MotorController< / code > type.< / dd >
< dd > < code > angleMotor< / code > - Angle motor for controlling the angle of the swerve module.< / dd >
< dd > < code > encoder< / code > - Absolute encoder for the swerve module.< / dd >
< dd > < code > driveGearRatio< / code > - Drive gear ratio in form of (rotation:1 AKA rotations/1) to get the encoder ticks
per rotation.< / dd >
< dd > < code > steerGearRatio< / code > - Steering motor gear ratio (usually 12.8:1 for MK4 in form of rotations:1 or
rotations/1), only applied if using Neo's.< / dd >
< dd > < code > swervePosition< / code > - Swerve Module position on the robot.< / dd >
< dd > < code > steeringOffsetDegrees< / code > - The current offset of the absolute encoder from 0 in degrees.< / dd >
< dd > < code > wheelDiameterMeters< / code > - The wheel diameter of the swerve drive module in meters.< / dd >
< dd > < code > wheelBaseMeters< / code > - The Distance between front and back wheels of the robot in meters.< / dd >
< dd > < code > driveTrainWidthMeters< / code > - The Distance between centers of right and left wheels in meters.< / dd >
< dd > < code > steeringMotorFreeSpeedRPM< / code > - The RPM free speed of the steering motor.< / dd >
< dd > < code > maxSpeedMPS< / code > - The maximum drive speed in meters per second.< / dd >
< dd > < code > maxDriveAcceleration< / code > - The maximum drive acceleration in meters^2 per second.< / dd >
< dd > < code > drivingPowerLimit< / code > - The power limit for the closed loop PID of the driver motor.< / dd >
< dd > < code > steeringPowerLimit< / code > - The power limit for the closed loop PID of the steering motor.< / dd >
< dd > < code > steeringInverted< / code > - The steering motor is inverted.< / dd >
< dd > < code > drivingInverted< / code > - The driving motor is inverted.< / dd >
< dt > < span class = "throwsLabel" > Throws:< / span > < / dt >
< dd > < code > java.lang.RuntimeException< / code > - if an assertion fails or invalid swerve module location is given.< / dd >
< / dl >
< / li >
< / ul >
< / li >
< / ul >
< / section >
<!-- ============ METHOD DETAIL ========== -->
< section role = "region" >
< ul class = "blockList" >
< li class = "blockList" > < a id = "method.detail" >
<!-- -->
< / a >
< h3 > Method Detail< / h3 >
< a id = "SwerveModuleLocationToString(frc.robot.subsystems.swervedrive.swerve.SwerveModule.SwerveModuleLocation)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > SwerveModuleLocationToString< / h4 >
< pre class = "methodSignature" > public static java.lang.String SwerveModuleLocationToString​ (< a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.SwerveModuleLocation< / a > swerveLocation)< / pre >
< div class = "block" > Convert < a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > < code > SwerveModule.SwerveModuleLocation< / code > < / a > to < code > String< / code > representation.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > swerveLocation< / code > - Swerve position to convert.< / dd >
< dt > < span class = "returnLabel" > Returns:< / span > < / dt >
< dd > < code > String< / code > name of the < a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > < code > SwerveModule.SwerveModuleLocation< / code > < / a > enum.< / dd >
< / dl >
< / li >
< / ul >
< a id = "resetEncoders()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > resetEncoders< / h4 >
< pre class = "methodSignature" > public void resetEncoders()< / pre >
< div class = "block" > Reset the REV encoders onboard the SparkMax's to 0, and set's the drive motor to position to 0 and synchronizes the
internal steering encoders with the absolute encoder.< / div >
< / li >
< / ul >
< a id = "synchronizeSteeringEncoder()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > synchronizeSteeringEncoder< / h4 >
< pre class = "methodSignature" > public void synchronizeSteeringEncoder()< / pre >
< div class = "block" > Synchronizes the internal encoder for the steering motor with the value from the absolute encoder.< / div >
< / li >
< / ul >
< a id = "setPIDF(double,double,double,double,double,frc.robot.subsystems.swervedrive.swerve.SwerveMotor.ModuleMotorType)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setPIDF< / h4 >
< pre class = "methodSignature" > public void setPIDF​ (double p,
double i,
double d,
double f,
double integralZone,
< a href = "SwerveMotor.ModuleMotorType.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveMotor.ModuleMotorType< / a > moduleMotorType)< / pre >
< div class = "block" > Set the PIDF coefficients for the closed loop PID onboard the motor controller. Tuning the PID
< p >
< b > P< / b > = .5 and increase it by .1 until oscillations occur, then decrease by .05 then .005 until oscillations
stop and angle is perfect or near perfect.
< / p >
< p >
< b > I< / b > = 0 tune this if your PID never quite reaches the target, after tuning < b > D< / b > . Increase this by
< b > P< / b > *.01 each time and adjust accordingly.
< / p >
< p >
< b > D< / b > = 0 tune this if the PID accelerates too fast, it will smooth the motion. Increase this by < b > P< / b > *10
and adjust accordingly.
< / p >
< p >
< b > F< / b > = 0 tune this if the PID is being used for velocity, the < b > F< / b > is multiplied by the target and added
to the voltage output. Increase this by 0.01 until the PIDF reaches the desired state in a fast enough manner.
< / p >
Documentation for this is best described by CTRE < a href = "https://docs.ctre-phoenix.com/en/stable/ch16_ClosedLoop.html#position-closed-loop-control-mode" > here< / a > .< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > p< / code > - Proportional gain for closed loop. This is multiplied by closed loop error in sensor units.< / dd >
< dd > < code > i< / code > - Integral gain for closed loop. This is multiplied by closed loop error in sensor units every
PID Loop.< / dd >
< dd > < code > d< / code > - Derivative gain for closed loop. This is multiplied by derivative error (sensor units per
PID loop).< / dd >
< dd > < code > f< / code > - Feed Fwd gain for Closed loop.< / dd >
< dd > < code > integralZone< / code > - Integral Zone can be used to auto clear the integral accumulator if the sensor pos is too
far from the target. This prevents unstable oscillation if the kI is too large. Value is in
sensor units.< / dd >
< dd > < code > moduleMotorType< / code > - Swerve drive motor type.< / dd >
< / dl >
< / li >
< / ul >
< a id = "setAngleOffset(double)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setAngleOffset< / h4 >
< pre class = "methodSignature" > public void setAngleOffset​ (double offset)< / pre >
< div class = "block" > Configure the magnetic offset in the CANCoder.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > offset< / code > - Magnetic offset in degrees.< / dd >
< / dl >
< / li >
< / ul >
< a id = "activeCAN()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > activeCAN< / h4 >
< pre class = "methodSignature" > public boolean activeCAN()< / pre >
< div class = "block" > Check that the link is good on the swerve module and CAN bus is able to retrieve data.< / div >
< dl >
< dt > < span class = "returnLabel" > Returns:< / span > < / dt >
< dd > true on all devices are accessible over CAN.< / dd >
< / dl >
< / li >
< / ul >
< a id = "remoteIntegratedEncoder()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > remoteIntegratedEncoder< / h4 >
< pre class = "methodSignature" > public boolean remoteIntegratedEncoder()< / pre >
< div class = "block" > Checks if the absolute encoder is able to be read directly by the motor controller instead of using the
synchronizeEncoder() function periodically.< / div >
< dl >
< dt > < span class = "returnLabel" > Returns:< / span > < / dt >
< dd > If the absolute sensor in the steering motor is directly accessed by the motor controller.< / dd >
< / dl >
< / li >
< / ul >
< a id = "setAngle(double,double)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setAngle< / h4 >
< pre class = "methodSignature" > public void setAngle​ (double angle,
double feedforward)< / pre >
< div class = "block" > Set the angle of the swerve module.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > angle< / code > - Angle in degrees.< / dd >
< dd > < code > feedforward< / code > - The feedforward for the PID.< / dd >
< / dl >
< / li >
< / ul >
< a id = "setAngle(double)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setAngle< / h4 >
< pre class = "methodSignature" > private void setAngle​ (double angle)< / pre >
< div class = "block" > Set the angle of the swerve module without feedforward.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > angle< / code > - Angle in degrees.< / dd >
< / dl >
< / li >
< / ul >
< a id = "setVelocity(double)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setVelocity< / h4 >
< pre class = "methodSignature" > public void setVelocity​ (double velocity)< / pre >
< div class = "block" > Set the drive motor velocity in MPS.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > velocity< / code > - Velocity in MPS.< / dd >
< / dl >
< / li >
< / ul >
< a id = "getState()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > getState< / h4 >
< pre class = "methodSignature" > public < a href = "kinematics/SwerveModuleState2.html" title = "class in frc.robot.subsystems.swervedrive.swerve.kinematics" > SwerveModuleState2< / a > getState()< / pre >
< div class = "block" > Get the module state.< / div >
< dl >
< dt > < span class = "returnLabel" > Returns:< / span > < / dt >
< dd > SwerveModuleState with the encoder inputs.< / dd >
< dt > < span class = "throwsLabel" > Throws:< / span > < / dt >
< dd > < code > java.lang.RuntimeException< / code > - Exception if CANCoder doesnt exist< / dd >
< / dl >
< / li >
< / ul >
< a id = "setState(frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveModuleState2)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setState< / h4 >
< pre class = "methodSignature" > public void setState​ (< a href = "kinematics/SwerveModuleState2.html" title = "class in frc.robot.subsystems.swervedrive.swerve.kinematics" > SwerveModuleState2< / a > state)< / pre >
< div class = "block" > Set the module speed and angle based off the module state.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > state< / code > - Module state.< / dd >
< / dl >
< / li >
< / ul >
< a id = "getPosition()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > getPosition< / h4 >
< pre class = "methodSignature" > public edu.wpi.first.math.kinematics.SwerveModulePosition getPosition()< / pre >
< div class = "block" > Get the swerve module position based off the sensors.< / div >
< dl >
< dt > < span class = "returnLabel" > Returns:< / span > < / dt >
< dd > Swerve Module position, with the angle as what the angle is supposed to be, not what it actually is.< / dd >
< / dl >
< / li >
< / ul >
< a id = "subscribe()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > subscribe< / h4 >
< pre class = "methodSignature" > public void subscribe()< / pre >
< div class = "block" > Subscribe from data within smart dashboard to make changes to the swerve module.< / div >
< / li >
< / ul >
< a id = "addEntry(java.lang.String,java.lang.Object)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > addEntry< / h4 >
< pre class = "methodSignature" > private edu.wpi.first.wpilibj.shuffleboard.SimpleWidget addEntry​ (java.lang.String name,
java.lang.Object defaultValue)< / pre >
< div class = "block" > Create a widget and add the entry to the hashmap of entries for network tables.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > name< / code > - Key to display on shuffleboard.< / dd >
< dd > < code > defaultValue< / code > - Default value.< / dd >
< dt > < span class = "returnLabel" > Returns:< / span > < / dt >
< dd > Widget that can be modified.< / dd >
< / dl >
< / li >
< / ul >
< a id = "publish(frc.robot.subsystems.swervedrive.swerve.SwerveModule.Verbosity)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > publish< / h4 >
< pre class = "methodSignature" > public void publish​ (< a href = "SwerveModule.Verbosity.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.Verbosity< / a > level)< / pre >
< div class = "block" > Publish data to the smart dashboard relating to this swerve module.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > level< / code > - Verbosity level, affects the CAN utilization, on HIGH it will enable the update button.< / dd >
< / dl >
< / li >
< / ul >
< a id = "initSendable(edu.wpi.first.util.sendable.SendableBuilder)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > initSendable< / h4 >
< pre class = "methodSignature" > public void initSendable​ (edu.wpi.first.util.sendable.SendableBuilder builder)< / pre >
< div class = "block" > Initializes this < code > Sendable< / code > object.< / div >
< dl >
< dt > < span class = "overrideSpecifyLabel" > Specified by:< / span > < / dt >
< dd > < code > initSendable< / code > in interface < code > edu.wpi.first.util.sendable.Sendable< / code > < / dd >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > builder< / code > - sendable builder< / dd >
< / dl >
< / li >
< / ul >
< a id = "close()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > close< / h4 >
< pre class = "methodSignature" > public void close()< / pre >
< div class = "block" > Closes this resource, relinquishing any underlying resources. This method is invoked automatically on objects
managed by the < code > try< / code > -with-resources statement.
< p > While this interface method is declared to throw < code >
Exception< / code > , implementers are < em > strongly< / em > encouraged to declare concrete implementations of the < code > close< / code >
method to throw more specific exceptions, or to throw no exception at all if the close operation cannot fail.
< p > Cases where the close operation may fail require careful
attention by implementers. It is strongly advised to relinquish the underlying resources and to internally
< em > mark< / em > the resource as closed, prior to throwing the exception. The < code > close< / code > method is unlikely to be
invoked more than once and so this ensures that the resources are released in a timely manner. Furthermore it
reduces problems that could arise when the resource wraps, or is wrapped, by another resource.
< p > < em > Implementers of this interface are also strongly advised
to not have the < code > close< / code > method throw < code > InterruptedException< / code > .< / em >
< p >
This exception interacts with a thread's interrupted status, and runtime misbehavior is likely to occur if an
< code > InterruptedException< / code > is suppressed.
< p >
More generally, if it would cause problems for an exception to be suppressed, the < code > AutoCloseable.close< / code >
method should not throw it.
< p > Note that unlike the < code > close< / code >
method of < code > Closeable< / code > , this < code > close< / code > method is < em > not< / em > required to be idempotent. In other words,
calling this < code > close< / code > method more than once may have some visible side effect, unlike < code > Closeable.close< / code >
which is required to have no effect if called more than once.
< p >
However, implementers of this interface are strongly encouraged to make their < code > close< / code > methods idempotent.< / div >
< dl >
< dt > < span class = "overrideSpecifyLabel" > Specified by:< / span > < / dt >
< dd > < code > close< / code > in interface < code > java.lang.AutoCloseable< / code > < / dd >
< / dl >
< / li >
< / ul >
< a id = "disable()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > disable< / h4 >
< pre class = "methodSignature" > public void disable()< / pre >
< div class = "block" > Disable the motor controller.< / div >
< dl >
< dt > < span class = "overrideSpecifyLabel" > Specified by:< / span > < / dt >
< dd > < code > disable< / code > in interface < code > edu.wpi.first.wpilibj.motorcontrol.MotorController< / code > < / dd >
< / dl >
< / li >
< / ul >
< a id = "stopMotor()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > stopMotor< / h4 >
< pre class = "methodSignature" > public void stopMotor()< / pre >
< div class = "block" > Stops motor movement. Motor can be moved again by calling set without having to re-enable the motor.< / div >
< dl >
< dt > < span class = "overrideSpecifyLabel" > Specified by:< / span > < / dt >
< dd > < code > stopMotor< / code > in interface < code > edu.wpi.first.wpilibj.motorcontrol.MotorController< / code > < / dd >
< / dl >
< / li >
< / ul >
< a id = "set(double)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > set< / h4 >
< pre class = "methodSignature" > public void set​ (double speed)< / pre >
< div class = "block" > Common interface for setting the speed of a motor controller.< / div >
< dl >
< dt > < span class = "overrideSpecifyLabel" > Specified by:< / span > < / dt >
< dd > < code > set< / code > in interface < code > edu.wpi.first.wpilibj.motorcontrol.MotorController< / code > < / dd >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > speed< / code > - The speed to set. Value should be between -1.0 and 1.0.< / dd >
< / dl >
< / li >
< / ul >
< a id = "get()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > get< / h4 >
< pre class = "methodSignature" > public double get()< / pre >
< div class = "block" > Common interface for getting the current set speed of a motor controller.< / div >
< dl >
< dt > < span class = "overrideSpecifyLabel" > Specified by:< / span > < / dt >
< dd > < code > get< / code > in interface < code > edu.wpi.first.wpilibj.motorcontrol.MotorController< / code > < / dd >
< dt > < span class = "returnLabel" > Returns:< / span > < / dt >
< dd > The current set speed. Value is between -1.0 and 1.0.< / dd >
< / dl >
< / li >
< / ul >
< a id = "getSwerveModulePosition(frc.robot.subsystems.swervedrive.swerve.SwerveModule.SwerveModuleLocation)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > getSwerveModulePosition< / h4 >
< pre class = "methodSignature" > private edu.wpi.first.math.geometry.Translation2d getSwerveModulePosition​ (< a href = "SwerveModule.SwerveModuleLocation.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveModule.SwerveModuleLocation< / a > swerveLocation)< / pre >
< div class = "block" > Get the swerve module position in < code > Translation2d< / code > from the enum passed.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > swerveLocation< / code > - Swerve module location enum.< / dd >
< dt > < span class = "returnLabel" > Returns:< / span > < / dt >
< dd > Location as < code > Translation2d< / code > .< / dd >
< dt > < span class = "throwsLabel" > Throws:< / span > < / dt >
< dd > < code > java.lang.RuntimeException< / code > - If Enum value is not defined.< / dd >
< / dl >
< / li >
< / ul >
< a id = "setVoltageCompensation(double)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setVoltageCompensation< / h4 >
< pre class = "methodSignature" > public void setVoltageCompensation​ (double nominalVoltage)< / pre >
< div class = "block" > Set the voltage compensation for the swerve module motor.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > nominalVoltage< / code > - Nominal voltage for operation to output to.< / dd >
< / dl >
< / li >
< / ul >
< a id = "setCurrentLimit(int,frc.robot.subsystems.swervedrive.swerve.SwerveMotor.ModuleMotorType)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setCurrentLimit< / h4 >
< pre class = "methodSignature" > public void setCurrentLimit​ (int currentLimit,
< a href = "SwerveMotor.ModuleMotorType.html" title = "enum in frc.robot.subsystems.swervedrive.swerve" > SwerveMotor.ModuleMotorType< / a > type)< / pre >
< div class = "block" > Set the current limit for the swerve drive motor, remember this may cause jumping if used in conjunction with
voltage compensation. This is useful to protect the motor from current spikes.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > currentLimit< / code > - Current limit in AMPS at free speed.< / dd >
< dd > < code > type< / code > - Swerve Drive Motor type to configure.< / dd >
< / dl >
< / li >
< / ul >
< a id = "setInvertedTurn(boolean)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setInvertedTurn< / h4 >
< pre class = "methodSignature" > public void setInvertedTurn​ (boolean isInverted)< / pre >
< div class = "block" > Set the steering motor to be inverted.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > isInverted< / code > - The state of inversion, true is inverted.< / dd >
< / dl >
< / li >
< / ul >
< a id = "setInvertedAbsoluteEncoder(boolean)" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > setInvertedAbsoluteEncoder< / h4 >
< pre class = "methodSignature" > public void setInvertedAbsoluteEncoder​ (boolean isInverted)< / pre >
< div class = "block" > Invert the absolute encoder.< / div >
< dl >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > isInverted< / code > - The state of inversion, true is inverted.< / dd >
< / dl >
< / li >
< / ul >
< a id = "getInverted()" >
<!-- -->
< / a >
< ul class = "blockList" >
< li class = "blockList" >
< h4 > getInverted< / h4 >
< pre class = "methodSignature" > public boolean getInverted()< / pre >
< div class = "block" > Common interface for returning if a motor controller is in the inverted state or not.< / div >
< dl >
< dt > < span class = "overrideSpecifyLabel" > Specified by:< / span > < / dt >
< dd > < code > getInverted< / code > in interface < code > edu.wpi.first.wpilibj.motorcontrol.MotorController< / code > < / dd >
< dt > < span class = "returnLabel" > Returns:< / span > < / dt >
< dd > isInverted The state of the inversion true is inverted.< / dd >
< / dl >
< / li >
< / ul >
< a id = "setInverted(boolean)" >
<!-- -->
< / a >
< ul class = "blockListLast" >
< li class = "blockList" >
< h4 > setInverted< / h4 >
< pre class = "methodSignature" > public void setInverted​ (boolean isInverted)< / pre >
< div class = "block" > Common interface for inverting direction of a motor controller.< / div >
< dl >
< dt > < span class = "overrideSpecifyLabel" > Specified by:< / span > < / dt >
< dd > < code > setInverted< / code > in interface < code > edu.wpi.first.wpilibj.motorcontrol.MotorController< / code > < / dd >
< dt > < span class = "paramLabel" > Parameters:< / span > < / dt >
< dd > < code > isInverted< / code > - The state of inversion, true is inverted.< / dd >
< / dl >
< / li >
< / ul >
< / li >
< / ul >
< / section >
< / li >
< / ul >
< / div >
< / div >
< / main >
<!-- ========= END OF CLASS DATA ========= -->
< footer role = "contentinfo" >
< nav role = "navigation" >
<!-- ======= START OF BOTTOM NAVBAR ====== -->
< div class = "bottomNav" > < a id = "navbar.bottom" >
<!-- -->
< / a >
< div class = "skipNav" > < a href = "#skip.navbar.bottom" title = "Skip navigation links" > Skip navigation links< / a > < / div >
< a id = "navbar.bottom.firstrow" >
<!-- -->
< / a >
< ul class = "navList" title = "Navigation" >
< li > < a href = "../../../../../index.html" > Overview< / a > < / li >
< li > < a href = "package-summary.html" > Package< / a > < / li >
< li class = "navBarCell1Rev" > Class< / li >
2023-01-31 10:52:13 -06:00
< li > < a href = "class-use/SwerveModule.html" > Use< / a > < / li >
2023-01-29 21:03:26 -06:00
< li > < a href = "package-tree.html" > Tree< / a > < / li >
< li > < a href = "../../../../../deprecated-list.html" > Deprecated< / a > < / li >
< li > < a href = "../../../../../index-files/index-1.html" > Index< / a > < / li >
< li > < a href = "../../../../../help-doc.html" > Help< / a > < / li >
< / ul >
< / div >
< div class = "subNav" >
< ul class = "navList" id = "allclasses_navbar_bottom" >
< li > < a href = "../../../../../allclasses.html" > All Classes< / a > < / li >
< / ul >
< div >
< script type = "text/javascript" > < ! - -
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
< / script >
< noscript >
< div > JavaScript is disabled on your browser.< / div >
< / noscript >
< / div >
< div >
< ul class = "subNavList" >
< li > Summary: < / li >
< li > < a href = "#nested.class.summary" > Nested< / a > | < / li >
< li > < a href = "#field.summary" > Field< / a > | < / li >
< li > < a href = "#constructor.summary" > Constr< / a > | < / li >
< li > < a href = "#method.summary" > Method< / a > < / li >
< / ul >
< ul class = "subNavList" >
< li > Detail: < / li >
< li > < a href = "#field.detail" > Field< / a > | < / li >
< li > < a href = "#constructor.detail" > Constr< / a > | < / li >
< li > < a href = "#method.detail" > Method< / a > < / li >
< / ul >
< / div >
< a id = "skip.navbar.bottom" >
<!-- -->
< / a > < / div >
<!-- ======== END OF BOTTOM NAVBAR ======= -->
< / nav >
< / footer >
< / body >
< / html >