But Seriously we need a name for this! Derivation of Mōvi Pro Pan/Tilt limits and smoothing ## Math Behind the Smoothing Function https://www.desmos.com/calculator/fqh08ohwcq The following relationships are established from 1-D kinematics: $$v^2 = v_o^2+2ax$$ - $v$ is the velocity at the current position - $v_o$ is the initial velocity - $a$ is the acceleration - $x$ is the distance from the starting position Rewriting the function in terms of a scaling factor, where $v_{adj} = v/v_o$, normalized about 1, and given that the acceleration is negative since we are slowing down: $$v_{adj}^2 = 1 - 2ax$$ $$v_{adj} = \sqrt{1 - 2ax}$$ Further generalizing this expression: $$v_{adj} = \sqrt{1 - f(a, x)}$$ Where to stop in the least amount of distance given an acceleration: $$f(a, x) = 2ax$$ If the acceleration is desired be smoother (non-linear), a quadratic function can be used: $$f(a, x) = 2ax - \frac{a^2}{1 - 2as_s}$$ ## High-level overview of how this is implemented in the code: Constants are defined by letters: [$lim_{max}$, $lim_{min}$, $c_{st}$, $c_{sm}$, $a$] Changing values are defined by symbols: [$θ$, $θ_{max}$, $θ_{min}$, $θ_{stop}$, $θ_{smooth}$, $\dot{θ}$, $\dot{θ}_{adj}$, $\dot{θ}_{in}$] **User & gimbal-provided provided values and their respective allowable ranges:** $lim_{max} \rightarrow [lim_{min}, \pi]$ is the max limit in rad (converted from °) || `int16_t max_lim` $lim_{min} \rightarrow [-\pi, lim_{max}]$ is the min limit in rad (converted from °) || `int16_t min_lim` $c_{st} \rightarrow [0, 1]$ is the stopping coefficient (computed from %) || `uint8_t stop_percent` $c_{sm} \rightarrow [0, 1]$ is the smoothing coefficient (computed from %) || `uint8_t s_percent` $θ \rightarrow [0, 2\pi]$ is the current position of the gimbal || `float prt_t2[axis]` **Calculated values:** $θ_{max} = lim_{max} - θ$ is the distance from the max limit in rad $θ_{min} = θ - lim_{min}$ is the distance from the min limit in rad $θ_{stop} = (lim_{max} - lim_{min})* c_{st} / 2$ is the distance defined to come to a full stop $θ_{smooth} = (1 - c_{sm})/(1 + c_{sm}) * θ_{stop}$ is the distance to transition to the smoothing function $a = (1 + c_{sm})/2θ_{stop}$ is the acceleration needed to come to a full stop **Conditional calculated values:** If the gimbal is within $θ_{stop}$ from the max limit ($θ_{max} \le θ_{stop}$): $θ_{lim} = θ_{stop} - θ_{max}$ is the distance past the start of the curve in the max limit direction Else if the gimbal is within $θ_{stop}$ from the max limit ($θ_{min} \le θ_{stop}$): $θ_{lim} = θ_{stop} - θ_{min}$ is the distance past the start of the curve in the min limit direction **Adjusted velocity calculations:** Once the either of the above are true, the adjusted angular velocity is computed: $\dot{θ}_{adj} = \sqrt{1 - 2aθ_{lim}}$ Then, once $θ_{lim} > θ_{smooth}$: $\dot{θ}_{adj} = \sqrt{1 - 2aθ_{lim} + a^2(θ_{lim} - θ_{smooth})^2/c_{sm}}$ The commanded gimbal rate then becomes $\dot{θ}$, where $\dot{θ}_{in}$ is the original commanded rate: $\dot{θ} = \dot{θ}_{adj}\dot{θ}_{in}$