# OLS derivations ## Simple/drivetrain Here's the ODE for a drivetrain. ``` dx/dt = -Kv/Ka x + 1/Ka u - Ks/Ka sgn(x) ``` ### OLS setup Let `α = -Kv/Ka`, `β = 1/Ka`, and `γ = -Ks/Ka`. ``` dx/dt = αx + βu + γ sgn(x) ``` ### Feedforward gains Divide the OLS terms by each other to obtain `Ks`, `Kv`, and `Ka`. ``` Ks = -γ/β Kv = -α/β Ka = 1/β ``` ## Elevator Here's the ODE for an elevator. ``` dx/dt = -Kv/Ka x + 1/Ka u - Ks/Ka sgn(x) - Kg/Ka ``` ### OLS setup Let `α = -Kv/Ka`, `β = 1/Ka`, `γ = -Ks/Ka`, and `δ = -Kg/Ka`. ``` dx/dt = αx + βu + γ sgn(x) + δ ``` ### Feedforward gains Divide the OLS terms by each other to obtain `Ks`, `Kv`, `Ka`, and `Kg`. ``` Ks = -γ/β Kv = -α/β Ka = 1/β Kg = −δ/β ``` ## Arm Here's the ODE for an arm: ``` dx/dt = -Kv/Ka x + 1/Ka u - Ks/Ka sgn(x) - Kg/Ka cos(angle) ``` If the arm encoder doesn't read zero degrees when the arm is horizontal, the fit for `Kg` will be wrong. An angle offset should be added to the model like so. ``` dx/dt = -Kv/Ka x + 1/Ka u - Ks/Ka sgn(x) - Kg/Ka cos(angle + offset) ``` Use a trig identity to split the cosine into two terms. ``` dx/dt = -Kv/Ka x + 1/Ka u - Ks/Ka sgn(x) - Kg/Ka (cos(angle) cos(offset) - sin(angle) sin(offset)) dx/dt = -Kv/Ka x + 1/Ka u - Ks/Ka sgn(x) - Kg/Ka cos(angle) cos(offset) + Kg/Ka sin(angle) sin(offset) ``` Reorder multiplicands so the offset trig is absorbed by the OLS terms. ``` dx/dt = -Kv/Ka x + 1/Ka u - Ks/Ka sgn(x) - Kg/Ka cos(offset) cos(angle) + Kg/Ka sin(offset) sin(angle) ``` ### OLS setup Let `α = -Kv/Ka`, `β = 1/Ka`, `γ = -Ks/Ka`, `δ = -Kg/Ka cos(offset)`, and `ε = Kg/Ka sin(offset)`. ``` dx/dt = αx + βu + γ sgn(x) + δ cos(angle) + ε sin(angle) ``` ### Feedforward gains: Ks, Kv, Ka Divide the OLS terms by each other to obtain `Ks`, `Kv`, and `Ka`. ``` Ks = -γ/β Kv = -α/β Ka = 1/β ``` ### Feedforward gains: Kg Take the sum of squares of the OLS terms containing the angle offset. The angle offset trig functions will form a trig identity that cancels out. Then, just solve for `Kg`. ``` δ²+ε² = (-Kg/Ka cos(offset))² + (Kg/Ka sin(offset))² δ²+ε² = (-Kg/Ka)² cos²(offset) + (Kg/Ka)² sin²(offset) δ²+ε² = (Kg/Ka)² cos²(offset) + (Kg/Ka)² sin²(offset) δ²+ε² = (Kg/Ka)² (cos²(offset) + sin²(offset)) δ²+ε² = (Kg/Ka)² (1) δ²+ε² = (Kg/Ka)² √(δ²+ε²) = Kg/Ka hypot(δ, ε) = Kg/Ka hypot(δ, ε) = Kg β Kg = hypot(δ, ε)/β ``` ### Feedforward gains: offset Divide ε by δ, combine the trig functions into `tan(offset)`, then use `atan2()` to preserve the angle quadrant. Maintaining the proper negative signs in the numerator and denominator are important for obtaining the correct result. ``` δ = -Kg/Ka cos(offset) ε = Kg/Ka sin(offset) sin(offset)/-cos(offset) = ε/δ sin(offset)/cos(offset) = ε/-δ tan(offset) = ε/-δ offset = atan2(ε, -δ) ```