Files
YAGSL/SwerveLib/frc/robot/subsystems/swervedrive/swerve/kinematics/SwerveDriveKinematics2.html
thenetworkgrinch 95baa4db9d First commit
2023-01-29 21:03:26 -06:00

639 lines
28 KiB
HTML

<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (11.0.13) on Sun Jan 29 15:36:03 CST 2023 -->
<title>SwerveDriveKinematics2</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="dc.created" content="2023-01-29">
<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="SwerveDriveKinematics2";
}
}
catch(err) {
}
//-->
var data = {"i0":9,"i1":9,"i2":10,"i3":10,"i4":10,"i5":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>
<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&nbsp;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:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</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">&nbsp;</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>&nbsp;<a href="package-summary.html">frc.robot.subsystems.swervedrive.swerve.kinematics</a></div>
<h2 title="Class SwerveDriveKinematics2" class="title">Class SwerveDriveKinematics2</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>edu.wpi.first.math.kinematics.SwerveDriveKinematics</li>
<li>
<ul class="inheritance">
<li>frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveDriveKinematics2</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<pre>public class <span class="typeNameLabel">SwerveDriveKinematics2</span>
extends edu.wpi.first.math.kinematics.SwerveDriveKinematics</pre>
<div class="block">Clone of WPI SwerveKinematics, which implements second order kinematics when calculating modules states from chassis
speed.
<p>Taken from https://github.com/FRC2539/javabot-2023/tree/main/src/main/java/frc/lib/swerve</p>
<p>https://github.com/first95/FRC2022/tree/feature/secondOrderKinematics/SwervyBot/src/main/java/frc/lib</p>
Makes use of <a href="SwerveDriveKinematics2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics"><code>SwerveDriveKinematics2</code></a> to add the angular velocity that is required of the module as an output.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- =========== 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">&nbsp;</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 org.ejml.simple.SimpleMatrix</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#bigInverseKinematics">bigInverseKinematics</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>private org.ejml.simple.SimpleMatrix</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#m_forwardKinematics">m_forwardKinematics</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>private org.ejml.simple.SimpleMatrix</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#m_inverseKinematics">m_inverseKinematics</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>private edu.wpi.first.math.geometry.Translation2d[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#m_modules">m_modules</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>private <a href="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="#m_moduleStates">m_moduleStates</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>private int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#m_numModules">m_numModules</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr 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="#m_prevCoR">m_prevCoR</a></span></code></th>
<td class="colLast">&nbsp;</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">&nbsp;</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(edu.wpi.first.math.geometry.Translation2d...)">SwerveDriveKinematics2</a></span>&#8203;(edu.wpi.first.math.geometry.Translation2d...&nbsp;wheelsMeters)</code></th>
<td class="colLast">
<div class="block">Constructs a swerve drive kinematics object.</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">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</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>static void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#desaturateWheelSpeeds(frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveModuleState2%5B%5D,double)">desaturateWheelSpeeds</a></span>&#8203;(<a href="SwerveModuleState2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics">SwerveModuleState2</a>[]&nbsp;moduleStates,
double&nbsp;attainableMaxSpeedMetersPerSecond)</code></th>
<td class="colLast">
<div class="block">Renormalizes the wheel speeds if any individual speed is above the specified maximum.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>static void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#desaturateWheelSpeeds(frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveModuleState2%5B%5D,edu.wpi.first.math.kinematics.ChassisSpeeds,double,double,double)">desaturateWheelSpeeds</a></span>&#8203;(<a href="SwerveModuleState2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics">SwerveModuleState2</a>[]&nbsp;moduleStates,
edu.wpi.first.math.kinematics.ChassisSpeeds&nbsp;currentChassisSpeed,
double&nbsp;attainableMaxModuleSpeedMetersPerSecond,
double&nbsp;attainableMaxTranslationalSpeedMetersPerSecond,
double&nbsp;attainableMaxRotationalVelocityRadiansPerSecond)</code></th>
<td class="colLast">
<div class="block">Renormalizes the wheel speeds if any individual speed is above the specified maximum, as well as getting rid of
joystick saturation at edges of joystick.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>edu.wpi.first.math.kinematics.ChassisSpeeds</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#toChassisSpeeds(frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveModuleState2...)">toChassisSpeeds</a></span>&#8203;(<a href="SwerveModuleState2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics">SwerveModuleState2</a>...&nbsp;wheelStates)</code></th>
<td class="colLast">
<div class="block">Performs forward kinematics to return the resulting chassis state from the given module states.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code><a href="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="#toSwerveModuleStates(edu.wpi.first.math.kinematics.ChassisSpeeds)">toSwerveModuleStates</a></span>&#8203;(edu.wpi.first.math.kinematics.ChassisSpeeds&nbsp;chassisSpeeds)</code></th>
<td class="colLast">
<div class="block">Performs inverse kinematics.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code><a href="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="#toSwerveModuleStates(edu.wpi.first.math.kinematics.ChassisSpeeds,edu.wpi.first.math.geometry.Translation2d)">toSwerveModuleStates</a></span>&#8203;(edu.wpi.first.math.kinematics.ChassisSpeeds&nbsp;chassisSpeeds,
edu.wpi.first.math.geometry.Translation2d&nbsp;centerOfRotationMeters)</code></th>
<td class="colLast">
<div class="block">Performs inverse kinematics to return the module states from a desired chassis velocity.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>edu.wpi.first.math.geometry.Twist2d</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#toTwist2d(edu.wpi.first.math.kinematics.SwerveModulePosition...)">toTwist2d</a></span>&#8203;(edu.wpi.first.math.kinematics.SwerveModulePosition...&nbsp;wheelDeltas)</code></th>
<td class="colLast">
<div class="block">Performs forward kinematics to return the resulting chassis state from the given module states.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.edu.wpi.first.math.kinematics.SwerveDriveKinematics">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;edu.wpi.first.math.kinematics.SwerveDriveKinematics</h3>
<code>desaturateWheelSpeeds, desaturateWheelSpeeds, toChassisSpeeds</code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</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="m_inverseKinematics">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>m_inverseKinematics</h4>
<pre>private final&nbsp;org.ejml.simple.SimpleMatrix m_inverseKinematics</pre>
</li>
</ul>
<a id="m_forwardKinematics">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>m_forwardKinematics</h4>
<pre>private final&nbsp;org.ejml.simple.SimpleMatrix m_forwardKinematics</pre>
</li>
</ul>
<a id="bigInverseKinematics">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>bigInverseKinematics</h4>
<pre>private final&nbsp;org.ejml.simple.SimpleMatrix bigInverseKinematics</pre>
</li>
</ul>
<a id="m_numModules">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>m_numModules</h4>
<pre>private final&nbsp;int m_numModules</pre>
</li>
</ul>
<a id="m_modules">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>m_modules</h4>
<pre>private final&nbsp;edu.wpi.first.math.geometry.Translation2d[] m_modules</pre>
</li>
</ul>
<a id="m_moduleStates">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>m_moduleStates</h4>
<pre>private final&nbsp;<a href="SwerveModuleState2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics">SwerveModuleState2</a>[] m_moduleStates</pre>
</li>
</ul>
<a id="m_prevCoR">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>m_prevCoR</h4>
<pre>private&nbsp;edu.wpi.first.math.geometry.Translation2d m_prevCoR</pre>
</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="&lt;init&gt;(edu.wpi.first.math.geometry.Translation2d...)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>SwerveDriveKinematics2</h4>
<pre>public&nbsp;SwerveDriveKinematics2&#8203;(edu.wpi.first.math.geometry.Translation2d...&nbsp;wheelsMeters)</pre>
<div class="block">Constructs a swerve drive kinematics object. This takes in a variable number of wheel locations as
<code>Translation2d</code>s. The order in which you pass in the wheel locations is the same order that you will receive
the module states when performing inverse kinematics. It is also expected that you pass in the module states in the
same order when calling the forward kinematics methods.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>wheelsMeters</code> - The locations of the wheels relative to the physical center of the robot.</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="desaturateWheelSpeeds(frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveModuleState2[],double)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>desaturateWheelSpeeds</h4>
<pre class="methodSignature">public static&nbsp;void&nbsp;desaturateWheelSpeeds&#8203;(<a href="SwerveModuleState2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics">SwerveModuleState2</a>[]&nbsp;moduleStates,
double&nbsp;attainableMaxSpeedMetersPerSecond)</pre>
<div class="block">Renormalizes the wheel speeds if any individual speed is above the specified maximum.
<p>Sometimes, after inverse kinematics, the requested speed from one or more modules may be
above the max attainable speed for the driving motor on that module. To fix this issue, one can reduce all the
wheel speeds to make sure that all requested module speeds are at-or-below the absolute threshold, while
maintaining the ratio of speeds between modules.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>moduleStates</code> - Reference to array of module states. The array will be mutated with the
normalized speeds!</dd>
<dd><code>attainableMaxSpeedMetersPerSecond</code> - The absolute max speed that a module can reach.</dd>
</dl>
</li>
</ul>
<a id="desaturateWheelSpeeds(frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveModuleState2[],edu.wpi.first.math.kinematics.ChassisSpeeds,double,double,double)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>desaturateWheelSpeeds</h4>
<pre class="methodSignature">public static&nbsp;void&nbsp;desaturateWheelSpeeds&#8203;(<a href="SwerveModuleState2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics">SwerveModuleState2</a>[]&nbsp;moduleStates,
edu.wpi.first.math.kinematics.ChassisSpeeds&nbsp;currentChassisSpeed,
double&nbsp;attainableMaxModuleSpeedMetersPerSecond,
double&nbsp;attainableMaxTranslationalSpeedMetersPerSecond,
double&nbsp;attainableMaxRotationalVelocityRadiansPerSecond)</pre>
<div class="block">Renormalizes the wheel speeds if any individual speed is above the specified maximum, as well as getting rid of
joystick saturation at edges of joystick.
<p>Sometimes, after inverse kinematics, the requested speed from one or more modules may be
above the max attainable speed for the driving motor on that module. To fix this issue, one can reduce all the
wheel speeds to make sure that all requested module speeds are at-or-below the absolute threshold, while
maintaining the ratio of speeds between modules.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>moduleStates</code> - Reference to array of module states. The array will be
mutated with the normalized speeds!</dd>
<dd><code>currentChassisSpeed</code> - The current speed of the robot</dd>
<dd><code>attainableMaxModuleSpeedMetersPerSecond</code> - The absolute max speed that a module can reach</dd>
<dd><code>attainableMaxTranslationalSpeedMetersPerSecond</code> - The absolute max speed that your robot can reach while
translating</dd>
<dd><code>attainableMaxRotationalVelocityRadiansPerSecond</code> - The absolute max speed the robot can reach while rotating</dd>
</dl>
</li>
</ul>
<a id="toSwerveModuleStates(edu.wpi.first.math.kinematics.ChassisSpeeds,edu.wpi.first.math.geometry.Translation2d)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>toSwerveModuleStates</h4>
<pre class="methodSignature">public&nbsp;<a href="SwerveModuleState2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics">SwerveModuleState2</a>[]&nbsp;toSwerveModuleStates&#8203;(edu.wpi.first.math.kinematics.ChassisSpeeds&nbsp;chassisSpeeds,
edu.wpi.first.math.geometry.Translation2d&nbsp;centerOfRotationMeters)</pre>
<div class="block">Performs inverse kinematics to return the module states from a desired chassis velocity. This method is often used
to convert joystick values into module speeds and angles.
<p>This function also supports variable centers of rotation. During normal operations, the
center of rotation is usually the same as the physical center of the robot; therefore, the argument is defaulted to
that use case. However, if you wish to change the center of rotation for evasive maneuvers, vision alignment, or
for any other use case, you can do so.
<p>In the case that the desired chassis speeds are zero (i.e. the robot will be stationary),
the previously calculated module angle will be maintained.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
<dd><code>toSwerveModuleStates</code>&nbsp;in class&nbsp;<code>edu.wpi.first.math.kinematics.SwerveDriveKinematics</code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>chassisSpeeds</code> - The desired chassis speed.</dd>
<dd><code>centerOfRotationMeters</code> - The center of rotation. For example, if you set the center of rotation at one corner
of the robot and provide a chassis speed that only has a dtheta component, the robot
will rotate around that corner.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>An array containing the module states. Use caution because these module states are not normalized.
Sometimes, a user input may cause one of the module speeds to go above the attainable max velocity. Use the
<a href="#desaturateWheelSpeeds(frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveModuleState2%5B%5D,double)"><code>DesaturateWheelSpeeds</code></a> function to rectify this issue.</dd>
</dl>
</li>
</ul>
<a id="toSwerveModuleStates(edu.wpi.first.math.kinematics.ChassisSpeeds)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>toSwerveModuleStates</h4>
<pre class="methodSignature">public&nbsp;<a href="SwerveModuleState2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics">SwerveModuleState2</a>[]&nbsp;toSwerveModuleStates&#8203;(edu.wpi.first.math.kinematics.ChassisSpeeds&nbsp;chassisSpeeds)</pre>
<div class="block">Performs inverse kinematics. See <a href="#toSwerveModuleStates(edu.wpi.first.math.kinematics.ChassisSpeeds,edu.wpi.first.math.geometry.Translation2d)"><code>toSwerveModuleStates(ChassisSpeeds, Translation2d)</code></a> toSwerveModuleStates
for more information.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
<dd><code>toSwerveModuleStates</code>&nbsp;in class&nbsp;<code>edu.wpi.first.math.kinematics.SwerveDriveKinematics</code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>chassisSpeeds</code> - The desired chassis speed.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>An array containing the module states.</dd>
</dl>
</li>
</ul>
<a id="toChassisSpeeds(frc.robot.subsystems.swervedrive.swerve.kinematics.SwerveModuleState2...)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>toChassisSpeeds</h4>
<pre class="methodSignature">public&nbsp;edu.wpi.first.math.kinematics.ChassisSpeeds&nbsp;toChassisSpeeds&#8203;(<a href="SwerveModuleState2.html" title="class in frc.robot.subsystems.swervedrive.swerve.kinematics">SwerveModuleState2</a>...&nbsp;wheelStates)</pre>
<div class="block">Performs forward kinematics to return the resulting chassis state from the given module states. This method is
often used for odometry -- determining the robot's position on the field using data from the real-world speed and
angle of each module on the robot.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>wheelStates</code> - The state of the modules (as a SwerveModuleState type) as measured from respective encoders and
gyros. The order of the swerve module states should be same as passed into the constructor of
this class.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The resulting chassis speed.</dd>
</dl>
</li>
</ul>
<a id="toTwist2d(edu.wpi.first.math.kinematics.SwerveModulePosition...)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>toTwist2d</h4>
<pre class="methodSignature">public&nbsp;edu.wpi.first.math.geometry.Twist2d&nbsp;toTwist2d&#8203;(edu.wpi.first.math.kinematics.SwerveModulePosition...&nbsp;wheelDeltas)</pre>
<div class="block">Performs forward kinematics to return the resulting chassis state from the given module states. This method is
often used for odometry -- determining the robot's position on the field using data from the real-world speed and
angle of each module on the robot.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
<dd><code>toTwist2d</code>&nbsp;in class&nbsp;<code>edu.wpi.first.math.kinematics.SwerveDriveKinematics</code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>wheelDeltas</code> - The latest change in position of the modules (as a SwerveModulePosition type) as measured from
respective encoders and gyros. The order of the swerve module states should be same as passed
into the constructor of this class.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The resulting Twist2d.</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>
<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&nbsp;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:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</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>