From bccfe638f8b229468a411d32b787ca15fc7fc095 Mon Sep 17 00:00:00 2001
From: Nate Laverdure <41549690+nlaverdure@users.noreply.github.com>
Date: Wed, 10 Jan 2024 17:44:54 -0500
Subject: [PATCH] Expanded on guidance for setting robot configs and MOI (#247)
---
docs/document-settings.md | 100 +++++++++----------
docs/estimating-moi.md | 39 ++++++++
docs/index.md | 12 ---
docs/media/NACA-TN-1629-figure3.PNG | Bin 0 -> 96122 bytes
docs/media/REV-2024-starterBot-massProps.PNG | Bin 0 -> 526633 bytes
5 files changed, 89 insertions(+), 62 deletions(-)
create mode 100644 docs/estimating-moi.md
create mode 100644 docs/media/NACA-TN-1629-figure3.PNG
create mode 100644 docs/media/REV-2024-starterBot-massProps.PNG
diff --git a/docs/document-settings.md b/docs/document-settings.md
index c65248d19..058eb3c85 100644
--- a/docs/document-settings.md
+++ b/docs/document-settings.md
@@ -1,91 +1,91 @@
-## Start by downloading Choreo from **[Releases](https://github.com/SleipnirGroup/Choreo/releases)**
+# Robot Configuration
-## Robot Config
+The trajectory optimizer depends upon the following user-specified parameters, which are entered in the Robot Configuration panel. The more accurately you enter these paramters, the more confident you can be that your robot will follow the time-optimized trajectory on the first attempt.
-The trajectory optimizer depends upon the following user-specified parameters, which are entered in the Robot Configuration panel. This helps the optimizer understand the robot's projected path very accurately.
+!!! tip
+
+ While more precision is always better, you'll most likely get diminishing returns after 3-4 significant figures.
Access the robot-config by accessing the drawer via hamburger icon on top left of screen, then clicking "Document Settings"
![Document Settings](./media/document-settings.png)
-### Dimensions
-
-- **Mass** [kg]: The mass of the robot with battery and bumpers
-- **MoI** [kg * m2]: The resistance to change in rotational velocity in response to a torque applied to the robot about the vertical axis
-- **Max Velocity** [m/s]: The maximum tangential speed of the wheel
-
-!!! tip "How to measure Max Velocity"
+!!! tip "Saving Robot Config"
+ Saving a copy of the robotConfig somewhere safe, like the root of a robot project, is highly recommended. This is so you can correlate that robot project to your robot's specifications, and thus your paths.
- A reasonable choice of Max Velocity is that corresponding to ~80% of free speed experienced at the drive motor(s).
+!!! tip "Undo + Redo"
+ Undo and Redo shortcuts work for all of these values.
-- **Max Torque** [N * m]: The maximum torque applied at the wheel
+## Dimensions
-!!! tip "How to measure Max Torque"
+In this panel, enter some basic properties of your robot chassis.
- A reasonable choice of Max Torque is that corresponding to a current draw of approximately `1.5 * BreakerValue` experienced at the drive motor(s).
+- **Mass** $[kg]$: The mass of the robot with battery and bumpers
+- **MoI** $[kg * m^2]$: The robot's moment of inertia, a measure of resistance to change in rotational velocity in response to a torque applied about the vertical axis
+- **Bumper Width** and **Bumper Length** $[m]$: The overall size of the robot's bumper.
+- **Wheelbase and Trackwidth** $[m]$: The largest distances between the robot's wheel centers
-- **Wheelbase and Trackwidth** [m]: The largest distances between the robot's wheel centers
-- **Length and Width** [m]: The overall size of the robot's _bumper_.
+## Drive Motor
-!!! tip "Saving Robot Config"
- Saving a copy of the robotConfig somewhere safe, like the root of a robot project, is highly recommended. This is so you can correlate that robot project to your robot's specifications, and thus your paths.
+This panel asks for details about the drive motors used to propel the robot around the playing field.
-!!! tip "Undo + Redo"
- Undo and Redo shortcuts work for all of these values.
+### Geometric properties
-### Measuring Moment of Inertia (MoI)
+- Wheel Radius $[m]$: The radius of the drive wheel
+- Gearing (unitless): The ratio of $(\text{Drive motor rotations} / \text{Wheel rotations})$
-The robot's rotational inertia has a significant impact on how quickly it can follow complex paths. For the best results, it is recommended to get as accurate an estimate of this parameter as possible. This can be accomplished via:
+### Motor performance properties
-- Faithful CAD loaded with mass properties
-- Physical experimentation
-- Other System Identification methods
+These values can be pre-filled using the [Motor Calculator](#motor-calculator) panel:
-If none of these techniques are possible, a reasonable estimate of MoI would be mass _ length _ width / 6 based on the assumption of a rectangle of uniformly-distributed mass.
+- **Motor Max Speed** $[\text{RPM}]$: The maximum speed of each drive motor
-!!! tip
+!!! tip "Choosing a Motor Max Speed"
- Of course, more precision is always better. But after ~3 decimals, you will most likely get diminishing returns.
+ A reasonable choice of Motor Max Speed is ~80% of the free speed of the drive motor(s). Although your motors have more speed available, this headroom helps ensure that your robot is able to close any errors and return to the planned trajectory. Use the [Motor Calculator](#motor-calculator) to help select an appropriate value.
-### Drive Motor
+- **Motor Max Torque** $[N * m]$: The maximum torque applied by each drive motor
-For presets to these values, jump to [Motor Calculator](#motor-calculator)
+!!! tip "Choosing a Max Torque"
+ A reasonable choice of Max Torque is that corresponding to a current draw of approximately `1.5 * BreakerValue` experienced at the drive motor(s). Although your motors have more torque available, this headroom helps ensure that your robot is able to close any errors and return to the planned trajectory. Use the [Motor Calculator](#motor-calculator) to help select an appropriate value.
-### Theoretical
+## Theoretical
-Calculated robot metrics for reference and validation.
+This panel displays calculated metrics about your robot, for reference and validation.
![robot-config-theoretical.png](./media/robot-config-theoretical.png)
-- **Floor Speed** [m/s]: Linear Maximum speed when not rotating
-- **Floor Accel** [m/s2]: Linear Maximum acceleration when not rotating
-- **Ang Speed** [rad/s]: Maximum angular speed when spinning in place
-- **Ang Accel** [rad/s2]: Maximum angular acceleration when spinning in place
+- **Floor Speed** $[m/s]$: The maximum speed reached by the robot when driving in a straight line and not rotating
+- **Floor Accel** $[m/s^2]$: The maximum acceleration reached by the robot when driving in a straight line and not rotating
+- **Ang Speed** $[rad/s]$: The robot's maximum angular speed when spinning in place
+- **Ang Accel** $[rad/s^2]$: The robot's maximum angular acceleration when spinning in place
+
+## Motor Calculator
-### Motor Calculator
+This panel helps you select appropriate drive motor parameters, using motor performance data from [reca.lc/motors](https://reca.lc/motors).
![robot-config-motor-calculator](./media/robot-config-motor-calculator.png)
-Choose from the following motor presets and a current limit in Amps.
+Choose a motor, then enter a current limit in Amps. The calculator displays the following preview values:
+
+- **Preview Max Speed** $[\text{RPM}]$: Estimated speed under load (~80% of free speed)
+- **Preview Max Torque** $[N * m]$: Motor torque at the given current limit
+
+Pressing APPLY will apply these preview values to the [Drive Motor](#drive-motor) panel above.
+
+!!! warning
-In addition to modifying the above [Drive Motor](#drive-motor) values, it shows:
+ Make sure to press the APPLY button, or else your values will not save. Don't worry, you can always hit undo at any time to revert.
-- **Preview Max Speed** [RPM]: Estimated speed under load (~80% of free speed)
-- **Preview Max Torque** [N • m]: Motor torque at the given current limit
+### Supported motors
-Motors Supported:
+The following motors are supported by the calculator:
- Falcon 500
-- Falcon with FOC
+- Falcon 500 with FOC
- NEO
- NEO Vortex
- Kraken X60
-- Kraken with FOC
+- Kraken X60 with FOC
- CIM
-
-!!! warning
-
- Make sure to press the APPLY button, or else your values will not save. Don't worry, you can always hit undo at any time to revert.
-
-Free Speed and Torque are from [reca.lc/motors](https://reca.lc/motors)
\ No newline at end of file
diff --git a/docs/estimating-moi.md b/docs/estimating-moi.md
new file mode 100644
index 000000000..305b13bfc
--- /dev/null
+++ b/docs/estimating-moi.md
@@ -0,0 +1,39 @@
+# Estimating and measuring Moment of Inertia (MoI)
+
+The robot's rotational inertia has a significant impact on how quickly it can follow complex, twisty paths. For the best results, it is recommended to get as accurate an estimate of this parameter as possible.
+
+In this section, we present various approaches to determine a resonably accurate estimate of this key property.
+
+## Faithful CAD loaded with mass properties
+
+Most popular CAD tools can calculate the mass properties of solid modeled objects. However, a disciplined approach to CAD work is required for these values to be accurate.
+
+![REV-2024-starterBot-massProps](./media/REV-2024-starterBot-massProps.png)
+Pictured: [2024 REV ION FRC Starter Bot](https://www.revrobotics.com/ion/frc-starter-bot-24/)
+
+## Physical experimentation
+
+The MoI of irregular objects can be determined experimentally using a compound-pendulum method as described in [The Experimental Determination of the Moments of Inertia of Airplanes by a Simplified Compound-Pendulum Method](https://ntrs.nasa.gov/citations/19930082299), NACA Technical Note No. 1629.
+
+![NACA-TN-1629-figure3](./media/NACA-TN-1629-figure3.png)
+
+## System Identification methods
+
+If thorough System Identification has been performed, the system's MoI can be calculated from:
+
+$$ I = \text{mass} * \dfrac{trackwidth}{2} * \dfrac{kA_\text{angular}}{kA_\text{linear}} $$
+
+where $kA_\text{angular}$ is the angular acceleration feedforward constant of the drivetrain and $kA_\text{linear}$ is the linear acceleration feedforward constant.
+
+## Assuming a simplified mass distribution
+
+If the robot is considered a solid rectangular plate of uniformly-distributed mass, its MoI would be:
+
+$$ I = \dfrac{1}{12} * \text{mass} * (\text{length}^2 + \text{width}^2) $$
+
+However, this would likely be an underestimate because most FRC robots tend to have mass concentrations (e.g. swerve modules) located along the frame perimeter, and are otherwise relatively hollow.
+
+A better estimate could by found by summing each subsystem's contributions to the robot's overall MoI, based on its mass and average distance from the axis of rotation:
+
+$$ I = \sum_{i=1}^n \text{mass}\_\text{subsystem i} * \text{radius}\_\text{subsystem i}^2 $$
+
diff --git a/docs/index.md b/docs/index.md
index 36a0d0da1..59e9b1841 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,15 +1,3 @@
----
-hide:
- - toc
- - navigation
----
-
-!!! tip inline end
-
- See the navigation links in the header or side-bar.
-
- Click :octicons-three-bars-16: (top left) on mobile.
-
# Welcome
Welcome to the [Choreo](https://github.com/SleipnirGroup/Choreo) documentation.
diff --git a/docs/media/NACA-TN-1629-figure3.PNG b/docs/media/NACA-TN-1629-figure3.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..cbda98ef59f94e4cd07fd8fa39fee8686fdf7bd6
GIT binary patch
literal 96122
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