# Bang-bang acceleration control of angular position

Version 1.0.0 (3.46 KB) by
Compares a bang-bang 1 dimensional controller with a controller based on the SmootherStep function.
Updated 26 Apr 2023

function angs = bangBangAngles(ang0, angGoal, accMax, dt)
Computes angular positions for a bang-bang acceleration control that moves the robot from zero velocity at ang0 (rad) to zero velocity at angGoal (rad) as fast as possible with maximum acccleration accMax (rad/s). The output is a vector of positions every dt seconds. This is suitable to compute set of angular position commands for a robot joint. Bang-bang controller uses max acceleration until the halfway position, then does -1*max acceleration until the goal is reached.
inputs:
• dt: time resolution of angular positions to return (s)
outputs:
• angs: a set of angular positions, every dt s for the object as it moves from ang0 to angGoal
The control picks the fastest (clockwise or counterclockwise) to go from the angle atan2( sin(ang0), cos(ang0) ) to atan2( sin(angGoal), cos(angGoal) ).
The control input is a bang-bang controller with acceleration
sign(angDelta)*accMax for tHalf seconds and
-sign(angDelta)*accMax for tHalf seconds.
The velocity of the robot is then
sign(angDelta)*accMax*t for t from 0 to tHalf and
sign(angDelta)*accMax*tHalf - sign(angDelta)*accMax*(t-tHalf) until 2*tHalf.
The position of the robot is then
ang0 + sign(angDelta)*1/2*accMax*t^2 for t from 0 to tHalf and
ang0 + sign(angDelta)*(1/2*accMax*tHalf^2 + accMax*tHalf*(t-tHalf)
- 1/2*accMax*(t-tHalf)^2) until 2*tHalf.
At tHalf the position of the robot is halfway to the goal, so we can solve for tHalf:
sign(angDelta)*1/2*accMax*tHalf^2 = angDelta/2
sign(angDelta)*accMax*tHalf^2 = angDelta
tHalf^2 = abs(angDelta/accMax)
tHalf = sqrt(abs(angDelta/accMax))
Aaron Becker, April 26, 2023.
function angs = smootherStepAngles(ang0, angGoal, T, dt)
computes angular positions for a smooth control input that moves the robot from ang0 to angGoal in total time T. The output is a vector of positions every dt seconds. This is suitable to compute set of angular position commands for a robot joint. Code is explained at https://en.wikipedia.org/wiki/Smoothstep, Ken Perlin suggested [Texturing and Modeling, Third Edition: A Procedural Approach] an improved version of the commonly used first-order smoothstep function, equivalent to the second order of its general form. It has zero 1st- and 2nd-order derivatives at x = 0 and x = 1.
inputs:
• T: time to reach goal (s)
• dt: time resolution of angular positions to return (s)
outputs:
• angs: a set of angular positions, every dt s for the object as it moves from ang0 to angGoal
function testbangBangAngles
compares the two functions bangBangAngles() and smootherStepAngles()

### Cite As

Aaron T. Becker's Robot Swarm Lab (2024). Bang-bang acceleration control of angular position (https://www.mathworks.com/matlabcentral/fileexchange/128539-bang-bang-acceleration-control-of-angular-position), MATLAB Central File Exchange. Retrieved .

##### MATLAB Release Compatibility
Created with R2023a
Compatible with any release
##### Platform Compatibility
Windows macOS Linux