Reads from the joystick analogue axes and allows you to drive the robot around. Buttons can switch between relative
control (where the robot drives forwards when you push the left stick forwards, whatever direction its facing) and
absolute (where the robot will drive in a specific direction, typically the direction it was facing when this mode was
selected, irrespective of its current orientation). The display is used to show the current estimate of position and
bearing from the dead reckoning algorithm.

Class enabling manual control of the robot from the joystick. Uses dead-reckoning for bearing lock, we don’t
use the IMU at all in this version of the class, it was proving problematic in real-world conditions and the
dead-reckoning logic is surprisingly accurate and stable.

Initialised with a sequence of triangula.navigation.TaskWaypoint instances, this task will drive to each
waypoint in sequence, optionally coming to a complete stop at the waypoint before running a sub-task until that task
returns an triangula.task.ExitTask at which point it proceeds to the next waypoint. The route can optionally
loop to run continuously.

loop – Whether to patrol continuously, defaults to False in which case this task will return an ExitTask when it
has completed all its waypoints. If True the task will not exit, and will repeatedly run through its list
of TaskWaypoint targets until otherwise interrupted.

linear_offset – Maximum linear distance away from the target Pose for each waypoint before we consider that we’ve hit it.
Specified in mm, defaults to 20

angular_offset – Maximum angular distance away from the target Pose for each waypoint before we consider that we’ve hit it.
Specified in radians, defaults to 0.1

max_power – A scale applied to motor speeds being sent to the chassis, defaults to 1.0 to move as fast as possible,
lower values might be helpful when testing!