diff --git a/.github/workflows/inspector.json b/.github/workflows/inspector.json index ce2d056bac..326bea1a1b 100644 --- a/.github/workflows/inspector.json +++ b/.github/workflows/inspector.json @@ -26,5 +26,5 @@ "latestVersion":"3b64aadee717c9f0566497a40fd0be7d0eaed96d" } ], - "ignoredFiles": ["source/docs/software/commandbased/command-scheduler.rst", "source/docs/software/hardware-apis/pneumatics/pressure.rst", "source/docs/software/hardware-apis/pneumatics/solenoids.rst", "source/docs/software/advanced-gradlerio/code-formatting.rst", "source/docs/software/advanced-controls/state-space/state-space-pose-estimators.rst", "source/docs/software/commandbased/pid-subsystems-commands.rst", "source/docs/software/commandbased/profilepid-subsystems-commands.rst", "source/docs/software/commandbased/subsystems.rst", "source/docs/software/hardware-apis/motors/wpi-drive-classes.rst", "source/docs/software/pathplanning/trajectory-tutorial/creating-drive-subsystem.rst", "source/docs/software/telemetry/writing-sendable-classes.rst"] + "ignoredFiles": ["source/docs/software/commandbased/command-scheduler.rst", "source/docs/software/hardware-apis/pneumatics/pressure.rst", "source/docs/software/hardware-apis/pneumatics/solenoids.rst", "source/docs/software/advanced-gradlerio/code-formatting.rst", "source/docs/software/controls/state-space/state-space-pose-estimators.rst", "source/docs/software/commandbased/pid-subsystems-commands.rst", "source/docs/software/commandbased/profilepid-subsystems-commands.rst", "source/docs/software/commandbased/subsystems.rst", "source/docs/software/hardware-apis/motors/wpi-drive-classes.rst", "source/docs/software/pathplanning/trajectory-tutorial/creating-drive-subsystem.rst", "source/docs/software/telemetry/writing-sendable-classes.rst"] } diff --git a/source/docs/controls-overviews/control-system-software.rst b/source/docs/controls-overviews/control-system-software.rst index 0fbd60763c..5b51543fe7 100644 --- a/source/docs/controls-overviews/control-system-software.rst +++ b/source/docs/controls-overviews/control-system-software.rst @@ -141,7 +141,7 @@ System Identification .. image:: images/control-system-software/sysid.png :alt: SysId UI showing diagnostics and analysis for a flywheel. -This tool helps teams automatically calculate constants that can be used to describe the physical properties of your robot for use in features like robot simulation, trajectory following, and PID control. For more information see the :ref:`System Identification section `. +This tool helps teams automatically calculate constants that can be used to describe the physical properties of your robot for use in features like robot simulation, trajectory following, and PID control. For more information see the :ref:`System Identification section `. OutlineViewer ------------- diff --git a/source/docs/software/basic-programming/cpp-units.rst b/source/docs/software/basic-programming/cpp-units.rst index ebc765b22d..e82a6641f9 100644 --- a/source/docs/software/basic-programming/cpp-units.rst +++ b/source/docs/software/basic-programming/cpp-units.rst @@ -160,7 +160,7 @@ To convert a container type to its underlying value, use the ``value()`` method. Example of the Units Library in WPILib Code ------------------------------------------- -Several arguments for methods in new features of WPILib (ex. :ref:`kinematics `) use the units library. Here is an example of :ref:`sampling a trajectory `. +Several arguments for methods in new features of WPILib (ex. :ref:`kinematics `) use the units library. Here is an example of :ref:`sampling a trajectory `. .. code-block:: c++ diff --git a/source/docs/software/basic-programming/java-units.rst b/source/docs/software/basic-programming/java-units.rst index 8e08fa8a82..3856967fe2 100644 --- a/source/docs/software/basic-programming/java-units.rst +++ b/source/docs/software/basic-programming/java-units.rst @@ -40,7 +40,7 @@ Java Generics ^^^^^^^^^^^^^ Units of measurement can be complex expressions involving various dimension, such as distance, time, and velocity. Nested `generic type parameters `__ allow for the definition of units that can represent such complex expressions. Generics are used to keep the library concise, reusable, and extensible, but it tends to be verbose due to the syntax for Java generics. -For instance, consider the type ``Measure>``. This type represents a measurement for velocity, where the velocity itself is expressed as a unit of distance per unit of time. This nested structure allows for the representation of units like meters per second or feet per minute. Similarly, the type ``Measure>>`` represents a measurement for a ratio of voltage to velocity. This type is useful for representing quantities like volts per meter per second, the unit of measure for some :ref:`feedforward` gains. +For instance, consider the type ``Measure>``. This type represents a measurement for velocity, where the velocity itself is expressed as a unit of distance per unit of time. This nested structure allows for the representation of units like meters per second or feet per minute. Similarly, the type ``Measure>>`` represents a measurement for a ratio of voltage to velocity. This type is useful for representing quantities like volts per meter per second, the unit of measure for some :ref:`feedforward` gains. It's important to note that not all measurements require such complex nested types. For example, the type ``Measure`` is sufficient for representing simple units like meters or feet. However, for more complex units, the use of nested generic type parameters is essential. diff --git a/source/docs/software/commandbased/binding-commands-to-triggers.rst b/source/docs/software/commandbased/binding-commands-to-triggers.rst index b5962bb668..a51668599f 100644 --- a/source/docs/software/commandbased/binding-commands-to-triggers.rst +++ b/source/docs/software/commandbased/binding-commands-to-triggers.rst @@ -188,7 +188,7 @@ The ``Trigger`` class can be composed to create composite triggers through the ` Debouncing Triggers ------------------- -To avoid rapid repeated activation, triggers (especially those originating from digital inputs) can be debounced with the :ref:`WPILib Debouncer class ` using the `debounce` method: +To avoid rapid repeated activation, triggers (especially those originating from digital inputs) can be debounced with the :ref:`WPILib Debouncer class ` using the `debounce` method: .. tab-set-code:: diff --git a/source/docs/software/commandbased/pid-subsystems-commands.rst b/source/docs/software/commandbased/pid-subsystems-commands.rst index 1891489c4e..7917bda24a 100644 --- a/source/docs/software/commandbased/pid-subsystems-commands.rst +++ b/source/docs/software/commandbased/pid-subsystems-commands.rst @@ -3,9 +3,9 @@ PID Control through PIDSubsystems and PIDCommands ================================================= -.. note:: For a description of the WPILib PID control features used by these command-based wrappers, see :ref:`docs/software/advanced-controls/controllers/pidcontroller:PID Control in WPILib`. +.. note:: For a description of the WPILib PID control features used by these command-based wrappers, see :ref:`docs/software/controls/controllers/pidcontroller:PID Control in WPILib`. -One of the most common control algorithms used in FRC\ |reg| is the :term:`PID` controller. WPILib offers its own :ref:`PIDController ` class to help teams implement this functionality on their robots. To further help teams integrate PID control into a command-based robot project, the command-based library includes two convenience wrappers for the ``PIDController`` class: ``PIDSubsystem``, which integrates the PID controller into a subsystem, and ``PIDCommand``, which integrates the PID controller into a command. +One of the most common control algorithms used in FRC\ |reg| is the :term:`PID` controller. WPILib offers its own :ref:`PIDController ` class to help teams implement this functionality on their robots. To further help teams integrate PID control into a command-based robot project, the command-based library includes two convenience wrappers for the ``PIDController`` class: ``PIDSubsystem``, which integrates the PID controller into a subsystem, and ``PIDCommand``, which integrates the PID controller into a command. PIDSubsystems ------------- diff --git a/source/docs/software/commandbased/profile-subsystems-commands.rst b/source/docs/software/commandbased/profile-subsystems-commands.rst index 3cf18e43bc..5e2c211692 100644 --- a/source/docs/software/commandbased/profile-subsystems-commands.rst +++ b/source/docs/software/commandbased/profile-subsystems-commands.rst @@ -1,7 +1,7 @@ Motion Profiling through TrapezoidProfileSubsystems and TrapezoidProfileCommands ================================================================================ -.. note:: For a description of the WPILib motion profiling features used by these command-based wrappers, see :ref:`docs/software/advanced-controls/controllers/trapezoidal-profiles:Trapezoidal Motion Profiles in WPILib`. +.. note:: For a description of the WPILib motion profiling features used by these command-based wrappers, see :ref:`docs/software/controls/controllers/trapezoidal-profiles:Trapezoidal Motion Profiles in WPILib`. .. note:: The ``TrapezoidProfile`` command wrappers are generally intended for composition with custom or external controllers. For combining trapezoidal motion profiling with WPILib's ``PIDController``, see :doc:`profilepid-subsystems-commands`. diff --git a/source/docs/software/commandbased/profilepid-subsystems-commands.rst b/source/docs/software/commandbased/profilepid-subsystems-commands.rst index 4556d879f7..c7028b4699 100644 --- a/source/docs/software/commandbased/profilepid-subsystems-commands.rst +++ b/source/docs/software/commandbased/profilepid-subsystems-commands.rst @@ -3,9 +3,9 @@ Combining Motion Profiling and PID in Command-Based =================================================== -.. note:: For a description of the WPILib PID control features used by these command-based wrappers, see :ref:`docs/software/advanced-controls/controllers/pidcontroller:PID Control in WPILib`. +.. note:: For a description of the WPILib PID control features used by these command-based wrappers, see :ref:`docs/software/controls/controllers/pidcontroller:PID Control in WPILib`. -A common FRC\ |reg| controls solution is to pair a trapezoidal motion profile for setpoint generation with a PID controller for setpoint tracking. To facilitate this, WPILib includes its own :ref:`ProfiledPIDController ` class. To further aid teams in integrating this functionality into their robots, the command-based framework contains two convenience wrappers for the ``ProfiledPIDController`` class: ``ProfiledPIDSubsystem``, which integrates the controller into a subsystem, and ``ProfiledPIDCommand``, which integrates the controller into a command. +A common FRC\ |reg| controls solution is to pair a trapezoidal motion profile for setpoint generation with a PID controller for setpoint tracking. To facilitate this, WPILib includes its own :ref:`ProfiledPIDController ` class. To further aid teams in integrating this functionality into their robots, the command-based framework contains two convenience wrappers for the ``ProfiledPIDController`` class: ``ProfiledPIDSubsystem``, which integrates the controller into a subsystem, and ``ProfiledPIDCommand``, which integrates the controller into a command. ProfiledPIDSubsystem -------------------- diff --git a/source/docs/software/advanced-controls/controllers/bang-bang.rst b/source/docs/software/controls/controllers/bang-bang.rst similarity index 89% rename from source/docs/software/advanced-controls/controllers/bang-bang.rst rename to source/docs/software/controls/controllers/bang-bang.rst index 20366ab453..c21094ab47 100644 --- a/source/docs/software/advanced-controls/controllers/bang-bang.rst +++ b/source/docs/software/controls/controllers/bang-bang.rst @@ -58,7 +58,7 @@ Using a bang-bang controller is easy: Combining Bang Bang Control with Feedforward -------------------------------------------- -Like a PID controller, best results are obtained in conjunction with a :ref:`feedforward ` controller that provides the necessary voltage to sustain the system output at the desired speed, so that the bang-bang controller is only responsible for rejecting disturbances. Since the bang-bang controller can *only* correct in the forward direction, however, it may be preferable to use a slightly conservative feedforward estimate to ensure that the shooter does not over-speed. +Like a PID controller, best results are obtained in conjunction with a :ref:`feedforward ` controller that provides the necessary voltage to sustain the system output at the desired speed, so that the bang-bang controller is only responsible for rejecting disturbances. Since the bang-bang controller can *only* correct in the forward direction, however, it may be preferable to use a slightly conservative feedforward estimate to ensure that the shooter does not over-speed. .. tab-set-code:: diff --git a/source/docs/software/advanced-controls/controllers/combining-feedforward-feedback.rst b/source/docs/software/controls/controllers/combining-feedforward-feedback.rst similarity index 92% rename from source/docs/software/advanced-controls/controllers/combining-feedforward-feedback.rst rename to source/docs/software/controls/controllers/combining-feedforward-feedback.rst index a249e31b1a..57fce92a1c 100644 --- a/source/docs/software/advanced-controls/controllers/combining-feedforward-feedback.rst +++ b/source/docs/software/controls/controllers/combining-feedforward-feedback.rst @@ -31,14 +31,14 @@ Users may add any feedforward they like to the output of the controller before s // Adds a feedforward to the loop output before sending it to the motor motor.setVoltage(pid.calculate(encoder.getDistance(), setpoint) + feedforward) -Moreover, feedforward is a separate feature entirely from feedback, and thus has no reason to be handled in the same controller object, as this violates separation of concerns. WPILib comes with several helper classes to compute accurate feedforward voltages for common FRC\ |reg| mechanisms - for more information, see :ref:`docs/software/advanced-controls/controllers/feedforward:Feedforward Control in WPILib`. +Moreover, feedforward is a separate feature entirely from feedback, and thus has no reason to be handled in the same controller object, as this violates separation of concerns. WPILib comes with several helper classes to compute accurate feedforward voltages for common FRC\ |reg| mechanisms - for more information, see :ref:`docs/software/controls/controllers/feedforward:Feedforward Control in WPILib`. Using Feedforward Components with PID ------------------------------------- .. note:: Since feedforward voltages are physically meaningful, it is best to use the ``setVoltage()`` (`Java `__, `C++ `__) method when applying them to motors to compensate for "voltage sag" from the battery. -What might a more complete example of combined feedforward/PID control look like? Consider the :ref:`drive example ` from the feedforward page. We can easily modify this to include feedback control (with a ``SimpleMotorFeedforward`` component): +What might a more complete example of combined feedforward/PID control look like? Consider the :ref:`drive example ` from the feedforward page. We can easily modify this to include feedback control (with a ``SimpleMotorFeedforward`` component): .. tab-set-code:: diff --git a/source/docs/software/advanced-controls/controllers/feedforward.rst b/source/docs/software/controls/controllers/feedforward.rst similarity index 93% rename from source/docs/software/advanced-controls/controllers/feedforward.rst rename to source/docs/software/controls/controllers/feedforward.rst index 1a255ee932..2799b78cbf 100644 --- a/source/docs/software/advanced-controls/controllers/feedforward.rst +++ b/source/docs/software/controls/controllers/feedforward.rst @@ -3,7 +3,7 @@ Feedforward Control in WPILib ============================= -.. note:: This article focuses on in-code implementation of feedforward control in WPILib. For a conceptual explanation of the feedforward equations used by WPILib, see :ref:`docs/software/advanced-controls/introduction/introduction-to-feedforward:Introduction to DC Motor Feedforward` +.. note:: This article focuses on in-code implementation of feedforward control in WPILib. For a conceptual explanation of the feedforward equations used by WPILib, see :ref:`docs/software/controls/introduction/introduction-to-feedforward:Introduction to DC Motor Feedforward` You may have used feedback control (such as PID) for reference tracking (making a system's output follow a desired reference signal). While this is effective, it's a reactionary measure; the system won't start applying control effort until the system is already behind. If we could tell the controller about the desired movement and required input beforehand, the system could react quicker and the feedback controller could do less work. A controller that feeds information forward into the plant like this is called a feedforward controller. @@ -14,7 +14,7 @@ The WPILib Feedforward Classes WPILib provides a number of classes to help users implement accurate feedforward control for their mechanisms. In many ways, an accurate feedforward is more important than feedback to effective control of a mechanism. Since most FRC\ |reg| mechanisms closely obey well-understood system equations, starting with an accurate feedforward is both easy and hugely beneficial to accurate and robust mechanism control. -The WPILib feedforward classes closely match the available mechanism characterization tools available in the :ref:`SysId toolsuite `. The system identification toolsuite can be used to quickly and effectively determine the correct gains for each type of feedforward. If you are unable to empirically characterize your mechanism (due to space and/or time constraints), reasonable estimates of ``kG``, ``kV``, and ``kA`` can be obtained by fairly simple computation, and are also available from `ReCalc `__. ``kS`` is nearly impossible to model, and must be measured empirically. +The WPILib feedforward classes closely match the available mechanism characterization tools available in the :ref:`SysId toolsuite `. The system identification toolsuite can be used to quickly and effectively determine the correct gains for each type of feedforward. If you are unable to empirically characterize your mechanism (due to space and/or time constraints), reasonable estimates of ``kG``, ``kV``, and ``kA`` can be obtained by fairly simple computation, and are also available from `ReCalc `__. ``kS`` is nearly impossible to model, and must be measured empirically. WPILib currently provides the following three helper classes for feedforward control: diff --git a/source/docs/software/advanced-controls/controllers/index.rst b/source/docs/software/controls/controllers/index.rst similarity index 100% rename from source/docs/software/advanced-controls/controllers/index.rst rename to source/docs/software/controls/controllers/index.rst diff --git a/source/docs/software/advanced-controls/controllers/pidcontroller.rst b/source/docs/software/controls/controllers/pidcontroller.rst similarity index 97% rename from source/docs/software/advanced-controls/controllers/pidcontroller.rst rename to source/docs/software/controls/controllers/pidcontroller.rst index faced4c405..88c3675acd 100644 --- a/source/docs/software/advanced-controls/controllers/pidcontroller.rst +++ b/source/docs/software/controls/controllers/pidcontroller.rst @@ -1,7 +1,7 @@ PID Control in WPILib ===================== -.. note:: This article focuses on in-code implementation of PID control in WPILib. For a conceptual explanation of the working of a PIDController, see :ref:`docs/software/advanced-controls/introduction/introduction-to-pid:Introduction to PID` +.. note:: This article focuses on in-code implementation of PID control in WPILib. For a conceptual explanation of the working of a PIDController, see :ref:`docs/software/controls/introduction/introduction-to-pid:Introduction to PID` .. note:: For a guide on implementing PID control through the :ref:`command-based framework `, see :ref:`docs/software/commandbased/pid-subsystems-commands:PID Control through PIDSubsystems and PIDCommands`. @@ -100,7 +100,7 @@ It is sometimes desirable to clear the internal state (most importantly, the int Setting a Max Integrator Value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. note:: Integrators introduce instability and hysteresis into feedback loop systems. It is strongly recommended that teams avoid using integral gain unless absolutely no other solution will do - very often, problems that can be solved with an integrator can be better solved through use of a more-accurate :ref:`feedforward `. +.. note:: Integrators introduce instability and hysteresis into feedback loop systems. It is strongly recommended that teams avoid using integral gain unless absolutely no other solution will do - very often, problems that can be solved with an integrator can be better solved through use of a more-accurate :ref:`feedforward `. A typical problem encountered when using integral feedback is excessive "wind-up" causing the system to wildly overshoot the setpoint. This can be alleviated in a number of ways - the WPILib ``PIDController`` class enforces an integrator range limiter to help teams overcome this issue. diff --git a/source/docs/software/advanced-controls/controllers/profiled-pidcontroller.rst b/source/docs/software/controls/controllers/profiled-pidcontroller.rst similarity index 91% rename from source/docs/software/advanced-controls/controllers/profiled-pidcontroller.rst rename to source/docs/software/controls/controllers/profiled-pidcontroller.rst index 2d838f7c34..64c791b6f2 100644 --- a/source/docs/software/advanced-controls/controllers/profiled-pidcontroller.rst +++ b/source/docs/software/controls/controllers/profiled-pidcontroller.rst @@ -12,7 +12,7 @@ Using the ProfiledPIDController class .. note:: In C++, the ``ProfiledPIDController`` class is templated on the unit type used for distance measurements, which may be angular or linear. The passed-in values *must* have units consistent with the distance units, or a compile-time error will be thrown. For more information on C++ units, see :ref:`docs/software/basic-programming/cpp-units:The C++ Units Library`. -.. note:: Much of the functionality of ``ProfiledPIDController`` is effectively identical to that of ``PIDController``. Accordingly, this article will only cover features that are substantially-changed to accommodate the motion profiling functionality. For information on standard ``PIDController`` features, see :ref:`docs/software/advanced-controls/controllers/pidcontroller:PID Control in WPILib`. +.. note:: Much of the functionality of ``ProfiledPIDController`` is effectively identical to that of ``PIDController``. Accordingly, this article will only cover features that are substantially-changed to accommodate the motion profiling functionality. For information on standard ``PIDController`` features, see :ref:`docs/software/controls/controllers/pidcontroller:PID Control in WPILib`. Constructing a ProfiledPIDController @@ -20,7 +20,7 @@ Constructing a ProfiledPIDController .. note:: C++ is often able to infer the type of the inner classes, and thus a simple initializer list (without the class name) can be sent as a parameter. The full class name is included in the example below for clarity. -Creating a ``ProfiledPIDController`` is nearly identical to :ref:`creating a PIDController `. The only difference is the need to supply a set of :ref:`trapezoidal profile constraints `, which will be automatically forwarded to the internally-generated ``TrapezoidProfile`` instances: +Creating a ``ProfiledPIDController`` is nearly identical to :ref:`creating a PIDController `. The only difference is the need to supply a set of :ref:`trapezoidal profile constraints `, which will be automatically forwarded to the internally-generated ``TrapezoidProfile`` instances: .. tab-set-code:: @@ -66,7 +66,7 @@ The specified ``goal`` value (which can be either a position value or a ``Trapez Getting/Using the Setpoint ~~~~~~~~~~~~~~~~~~~~~~~~~~ -Since the ``ProfiledPIDController`` goal differs from the setpoint, is if often desirable to poll the current setpoint of the controller (for instance, to get values to use with :ref:`feedforward `). This can be done with the ``getSetpoint()`` method. +Since the ``ProfiledPIDController`` goal differs from the setpoint, is if often desirable to poll the current setpoint of the controller (for instance, to get values to use with :ref:`feedforward `). This can be done with the ``getSetpoint()`` method. The returned setpoint might then be used as in the following example: diff --git a/source/docs/software/advanced-controls/controllers/trapezoidal-profiles.rst b/source/docs/software/controls/controllers/trapezoidal-profiles.rst similarity index 96% rename from source/docs/software/advanced-controls/controllers/trapezoidal-profiles.rst rename to source/docs/software/controls/controllers/trapezoidal-profiles.rst index a10a3304de..0da008e83c 100644 --- a/source/docs/software/advanced-controls/controllers/trapezoidal-profiles.rst +++ b/source/docs/software/controls/controllers/trapezoidal-profiles.rst @@ -21,7 +21,7 @@ Creating a TrapezoidProfile Constraints ^^^^^^^^^^^ -.. note:: The various :ref:`feedforward helper classes ` provide methods for calculating the maximum simultaneously-achievable velocity and acceleration of a mechanism. These can be very useful for calculating appropriate motion constraints for your ``TrapezoidProfile``. +.. note:: The various :ref:`feedforward helper classes ` provide methods for calculating the maximum simultaneously-achievable velocity and acceleration of a mechanism. These can be very useful for calculating appropriate motion constraints for your ``TrapezoidProfile``. In order to create a trapezoidal motion profile, we must first impose some constraints on the desired motion. Namely, we must specify a maximum velocity and acceleration that the mechanism will be expected to achieve during the motion. To do this, we create an instance of the ``TrapezoidProfile.Constraints`` class (`Java `__, `C++ `__): diff --git a/source/docs/software/advanced-controls/controls-glossary.rst b/source/docs/software/controls/controls-glossary.rst similarity index 100% rename from source/docs/software/advanced-controls/controls-glossary.rst rename to source/docs/software/controls/controls-glossary.rst diff --git a/source/docs/software/advanced-controls/filters/debouncer.rst b/source/docs/software/controls/filters/debouncer.rst similarity index 100% rename from source/docs/software/advanced-controls/filters/debouncer.rst rename to source/docs/software/controls/filters/debouncer.rst diff --git a/source/docs/software/advanced-controls/filters/images/firfilter.png b/source/docs/software/controls/filters/images/firfilter.png similarity index 100% rename from source/docs/software/advanced-controls/filters/images/firfilter.png rename to source/docs/software/controls/filters/images/firfilter.png diff --git a/source/docs/software/advanced-controls/filters/images/highpassfilter.png b/source/docs/software/controls/filters/images/highpassfilter.png similarity index 100% rename from source/docs/software/advanced-controls/filters/images/highpassfilter.png rename to source/docs/software/controls/filters/images/highpassfilter.png diff --git a/source/docs/software/advanced-controls/filters/images/medianfilter.png b/source/docs/software/controls/filters/images/medianfilter.png similarity index 100% rename from source/docs/software/advanced-controls/filters/images/medianfilter.png rename to source/docs/software/controls/filters/images/medianfilter.png diff --git a/source/docs/software/advanced-controls/filters/images/singlepolefilter.png b/source/docs/software/controls/filters/images/singlepolefilter.png similarity index 100% rename from source/docs/software/advanced-controls/filters/images/singlepolefilter.png rename to source/docs/software/controls/filters/images/singlepolefilter.png diff --git a/source/docs/software/advanced-controls/filters/index.rst b/source/docs/software/controls/filters/index.rst similarity index 100% rename from source/docs/software/advanced-controls/filters/index.rst rename to source/docs/software/controls/filters/index.rst diff --git a/source/docs/software/advanced-controls/filters/introduction.rst b/source/docs/software/controls/filters/introduction.rst similarity index 100% rename from source/docs/software/advanced-controls/filters/introduction.rst rename to source/docs/software/controls/filters/introduction.rst diff --git a/source/docs/software/advanced-controls/filters/linear-filter.rst b/source/docs/software/controls/filters/linear-filter.rst similarity index 94% rename from source/docs/software/advanced-controls/filters/linear-filter.rst rename to source/docs/software/controls/filters/linear-filter.rst index 72a4783334..cb96dd5192 100644 --- a/source/docs/software/advanced-controls/filters/linear-filter.rst +++ b/source/docs/software/controls/filters/linear-filter.rst @@ -46,7 +46,7 @@ The ``singlePoleIIR()`` factory method creates a single-pole infinite impulse re // Period is 0.02 seconds - this is the standard FRC main loop period frc::LinearFilter filter = frc::LinearFilter::SinglePoleIIR(0.1_s, 0.02_s); -The "time constant" parameter determines the "characteristic timescale" of the filter's impulse response; the filter will cancel out any signal dynamics that occur on timescales significantly shorter than this. Relatedly, it is also the approximate timescale of the introduced :ref:`phase lag `. The reciprocal of this timescale, multiplied by 2 pi, is the "cutoff frequency" of the filter. +The "time constant" parameter determines the "characteristic timescale" of the filter's impulse response; the filter will cancel out any signal dynamics that occur on timescales significantly shorter than this. Relatedly, it is also the approximate timescale of the introduced :ref:`phase lag `. The reciprocal of this timescale, multiplied by 2 pi, is the "cutoff frequency" of the filter. The "period" parameter is the period at which the filter's ``calculate()`` method will be called. For the vast majority of implementations, this will be the standard main robot loop period of 0.02 seconds. @@ -98,7 +98,7 @@ The ``highPass`` factory method creates a simple first-order infinite impulse re // Period is 0.02 seconds - this is the standard FRC main loop period frc::LinearFilter filter = frc::LinearFilter::HighPass(0.1_s, 0.02_s); -The "time constant" parameter determines the "characteristic timescale" of the filter's impulse response; the filter will cancel out any signal dynamics that occur on timescales significantly longer than this. Relatedly, it is also the approximate timescale of the introduced :ref:`phase lead `. The reciprocal of this timescale, multiplied by 2 pi, is the "cutoff frequency" of the filter. +The "time constant" parameter determines the "characteristic timescale" of the filter's impulse response; the filter will cancel out any signal dynamics that occur on timescales significantly longer than this. Relatedly, it is also the approximate timescale of the introduced :ref:`phase lead `. The reciprocal of this timescale, multiplied by 2 pi, is the "cutoff frequency" of the filter. The "period" parameter is the period at which the filter's ``calculate()`` method will be called. For the vast majority of implementations, this will be the standard main robot loop period of 0.02 seconds. diff --git a/source/docs/software/advanced-controls/filters/median-filter.rst b/source/docs/software/controls/filters/median-filter.rst similarity index 87% rename from source/docs/software/advanced-controls/filters/median-filter.rst rename to source/docs/software/controls/filters/median-filter.rst index 3dee995b61..6accc28b01 100644 --- a/source/docs/software/advanced-controls/filters/median-filter.rst +++ b/source/docs/software/controls/filters/median-filter.rst @@ -4,7 +4,7 @@ Median Filter .. image:: images/medianfilter.png :alt: A graph with two peaks with the input closely following the target signal. -A `statistically robust` alternative to the :ref:`moving-average filter ` is the *median filter*. Where a moving average filter takes the arithmetic *mean* of the input over a moving sample window, a median filter (per the name) takes a median instead. +A `statistically robust` alternative to the :ref:`moving-average filter ` is the *median filter*. Where a moving average filter takes the arithmetic *mean* of the input over a moving sample window, a median filter (per the name) takes a median instead. The median filter is most-useful for removing occasional outliers from an input stream. This makes it particularly well-suited to filtering inputs from distance sensors, which are prone to occasional interference. Unlike a moving average, the median filter will remain completely unaffected by small numbers of outliers, no matter how extreme. diff --git a/source/docs/software/advanced-controls/filters/resources/filterdemo.csv b/source/docs/software/controls/filters/resources/filterdemo.csv similarity index 100% rename from source/docs/software/advanced-controls/filters/resources/filterdemo.csv rename to source/docs/software/controls/filters/resources/filterdemo.csv diff --git a/source/docs/software/advanced-controls/filters/slew-rate-limiter.rst b/source/docs/software/controls/filters/slew-rate-limiter.rst similarity index 86% rename from source/docs/software/advanced-controls/filters/slew-rate-limiter.rst rename to source/docs/software/controls/filters/slew-rate-limiter.rst index 7acb308984..8a3b9a1e90 100644 --- a/source/docs/software/advanced-controls/filters/slew-rate-limiter.rst +++ b/source/docs/software/controls/filters/slew-rate-limiter.rst @@ -5,7 +5,7 @@ Slew Rate Limiter A common use for filters in FRC\ |reg| is to soften the behavior of control inputs (for example, the joystick inputs from your driver controls). Unfortunately, a simple low-pass filter is poorly-suited for this job; while a low-pass filter will soften the response of an input stream to sudden changes, it will also wash out fine control detail and introduce phase lag. A better solution is to limit the rate-of-change of the control input directly. This is performed with a *slew rate limiter* - a filter that caps the maximum rate-of-change of the signal. -A slew rate limiter can be thought of as a sort of primitive motion profile. In fact, the slew rate limiter is the first-order equivalent of the :ref:`Trapezoidal Motion Profile ` supported by WPILib - it is precisely the limiting case of trapezoidal motion when the acceleration constraint is allowed to tend to infinity. Accordingly, the slew rate limiter is a good choice for applying a de-facto motion profile to a stream of velocity setpoints (or voltages, which are usually approximately proportional to velocity). For input streams that control positions, it is usually better to use a proper trapezoidal profile. +A slew rate limiter can be thought of as a sort of primitive motion profile. In fact, the slew rate limiter is the first-order equivalent of the :ref:`Trapezoidal Motion Profile ` supported by WPILib - it is precisely the limiting case of trapezoidal motion when the acceleration constraint is allowed to tend to infinity. Accordingly, the slew rate limiter is a good choice for applying a de-facto motion profile to a stream of velocity setpoints (or voltages, which are usually approximately proportional to velocity). For input streams that control positions, it is usually better to use a proper trapezoidal profile. Slew rate limiting is supported in WPILib through the ``SlewRateLimiter`` class (`Java `__, `C++ `__). diff --git a/source/docs/software/advanced-controls/geometry/coordinate-systems.rst b/source/docs/software/controls/geometry/coordinate-systems.rst similarity index 100% rename from source/docs/software/advanced-controls/geometry/coordinate-systems.rst rename to source/docs/software/controls/geometry/coordinate-systems.rst diff --git a/source/docs/software/advanced-controls/geometry/diagrams/field-system.svg b/source/docs/software/controls/geometry/diagrams/field-system.svg similarity index 100% rename from source/docs/software/advanced-controls/geometry/diagrams/field-system.svg rename to source/docs/software/controls/geometry/diagrams/field-system.svg diff --git a/source/docs/software/advanced-controls/geometry/diagrams/robot-system.svg b/source/docs/software/controls/geometry/diagrams/robot-system.svg similarity index 100% rename from source/docs/software/advanced-controls/geometry/diagrams/robot-system.svg rename to source/docs/software/controls/geometry/diagrams/robot-system.svg diff --git a/source/docs/software/advanced-controls/geometry/images/infinite-recharge.jpg b/source/docs/software/controls/geometry/images/infinite-recharge.jpg similarity index 100% rename from source/docs/software/advanced-controls/geometry/images/infinite-recharge.jpg rename to source/docs/software/controls/geometry/images/infinite-recharge.jpg diff --git a/source/docs/software/advanced-controls/geometry/index.rst b/source/docs/software/controls/geometry/index.rst similarity index 100% rename from source/docs/software/advanced-controls/geometry/index.rst rename to source/docs/software/controls/geometry/index.rst diff --git a/source/docs/software/advanced-controls/geometry/pose.rst b/source/docs/software/controls/geometry/pose.rst similarity index 100% rename from source/docs/software/advanced-controls/geometry/pose.rst rename to source/docs/software/controls/geometry/pose.rst diff --git a/source/docs/software/advanced-controls/geometry/transformations.rst b/source/docs/software/controls/geometry/transformations.rst similarity index 100% rename from source/docs/software/advanced-controls/geometry/transformations.rst rename to source/docs/software/controls/geometry/transformations.rst diff --git a/source/docs/software/advanced-controls/index.rst b/source/docs/software/controls/index.rst similarity index 60% rename from source/docs/software/advanced-controls/index.rst rename to source/docs/software/controls/index.rst index 0addafd44b..f3a8ac2036 100644 --- a/source/docs/software/advanced-controls/index.rst +++ b/source/docs/software/controls/index.rst @@ -1,7 +1,7 @@ -Advanced Controls +Controls ================= -This section covers advanced control features in WPILib, such as various feedback/feedforward control algorithms and trajectory following. +This section covers control features in WPILib, such as various feedback/feedforward control algorithms and trajectory following. .. toctree:: :maxdepth: 2 diff --git a/source/docs/software/advanced-controls/introduction/common-control-issues.rst b/source/docs/software/controls/introduction/common-control-issues.rst similarity index 100% rename from source/docs/software/advanced-controls/introduction/common-control-issues.rst rename to source/docs/software/controls/introduction/common-control-issues.rst diff --git a/source/docs/software/advanced-controls/introduction/control-system-basics.rst b/source/docs/software/controls/introduction/control-system-basics.rst similarity index 90% rename from source/docs/software/advanced-controls/introduction/control-system-basics.rst rename to source/docs/software/controls/introduction/control-system-basics.rst index af35e4d766..099524ca71 100644 --- a/source/docs/software/advanced-controls/introduction/control-system-basics.rst +++ b/source/docs/software/controls/introduction/control-system-basics.rst @@ -77,6 +77,6 @@ For the purposes of the introductory section, all systems and controllers (excep Nonetheless, we restrict ourselves to SISO systems here to be able to present the following tutorials in terms of the PID Controller formalism, which is commonly featured in introductory course material and has extensive documentation and many available implementations. -The :ref:`state-space ` formalism is an alternate way to conceptualize these systems which allows us to easily capture interactions between different quantities (as well as simultaneously represent multiple aspects of the same quantity, such as position and velocity of a motor). It does this, roughly, by replacing the single-dimensional scalars (e.g. the :term:`gain`, :term:`input`, and :term:`output`) with multi-dimensional vectors. In the state-space formalism, the equivalent of a "PID" controller is a vector-proportional controller on a single vector-valued mechanism state, with a single :term:`gain` vector (instead of three different :term:`gain` scalars). +The :ref:`state-space ` formalism is an alternate way to conceptualize these systems which allows us to easily capture interactions between different quantities (as well as simultaneously represent multiple aspects of the same quantity, such as position and velocity of a motor). It does this, roughly, by replacing the single-dimensional scalars (e.g. the :term:`gain`, :term:`input`, and :term:`output`) with multi-dimensional vectors. In the state-space formalism, the equivalent of a "PID" controller is a vector-proportional controller on a single vector-valued mechanism state, with a single :term:`gain` vector (instead of three different :term:`gain` scalars). If you remember that a state-space controller is really just a PID controller written with dense notation, many of the principles covered in this set of introductory articles will transfer seamlessly to the case of state-space control. diff --git a/source/docs/software/advanced-controls/introduction/images/control-system-basic-blockdiagram-2.png b/source/docs/software/controls/introduction/images/control-system-basic-blockdiagram-2.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/control-system-basic-blockdiagram-2.png rename to source/docs/software/controls/introduction/images/control-system-basic-blockdiagram-2.png diff --git a/source/docs/software/advanced-controls/introduction/images/control-system-basics-blockdiagrams-1.png b/source/docs/software/controls/introduction/images/control-system-basics-blockdiagrams-1.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/control-system-basics-blockdiagrams-1.png rename to source/docs/software/controls/introduction/images/control-system-basics-blockdiagrams-1.png diff --git a/source/docs/software/advanced-controls/introduction/images/control-system-basics-ctrl-plus-plant.png b/source/docs/software/controls/introduction/images/control-system-basics-ctrl-plus-plant.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/control-system-basics-ctrl-plus-plant.png rename to source/docs/software/controls/introduction/images/control-system-basics-ctrl-plus-plant.png diff --git a/source/docs/software/advanced-controls/introduction/images/control-system-basics-feedbackplant.png b/source/docs/software/controls/introduction/images/control-system-basics-feedbackplant.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/control-system-basics-feedbackplant.png rename to source/docs/software/controls/introduction/images/control-system-basics-feedbackplant.png diff --git a/source/docs/software/advanced-controls/introduction/images/control-system-basics-whatisgain.png b/source/docs/software/controls/introduction/images/control-system-basics-whatisgain.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/control-system-basics-whatisgain.png rename to source/docs/software/controls/introduction/images/control-system-basics-whatisgain.png diff --git a/source/docs/software/advanced-controls/introduction/images/introduction-to-pid-d-controller.png b/source/docs/software/controls/introduction/images/introduction-to-pid-d-controller.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/introduction-to-pid-d-controller.png rename to source/docs/software/controls/introduction/images/introduction-to-pid-d-controller.png diff --git a/source/docs/software/advanced-controls/introduction/images/introduction-to-pid-damped-controller.png b/source/docs/software/controls/introduction/images/introduction-to-pid-damped-controller.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/introduction-to-pid-damped-controller.png rename to source/docs/software/controls/introduction/images/introduction-to-pid-damped-controller.png diff --git a/source/docs/software/advanced-controls/introduction/images/introduction-to-pid-p-controller.png b/source/docs/software/controls/introduction/images/introduction-to-pid-p-controller.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/introduction-to-pid-p-controller.png rename to source/docs/software/controls/introduction/images/introduction-to-pid-p-controller.png diff --git a/source/docs/software/advanced-controls/introduction/images/introduction-to-pid-pi-controller-block-diagram.png b/source/docs/software/controls/introduction/images/introduction-to-pid-pi-controller-block-diagram.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/introduction-to-pid-pi-controller-block-diagram.png rename to source/docs/software/controls/introduction/images/introduction-to-pid-pi-controller-block-diagram.png diff --git a/source/docs/software/advanced-controls/introduction/images/introduction-to-pid-pi-controller-overshoot.png b/source/docs/software/controls/introduction/images/introduction-to-pid-pi-controller-overshoot.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/introduction-to-pid-pi-controller-overshoot.png rename to source/docs/software/controls/introduction/images/introduction-to-pid-pi-controller-overshoot.png diff --git a/source/docs/software/advanced-controls/introduction/images/introduction-to-pid-pi-controller-steadystate.png b/source/docs/software/controls/introduction/images/introduction-to-pid-pi-controller-steadystate.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/introduction-to-pid-pi-controller-steadystate.png rename to source/docs/software/controls/introduction/images/introduction-to-pid-pi-controller-steadystate.png diff --git a/source/docs/software/advanced-controls/introduction/images/introduction-to-pid-pid-controller-block.png b/source/docs/software/controls/introduction/images/introduction-to-pid-pid-controller-block.png similarity index 100% rename from source/docs/software/advanced-controls/introduction/images/introduction-to-pid-pid-controller-block.png rename to source/docs/software/controls/introduction/images/introduction-to-pid-pid-controller-block.png diff --git a/source/docs/software/advanced-controls/introduction/index.rst b/source/docs/software/controls/introduction/index.rst similarity index 90% rename from source/docs/software/advanced-controls/introduction/index.rst rename to source/docs/software/controls/introduction/index.rst index af7d809aed..547e483d70 100644 --- a/source/docs/software/advanced-controls/introduction/index.rst +++ b/source/docs/software/controls/introduction/index.rst @@ -1,4 +1,4 @@ -Advanced Controls Introduction +Controls Introduction ============================== .. toctree:: diff --git a/source/docs/software/advanced-controls/introduction/introduction-to-feedforward.rst b/source/docs/software/controls/introduction/introduction-to-feedforward.rst similarity index 87% rename from source/docs/software/advanced-controls/introduction/introduction-to-feedforward.rst rename to source/docs/software/controls/introduction/introduction-to-feedforward.rst index 028c07962c..c739fcb867 100644 --- a/source/docs/software/advanced-controls/introduction/introduction-to-feedforward.rst +++ b/source/docs/software/controls/introduction/introduction-to-feedforward.rst @@ -1,7 +1,7 @@ Introduction to DC Motor Feedforward ==================================== -.. note:: For a guide on implementing PID control in code with WPILib, see :ref:`docs/software/advanced-controls/controllers/feedforward:Feedforward Control in WPILib`. +.. note:: For a guide on implementing PID control in code with WPILib, see :ref:`docs/software/controls/controllers/feedforward:Feedforward Control in WPILib`. This page explains the conceptual and mathematical workings of WPILib's SimpleMotorFeedforward (and the other related classes). @@ -55,10 +55,10 @@ where :math:`V` is the applied voltage, :math:`\theta` is the angular displaceme Using the Feedforward --------------------- -In order to use the feedforward, we need to plug in values for each unknown in the above voltage-balance equation *other than the voltage*. As mentioned :ref:`earlier `, the values of the gains :math:`K_g`, :math:`K_v`, :math:`K_a` can be obtained through theoretical modeling with `ReCalc `__. Explicit measurement with :doc:`SysId ` will yield the aforementioned gains in addition to :math:`K_s`. That leaves us needing values for velocity, acceleration, and (in the case of the arm feedforward) position. +In order to use the feedforward, we need to plug in values for each unknown in the above voltage-balance equation *other than the voltage*. As mentioned :ref:`earlier `, the values of the gains :math:`K_g`, :math:`K_v`, :math:`K_a` can be obtained through theoretical modeling with `ReCalc `__. Explicit measurement with :doc:`SysId ` will yield the aforementioned gains in addition to :math:`K_s`. That leaves us needing values for velocity, acceleration, and (in the case of the arm feedforward) position. Typically, these come from our setpoints - remember that with feedforward we are making a "guess" as to the output we need based on where we want the system to be. For velocity control, this does not pose a problem - we can take the velocity value from our setpoint directly, and if necessary (it can often be omitted in practice) we can infer the acceleration from the difference between the current and previous velocity setpoints. -For position control, however, this can be difficult - except for the arm controller, there's no direct term in the feedforward equation for position. We often have no choice but to calculate our velocity from the difference between the current and previous setpoint positions, and to ignore acceleration entirely. In order to do better, we need to ensure that our setpoints vary *smoothly* according to some set of constraints - this is usually accomplished with a :ref:`motion profile `. +For position control, however, this can be difficult - except for the arm controller, there's no direct term in the feedforward equation for position. We often have no choice but to calculate our velocity from the difference between the current and previous setpoint positions, and to ignore acceleration entirely. In order to do better, we need to ensure that our setpoints vary *smoothly* according to some set of constraints - this is usually accomplished with a :ref:`motion profile `. diff --git a/source/docs/software/advanced-controls/introduction/introduction-to-pid.rst b/source/docs/software/controls/introduction/introduction-to-pid.rst similarity index 93% rename from source/docs/software/advanced-controls/introduction/introduction-to-pid.rst rename to source/docs/software/controls/introduction/introduction-to-pid.rst index 38a4bfff33..ffb50003b8 100644 --- a/source/docs/software/advanced-controls/introduction/introduction-to-pid.rst +++ b/source/docs/software/controls/introduction/introduction-to-pid.rst @@ -3,14 +3,14 @@ Introduction to PID =================== -.. note:: For a guide on implementing PID control with WPILib, see :ref:`docs/software/advanced-controls/controllers/pidcontroller:PID Control in WPILib`. +.. note:: For a guide on implementing PID control with WPILib, see :ref:`docs/software/controls/controllers/pidcontroller:PID Control in WPILib`. -This page explains the conceptual and mathematical workings of a PID controller. :ref:`A video explanation from WPI is also available `. +This page explains the conceptual and mathematical workings of a PID controller. :ref:`A video explanation from WPI is also available `. What is a PID Controller? ------------------------- -The PID controller is a common :ref:`feedback controller` consisting of proportional, integral, and derivative terms, hence the name. This article will build up the definition of a PID controller term by term while trying to provide some intuition for how each term behaves. +The PID controller is a common :ref:`feedback controller` consisting of proportional, integral, and derivative terms, hence the name. This article will build up the definition of a PID controller term by term while trying to provide some intuition for how each term behaves. First, we'll get some nomenclature for PID controllers out of the way. In a PID context, we use the term :term:`reference` or :term:`setpoint` to mean the desired state of the mechanism, and the term :term:`output` or :term:`process variable` to refer to the measured state of the mechanism. Below are some common variable naming conventions for relevant quantities. @@ -96,7 +96,7 @@ If the :term:`setpoint` is constant, the implicit velocity :term:`setpoint` is z Integral Term ------------- -.. important:: Integral gain is generally not recommended for FRC\ |reg| use. It is almost always better to use a feedforward controller to eliminate steady-state error. If you do employ integral gain, it is crucial to provide some protection against :ref:`integral windup `. +.. important:: Integral gain is generally not recommended for FRC\ |reg| use. It is almost always better to use a feedforward controller to eliminate steady-state error. If you do employ integral gain, it is crucial to provide some protection against :ref:`integral windup `. The *Integral* term attempts to drive the total accumulated error to zero by contributing to the control signal proportionally to the sum of all past errors. Intuitively, this tries to drive the *average* of all past :term:`output` values towards the *average* of all past :term:`reference` values. @@ -128,7 +128,7 @@ A common way of eliminating :term:`steady-state error` is to integrate the :term Putting It All Together ----------------------- -.. note:: For information on using the WPILib provided PIDController, see the :ref:`relevant article `. +.. note:: For information on using the WPILib provided PIDController, see the :ref:`relevant article `. When these terms are combined by summing them all together, one gets the typical definition for a PID controller. diff --git a/source/docs/software/advanced-controls/introduction/picking-control-strategy.rst b/source/docs/software/controls/introduction/picking-control-strategy.rst similarity index 94% rename from source/docs/software/advanced-controls/introduction/picking-control-strategy.rst rename to source/docs/software/controls/introduction/picking-control-strategy.rst index 5efcfc5725..e39fd511a4 100644 --- a/source/docs/software/advanced-controls/introduction/picking-control-strategy.rst +++ b/source/docs/software/controls/introduction/picking-control-strategy.rst @@ -38,7 +38,7 @@ Feedforward and Position Control The WPILib feedforward classes require velocity and acceleration setpoints to generate an estimated control voltage. This is because the equations-of-motion of a permanent-magnet DC motor relate the applied voltage to velocity and acceleration; it is a fact of physics that we cannot change. -But what if we want to control position? When controlling a DC motor, there's no immediate relation between position and control signal. In order to use feedforward effectively for position control, we need to come up with a sequence of velocities that will take the robot mechanism to the desired position. This is called a :ref:`motion profile `. +But what if we want to control position? When controlling a DC motor, there's no immediate relation between position and control signal. In order to use feedforward effectively for position control, we need to come up with a sequence of velocities that will take the robot mechanism to the desired position. This is called a :ref:`motion profile `. Many teams do not wish to incur the extra technical cost of using a motion profile when doing position control, and instead omit the feedforward controller entirely and opt to use only feedback control. As we will discuss later, this may work in *some* situations, but has some important caveats. @@ -99,7 +99,7 @@ Theoretical Modeling `ReCalc is an online calculator `__ which estimates physical parameters for a number of common FRC mechanisms. Importantly, it can generate estimate the ``kV``, ``kA``, and ``kG`` gains for the WPILib feedforward classes. -The :doc:`WPILib system identification tool ` supports a "theoretical mode" that can be used to determine PID gains for feedback control from the ``kV`` and ``kA`` gains from ReCalc, enabling (in theory) full tuning of a control loop without running any test routines. +The :doc:`WPILib system identification tool ` supports a "theoretical mode" that can be used to determine PID gains for feedback control from the ``kV`` and ``kA`` gains from ReCalc, enabling (in theory) full tuning of a control loop without running any test routines. Remember, however, that theory is not reality and purely theoretical gains are not guaranteed to work well. There is *never* a substitute for testing. @@ -108,7 +108,7 @@ System Identification A good way to improve the accuracy of a simple physics model is to perform experiments on the real mechanism, record data, and use the data to *derive* the constants associated with different parts of the model. This is very useful for physical quantities which are difficult or impossible to predict, but easy to measure (ex: friction in a gearbox). -:doc:`WPILib's system identification tool ` supports some common FRC mechanisms, including drivetrain. It deploys its own code to the robot to exercise the mechanism, record data, and derive gains for both feedforward and feedback control schemes. +:doc:`WPILib's system identification tool ` supports some common FRC mechanisms, including drivetrain. It deploys its own code to the robot to exercise the mechanism, record data, and derive gains for both feedforward and feedback control schemes. Manual Tuning: What to Do with No Explicit Model ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/source/docs/software/advanced-controls/introduction/pid-video.rst b/source/docs/software/controls/introduction/pid-video.rst similarity index 100% rename from source/docs/software/advanced-controls/introduction/pid-video.rst rename to source/docs/software/controls/introduction/pid-video.rst diff --git a/source/docs/software/advanced-controls/introduction/tuning-flywheel.rst b/source/docs/software/controls/introduction/tuning-flywheel.rst similarity index 88% rename from source/docs/software/advanced-controls/introduction/tuning-flywheel.rst rename to source/docs/software/controls/introduction/tuning-flywheel.rst index 552da33780..d3a087878e 100644 --- a/source/docs/software/advanced-controls/introduction/tuning-flywheel.rst +++ b/source/docs/software/controls/introduction/tuning-flywheel.rst @@ -11,7 +11,7 @@ Our "Flywheel" consists of: * A rotating inertial mass which launches the game piece (the flywheel) * A motor (and possibly a gearbox) driving the mass. -For the purposes of this tutorial, this plant is modeled with the same equation used by WPILib's :ref:`docs/software/advanced-controls/controllers/feedforward:SimpleMotorFeedforward`, with additional adjustment for sensor delay and gearbox inefficiency. The simulation assumes the plant is controlled by feedforward and feedback controllers, composed in this fashion: +For the purposes of this tutorial, this plant is modeled with the same equation used by WPILib's :ref:`docs/software/controls/controllers/feedforward:SimpleMotorFeedforward`, with additional adjustment for sensor delay and gearbox inefficiency. The simulation assumes the plant is controlled by feedforward and feedback controllers, composed in this fashion: .. image:: images/control-system-basics-ctrl-plus-plant.png :alt: Tuning Exercise Block Diagrams showing feedforward and feedback blocks, controlling a plant. @@ -22,7 +22,7 @@ Where: * The controller's :term:`setpoint` :math:`r(t)` is the desired velocity of the flywheel * The controller's :term:`control effort`, :math:`u(t)` is the voltage applied to the motor driving the flywheel's motion -.. note:: A more detailed description of the mathematics of the system :ref:`can be found here`. +.. note:: A more detailed description of the mathematics of the system :ref:`can be found here`. Picking the Control Strategy for a Flywheel Velocity Controller --------------------------------------------------------------- @@ -33,7 +33,7 @@ Flywheels are commonly used to propel game pieces through the air, toward a targ To consistently launch a gamepiece, a good first step is to make sure it is spinning at a particular speed before putting a gamepiece into it. Thus, we want to accurately control the velocity of our flywheel. -.. note:: This is fundamentally different from the :ref:`vertical arm ` and :ref:`turret ` controllers, which both control *position*. +.. note:: This is fundamentally different from the :ref:`vertical arm ` and :ref:`turret ` controllers, which both control *position*. The tutorials below will demonstrate the behavior of the system under bang-bang, pure feedforward, pure feedback (PID), and combined feedforward-feedback control strategies. Follow the instructions to learn how to manually tune these controllers, and expand the "tuning solution" to view an optimal model-based set of tuning parameters. @@ -58,7 +58,7 @@ Interact with the simulation below to see how the flywheel system responds when -The "Bang-Bang" controller is a simple controller which applies a binary (present/not-present) force to a mechanism to try to get it closer to a setpoint. A more detailed description (and documentation for the corresponding WPILib implementation) can be found :ref:`here. ` +The "Bang-Bang" controller is a simple controller which applies a binary (present/not-present) force to a mechanism to try to get it closer to a setpoint. A more detailed description (and documentation for the corresponding WPILib implementation) can be found :ref:`here. ` There are no tuneable controller parameters for a bang-bang controller - you can only adjust the setpoint. This simplicity is a strength, and also a weakness. @@ -73,7 +73,7 @@ Typically, the steady-state oscillation of a bang-bang controller is small enoug The abrupt changes in control effort can cause abrupt changes in current draw if the system's inductance is too low. This may stress motor control hardware, and cause eventual damage or failure. -Finally, this technique only works for mechanisms that accelerate relatively slowly. A more in-depth discussion of the details :ref:`can be found here `. +Finally, this technique only works for mechanisms that accelerate relatively slowly. A more in-depth discussion of the details :ref:`can be found here `. Bang-bang control sacrifices a lot for simplicity and high performance (in the sense of fast convergence to the setpoint). To achieve "smoother" control, we need to consider a different control strategy. @@ -184,9 +184,9 @@ A gamepiece-launching flywheel is one of the most visible applications of veloci Choice of Control Strategies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Because we are controlling velocity, we can achieve fairly good performance with a :ref:`pure feedforward controller `. This is because a permanent-magnet DC motor's steady-state velocity is roughly proportional to the voltage applied, and is the reason that you can drive your robot around with joysticks without appearing to use any control loop at all - in that case, you are implicitly using a proportional feedforward model. +Because we are controlling velocity, we can achieve fairly good performance with a :ref:`pure feedforward controller `. This is because a permanent-magnet DC motor's steady-state velocity is roughly proportional to the voltage applied, and is the reason that you can drive your robot around with joysticks without appearing to use any control loop at all - in that case, you are implicitly using a proportional feedforward model. -Because we must apply a constant control voltage to the motor to maintain a velocity at the setpoint, we cannot successfully use a :ref:`pure feedback (PID) controller ` (whose output typically disappears when you reach the setpoint) - in order to effectively control velocity, a feedback controller must be :ref:`combined with a feedforward controller `. +Because we must apply a constant control voltage to the motor to maintain a velocity at the setpoint, we cannot successfully use a :ref:`pure feedback (PID) controller ` (whose output typically disappears when you reach the setpoint) - in order to effectively control velocity, a feedback controller must be :ref:`combined with a feedforward controller `. Bang-bang control can be combined with feedforward control much in the way PID control can - for the sake of brevity we do not include a combined feedforward-bang-bang simulation. @@ -199,7 +199,7 @@ Adding an integral gain to the :term:`controller` is often a sub-optimal way to Velocity and Position Control ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Velocity control also differs from position control in the effect of inertia - in a position controller, inertia tends to cause the mechanism to swing past the setpoint even if the control voltage drops to zero near the setpoint. This makes aggressive control strategies infeasible, as they end up wasting lots of energy fighting self-induced oscillations. In a velocity controller, however, the effect is different - the rotor shaft stops accelerating as soon as you stop applying a control voltage (in fact, it will slow down due to friction and back-EMF), so such overshoots are rare (in fact, overshoot typically occurs in velocity controllers only as a result of loop delay). This enables the use of an extremely simple, extremely aggressive control strategy called :ref:`bang-bang control `. +Velocity control also differs from position control in the effect of inertia - in a position controller, inertia tends to cause the mechanism to swing past the setpoint even if the control voltage drops to zero near the setpoint. This makes aggressive control strategies infeasible, as they end up wasting lots of energy fighting self-induced oscillations. In a velocity controller, however, the effect is different - the rotor shaft stops accelerating as soon as you stop applying a control voltage (in fact, it will slow down due to friction and back-EMF), so such overshoots are rare (in fact, overshoot typically occurs in velocity controllers only as a result of loop delay). This enables the use of an extremely simple, extremely aggressive control strategy called :ref:`bang-bang control `. Feedforward Simplifications ~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source/docs/software/advanced-controls/introduction/tuning-turret.rst b/source/docs/software/controls/introduction/tuning-turret.rst similarity index 89% rename from source/docs/software/advanced-controls/introduction/tuning-turret.rst rename to source/docs/software/controls/introduction/tuning-turret.rst index 63dc63d994..6f5ae587a3 100644 --- a/source/docs/software/advanced-controls/introduction/tuning-turret.rst +++ b/source/docs/software/controls/introduction/tuning-turret.rst @@ -13,7 +13,7 @@ Our "turret" consists of: * A rotating inertial mass (the turret) * A motor and gearbox driving the mass -For the purposes of this tutorial, this plant is modeled with the same equation used by WPILib's :ref:`docs/software/advanced-controls/controllers/feedforward:SimpleMotorFeedforward`, with additional adjustment for sensor delay and gearbox inefficiency. The simulation assumes the plant is controlled by feedforward and feedback controllers, composed in this fashion: +For the purposes of this tutorial, this plant is modeled with the same equation used by WPILib's :ref:`docs/software/controls/controllers/feedforward:SimpleMotorFeedforward`, with additional adjustment for sensor delay and gearbox inefficiency. The simulation assumes the plant is controlled by feedforward and feedback controllers, composed in this fashion: .. image:: images/control-system-basics-ctrl-plus-plant.png :alt: Tuning Exercise Block Diagrams showing feedforward and feedback blocks, controlling a plant. @@ -72,9 +72,9 @@ Note that the turret may "lag" the commanded motion - this is normal, and is fin Issues with Feed-Forward Control Alone ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -As mentioned above, our simulated mechanism perfectly obeys the WPILib :ref:`docs/software/advanced-controls/controllers/feedforward:SimpleMotorFeedforward` equation (as long as the "system noise" option is disabled). We might then expect, like in the case of the :ref:`flywheel velocity controller `, that we should be able to achieve perfect convergence-to-setpoint with a feedforward loop alone. +As mentioned above, our simulated mechanism perfectly obeys the WPILib :ref:`docs/software/controls/controllers/feedforward:SimpleMotorFeedforward` equation (as long as the "system noise" option is disabled). We might then expect, like in the case of the :ref:`flywheel velocity controller `, that we should be able to achieve perfect convergence-to-setpoint with a feedforward loop alone. -However, our feedforward equation relates *velocity* and *acceleration* to voltage - it allows us to control the *instantaneous motion* of our mechanism with high accuracy, but it does not allow us direct control over the *position*. This is a problem even in our simulation (in which the feedforward equation is the *actual* equation of motion), because unless we employ a :ref:`motion profile ` to generate a sequence of velocity setpoints we can ask the turret to jump immediately from one position to another. This is impossible, even for our simulated turret. +However, our feedforward equation relates *velocity* and *acceleration* to voltage - it allows us to control the *instantaneous motion* of our mechanism with high accuracy, but it does not allow us direct control over the *position*. This is a problem even in our simulation (in which the feedforward equation is the *actual* equation of motion), because unless we employ a :ref:`motion profile ` to generate a sequence of velocity setpoints we can ask the turret to jump immediately from one position to another. This is impossible, even for our simulated turret. The resulting behavior from the feedforward controller is to output a single "voltage spike" when the position setpoint changes (corresponding to a single loop iteration of very high velocity), and then zero voltage (because it is assumed that the system has already reached the setpoint). In practice, we can see in the simulation that this results in an initial "impulse" movement towards the target position, that stops at some indeterminate position in-between. This kind of response is called a "kick," and is generally seen as undesirable. @@ -152,7 +152,7 @@ Tuning Conclusions Choice of Control Strategies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Like in the case of the :ref:`vertical arm `, and unlike the case of the :ref:`flywheel `, we are trying to control the *position* rather than the *velocity* of our mechanism. +Like in the case of the :ref:`vertical arm `, and unlike the case of the :ref:`flywheel `, we are trying to control the *position* rather than the *velocity* of our mechanism. In the case of the flywheel *velocity* controller we could achieve good control performance with feedforward alone. However, it is very hard to predict how much voltage will cause a certain total change in *position* (time can turn even small errors in velocity into very big errors in position). In this case, we cannot rely on feedforward control alone - as with the vertical arm, we will need a feedback controller. diff --git a/source/docs/software/advanced-controls/introduction/tuning-vertical-arm.rst b/source/docs/software/controls/introduction/tuning-vertical-arm.rst similarity index 89% rename from source/docs/software/advanced-controls/introduction/tuning-vertical-arm.rst rename to source/docs/software/controls/introduction/tuning-vertical-arm.rst index c8b7e9000f..88aa2951c0 100644 --- a/source/docs/software/advanced-controls/introduction/tuning-vertical-arm.rst +++ b/source/docs/software/controls/introduction/tuning-vertical-arm.rst @@ -13,7 +13,7 @@ Our "vertical arm" consists of: * A mass on a stick, under the force of gravity, pivoting around an axle. * A motor and gearbox driving the axle to which the mass-on-a-stick is attached -For the purposes of this tutorial, this plant is modeled with the same equation used by WPILib's :ref:`docs/software/advanced-controls/controllers/feedforward:ArmFeedforward`, with additional adjustment for sensor delay and gearbox inefficiency. The simulation assumes the plant is controlled by feedforward and feedback controllers, composed in this fashion: +For the purposes of this tutorial, this plant is modeled with the same equation used by WPILib's :ref:`docs/software/controls/controllers/feedforward:ArmFeedforward`, with additional adjustment for sensor delay and gearbox inefficiency. The simulation assumes the plant is controlled by feedforward and feedback controllers, composed in this fashion: .. image:: images/control-system-basics-ctrl-plus-plant.png :alt: Tuning Exercise Block Diagrams showing feedforward and feedback blocks, controlling a plant. @@ -70,9 +70,9 @@ To tune the feedforward controller, perform the following: Issues with Feed-Forward Control Alone ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -As mentioned above, our simulated mechanism almost-perfectly obeys the WPILib :ref:`docs/software/advanced-controls/controllers/feedforward:ArmFeedforward` equation (as long as the "system noise" option is disabled). We might then expect, like in the case of the :ref:`flywheel velocity controller `, that we should be able to achieve perfect convergence-to-setpoint with a feedforward loop alone. +As mentioned above, our simulated mechanism almost-perfectly obeys the WPILib :ref:`docs/software/controls/controllers/feedforward:ArmFeedforward` equation (as long as the "system noise" option is disabled). We might then expect, like in the case of the :ref:`flywheel velocity controller `, that we should be able to achieve perfect convergence-to-setpoint with a feedforward loop alone. -However, our feedforward equation relates *velocity* and *acceleration* to voltage - it allows us to control the *instantaneous motion* of our mechanism with high accuracy, but it does not allow us direct control over the *position*. This is a problem even in our simulation (in which the feedforward equation is the *actual* equation of motion), because unless we employ a :ref:`motion profile ` to generate a sequence of velocity setpoints we can ask the arm to jump immediately from one position to another. This is impossible, even for our simulated arm. +However, our feedforward equation relates *velocity* and *acceleration* to voltage - it allows us to control the *instantaneous motion* of our mechanism with high accuracy, but it does not allow us direct control over the *position*. This is a problem even in our simulation (in which the feedforward equation is the *actual* equation of motion), because unless we employ a :ref:`motion profile ` to generate a sequence of velocity setpoints we can ask the arm to jump immediately from one position to another. This is impossible, even for our simulated arm. The resulting behavior from the feedforward controller is to output a single "voltage spike" when the position setpoint changes (corresponding to a single loop iteration of very high velocity), and then zero voltage (because it is assumed that the system has already reached the setpoint). In practice, we can see in the simulation that this results in an initial "impulse" movement towards the target position, that stops at some indeterminate position in-between. This kind of response is called a "kick," and is generally seen as undesirable. @@ -156,7 +156,7 @@ Tuning Conclusions Choice of Control Strategies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Like in the case of the :ref:`turret `, and unlike the case of the :ref:`flywheel `, we are trying to control the *position* rather than the *velocity* of our mechanism. +Like in the case of the :ref:`turret `, and unlike the case of the :ref:`flywheel `, we are trying to control the *position* rather than the *velocity* of our mechanism. In the case of the flywheel *velocity* controller we could achieve good control performance with feedforward alone. However, it is very hard to predict how much voltage will cause a certain total change in *position* (time can turn even small errors in velocity into very big errors in position). In this case, we cannot rely on feedforward control alone - as with the vertical arm, we will need a feedback controller. @@ -179,4 +179,4 @@ A Note on Feedforward and Static Friction For the sake of simplicity, the simulations above omit the :math:`K_s` term from the WPILib SimpleMotorFeedforward equation. On actual mechanisms, however, this can be important - especially if there's a lot of friction in the mechanism gearing. -In the case of a vertical arm or elevator, :math:`K_s` can be somewhat tedious to estimate separately from :math:`K_g`. If your arm or elevator has enough friction for :math:`K_s` to be important, it is recommended that you use the :doc:`WPILib system identification tool ` to determine your system gains. +In the case of a vertical arm or elevator, :math:`K_s` can be somewhat tedious to estimate separately from :math:`K_g`. If your arm or elevator has enough friction for :math:`K_s` to be important, it is recommended that you use the :doc:`WPILib system identification tool ` to determine your system gains. diff --git a/source/docs/software/advanced-controls/introduction/tutorial-intro.rst b/source/docs/software/controls/introduction/tutorial-intro.rst similarity index 73% rename from source/docs/software/advanced-controls/introduction/tutorial-intro.rst rename to source/docs/software/controls/introduction/tutorial-intro.rst index 1712cc5889..0b1af2c74d 100644 --- a/source/docs/software/advanced-controls/introduction/tutorial-intro.rst +++ b/source/docs/software/controls/introduction/tutorial-intro.rst @@ -26,10 +26,10 @@ Leave the setting turned off at first to learn the system's ideal behavior. Late Be Systematic ------------- -As seen in :ref:`the introduction to PID `, a PID controller has *three* tuned constants.Feedforward components will add even more. This means searching for the "correct" constants manually can be quite difficult - it is therefore necessary to approach the tuning procedure systematically. +As seen in :ref:`the introduction to PID `, a PID controller has *three* tuned constants.Feedforward components will add even more. This means searching for the "correct" constants manually can be quite difficult - it is therefore necessary to approach the tuning procedure systematically. Follow the order of tuning presented in the tutorials - it will maximize your chances of success. Resist checking the tuning solutions until you believe your solution is close to correct. Then check your answer, and try the provided one to compare against your own results. -Furthermore, work from easy to difficult. :ref:`Flywheel mechanisms ` are the easiest to tune. After that, look into the :ref:`turret tuning `. Then, finish off with the :ref:`vertical arm example`. +Furthermore, work from easy to difficult. :ref:`Flywheel mechanisms ` are the easiest to tune. After that, look into the :ref:`turret tuning `. Then, finish off with the :ref:`vertical arm example`. diff --git a/source/docs/software/advanced-controls/state-space/filter-comparison-data/iir-filter.csv b/source/docs/software/controls/state-space/filter-comparison-data/iir-filter.csv similarity index 100% rename from source/docs/software/advanced-controls/state-space/filter-comparison-data/iir-filter.csv rename to source/docs/software/controls/state-space/filter-comparison-data/iir-filter.csv diff --git a/source/docs/software/advanced-controls/state-space/filter-comparison-data/measurement.csv b/source/docs/software/controls/state-space/filter-comparison-data/measurement.csv similarity index 100% rename from source/docs/software/advanced-controls/state-space/filter-comparison-data/measurement.csv rename to source/docs/software/controls/state-space/filter-comparison-data/measurement.csv diff --git a/source/docs/software/advanced-controls/state-space/filter-comparison-data/median-filter.csv b/source/docs/software/controls/state-space/filter-comparison-data/median-filter.csv similarity index 100% rename from source/docs/software/advanced-controls/state-space/filter-comparison-data/median-filter.csv rename to source/docs/software/controls/state-space/filter-comparison-data/median-filter.csv diff --git a/source/docs/software/advanced-controls/state-space/filter-comparison-data/xhat-state-2-measurement-1.csv b/source/docs/software/controls/state-space/filter-comparison-data/xhat-state-2-measurement-1.csv similarity index 100% rename from source/docs/software/advanced-controls/state-space/filter-comparison-data/xhat-state-2-measurement-1.csv rename to source/docs/software/controls/state-space/filter-comparison-data/xhat-state-2-measurement-1.csv diff --git a/source/docs/software/advanced-controls/state-space/filter-comparison-data/xhat-state-3-measurement-02.csv b/source/docs/software/controls/state-space/filter-comparison-data/xhat-state-3-measurement-02.csv similarity index 100% rename from source/docs/software/advanced-controls/state-space/filter-comparison-data/xhat-state-3-measurement-02.csv rename to source/docs/software/controls/state-space/filter-comparison-data/xhat-state-3-measurement-02.csv diff --git a/source/docs/software/advanced-controls/state-space/filter_comparison.py b/source/docs/software/controls/state-space/filter_comparison.py old mode 100755 new mode 100644 similarity index 100% rename from source/docs/software/advanced-controls/state-space/filter_comparison.py rename to source/docs/software/controls/state-space/filter_comparison.py diff --git a/source/docs/software/advanced-controls/state-space/graph.py b/source/docs/software/controls/state-space/graph.py old mode 100755 new mode 100644 similarity index 100% rename from source/docs/software/advanced-controls/state-space/graph.py rename to source/docs/software/controls/state-space/graph.py diff --git a/source/docs/software/advanced-controls/state-space/images/coordinate-systems.jpg b/source/docs/software/controls/state-space/images/coordinate-systems.jpg similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/coordinate-systems.jpg rename to source/docs/software/controls/state-space/images/coordinate-systems.jpg diff --git a/source/docs/software/advanced-controls/state-space/images/elevator-phase-portrait.png b/source/docs/software/controls/state-space/images/elevator-phase-portrait.png similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/elevator-phase-portrait.png rename to source/docs/software/controls/state-space/images/elevator-phase-portrait.png diff --git a/source/docs/software/advanced-controls/state-space/images/filter_comparison.png b/source/docs/software/controls/state-space/images/filter_comparison.png similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/filter_comparison.png rename to source/docs/software/controls/state-space/images/filter_comparison.png diff --git a/source/docs/software/advanced-controls/state-space/images/flywheel-lqr-ex.jpg b/source/docs/software/controls/state-space/images/flywheel-lqr-ex.jpg similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/flywheel-lqr-ex.jpg rename to source/docs/software/controls/state-space/images/flywheel-lqr-ex.jpg diff --git a/source/docs/software/advanced-controls/state-space/images/latency-comp-lqr.jpg b/source/docs/software/controls/state-space/images/latency-comp-lqr.jpg similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/latency-comp-lqr.jpg rename to source/docs/software/controls/state-space/images/latency-comp-lqr.jpg diff --git a/source/docs/software/advanced-controls/state-space/images/linear-sin-x.jpg b/source/docs/software/controls/state-space/images/linear-sin-x.jpg similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/linear-sin-x.jpg rename to source/docs/software/controls/state-space/images/linear-sin-x.jpg diff --git a/source/docs/software/advanced-controls/state-space/images/normal-distribution.png b/source/docs/software/controls/state-space/images/normal-distribution.png similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/normal-distribution.png rename to source/docs/software/controls/state-space/images/normal-distribution.png diff --git a/source/docs/software/advanced-controls/state-space/images/pendulum-balance.png b/source/docs/software/controls/state-space/images/pendulum-balance.png similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/pendulum-balance.png rename to source/docs/software/controls/state-space/images/pendulum-balance.png diff --git a/source/docs/software/advanced-controls/state-space/images/pendulum-closed-loop.png b/source/docs/software/controls/state-space/images/pendulum-closed-loop.png similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/pendulum-closed-loop.png rename to source/docs/software/controls/state-space/images/pendulum-closed-loop.png diff --git a/source/docs/software/advanced-controls/state-space/images/pendulum-markedup.jpg b/source/docs/software/controls/state-space/images/pendulum-markedup.jpg similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/pendulum-markedup.jpg rename to source/docs/software/controls/state-space/images/pendulum-markedup.jpg diff --git a/source/docs/software/advanced-controls/state-space/images/pendulum-phase-plot.png b/source/docs/software/controls/state-space/images/pendulum-phase-plot.png similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/pendulum-phase-plot.png rename to source/docs/software/controls/state-space/images/pendulum-phase-plot.png diff --git a/source/docs/software/advanced-controls/state-space/images/state-space-graph.png b/source/docs/software/controls/state-space/images/state-space-graph.png similarity index 100% rename from source/docs/software/advanced-controls/state-space/images/state-space-graph.png rename to source/docs/software/controls/state-space/images/state-space-graph.png diff --git a/source/docs/software/advanced-controls/state-space/index.rst b/source/docs/software/controls/state-space/index.rst similarity index 100% rename from source/docs/software/advanced-controls/state-space/index.rst rename to source/docs/software/controls/state-space/index.rst diff --git a/source/docs/software/advanced-controls/state-space/latency.py b/source/docs/software/controls/state-space/latency.py old mode 100755 new mode 100644 similarity index 100% rename from source/docs/software/advanced-controls/state-space/latency.py rename to source/docs/software/controls/state-space/latency.py diff --git a/source/docs/software/advanced-controls/state-space/linearization.py b/source/docs/software/controls/state-space/linearization.py old mode 100755 new mode 100644 similarity index 100% rename from source/docs/software/advanced-controls/state-space/linearization.py rename to source/docs/software/controls/state-space/linearization.py diff --git a/source/docs/software/advanced-controls/state-space/state-space-debugging.rst b/source/docs/software/controls/state-space/state-space-debugging.rst similarity index 95% rename from source/docs/software/advanced-controls/state-space/state-space-debugging.rst rename to source/docs/software/controls/state-space/state-space-debugging.rst index ffd0f2a26d..ee22ede060 100644 --- a/source/docs/software/advanced-controls/state-space/state-space-debugging.rst +++ b/source/docs/software/controls/state-space/state-space-debugging.rst @@ -35,4 +35,4 @@ Reliable data of the :term:`system's ` :term:`state`\s, :term:`input`\s Compensating for Input Lag -------------------------- -Often times, some sensor input data (i.e. velocity readings) may be delayed due to onboard filtering that smart motor controllers tend to perform. By default, LQR's K gain assumes no input delay, so introducing significant delay on the order of tens of milliseconds can cause instability. To combat this, the LQR's K gain can be reduced, trading off performance for stability. A code example for how to compensate for this latency in a mathematically rigorous manner is available :ref:`here `. +Often times, some sensor input data (i.e. velocity readings) may be delayed due to onboard filtering that smart motor controllers tend to perform. By default, LQR's K gain assumes no input delay, so introducing significant delay on the order of tens of milliseconds can cause instability. To combat this, the LQR's K gain can be reduced, trading off performance for stability. A code example for how to compensate for this latency in a mathematically rigorous manner is available :ref:`here `. diff --git a/source/docs/software/advanced-controls/state-space/state-space-flywheel-walkthrough.rst b/source/docs/software/controls/state-space/state-space-flywheel-walkthrough.rst similarity index 84% rename from source/docs/software/advanced-controls/state-space/state-space-flywheel-walkthrough.rst rename to source/docs/software/controls/state-space/state-space-flywheel-walkthrough.rst index 7bd444fbc1..6b67d6751f 100644 --- a/source/docs/software/advanced-controls/state-space/state-space-flywheel-walkthrough.rst +++ b/source/docs/software/controls/state-space/state-space-flywheel-walkthrough.rst @@ -3,13 +3,13 @@ State-Space Controller Walkthrough ================================== -.. note:: Before following this tutorial, readers are recommended to have read an :ref:`docs/software/advanced-controls/state-space/state-space-intro:Introduction to state-space control`. +.. note:: Before following this tutorial, readers are recommended to have read an :ref:`docs/software/controls/state-space/state-space-intro:Introduction to state-space control`. The goal of this tutorial is to provide "end-to-end" instructions on implementing a state-space controller for a flywheel. By following this tutorial, readers will learn how to: 1. Create an accurate state-space model of a flywheel using :term:`system identification` or :term:`CAD` software. 2. Implement a Kalman Filter to filter encoder velocity measurements without lag. -3. Implement a :ref:`LQR ` feedback controller which, when combined with model-based feedforward, will generate voltage :term:`inputs ` to drive the flywheel to a :term:`reference`. +3. Implement a :ref:`LQR ` feedback controller which, when combined with model-based feedforward, will generate voltage :term:`inputs ` to drive the flywheel to a :term:`reference`. This tutorial is intended to be approachable for teams without a great deal of programming expertise. While the WPILib library offers significant flexibility in the manner in which its state-space control features are implemented, closely following the implementation outlined in this tutorial should provide teams with a basic structure which can be reused for a variety of state-space systems. @@ -23,7 +23,7 @@ Because state-space control focuses on creating an accurate model of our system, Modeling Our Flywheel --------------------- -:ref:`Recall ` that continuous state-space systems are modeled using the following system of equations: +:ref:`Recall ` that continuous state-space systems are modeled using the following system of equations: .. math:: \dot{\mathbf{x}} &= \mathbf{A}\mathbf{x} + \mathbf{B}\mathbf{u} \\ @@ -33,7 +33,7 @@ Where :term:`x-dot` is the rate of change of the :term:`system`'s :term:`state`, Let's use this system of equations to model our flywheel in two different ways. We'll first model it using :term:`system identification` using the SysId toolsuite, and then model it based on the motor and flywheel's :term:`moment of inertia`. -The first step of building up our state-space system is picking our system's states. We can pick anything we want as a state -- we could pick completely unrelated states if we wanted -- but it helps to pick states that are important. We can include :term:`hidden states ` in our state (such as elevator velocity if we were only able to measure its position) and let our Kalman Filter estimate their values. Remember that the states we choose will be driven towards their respective :term:`references ` by the feedback controller (typically the :ref:`Linear-Quadratic Regulator ` since it's optimal). +The first step of building up our state-space system is picking our system's states. We can pick anything we want as a state -- we could pick completely unrelated states if we wanted -- but it helps to pick states that are important. We can include :term:`hidden states ` in our state (such as elevator velocity if we were only able to measure its position) and let our Kalman Filter estimate their values. Remember that the states we choose will be driven towards their respective :term:`references ` by the feedback controller (typically the :ref:`Linear-Quadratic Regulator ` since it's optimal). For our flywheel, we care only about one state: its velocity. While we could chose to also model its acceleration, the inclusion of this state isn't necessary for our system. @@ -41,12 +41,12 @@ Next, we identify the :term:`inputs ` to our system. Inputs can be though A continuous-time state-space system writes :term:`x-dot`, or the instantaneous rate of change of the system's :term:`system`\'s state, as proportional to the current :term:`state` and :term:`inputs `. Because our state is angular velocity, :math:`\mathbf{\dot{x}}` will be the flywheel's angular acceleration. -Next, we will model our flywheel as a continuous-time state-space system. WPILib's ``LinearSystem`` will convert this to discrete-time internally. Review :ref:`state-space notation ` for more on continuous-time and discrete-time systems. +Next, we will model our flywheel as a continuous-time state-space system. WPILib's ``LinearSystem`` will convert this to discrete-time internally. Review :ref:`state-space notation ` for more on continuous-time and discrete-time systems. Modeling with System Identification ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To rewrite this in state-space notation using :term:`system identification`, we recall from the flywheel :ref:`state-space notation example `, where we rewrote the following equation in terms of :math:`\mathbf{a}`. +To rewrite this in state-space notation using :term:`system identification`, we recall from the flywheel :ref:`state-space notation example `, where we rewrote the following equation in terms of :math:`\mathbf{a}`. .. math:: V = kV \cdot \mathbf{v} + kA \cdot \mathbf{a}\\ @@ -139,7 +139,7 @@ In the case of a flywheel we start with a state standard deviation of 3 rad/s an .. image:: images/filter_comparison.png :alt: The effect of a Kalman, median, and IIR filters on some flywheel data. -The above graph shows two differently tuned Kalman filters, as well as a :ref:`single-pole IIR filter ` and a :ref:`docs/software/advanced-controls/filters/median-filter:Median Filter`. This data was collected with a shooter over ~5 seconds, and four balls were run through the shooter (as seen in the four dips in velocity). While there are no hard rules on choosing good state and measurement standard deviations, they should in general be tuned to trust the model enough to reject noise while reacting quickly to external disturbances. +The above graph shows two differently tuned Kalman filters, as well as a :ref:`single-pole IIR filter ` and a :ref:`docs/software/controls/filters/median-filter:Median Filter`. This data was collected with a shooter over ~5 seconds, and four balls were run through the shooter (as seen in the four dips in velocity). While there are no hard rules on choosing good state and measurement standard deviations, they should in general be tuned to trust the model enough to reject noise while reacting quickly to external disturbances. Because the feedback controller computes error using the :term:`x-hat` estimated by the Kalman filter, the controller will react to disturbances only as quickly the filter's state estimate changes. In the above chart, the upper left plot (with a state standard deviation of 3.0 and measurement standard deviation of 0.2) produced a filter that reacted quickly to disturbances while rejecting noise, while the upper right plot shows a filter that was barely affected by the velocity dips. @@ -169,16 +169,16 @@ Because the feedback controller computes error using the :term:`x-hat` estimated :linenos: :lineno-start: 48 -Because Kalman filters use our state-space model in the :ref:`docs/software/advanced-controls/state-space/state-space-observers:Predict step`, it is important that our model is as accurate as possible. One way to verify this is to record a flywheel's input voltage and velocity over time, and replay this data by calling only ``predict`` on the Kalman filter. Then, the kV and kA gains (or moment of inertia and other constants) can be adjusted until the model closely matches the recorded data. +Because Kalman filters use our state-space model in the :ref:`docs/software/controls/state-space/state-space-observers:Predict step`, it is important that our model is as accurate as possible. One way to verify this is to record a flywheel's input voltage and velocity over time, and replay this data by calling only ``predict`` on the Kalman filter. Then, the kV and kA gains (or moment of inertia and other constants) can be adjusted until the model closely matches the recorded data. .. todo:: do we need to elaborate on this^ more? Linear-Quadratic Regulators and Plant Inversion Feedforward ----------------------------------------------------------- -:ref:`docs/software/advanced-controls/state-space/state-space-intro:The Linear-Quadratic Regulator` finds a feedback controller to drive our flywheel :term:`system` to its :term:`reference`. Because our flywheel has just one state, the control law picked by our LQR will be in the form :math:`\mathbf{u = K (r - x)}` where :math:`\mathbf{K}` is a 1x1 matrix; in other words, the control law picked by LQR is simply a proportional controller, or a PID controller with only a P gain. This gain is chosen by our LQR based on the state excursion and control efforts we pass it. More on tuning LQR controllers can be found in the :ref:`LQR application example `. +:ref:`docs/software/controls/state-space/state-space-intro:The Linear-Quadratic Regulator` finds a feedback controller to drive our flywheel :term:`system` to its :term:`reference`. Because our flywheel has just one state, the control law picked by our LQR will be in the form :math:`\mathbf{u = K (r - x)}` where :math:`\mathbf{K}` is a 1x1 matrix; in other words, the control law picked by LQR is simply a proportional controller, or a PID controller with only a P gain. This gain is chosen by our LQR based on the state excursion and control efforts we pass it. More on tuning LQR controllers can be found in the :ref:`LQR application example `. -Much like ``SimpleMotorFeedforward`` can be used to generate feedforward voltage inputs given kS, kV, and kA constants, the Plant Inversion Feedforward class generate :ref:`feedforward ` voltage inputs given a state-space system. The voltage commands generated by the ``LinearSystemLoop`` class are the sum of the feedforward and feedback inputs. +Much like ``SimpleMotorFeedforward`` can be used to generate feedforward voltage inputs given kS, kV, and kA constants, the Plant Inversion Feedforward class generate :ref:`feedforward ` voltage inputs given a state-space system. The voltage commands generated by the ``LinearSystemLoop`` class are the sum of the feedforward and feedback inputs. .. tab-set:: diff --git a/source/docs/software/advanced-controls/state-space/state-space-intro.rst b/source/docs/software/controls/state-space/state-space-intro.rst similarity index 97% rename from source/docs/software/advanced-controls/state-space/state-space-intro.rst rename to source/docs/software/controls/state-space/state-space-intro.rst index a943e30dc0..18633e660c 100644 --- a/source/docs/software/advanced-controls/state-space/state-space-intro.rst +++ b/source/docs/software/controls/state-space/state-space-intro.rst @@ -17,7 +17,7 @@ If you've used WPILib's feedforward classes for ``SimpleMotorFeedforward`` or it Vocabulary ---------- -For the background vocabulary that will be used throughout this article, see the :ref:`Glossary `. +For the background vocabulary that will be used throughout this article, see the :ref:`Glossary `. Introduction to Linear Algebra ------------------------------ @@ -79,7 +79,7 @@ A continuous-time state-space system can be converted into a discrete-time syste State-space Notation Example: Flywheel from Kv and Ka ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:ref:`Recall ` that we can model the motion of a flywheel connected to a brushed DC motor with the equation :math:`V = K_v \cdot v + K_a \cdot a`, where V is voltage output, v is the flywheel's angular velocity and a is its angular acceleration. This equation can be rewritten as :math:`a = \frac{V - K_v \cdot v}{K_a}`, or :math:`a = \frac{-K_v}{K_a} \cdot v + \frac{1}{K_a} \cdot V`. Notice anything familiar? This equation relates the angular acceleration of the flywheel to its angular velocity and the voltage applied. +:ref:`Recall ` that we can model the motion of a flywheel connected to a brushed DC motor with the equation :math:`V = K_v \cdot v + K_a \cdot a`, where V is voltage output, v is the flywheel's angular velocity and a is its angular acceleration. This equation can be rewritten as :math:`a = \frac{V - K_v \cdot v}{K_a}`, or :math:`a = \frac{-K_v}{K_a} \cdot v + \frac{1}{K_a} \cdot V`. Notice anything familiar? This equation relates the angular acceleration of the flywheel to its angular velocity and the voltage applied. We can convert this equation to state-space notation. We can create a system with one state (velocity), one :term:`input` (voltage), and one :term:`output` (velocity). Recalling that the first derivative of velocity is acceleration, we can write our equation as follows, replacing velocity with :math:`\mathbf{x}`, acceleration with :math:`\mathbf{\dot{x}}`, and voltage :math:`\mathbf{V}` with :math:`\mathbf{u}`: diff --git a/source/docs/software/advanced-controls/state-space/state-space-observers.rst b/source/docs/software/controls/state-space/state-space-observers.rst similarity index 97% rename from source/docs/software/advanced-controls/state-space/state-space-observers.rst rename to source/docs/software/controls/state-space/state-space-observers.rst index 312afa7d9b..3805e6383a 100644 --- a/source/docs/software/advanced-controls/state-space/state-space-observers.rst +++ b/source/docs/software/controls/state-space/state-space-observers.rst @@ -1,9 +1,9 @@ State Observers and Kalman Filters ================================== -State observers combine information about a system's behavior and external measurements to estimate the true :term:`state` of the system. A common observer used for linear systems is the Kalman Filter. Kalman filters are advantageous over other :ref:`filters ` as they fuse measurements from one or more sensors with a state-space model of the system to optimally estimate a system's state. +State observers combine information about a system's behavior and external measurements to estimate the true :term:`state` of the system. A common observer used for linear systems is the Kalman Filter. Kalman filters are advantageous over other :ref:`filters ` as they fuse measurements from one or more sensors with a state-space model of the system to optimally estimate a system's state. -This image shows flywheel velocity measurements over time, run through a variety of different filters. Note that a well-tuned Kalman filter shows no measurement lag during flywheel spinup while still rejecting noisy data and reacting quickly to disturbances as balls pass through it. More on filters can be found in the :ref:`filters section `\. +This image shows flywheel velocity measurements over time, run through a variety of different filters. Note that a well-tuned Kalman filter shows no measurement lag during flywheel spinup while still rejecting noisy data and reacting quickly to disturbances as balls pass through it. More on filters can be found in the :ref:`filters section `\. .. image:: images/filter_comparison.png :alt: Filter comparison between: Kalman, Median, and IIR. diff --git a/source/docs/software/advanced-controls/state-space/state-space-pose-estimators.rst b/source/docs/software/controls/state-space/state-space-pose-estimators.rst similarity index 100% rename from source/docs/software/advanced-controls/state-space/state-space-pose-estimators.rst rename to source/docs/software/controls/state-space/state-space-pose-estimators.rst diff --git a/source/docs/software/advanced-controls/system-identification/additional-utils.rst b/source/docs/software/controls/system-identification/additional-utils.rst similarity index 100% rename from source/docs/software/advanced-controls/system-identification/additional-utils.rst rename to source/docs/software/controls/system-identification/additional-utils.rst diff --git a/source/docs/software/advanced-controls/system-identification/analyzing-gains.rst b/source/docs/software/controls/system-identification/analyzing-gains.rst similarity index 90% rename from source/docs/software/advanced-controls/system-identification/analyzing-gains.rst rename to source/docs/software/controls/system-identification/analyzing-gains.rst index cef16f36ab..791651df46 100644 --- a/source/docs/software/advanced-controls/system-identification/analyzing-gains.rst +++ b/source/docs/software/controls/system-identification/analyzing-gains.rst @@ -6,7 +6,7 @@ Analyzing Data Feedforward Analysis ---------------------------- -.. note:: For information on what the calculated feedback gains mean, see :ref:`docs/software/advanced-controls/introduction/introduction-to-feedforward:The Permanent-Magnet DC Motor Feedforward Equation`. For information on using the calculated feedback gains in code, see :ref:`feedforward control `. +.. note:: For information on what the calculated feedback gains mean, see :ref:`docs/software/controls/introduction/introduction-to-feedforward:The Permanent-Magnet DC Motor Feedforward Equation`. For information on using the calculated feedback gains in code, see :ref:`feedforward control `. Click the dropdown arrow on the :guilabel:`Feedforward` Section. @@ -61,7 +61,7 @@ Measurement Delays .. note:: If you are using default smart motor controller settings or WPILib PID Control without additional filtering, SysId handles this for you. -Many "smart motor controllers" (such as the ``Talon SRX``, ``Venom``, ``Talon FX``, and ``SPARK MAX``) apply substantial :ref:`low-pass filtering ` to their encoder velocity measurements, which can introduce a significant amount of phase lag. This can cause the calculated gains for velocity loops to be unstable. This can be accounted for with the :guilabel:`Measurement Delay` box. +Many "smart motor controllers" (such as the ``Talon SRX``, ``Venom``, ``Talon FX``, and ``SPARK MAX``) apply substantial :ref:`low-pass filtering ` to their encoder velocity measurements, which can introduce a significant amount of phase lag. This can cause the calculated gains for velocity loops to be unstable. This can be accounted for with the :guilabel:`Measurement Delay` box. However, the measurement delays have already been calculated for the default settings of the previously mentioned motor controllers so for most users this is handled by selecting the right preset in :guilabel:`Gain Settings Preset`. diff --git a/source/docs/software/advanced-controls/system-identification/creating-routine.rst b/source/docs/software/controls/system-identification/creating-routine.rst similarity index 100% rename from source/docs/software/advanced-controls/system-identification/creating-routine.rst rename to source/docs/software/controls/system-identification/creating-routine.rst diff --git a/source/docs/software/advanced-controls/system-identification/images/accel-vs-vel-plot.png b/source/docs/software/controls/system-identification/images/accel-vs-vel-plot.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/accel-vs-vel-plot.png rename to source/docs/software/controls/system-identification/images/accel-vs-vel-plot.png diff --git a/source/docs/software/advanced-controls/system-identification/images/controller-settings.png b/source/docs/software/controls/system-identification/images/controller-settings.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/controller-settings.png rename to source/docs/software/controls/system-identification/images/controller-settings.png diff --git a/source/docs/software/advanced-controls/system-identification/images/dynamic-test-too-long.png b/source/docs/software/controls/system-identification/images/dynamic-test-too-long.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/dynamic-test-too-long.png rename to source/docs/software/controls/system-identification/images/dynamic-test-too-long.png diff --git a/source/docs/software/advanced-controls/system-identification/images/entries-selected.png b/source/docs/software/controls/system-identification/images/entries-selected.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/entries-selected.png rename to source/docs/software/controls/system-identification/images/entries-selected.png diff --git a/source/docs/software/advanced-controls/system-identification/images/feedback-analysis.png b/source/docs/software/controls/system-identification/images/feedback-analysis.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/feedback-analysis.png rename to source/docs/software/controls/system-identification/images/feedback-analysis.png diff --git a/source/docs/software/advanced-controls/system-identification/images/feedforward-analysis.png b/source/docs/software/controls/system-identification/images/feedforward-analysis.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/feedforward-analysis.png rename to source/docs/software/controls/system-identification/images/feedforward-analysis.png diff --git a/source/docs/software/advanced-controls/system-identification/images/feedforward-values.png b/source/docs/software/controls/system-identification/images/feedforward-values.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/feedforward-values.png rename to source/docs/software/controls/system-identification/images/feedforward-values.png diff --git a/source/docs/software/advanced-controls/system-identification/images/hide-sim-data.png b/source/docs/software/controls/system-identification/images/hide-sim-data.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/hide-sim-data.png rename to source/docs/software/controls/system-identification/images/hide-sim-data.png diff --git a/source/docs/software/advanced-controls/system-identification/images/high-threshold.png b/source/docs/software/controls/system-identification/images/high-threshold.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/high-threshold.png rename to source/docs/software/controls/system-identification/images/high-threshold.png diff --git a/source/docs/software/advanced-controls/system-identification/images/input-slider.png b/source/docs/software/controls/system-identification/images/input-slider.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/input-slider.png rename to source/docs/software/controls/system-identification/images/input-slider.png diff --git a/source/docs/software/advanced-controls/system-identification/images/log-loaded.png b/source/docs/software/controls/system-identification/images/log-loaded.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/log-loaded.png rename to source/docs/software/controls/system-identification/images/log-loaded.png diff --git a/source/docs/software/advanced-controls/system-identification/images/looptype.png b/source/docs/software/controls/system-identification/images/looptype.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/looptype.png rename to source/docs/software/controls/system-identification/images/looptype.png diff --git a/source/docs/software/advanced-controls/system-identification/images/low-threshold.png b/source/docs/software/controls/system-identification/images/low-threshold.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/low-threshold.png rename to source/docs/software/controls/system-identification/images/low-threshold.png diff --git a/source/docs/software/advanced-controls/system-identification/images/motionthreshold-selector.png b/source/docs/software/controls/system-identification/images/motionthreshold-selector.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/motionthreshold-selector.png rename to source/docs/software/controls/system-identification/images/motionthreshold-selector.png diff --git a/source/docs/software/advanced-controls/system-identification/images/optimality-criteria.png b/source/docs/software/controls/system-identification/images/optimality-criteria.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/optimality-criteria.png rename to source/docs/software/controls/system-identification/images/optimality-criteria.png diff --git a/source/docs/software/advanced-controls/system-identification/images/plot-view.png b/source/docs/software/controls/system-identification/images/plot-view.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/plot-view.png rename to source/docs/software/controls/system-identification/images/plot-view.png diff --git a/source/docs/software/advanced-controls/system-identification/images/post-sim-hide.png b/source/docs/software/controls/system-identification/images/post-sim-hide.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/post-sim-hide.png rename to source/docs/software/controls/system-identification/images/post-sim-hide.png diff --git a/source/docs/software/advanced-controls/system-identification/images/regular-slider.png b/source/docs/software/controls/system-identification/images/regular-slider.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/regular-slider.png rename to source/docs/software/controls/system-identification/images/regular-slider.png diff --git a/source/docs/software/advanced-controls/system-identification/images/resized-plot.png b/source/docs/software/controls/system-identification/images/resized-plot.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/resized-plot.png rename to source/docs/software/controls/system-identification/images/resized-plot.png diff --git a/source/docs/software/advanced-controls/system-identification/images/scaling-units.png b/source/docs/software/controls/system-identification/images/scaling-units.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/scaling-units.png rename to source/docs/software/controls/system-identification/images/scaling-units.png diff --git a/source/docs/software/advanced-controls/system-identification/images/selecting-data-file.png b/source/docs/software/controls/system-identification/images/selecting-data-file.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/selecting-data-file.png rename to source/docs/software/controls/system-identification/images/selecting-data-file.png diff --git a/source/docs/software/advanced-controls/system-identification/images/state-selected.png b/source/docs/software/controls/system-identification/images/state-selected.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/state-selected.png rename to source/docs/software/controls/system-identification/images/state-selected.png diff --git a/source/docs/software/advanced-controls/system-identification/images/test-duration-slider.png b/source/docs/software/controls/system-identification/images/test-duration-slider.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/test-duration-slider.png rename to source/docs/software/controls/system-identification/images/test-duration-slider.png diff --git a/source/docs/software/advanced-controls/system-identification/images/time-domain-plots.png b/source/docs/software/controls/system-identification/images/time-domain-plots.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/time-domain-plots.png rename to source/docs/software/controls/system-identification/images/time-domain-plots.png diff --git a/source/docs/software/advanced-controls/system-identification/images/velo-noise.png b/source/docs/software/controls/system-identification/images/velo-noise.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/velo-noise.png rename to source/docs/software/controls/system-identification/images/velo-noise.png diff --git a/source/docs/software/advanced-controls/system-identification/images/viewing-metrics.png b/source/docs/software/controls/system-identification/images/viewing-metrics.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/viewing-metrics.png rename to source/docs/software/controls/system-identification/images/viewing-metrics.png diff --git a/source/docs/software/advanced-controls/system-identification/images/window-size-selector.png b/source/docs/software/controls/system-identification/images/window-size-selector.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/window-size-selector.png rename to source/docs/software/controls/system-identification/images/window-size-selector.png diff --git a/source/docs/software/advanced-controls/system-identification/images/zoomed-in-plot.png b/source/docs/software/controls/system-identification/images/zoomed-in-plot.png similarity index 100% rename from source/docs/software/advanced-controls/system-identification/images/zoomed-in-plot.png rename to source/docs/software/controls/system-identification/images/zoomed-in-plot.png diff --git a/source/docs/software/advanced-controls/system-identification/index.rst b/source/docs/software/controls/system-identification/index.rst similarity index 100% rename from source/docs/software/advanced-controls/system-identification/index.rst rename to source/docs/software/controls/system-identification/index.rst diff --git a/source/docs/software/advanced-controls/system-identification/introduction.rst b/source/docs/software/controls/system-identification/introduction.rst similarity index 92% rename from source/docs/software/advanced-controls/system-identification/introduction.rst rename to source/docs/software/controls/system-identification/introduction.rst index b5a74464ff..2e8a72217e 100644 --- a/source/docs/software/advanced-controls/system-identification/introduction.rst +++ b/source/docs/software/controls/system-identification/introduction.rst @@ -8,12 +8,12 @@ What is "System Identification?" In Control Theory, :term:`system identification` is the process of determining a mathematical model for the behavior of a system through statistical analysis of its inputs and outputs. -This model is a rule describing how input voltage affects the way our measurements (typically encoder data) evolve in time. A "system identification" routine takes such a model and a dataset and attempts to fit parameters which would make your model most closely-match the dataset. Generally, the model is not perfect - the real-world data are polluted by both measurement noise (e.g. timing errors, encoder resolution limitations) and system noise (unmodeled forces acting on the system, like vibrations). However, even an imperfect model is usually "good enough" to give us accurate :ref:`feedforward control ` of the mechanism, and even to estimate optimal gains for :ref:`feedback control `. +This model is a rule describing how input voltage affects the way our measurements (typically encoder data) evolve in time. A "system identification" routine takes such a model and a dataset and attempts to fit parameters which would make your model most closely-match the dataset. Generally, the model is not perfect - the real-world data are polluted by both measurement noise (e.g. timing errors, encoder resolution limitations) and system noise (unmodeled forces acting on the system, like vibrations). However, even an imperfect model is usually "good enough" to give us accurate :ref:`feedforward control ` of the mechanism, and even to estimate optimal gains for :ref:`feedback control `. Assumed Behavioral Model ------------------------ -If you haven't yet, read the full explanation of the feedforward equations used by the WPILib toolsuite in :ref:`docs/software/advanced-controls/introduction/introduction-to-feedforward:The Permanent-Magnet DC Motor Feedforward Equation`. +If you haven't yet, read the full explanation of the feedforward equations used by the WPILib toolsuite in :ref:`docs/software/controls/introduction/introduction-to-feedforward:The Permanent-Magnet DC Motor Feedforward Equation`. The process of System Identification is to determine concrete values for the coefficients in the model that best-reflect the behavior of *your particular* real-world system. diff --git a/source/docs/software/advanced-controls/system-identification/loading-data.rst b/source/docs/software/controls/system-identification/loading-data.rst similarity index 100% rename from source/docs/software/advanced-controls/system-identification/loading-data.rst rename to source/docs/software/controls/system-identification/loading-data.rst diff --git a/source/docs/software/advanced-controls/system-identification/running-routine.rst b/source/docs/software/controls/system-identification/running-routine.rst similarity index 100% rename from source/docs/software/advanced-controls/system-identification/running-routine.rst rename to source/docs/software/controls/system-identification/running-routine.rst diff --git a/source/docs/software/advanced-controls/system-identification/viewing-diagnostics.rst b/source/docs/software/controls/system-identification/viewing-diagnostics.rst similarity index 95% rename from source/docs/software/advanced-controls/system-identification/viewing-diagnostics.rst rename to source/docs/software/controls/system-identification/viewing-diagnostics.rst index 79bc0c35f2..730739a8fc 100644 --- a/source/docs/software/advanced-controls/system-identification/viewing-diagnostics.rst +++ b/source/docs/software/controls/system-identification/viewing-diagnostics.rst @@ -13,7 +13,7 @@ The acceleration r-squared is the fraction of the variance in measured accelerat The simulated velocity r-squared is the fraction of the variance in measured velocity explained by a noiseless simulation of the motor movement stepped forward with the constants determined from the regression. A value north of ``.9`` indicates a good fit. -The simulated velocity RMSE is the standard deviation of the velocity error from the simulated model. This is a good estimation of the amount of process noise present during the test routine, and can be used as a low-end estimate for the model noise term in :ref:`state-space control `. +The simulated velocity RMSE is the standard deviation of the velocity error from the simulated model. This is a good estimation of the amount of process noise present during the test routine, and can be used as a low-end estimate for the model noise term in :ref:`state-space control `. Diagnostic Plots ---------------- @@ -37,7 +37,7 @@ The velocity time domain plots contain three sets of data: Raw Data, Filtered Da A successful quasistatic graph will be very nearly linear, while a successful dynamic graph will be an approximately exponential approach of the steady-speed. -Deviation from this behavior is a sign of an :ref:`error `, either in your robot setup, analysis settings, or your test procedure. +Deviation from this behavior is a sign of an :ref:`error `, either in your robot setup, analysis settings, or your test procedure. Acceleration-Velocity Plot ^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/source/docs/software/advanced-controls/trajectories/constraints.rst b/source/docs/software/controls/trajectories/constraints.rst similarity index 85% rename from source/docs/software/advanced-controls/trajectories/constraints.rst rename to source/docs/software/controls/trajectories/constraints.rst index a638f7a8eb..d1065e6fa9 100644 --- a/source/docs/software/advanced-controls/trajectories/constraints.rst +++ b/source/docs/software/controls/trajectories/constraints.rst @@ -1,6 +1,6 @@ Trajectory Constraints ====================== -In the :ref:`previous article `, you might have noticed that no custom constraints were added when generating the trajectories. Custom constraints allow users to impose more restrictions on the velocity and acceleration at points along the trajectory based on location and curvature. +In the :ref:`previous article `, you might have noticed that no custom constraints were added when generating the trajectories. Custom constraints allow users to impose more restrictions on the velocity and acceleration at points along the trajectory based on location and curvature. For example, a custom constraint can keep the velocity of the trajectory under a certain threshold in a certain region or slow down the robot near turns for stability purposes. @@ -17,7 +17,7 @@ WPILib includes a set of predefined constraints that users can utilize when gene - ``RectangularRegionConstraint``: Imposes a constraint only in a rectangular region on the field. - ``SwerveDriveKinematicsConstraint``: Limits the velocity of the robot around turns such that no wheel of a swerve-drive robot goes over a specified maximum velocity. -.. note:: The ``DifferentialDriveVoltageConstraint`` only ensures that theoretical voltage commands do not go over the specified maximum using a :ref:`feedforward model `. If the robot were to deviate from the reference while tracking, the commanded voltage may be higher than the specified maximum. +.. note:: The ``DifferentialDriveVoltageConstraint`` only ensures that theoretical voltage commands do not go over the specified maximum using a :ref:`feedforward model `. If the robot were to deviate from the reference while tracking, the commanded voltage may be higher than the specified maximum. Creating a Custom Constraint ---------------------------- diff --git a/source/docs/software/advanced-controls/trajectories/examples/trajectory-generation-1/cpp/ExampleTrajectory.cpp b/source/docs/software/controls/trajectories/examples/trajectory-generation-1/cpp/ExampleTrajectory.cpp similarity index 100% rename from source/docs/software/advanced-controls/trajectories/examples/trajectory-generation-1/cpp/ExampleTrajectory.cpp rename to source/docs/software/controls/trajectories/examples/trajectory-generation-1/cpp/ExampleTrajectory.cpp diff --git a/source/docs/software/advanced-controls/trajectories/examples/trajectory-generation-1/java/ExampleTrajectory.java b/source/docs/software/controls/trajectories/examples/trajectory-generation-1/java/ExampleTrajectory.java similarity index 100% rename from source/docs/software/advanced-controls/trajectories/examples/trajectory-generation-1/java/ExampleTrajectory.java rename to source/docs/software/controls/trajectories/examples/trajectory-generation-1/java/ExampleTrajectory.java diff --git a/source/docs/software/advanced-controls/trajectories/holonomic.rst b/source/docs/software/controls/trajectories/holonomic.rst similarity index 98% rename from source/docs/software/advanced-controls/trajectories/holonomic.rst rename to source/docs/software/controls/trajectories/holonomic.rst index 4ac38b8a0c..5bf38c34b5 100644 --- a/source/docs/software/advanced-controls/trajectories/holonomic.rst +++ b/source/docs/software/controls/trajectories/holonomic.rst @@ -6,7 +6,7 @@ Constructing a Holonomic Drive Controller ----------------------------------------- The holonomic drive controller should be instantiated with 2 PID controllers and 1 profiled PID controller. -.. note:: For more information on PID control, see :ref:`docs/software/advanced-controls/controllers/pidcontroller:PID Control in WPILib`. +.. note:: For more information on PID control, see :ref:`docs/software/controls/controllers/pidcontroller:PID Control in WPILib`. The 2 PID controllers are controllers that should correct for error in the field-relative x and y directions respectively. For example, if the first 2 arguments are ``PIDController(1, 0, 0)`` and ``PIDController(1.2, 0, 0)`` respectively, the holonomic drive controller will add an additional meter per second in the x direction for every meter of error in the x direction and will add an additional 1.2 meters per second in the y direction for every meter of error in the y direction. diff --git a/source/docs/software/advanced-controls/trajectories/images/relative-to.png b/source/docs/software/controls/trajectories/images/relative-to.png similarity index 100% rename from source/docs/software/advanced-controls/trajectories/images/relative-to.png rename to source/docs/software/controls/trajectories/images/relative-to.png diff --git a/source/docs/software/advanced-controls/trajectories/images/sysid-trackwidth.png b/source/docs/software/controls/trajectories/images/sysid-trackwidth.png similarity index 100% rename from source/docs/software/advanced-controls/trajectories/images/sysid-trackwidth.png rename to source/docs/software/controls/trajectories/images/sysid-trackwidth.png diff --git a/source/docs/software/advanced-controls/trajectories/images/transform-by.png b/source/docs/software/controls/trajectories/images/transform-by.png similarity index 100% rename from source/docs/software/advanced-controls/trajectories/images/transform-by.png rename to source/docs/software/controls/trajectories/images/transform-by.png diff --git a/source/docs/software/advanced-controls/trajectories/index.rst b/source/docs/software/controls/trajectories/index.rst similarity index 100% rename from source/docs/software/advanced-controls/trajectories/index.rst rename to source/docs/software/controls/trajectories/index.rst diff --git a/source/docs/software/advanced-controls/trajectories/manipulating-trajectories.rst b/source/docs/software/controls/trajectories/manipulating-trajectories.rst similarity index 87% rename from source/docs/software/advanced-controls/trajectories/manipulating-trajectories.rst rename to source/docs/software/controls/trajectories/manipulating-trajectories.rst index a673e19f6d..78e50579ef 100644 --- a/source/docs/software/advanced-controls/trajectories/manipulating-trajectories.rst +++ b/source/docs/software/controls/trajectories/manipulating-trajectories.rst @@ -49,4 +49,4 @@ Note: The angular velocity at the sample point can be calculated by multiplying Getting all states of the trajectory (advanced) ----------------------------------------------- -A more advanced user can get a list of all states of the trajectory by calling the ``States()`` (C++) / ``getStates()`` (Java) method. Each state represents a point on the trajectory. :ref:`When the trajectory is created ` using the ``TrajectoryGenerator::GenerateTrajectory(...)`` method, a list of trajectory points / states are created. When the user samples the trajectory at a particular timestep, a new sample point is interpolated between two existing points / states in the list. +A more advanced user can get a list of all states of the trajectory by calling the ``States()`` (C++) / ``getStates()`` (Java) method. Each state represents a point on the trajectory. :ref:`When the trajectory is created ` using the ``TrajectoryGenerator::GenerateTrajectory(...)`` method, a list of trajectory points / states are created. When the user samples the trajectory at a particular timestep, a new sample point is interpolated between two existing points / states in the list. diff --git a/source/docs/software/advanced-controls/trajectories/ramsete.rst b/source/docs/software/controls/trajectories/ramsete.rst similarity index 100% rename from source/docs/software/advanced-controls/trajectories/ramsete.rst rename to source/docs/software/controls/trajectories/ramsete.rst diff --git a/source/docs/software/advanced-controls/trajectories/trajectory-generation.rst b/source/docs/software/controls/trajectories/trajectory-generation.rst similarity index 100% rename from source/docs/software/advanced-controls/trajectories/trajectory-generation.rst rename to source/docs/software/controls/trajectories/trajectory-generation.rst diff --git a/source/docs/software/advanced-controls/trajectories/transforming-trajectories.rst b/source/docs/software/controls/trajectories/transforming-trajectories.rst similarity index 100% rename from source/docs/software/advanced-controls/trajectories/transforming-trajectories.rst rename to source/docs/software/controls/trajectories/transforming-trajectories.rst diff --git a/source/docs/software/advanced-controls/trajectories/troubleshooting.rst b/source/docs/software/controls/trajectories/troubleshooting.rst similarity index 98% rename from source/docs/software/advanced-controls/trajectories/troubleshooting.rst rename to source/docs/software/controls/trajectories/troubleshooting.rst index 2cf0df0d4b..6ca1df2d38 100644 --- a/source/docs/software/advanced-controls/trajectories/troubleshooting.rst +++ b/source/docs/software/controls/trajectories/troubleshooting.rst @@ -15,7 +15,7 @@ There are a number of things that can cause your robot to do completely the wron - Are the start and end headings of your trajectory wrong? - Is your robot's gyro getting reset to the wrong heading? - - :ref:`Do you have the reverse flag set incorrectly? ` + - :ref:`Do you have the reverse flag set incorrectly? ` - Are your gyro angles clockwise positive? If so, you should negate them. * My robot just drives in a straight line even though it should turn. @@ -26,7 +26,7 @@ There are a number of things that can cause your robot to do completely the wron * I get a ``MalformedSplineException`` printout on the driver station and the robot doesn't move. - - :ref:`Do you have the reverse flag set incorrectly? ` + - :ref:`Do you have the reverse flag set incorrectly? ` - Do you have two waypoints very close together with approximately opposite headings? - Do you have two waypoints with the same (or nearly the same) coordinates? diff --git a/source/docs/software/advanced-controls/video-walkthrough.rst b/source/docs/software/controls/video-walkthrough.rst similarity index 100% rename from source/docs/software/advanced-controls/video-walkthrough.rst rename to source/docs/software/controls/video-walkthrough.rst diff --git a/source/docs/software/convenience-features/event-based.rst b/source/docs/software/convenience-features/event-based.rst index e5095158d7..a2950967c5 100644 --- a/source/docs/software/convenience-features/event-based.rst +++ b/source/docs/software/convenience-features/event-based.rst @@ -94,7 +94,7 @@ The ``negate()``/``!`` composes one ``BooleanEvent`` condition into another cond debounce() / Debounce() ^^^^^^^^^^^^^^^^^^^^^^^ -To avoid rapid repeated activation, conditions (especially those originating from digital inputs) can be debounced with the :ref:`WPILib Debouncer class ` using the `debounce` method: +To avoid rapid repeated activation, conditions (especially those originating from digital inputs) can be debounced with the :ref:`WPILib Debouncer class ` using the `debounce` method: .. tab-set-code:: diff --git a/source/docs/software/dashboards/glass/mech2d-widget.rst b/source/docs/software/dashboards/glass/mech2d-widget.rst index 989e3ab88c..f2ff2f742c 100644 --- a/source/docs/software/dashboards/glass/mech2d-widget.rst +++ b/source/docs/software/dashboards/glass/mech2d-widget.rst @@ -31,7 +31,7 @@ In the examples below, an elevator is drawn, with a rotational wrist on top of t :lineno-start: 32 -Each ``MechanismLigament2d`` object represents a stage of the mechanism. It has a three required parameters, a name, an initial length to draw (relative to the size of the ``Mechanism2d`` object), and an initial angle to draw the ligament in degrees. Ligament angles are relative to the parent ligament, and follow math notation - the same as :ref:`Rotation2d ` (counterclockwise-positive). A ligament based on the root with an angle of zero will point right. Two optional parameters let you change the width (also relative to the size of the Mechanism2d object) and the color. Call ``append()``/``Append()`` on a root node or ligament node to add another node to the figure. In Java, pass a constructed ``MechanismLigament2d`` object to add it. In C++, pass the construction parameters in order to construct and add a ligament. +Each ``MechanismLigament2d`` object represents a stage of the mechanism. It has a three required parameters, a name, an initial length to draw (relative to the size of the ``Mechanism2d`` object), and an initial angle to draw the ligament in degrees. Ligament angles are relative to the parent ligament, and follow math notation - the same as :ref:`Rotation2d ` (counterclockwise-positive). A ligament based on the root with an angle of zero will point right. Two optional parameters let you change the width (also relative to the size of the Mechanism2d object) and the color. Call ``append()``/``Append()`` on a root node or ligament node to add another node to the figure. In Java, pass a constructed ``MechanismLigament2d`` object to add it. In C++, pass the construction parameters in order to construct and add a ligament. .. tab-set-code:: diff --git a/source/docs/software/dashboards/smartdashboard/test-mode-and-live-window/pid-tuning-with-smartdashboard.rst b/source/docs/software/dashboards/smartdashboard/test-mode-and-live-window/pid-tuning-with-smartdashboard.rst index 0e6987ff78..3708c2e4bc 100644 --- a/source/docs/software/dashboards/smartdashboard/test-mode-and-live-window/pid-tuning-with-smartdashboard.rst +++ b/source/docs/software/dashboards/smartdashboard/test-mode-and-live-window/pid-tuning-with-smartdashboard.rst @@ -27,10 +27,10 @@ Tuning the PIDController .. image:: images/PID-tuning-with-SmartDashboard/tuning-pid-controller.png :alt: Using the PIDController to tune the control. -Tuning the PID controller can be difficult and there are many articles that describe techniques that can be used. It is best to start with the P value first. To try different values fill in a low number for P, enter a setpoint determined earlier in this document, and note how fast the mechanism responds. If it responds too slowly, perhaps never reaching the setpoint, increase P. If it responds too quickly, perhaps oscillating, reduce the P value. Repeat this process until you get a response that is as fast as possible without oscillation. It's possible that having a P term is all that's needed to achieve adequate control of your mechanism. Further information is located in the :doc:`/docs/software/advanced-controls/introduction/tuning-flywheel` document. +Tuning the PID controller can be difficult and there are many articles that describe techniques that can be used. It is best to start with the P value first. To try different values fill in a low number for P, enter a setpoint determined earlier in this document, and note how fast the mechanism responds. If it responds too slowly, perhaps never reaching the setpoint, increase P. If it responds too quickly, perhaps oscillating, reduce the P value. Repeat this process until you get a response that is as fast as possible without oscillation. It's possible that having a P term is all that's needed to achieve adequate control of your mechanism. Further information is located in the :doc:`/docs/software/controls/introduction/tuning-flywheel` document. Once you have determined P, I, and D values they can be inserted into the program. You'll find them either in the properties for the PIDSubsystem in RobotBuilder or in the constructor for the PID Subsystem in your code. The F (feedforward) term is used for controlling velocity with a PID controller. -More information can be found at :ref:`docs/software/advanced-controls/controllers/pidcontroller:PID Control in WPILib`. +More information can be found at :ref:`docs/software/controls/controllers/pidcontroller:PID Control in WPILib`. diff --git a/source/docs/software/examples-tutorials/wpilib-examples.rst b/source/docs/software/examples-tutorials/wpilib-examples.rst index 07af1f0c90..7b4cac4386 100644 --- a/source/docs/software/examples-tutorials/wpilib-examples.rst +++ b/source/docs/software/examples-tutorials/wpilib-examples.rst @@ -77,7 +77,7 @@ These examples demonstrate the use of the :ref:`Command-Based framework `. +These examples demonstrate the use of the :ref:`State-Space Control `. * **StateSpaceFlywheel** (`Java `__, `C++ `__, `Python `__): Demonstrates state-space control of a flywheel. * **StateSpaceFlywheelSysId** (`Java `__, `C++ `__, `Python `__): Demonstrates state-space control using SysId's System Identification for controlling a flywheel. diff --git a/source/docs/software/hardware-apis/motors/wpi-drive-classes.rst b/source/docs/software/hardware-apis/motors/wpi-drive-classes.rst index a604f8c97f..aced52aadb 100644 --- a/source/docs/software/hardware-apis/motors/wpi-drive-classes.rst +++ b/source/docs/software/hardware-apis/motors/wpi-drive-classes.rst @@ -376,4 +376,4 @@ The use of field-oriented driving makes often makes the robot much easier to dri Just remember to get the gyro angle each time ``driveCartesian()`` is called. -.. note:: Many teams also like to ramp the joysticks inputs over time to promote a smooth acceleration and reduce jerk. This can be accomplished with a :ref:`Slew Rate Limiter `. +.. note:: Many teams also like to ramp the joysticks inputs over time to promote a smooth acceleration and reduce jerk. This can be accomplished with a :ref:`Slew Rate Limiter `. diff --git a/source/docs/software/hardware-apis/sensors/encoders-software.rst b/source/docs/software/hardware-apis/sensors/encoders-software.rst index 8955a90017..a7883631f7 100644 --- a/source/docs/software/hardware-apis/sensors/encoders-software.rst +++ b/source/docs/software/hardware-apis/sensors/encoders-software.rst @@ -460,7 +460,7 @@ Encoders are some of the most useful sensors in FRC\ |reg|; they are very nearly Driving to a Distance ^^^^^^^^^^^^^^^^^^^^^ -Encoders can be used on a robot drive to create a simple "drive to distance" routine. This is useful in autonomous mode, but has the disadvantage that the robot's momentum will cause it to overshoot the intended distance. Better methods include using a :doc:`PID Controller ` or using :doc:`Path Planning ` +Encoders can be used on a robot drive to create a simple "drive to distance" routine. This is useful in autonomous mode, but has the disadvantage that the robot's momentum will cause it to overshoot the intended distance. Better methods include using a :doc:`PID Controller ` or using :doc:`Path Planning ` .. note:: The following example uses the `Encoder` class, but is similar if other `DutyCycleEncoder` or `AnalogEncoder` is used. However, quadrature encoders are typically better suited for drivetrains since they roll over many times and don't have an absolute position. diff --git a/source/docs/software/kinematics-and-odometry/differential-drive-odometry.rst b/source/docs/software/kinematics-and-odometry/differential-drive-odometry.rst index 272e4ddb47..eaf4041f66 100644 --- a/source/docs/software/kinematics-and-odometry/differential-drive-odometry.rst +++ b/source/docs/software/kinematics-and-odometry/differential-drive-odometry.rst @@ -13,7 +13,7 @@ The ``DifferentialDriveOdometry`` class constructor requires three mandatory arg The optional argument is the starting pose of your robot on the field (as a ``Pose2d``). By default, the robot will start at ``x = 0, y = 0, theta = 0``. -.. note:: 0 degrees / radians represents the robot angle when the robot is facing directly toward your opponent's alliance station. As your robot turns to the left, your gyroscope angle should increase. The ``Gyro`` interface supplies ``getRotation2d``/``GetRotation2d`` that you can use for this purpose. See :ref:`Field Coordinate System ` for more information about the coordinate system. +.. note:: 0 degrees / radians represents the robot angle when the robot is facing directly toward your opponent's alliance station. As your robot turns to the left, your gyroscope angle should increase. The ``Gyro`` interface supplies ``getRotation2d``/``GetRotation2d`` that you can use for this purpose. See :ref:`Field Coordinate System ` for more information about the coordinate system. .. tab-set-code:: diff --git a/source/docs/software/kinematics-and-odometry/mecanum-drive-odometry.rst b/source/docs/software/kinematics-and-odometry/mecanum-drive-odometry.rst index 64c3643026..a956fd0dc5 100644 --- a/source/docs/software/kinematics-and-odometry/mecanum-drive-odometry.rst +++ b/source/docs/software/kinematics-and-odometry/mecanum-drive-odometry.rst @@ -16,7 +16,7 @@ The mandatory arguments are: The fourth optional argument is the starting pose of your robot on the field (as a ``Pose2d``). By default, the robot will start at ``x = 0, y = 0, theta = 0``. -.. note:: 0 degrees / radians represents the robot angle when the robot is facing directly toward your opponent's alliance station. As your robot turns to the left, your gyroscope angle should increase. The ``Gyro`` interface supplies ``getRotation2d``/``GetRotation2d`` that you can use for this purpose. See :ref:`Field Coordinate System ` for more information about the coordinate system. +.. note:: 0 degrees / radians represents the robot angle when the robot is facing directly toward your opponent's alliance station. As your robot turns to the left, your gyroscope angle should increase. The ``Gyro`` interface supplies ``getRotation2d``/``GetRotation2d`` that you can use for this purpose. See :ref:`Field Coordinate System ` for more information about the coordinate system. .. tab-set-code:: diff --git a/source/docs/software/kinematics-and-odometry/swerve-drive-odometry.rst b/source/docs/software/kinematics-and-odometry/swerve-drive-odometry.rst index a6d8401345..bff4d8f45c 100644 --- a/source/docs/software/kinematics-and-odometry/swerve-drive-odometry.rst +++ b/source/docs/software/kinematics-and-odometry/swerve-drive-odometry.rst @@ -16,7 +16,7 @@ The mandatory arguments are: The fourth optional argument is the starting pose of your robot on the field (as a ``Pose2d``). By default, the robot will start at ``x = 0, y = 0, theta = 0``. -.. note:: 0 degrees / radians represents the robot angle when the robot is facing directly toward your opponent's alliance station. As your robot turns to the left, your gyroscope angle should increase. The ``Gyro`` interface supplies ``getRotation2d``/``GetRotation2d`` that you can use for this purpose. See :ref:`Field Coordinate System ` for more information about the coordinate system. +.. note:: 0 degrees / radians represents the robot angle when the robot is facing directly toward your opponent's alliance station. As your robot turns to the left, your gyroscope angle should increase. The ``Gyro`` interface supplies ``getRotation2d``/``GetRotation2d`` that you can use for this purpose. See :ref:`Field Coordinate System ` for more information about the coordinate system. .. tab-set-code:: diff --git a/source/docs/software/pathplanning/index.rst b/source/docs/software/pathplanning/index.rst index 058d9ed856..b2a3f058c4 100644 --- a/source/docs/software/pathplanning/index.rst +++ b/source/docs/software/pathplanning/index.rst @@ -1,7 +1,7 @@ Path Planning ============= -Path Planning is the process of creating and following trajectories. These paths use the WPILib trajectory APIs for generation and a :ref:`Ramsete Controller ` for following. This section highlights the process of characterizing your robot for system identification, trajectory following and usage of PathWeaver. Users may also want to read the :ref:`generic trajectory following documents ` for additional information about the API and non-commandbased usage. +Path Planning is the process of creating and following trajectories. These paths use the WPILib trajectory APIs for generation and a :ref:`Ramsete Controller ` for following. This section highlights the process of characterizing your robot for system identification, trajectory following and usage of PathWeaver. Users may also want to read the :ref:`generic trajectory following documents ` for additional information about the API and non-commandbased usage. Notice on Swerve Support ------------------------ diff --git a/source/docs/software/pathplanning/pathweaver/introduction.rst b/source/docs/software/pathplanning/pathweaver/introduction.rst index b6faa0dd4f..60405776fe 100644 --- a/source/docs/software/pathplanning/pathweaver/introduction.rst +++ b/source/docs/software/pathplanning/pathweaver/introduction.rst @@ -9,4 +9,4 @@ A more advanced approach to autonomous is called "path planning". Instead of dri WPILib contains a trajectory generation suite that can be used by teams to generate and follow trajectories. This series of articles will go over how to generate and visualize trajectories using PathWeaver. For a comprehensive tutorial on following trajectories, please visit the :ref:`end-to-end trajectory tutorial `. -.. note:: :ref:`Trajectory following ` code is required to use PathWeaver. We recommend that you start with Trajectory following and get that working with simple paths. From there you can continue on to testing more complicated paths generated by PathWeaver. +.. note:: :ref:`Trajectory following ` code is required to use PathWeaver. We recommend that you start with Trajectory following and get that working with simple paths. From there you can continue on to testing more complicated paths generated by PathWeaver. diff --git a/source/docs/software/pathplanning/trajectory-tutorial/characterizing-drive.rst b/source/docs/software/pathplanning/trajectory-tutorial/characterizing-drive.rst index 22a3039559..ea08fa0620 100644 --- a/source/docs/software/pathplanning/trajectory-tutorial/characterizing-drive.rst +++ b/source/docs/software/pathplanning/trajectory-tutorial/characterizing-drive.rst @@ -1,7 +1,7 @@ Step 1: Characterizing Your Robot Drive ======================================= -.. note:: For detailed instructions on using the System Identification tool, see its :ref:`dedicated documentation `. +.. note:: For detailed instructions on using the System Identification tool, see its :ref:`dedicated documentation `. .. note:: The drive identification process requires ample space for the robot to drive. Be sure to have *at least* a 10' stretch (ideally closer to 20') in which the robot can drive during the identification routine. @@ -14,18 +14,18 @@ Gathering the Data We begin by gathering our drive identification data. -1. :ref:`Configure and Deploy your robot project `. -2. :ref:`Run the identification Routine `. +1. :ref:`Configure and Deploy your robot project `. +2. :ref:`Run the identification Routine `. Analyzing the Data ------------------ -Once the identification routine has been run and the data file has been saved, it is time to :ref:`open it in the analysis pane `. +Once the identification routine has been run and the data file has been saved, it is time to :ref:`open it in the analysis pane `. Checking Diagnostics ^^^^^^^^^^^^^^^^^^^^ -Per the :ref:`system identification guide `, we first view the diagnostics to ensure that our data look reasonable: +Per the :ref:`system identification guide `, we first view the diagnostics to ensure that our data look reasonable: .. image:: images/diagnostic-plots.png :alt: SysId diagnostics panel. @@ -55,7 +55,7 @@ Calculate Feedback Gains .. note:: Feedback gains do *not*, in general, transfer across robots. Do *not* use the gains from this tutorial for your own robot. -We now :ref:`calculate the feedback gains ` for the PID control that we will use to follow the path. Trajectory following with WPILib's RAMSETE controller uses velocity closed-loop control, so we first select ``Velocity`` mode in the identification tool: +We now :ref:`calculate the feedback gains ` for the PID control that we will use to follow the path. Trajectory following with WPILib's RAMSETE controller uses velocity closed-loop control, so we first select ``Velocity`` mode in the identification tool: .. image:: images/velocity-mode.png :alt: How to specify velocity mode in the "Loop Type" dropdown. diff --git a/source/docs/software/pathplanning/trajectory-tutorial/creating-following-trajectory.rst b/source/docs/software/pathplanning/trajectory-tutorial/creating-following-trajectory.rst index ab16763efe..be3fb9968f 100644 --- a/source/docs/software/pathplanning/trajectory-tutorial/creating-following-trajectory.rst +++ b/source/docs/software/pathplanning/trajectory-tutorial/creating-following-trajectory.rst @@ -143,7 +143,7 @@ We will first reset our robot's pose to the starting pose of the trajectory. Thi :lineno-start: 84 -It is very important that the initial robot pose match the first pose in the trajectory. For the purposes of our example, the robot will be reliably starting at a position of ``(0,0)`` with a heading of ``0``. In actual use, however, it is probably not desirable to base your coordinate system on the robot position, and so the starting position for both the robot and the trajectory should be set to some other value. If you wish to use a trajectory that has been defined in robot-centric coordinates in such a situation, you can transform it to be relative to the robot's current pose using the ``transformBy`` method (`Java `_, `C++ `_). For more information about transforming trajectories, see :ref:`docs/software/advanced-controls/trajectories/transforming-trajectories:Transforming Trajectories`. +It is very important that the initial robot pose match the first pose in the trajectory. For the purposes of our example, the robot will be reliably starting at a position of ``(0,0)`` with a heading of ``0``. In actual use, however, it is probably not desirable to base your coordinate system on the robot position, and so the starting position for both the robot and the trajectory should be set to some other value. If you wish to use a trajectory that has been defined in robot-centric coordinates in such a situation, you can transform it to be relative to the robot's current pose using the ``transformBy`` method (`Java `_, `C++ `_). For more information about transforming trajectories, see :ref:`docs/software/controls/trajectories/transforming-trajectories:Transforming Trajectories`. Now that we have a trajectory, we can create a command that, when executed, will follow that trajectory. To do this, we use the ``RamseteCommand`` class (`Java `__, `C++ `__) diff --git a/source/docs/software/pathplanning/trajectory-tutorial/entering-constants.rst b/source/docs/software/pathplanning/trajectory-tutorial/entering-constants.rst index c108155100..8d1fdff39c 100644 --- a/source/docs/software/pathplanning/trajectory-tutorial/entering-constants.rst +++ b/source/docs/software/pathplanning/trajectory-tutorial/entering-constants.rst @@ -71,7 +71,7 @@ We must also decide on a nominal max acceleration and max velocity for the robot Ramsete Parameters ------------------ -Finally, we must include a pair of parameters for the RAMSETE controller. The values shown below should work well for most robots, provided distances have been correctly measured in meters - for more information on tuning these values (if it is required), see :ref:`docs/software/advanced-controls/trajectories/ramsete:Constructing the Ramsete Controller Object`. +Finally, we must include a pair of parameters for the RAMSETE controller. The values shown below should work well for most robots, provided distances have been correctly measured in meters - for more information on tuning these values (if it is required), see :ref:`docs/software/controls/trajectories/ramsete:Constructing the Ramsete Controller Object`. .. tab-set-code:: diff --git a/source/docs/software/pathplanning/trajectory-tutorial/trajectory-tutorial-overview.rst b/source/docs/software/pathplanning/trajectory-tutorial/trajectory-tutorial-overview.rst index 7ba2ecfb6f..1e3bb68e66 100644 --- a/source/docs/software/pathplanning/trajectory-tutorial/trajectory-tutorial-overview.rst +++ b/source/docs/software/pathplanning/trajectory-tutorial/trajectory-tutorial-overview.rst @@ -5,7 +5,7 @@ Trajectory Tutorial Overview .. todo:: add pathweaver stuff once it is available -.. note:: Before following this tutorial, it is helpful (but not strictly necessary) to have a baseline familiarity with WPILib's :ref:`PID control `, :ref:`feedforward `, and :ref:`trajectory ` features. +.. note:: Before following this tutorial, it is helpful (but not strictly necessary) to have a baseline familiarity with WPILib's :ref:`PID control `, :ref:`feedforward `, and :ref:`trajectory ` features. .. note:: The robot code in this tutorial uses the :ref:`command-based ` framework. The command-based framework is strongly recommended for beginning and intermediate teams. @@ -43,4 +43,4 @@ To follow this tutorial, you will need ready access to the following materials: * :ref:`FRC Driver Station `. * :ref:`WPILib `. - * :ref:`The System Identification Toolsuite `. + * :ref:`The System Identification Toolsuite `. diff --git a/source/docs/software/telemetry/robot-telemetry-with-sendable.rst b/source/docs/software/telemetry/robot-telemetry-with-sendable.rst index 6d4921618c..3669557733 100644 --- a/source/docs/software/telemetry/robot-telemetry-with-sendable.rst +++ b/source/docs/software/telemetry/robot-telemetry-with-sendable.rst @@ -21,7 +21,7 @@ Sending a Sendable to the Dashboard .. note:: Unlike simple data types, Sendables are automatically kept up-to-date on the dashboard by WPILib, without any further user code - "set it and forget it". Accordingly, they should usually be sent to the dashboard in an initialization block or constructor, *not* in a periodic function. -To send a ``Sendable`` object to the dashboard, simply use the dashboard's ``putData`` method. For example, an "arm" class that uses a :ref:`PID Controller ` can automatically log telemetry from the controller by calling the following in its constructor: +To send a ``Sendable`` object to the dashboard, simply use the dashboard's ``putData`` method. For example, an "arm" class that uses a :ref:`PID Controller ` can automatically log telemetry from the controller by calling the following in its constructor: .. tab-set-code:: diff --git a/source/docs/software/wpilib-tools/robot-simulation/drivesim-tutorial/drivetrain-model.rst b/source/docs/software/wpilib-tools/robot-simulation/drivesim-tutorial/drivetrain-model.rst index 8a1c0241a9..4772dc9ca0 100644 --- a/source/docs/software/wpilib-tools/robot-simulation/drivesim-tutorial/drivetrain-model.rst +++ b/source/docs/software/wpilib-tools/robot-simulation/drivesim-tutorial/drivetrain-model.rst @@ -66,7 +66,7 @@ You can calculate the measurement noise of your sensors by taking multiple data Creating a ``DifferentialDrivetrainSim`` from SysId Gains -------------------------------------------------------------------- -You can also use the gains produced by :ref:`System Identification `, which you may have performed as part of setting up the trajectory tracking workflow outlined :ref:`here ` to create a simulation model of your drivetrain and often yield results closer to real-world behavior than the method above. +You can also use the gains produced by :ref:`System Identification `, which you may have performed as part of setting up the trajectory tracking workflow outlined :ref:`here ` to create a simulation model of your drivetrain and often yield results closer to real-world behavior than the method above. .. important:: You must need two sets of ``Kv`` and ``Ka`` gains from the identification tool -- one from straight-line motion and the other from rotating in place. We will refer to these two sets of gains as linear and angular gains respectively. diff --git a/source/docs/software/wpilib-tools/robot-simulation/physics-sim.rst b/source/docs/software/wpilib-tools/robot-simulation/physics-sim.rst index 66b4dbc58d..3fd3fd2ca1 100644 --- a/source/docs/software/wpilib-tools/robot-simulation/physics-sim.rst +++ b/source/docs/software/wpilib-tools/robot-simulation/physics-sim.rst @@ -1,7 +1,7 @@ Physics Simulation with WPILib ============================== -Because :ref:`state-space notation ` allows us to compactly represent the :term:`dynamics ` of :term:`systems `, we can leverage it to provide a backend for simulating physical systems on robots. The goal of these simulators is to simulate the motion of robot mechanisms without modifying existing non-simulation user code. The basic flow of such simulators is as follows: +Because :ref:`state-space notation ` allows us to compactly represent the :term:`dynamics ` of :term:`systems `, we can leverage it to provide a backend for simulating physical systems on robots. The goal of these simulators is to simulate the motion of robot mechanisms without modifying existing non-simulation user code. The basic flow of such simulators is as follows: - In normal user code: diff --git a/source/docs/software/wpilib-tools/robotbuilder/advanced/robotbuilder-setpoint-command.rst b/source/docs/software/wpilib-tools/robotbuilder/advanced/robotbuilder-setpoint-command.rst index 51025ee8de..67b0725182 100644 --- a/source/docs/software/wpilib-tools/robotbuilder/advanced/robotbuilder-setpoint-command.rst +++ b/source/docs/software/wpilib-tools/robotbuilder/advanced/robotbuilder-setpoint-command.rst @@ -30,7 +30,7 @@ Fill in the name of the new command. The Requires field is the PIDSubsystem that 1. Click on the Parameter Presets to set up the setpoints. 2. Select :guilabel:`Add Preset` -3. Enter a preset name (in this case 'bottom' +3. Enter a preset name (in this case 'bottom') 4. Click the dropdown next to the setpoint entry box 5. Select the Elevator.Bottom constant, that was created in the Elevator subsystem previously 6. Repeat steps 2-5 for the other setpoints. @@ -40,4 +40,4 @@ There is no need to fill in any code for this command, it is automatically creat Whenever this command is scheduled, it will automatically drive the subsystem to the specified setpoint. When the setpoint is reached within the tolerance specified in the PIDSubsystem, the command ends and the next command starts. It is important to specify a tolerance in the PIDSubsystem or this command might never end because the tolerance is not achieved. -.. note:: For more information about PID Control, please see the :ref:`Advanced Controls Introduction `. +.. note:: For more information about PID Control, please see the :ref:`Controls Introduction `. diff --git a/source/index.rst b/source/index.rst index 030c2d7168..ea4377690b 100644 --- a/source/index.rst +++ b/source/index.rst @@ -396,7 +396,7 @@ Community translations can be found in a variety of languages in the bottom-left docs/software/pathplanning/index docs/software/roborio-info/index docs/software/advanced-gradlerio/index - docs/software/advanced-controls/index + docs/software/controls/index docs/software/convenience-features/index .. toctree:: diff --git a/source/redirects.txt b/source/redirects.txt index bffb4d9f05..d7089281e2 100644 --- a/source/redirects.txt +++ b/source/redirects.txt @@ -291,3 +291,56 @@ "docs/software/pathplanning/system-identification/index.rst" "docs/software/advanced-controls/system-identification/index.rst" "docs/software/pathplanning/system-identification/configuring-project.rst" "docs/software/advanced-controls/system-identification/creating-routine.rst" "docs/software/pathplanning/system-identification/identification-routine.rst" "docs/software/advanced-controls/system-identification/running-routine.rst" +"docs/software/advanced-controls/controllers/bang-bang.rst" "docs/software/controls/controllers/bang-bang.rst" +"docs/software/advanced-controls/controllers/combining-feedforward-feedback.rst" "docs/software/controls/controllers/combining-feedforward-feedback.rst" +"docs/software/advanced-controls/controllers/feedforward.rst" "docs/software/controls/controllers/feedforward.rst" +"docs/software/advanced-controls/controllers/index.rst" "docs/software/controls/controllers/index.rst" +"docs/software/advanced-controls/controllers/pidcontroller.rst" "docs/software/controls/controllers/pidcontroller.rst" +"docs/software/advanced-controls/controllers/profiled-pidcontroller.rst" "docs/software/controls/controllers/profiled-pidcontroller.rst" +"docs/software/advanced-controls/controllers/trapezoidal-profiles.rst" "docs/software/controls/controllers/trapezoidal-profiles.rst" +"docs/software/advanced-controls/controls-glossary.rst" "docs/software/controls/controls-glossary.rst" +"docs/software/advanced-controls/filters/debouncer.rst" "docs/software/controls/filters/debouncer.rst" +"docs/software/advanced-controls/filters/index.rst" "docs/software/controls/filters/index.rst" +"docs/software/advanced-controls/filters/introduction.rst" "docs/software/controls/filters/introduction.rst" +"docs/software/advanced-controls/filters/linear-filter.rst" "docs/software/controls/filters/linear-filter.rst" +"docs/software/advanced-controls/filters/median-filter.rst" "docs/software/controls/filters/median-filter.rst" +"docs/software/advanced-controls/filters/slew-rate-limiter.rst" "docs/software/controls/filters/slew-rate-limiter.rst" +"docs/software/advanced-controls/geometry/coordinate-systems.rst" "docs/software/controls/geometry/coordinate-systems.rst" +"docs/software/advanced-controls/geometry/index.rst" "docs/software/controls/geometry/index.rst" +"docs/software/advanced-controls/geometry/pose.rst" "docs/software/controls/geometry/pose.rst" +"docs/software/advanced-controls/geometry/transformations.rst" "docs/software/controls/geometry/transformations.rst" +"docs/software/advanced-controls/index.rst" "docs/software/controls/index.rst" +"docs/software/advanced-controls/introduction/common-control-issues.rst" "docs/software/controls/introduction/common-control-issues.rst" +"docs/software/advanced-controls/introduction/control-system-basics.rst" "docs/software/controls/introduction/control-system-basics.rst" +"docs/software/advanced-controls/introduction/index.rst" "docs/software/controls/introduction/index.rst" +"docs/software/advanced-controls/introduction/introduction-to-feedforward.rst" "docs/software/controls/introduction/introduction-to-feedforward.rst" +"docs/software/advanced-controls/introduction/introduction-to-pid.rst" "docs/software/controls/introduction/introduction-to-pid.rst" +"docs/software/advanced-controls/introduction/picking-control-strategy.rst" "docs/software/controls/introduction/picking-control-strategy.rst" +"docs/software/advanced-controls/introduction/pid-video.rst" "docs/software/controls/introduction/pid-video.rst" +"docs/software/advanced-controls/introduction/tuning-flywheel.rst" "docs/software/controls/introduction/tuning-flywheel.rst" +"docs/software/advanced-controls/introduction/tuning-turret.rst" "docs/software/controls/introduction/tuning-turret.rst" +"docs/software/advanced-controls/introduction/tuning-vertical-arm.rst" "docs/software/controls/introduction/tuning-vertical-arm.rst" +"docs/software/advanced-controls/introduction/tutorial-intro.rst" "docs/software/controls/introduction/tutorial-intro.rst" +"docs/software/advanced-controls/state-space/index.rst" "docs/software/controls/state-space/index.rst" +"docs/software/advanced-controls/state-space/state-space-debugging.rst" "docs/software/controls/state-space/state-space-debugging.rst" +"docs/software/advanced-controls/state-space/state-space-flywheel-walkthrough.rst" "docs/software/controls/state-space/state-space-flywheel-walkthrough.rst" +"docs/software/advanced-controls/state-space/state-space-intro.rst" "docs/software/controls/state-space/state-space-intro.rst" +"docs/software/advanced-controls/state-space/state-space-observers.rst" "docs/software/controls/state-space/state-space-observers.rst" +"docs/software/advanced-controls/state-space/state-space-pose-estimators.rst" "docs/software/controls/state-space/state-space-pose-estimators.rst" +"docs/software/advanced-controls/system-identification/additional-utils.rst" "docs/software/controls/system-identification/additional-utils.rst" +"docs/software/advanced-controls/system-identification/analyzing-gains.rst" "docs/software/controls/system-identification/analyzing-gains.rst" +"docs/software/advanced-controls/system-identification/creating-routine.rst" "docs/software/controls/system-identification/creating-routine.rst" +"docs/software/advanced-controls/system-identification/index.rst" "docs/software/controls/system-identification/index.rst" +"docs/software/advanced-controls/system-identification/introduction.rst" "docs/software/controls/system-identification/introduction.rst" +"docs/software/advanced-controls/system-identification/loading-data.rst" "docs/software/controls/system-identification/loading-data.rst" +"docs/software/advanced-controls/system-identification/running-routine.rst" "docs/software/controls/system-identification/running-routine.rst" +"docs/software/advanced-controls/system-identification/viewing-diagnostics.rst" "docs/software/controls/system-identification/viewing-diagnostics.rst" +"docs/software/advanced-controls/trajectories/constraints.rst" "docs/software/controls/trajectories/constraints.rst" +"docs/software/advanced-controls/trajectories/holonomic.rst" "docs/software/controls/trajectories/holonomic.rst" +"docs/software/advanced-controls/trajectories/index.rst" "docs/software/controls/trajectories/index.rst" +"docs/software/advanced-controls/trajectories/manipulating-trajectories.rst" "docs/software/controls/trajectories/manipulating-trajectories.rst" +"docs/software/advanced-controls/trajectories/ramsete.rst" "docs/software/controls/trajectories/ramsete.rst" +"docs/software/advanced-controls/trajectories/trajectory-generation.rst" "docs/software/controls/trajectories/trajectory-generation.rst" +"docs/software/advanced-controls/trajectories/transforming-trajectories.rst" "docs/software/controls/trajectories/transforming-trajectories.rst" +"docs/software/advanced-controls/trajectories/troubleshooting.rst" "docs/software/controls/trajectories/troubleshooting.rst" +"docs/software/advanced-controls/video-walkthrough.rst" "docs/software/controls/video-walkthrough.rst" diff --git a/source/stubs/advanced-programming-stub.rst b/source/stubs/advanced-programming-stub.rst index cc45a1bfdd..b859a2625f 100644 --- a/source/stubs/advanced-programming-stub.rst +++ b/source/stubs/advanced-programming-stub.rst @@ -15,5 +15,5 @@ Documentation that is suited toward veteran teams. This includes content such as /docs/software/pathplanning/index /docs/software/roborio-info/index /docs/software/advanced-gradlerio/index - /docs/software/advanced-controls/index + /docs/software/controls/index /docs/software/convenience-features/index