Control Theory
Control Theory
Tyler Veness
Practical Guide to State-space Control
Graduate-level control theory for high schoolers
Tyler Veness
Copyright © 2017 Tyler Veness
https://github.com/calcmogul/state-space-guide
Licensed under the Creative Commons Attribution-ShareAlike 4.0 International License (the “Li-
cense”). You may not use this file except in compliance with the License. You may obtain a copy
of the License at http://creativecommons.org/licenses/by-sa/4.0. Unless required by
applicable law or agreed to in writing, software distributed under the License is distributed on an
“ ” , , either express or implied. See the
License for the specific language governing permissions and limitations under the License.
Generated on December 8, 2018 from commit 7806744. The latest version can be downloaded from
https://file.tavsys.net/control/state-space-guide.pdf.
Tree next to Oakes Circle at UCSC
Contents
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
2 Calculus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1 Derivatives 9
2.1.1 Power rule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.2 Product rule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1.3 Chain rule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2 Integrals 10
2.2.1 Change of variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Tables 11
2.3.1 Common derivatives and integrals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3 Dynamics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1 Linear motion 13
3.2 Angular motion 13
3.3 Curvilinear motion 14
3.3.1 Two-wheeled vehicle kinematics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4 Model examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.1 Pendulum 15
4.1.1 Force derivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.1.2 Torque derivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.1.3 Energy derivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2 DC brushed motor 19
4.2.1 Equations of motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2.2 Calculating constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3 Elevator 21
4.3.1 Equations of motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.4 Flywheel 23
4.4.1 Equations of motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.5 Drivetrain 25
4.5.1 Equations of motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.6 Single-jointed arm 27
4.6.1 Equations of motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.7 Rotating claw 29
4.7.1 Equations of motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6 PID controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.1 The definition 35
6.1.1 Proportional gain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.1.2 Integral gain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
6.1.3 Derivative gain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
6.2 Response types 36
6.3 Types of PID controllers 37
6.4 General control theory perspective 38
6.5 Manual tuning 39
6.6 Limitations 39
8 Linear algebra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
8.1 Vectors 59
8.1.1 What is a vector? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
8.1.2 Geometric interpretation of vectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
8.1.3 Vector addition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
8.1.4 Scalar-vector multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
8.2 Linear combinations, span, and basis vectors 62
8.2.1 Basis vectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
8.2.2 Linear combination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
8.2.3 Span . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.2.4 Linear dependence and independence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
8.3 Linear transformations and matrices 65
8.3.1 What is a linear transformation? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.3.2 Describing transformations numerically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.3.3 Examples of linear transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.4 Matrix multiplication as composition 69
8.4.1 General matrix multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
8.4.2 Matrix multiplication associativity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
8.5 The determinant 71
8.5.1 Scaling areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
8.5.2 Exploring the determinant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
8.5.3 The determinant in 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.5.4 Computing the determinant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
8.6 Inverse matrices, column space, and null space 74
8.6.1 Linear systems of equations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
8.6.2 Inverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
8.6.3 Rank and column space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
8.6.4 Null space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
8.6.5 Closing remarks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
8.7 Nonsquare matrices as transformations between dimensions 78
8.8 Eigenvectors and eigenvalues 79
8.8.1 What is an eigenvector? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
8.8.2 Eigenvectors in 3D rotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
8.8.3 Finding eigenvalues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
8.8.4 Transformations with no eigenvectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
8.8.5 Repeated eigenvalues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
8.8.6 Transformations with larger eigenvector spans . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
8.9 Miscellaneous notation 84
9 State-space controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
9.1 From PID control to model-based control 85
9.2 What is a dynamical system? 86
9.3 State-space notation 86
9.3.1 What is state-space? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
9.3.2 Benefits over classical control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
9.3.3 The equations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
9.4 Controllability 87
9.5 Observability 88
9.6 Closed-loop controller 89
9.7 Pole placement 90
9.8 LQR 90
9.8.1 Bryson’s rule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
9.9 Case studies of controller design methods 92
9.10 Model augmentation 93
9.10.1 Plant augmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
9.10.2 Controller augmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
9.10.3 Observer augmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
9.10.4 Output augmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
9.10.5 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
9.11 Feedforwards 95
9.11.1 Steady-state feedforward . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
9.11.2 Two-state feedforward . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
9.11.3 Case studies of feedforwards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.11.4 Feedforwards for unmodeled dynamics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.12 Integral control 101
9.12.1 Plant augmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.12.2 U error estimation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
V Motion planning
VI Appendices
D Derivations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
D.1 Transfer function in feedback 191
D.2 Optimal control law 192
D.3 Zero-order hold for state-space 193
D.4 Kalman filter as Luenberger observer 195
D.4.1 Luenberger observer with separate prediction and update . . . . . . . . . . . . . . . . . . . 196
D.5 Trapezoidal motion profile 196
D.6 S-curve motion profile 196
Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Online 199
Miscellaneous 200
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Flower bush near Spencer’s Market in Santa Maria, CA
Preface
Motivation
I am the software mentor for a FIRST Robotics Competition (FRC) team. My responsibilities for
that include teaching programming, software engineering practices, and applications of control theory.
The curriculum I developed as of the spring of 2017 (located at https://csweb.frc3512.com/
ci/) taught rookies enough to be minimally competitive, but it provided no formal avenues of growth
for veteran students.
Also, out of a six week build season, the software team usually only got a few days with the completed
robot due to poor build schedule management. This led to two problems. First, two days is only
enough time to verify basic software functionality, not test and tune feedback controllers. Second,
this was also the first time the robot’s electromechanical systems have been tested after integration, so
any issues that arose consumed valuable software integration time while the team traced the problem
to a mechanical, electrical, or software cause.
This book expands my curriculum to cover control theory topics I have learned in my graduate-level
engineering classes at University of California, Santa Cruz. It introduces state-space controllers and
serves as a practical guide for formulating and implementing them. Since state-space control utilizes a
system model, both problems mentioned earlier can be addressed. Basic software functionality can be
tested against it and feedback controllers can be tuned automatically based on system constraints. This
allows software teams to test their work much earlier in the build season in a controlled environment
as well as save time during feedback controller design, implementation, and testing.
I originally started writing this book because I felt that the topic wasn’t difficult, but the information for
it wasn’t easily accessible. When I was a high school robotics team member, I had to learn everything
from scratch through various internet sources and eventually from college courses as part of my
bachelor’s degree. Control theory has a certain beauty to it, and I want more people to appreciate
it the way I do. Therefore, my goal is to make the learning process quicker and easier for the team
members who come after me by collating all the relevant information.
xii
Intended audience
This guide is intended to make an advanced engineering topic approachable so it can be applied by
those who aren’t experts in control theory. My intended audience is high school students who are
members of a FIRST Robotics Competition team. As such, they will likely have passing knowledge
of PID control and have basic proficiency in programming. This guide will expand their incomplete
understanding of control theory to include the fundamentals of classical control theory, enough linear
algebra to understand the notation and mechanics of modern control, and finally how to apply modern
control to design challenges they regularly see in their FRC robots from year to year.
Acknowledgements
I would like to thank my controls engineering instructors Dejan Milutinović and Gabriel Elkaim of
University of California, Santa Cruz. They taught their classes from a pragmatic perspective focused
on application and intuition that I appreciated. I would also like to thank Dejan Milutinović for
introducing me to the field of control theory and both of my instructors for teaching me what it
means to be a controls engineer.
Thanks to Austin Schuh from FRC team 971 for providing the final continuous state-space models
used in the examples section.
Trees by Baskin Engineering building at UCSC
0.1 Prerequisites
Knowledge of basic algebra and complex numbers is assumed. Some introductory physics and cal-
culus will be taught as necessary.
presents an example of a nonlinear controller for a unicycle-like vehicle as well as how to apply it to
a two-wheeled vehicle. Since nonlinear control isn’t the focus of this book, we mention other books
and resources for further reading.
Part IV, “Estimation and localization,” introduces the field of stochastic control theory. The Luen-
berger observer and the probability theory behind the Kalman filter is taught with several examples
of creative applications of Kalman filter theory.
Part V, “Motion planning,” covers planning how the robot will get from its current state to some
desired state in a manner achievable by its dynamics. Motion profiles are introduced.
The appendices provide further enrichment that isn’t required for a passing understanding of the
material. This includes derivations for many of the results presented and used in the mainmatter of
the book.
The Python scripts used to generate the plots in the case studies double as reference implementa-
tions of the techniques discussed in their respective chapters. They are available in this book’s Git
repository. Its location is listed on the copyright page.
Some parts are mathematically rigorous, but I believe in giving students a solid theoretical foundation
with emphasis on intuition so they can apply it to new problems. To achieve deep understanding of
the topics in this book, math is unavoidable. With that said, I try to provide practical and intuitive
explanations whenever possible.
Classical control theory is interesting in that one can perform stability and robustness analyses and
design reasonable controllers for systems on the back of a napkin. It’s also useful for controlling
systems which don’t have a model. One can generate a Bode plot of a system by feeding in sine
waves of increasing frequency and recording the amplitude of the output oscillations. This data can
be used to create a transfer function or lead and lag compensators can be applied directly based on the
Bode plot. However, computing power is much more plentiful nowadays; we should take advantage
of this in the design phase and use the more modern tools that enables when it makes sense.
This book uses LQR and modern control over, say, loop shaping with Bode and Nyquist plots be-
cause we have accurate dynamical models to leverage, and LQR allows directly expressing what the
author is concerned with optimizing: state excursion relative to control effort. Applying lead and
lag compensators, while effective for robust controller design, doesn’t provide the same expressive
power.
0.4 The mindset of an egoless engineer 3
Control systems are all around us and we interact with them daily. A small list of ones you may have
seen includes heaters and air conditioners with thermostats, cruise control and the anti-lock braking
system (ABS) on automobiles, and fan speed modulation on modern laptops. Control systems monitor
or control the behavior of systems like these and may consist of humans controlling them directly
(manual control), or of only machines (automatic control).
How can we prove closed-loop controllers on an autonomous car, for example, will behave safely
and meet the desired performance specifications in the presence of uncertainty? Control theory is an
application of algebra and geometry used to analyze and predict the behavior of systems, make them
respond how we want them to, and make them robust to disturbances and uncertainty.
Controls engineering is, put simply, the engineering process applied to control theory. As such,
it’s more than just applied math. While control theory has some beautiful math behind it, controls
engineering is an engineering discipline like any other that is filled with trade-offs. The solutions
control theory gives should always be sanity checked and informed by our performance specifications.
We don’t need to be perfect; we just need to be good enough to meet our specifications (see section
0.4 for more on engineering).
1.1 Nomenclature
Most resources for advanced engineering topics assume a level of knowledge well above that which is
necessary. Part of the problem is the use of jargon. While it efficiently communicates ideas to those
within the field, new people who aren’t familiar with it are lost. See the glossary for a list of words
and phrases commonly used in control theory, their origins, and their meaning. Links to the glossary
are provided for certain words throughout the book and will use this color.
The system or collection of actuators being controlled by a control system is called the plant. Con-
trollers which don’t include information measured from the plant’s output are called open-loop con-
trollers. Controllers which incorporate information fed back from the plant’s output are called closed-
loop controllers or feedback controllers.
6 Chapter 1. Introduction to control theory
Table 1.1 describes how the terms input and output apply to plants versus controllers and what letters
are commonly associated with each when working with them. Namely, that the terms input and
output are defined with respect to the plant, not the controller.
Plant Controller
Inputs u(t) r(t), y(t)
Outputs y(t) u(t)
2 Calculus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1 Derivatives
2.2 Integrals
2.3 Tables
3 Dynamics . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1 Linear motion
3.2 Angular motion
3.3 Curvilinear motion
4 Model examples . . . . . . . . . . . . . . . . . . . . 15
4.1 Pendulum
4.2 DC brushed motor
4.3 Elevator
4.4 Flywheel
4.5 Drivetrain
4.6 Single-jointed arm
4.7 Rotating claw
This page intentionally left blank
Hills by northbound freeway between Santa Maria and Ventura
2. Calculus
This book uses derivatives and integrals occasionally to represent small changes in values over small
changes in time and the infintessimal sum of values over time respectively. If you are interested in
more information after reading this chapter, 3Blue1Brown does a fantastic job of introducing them in
his Essence of calculus video series [12]. We recommend watching videos 1 through 3 and 7 through
11 from that playlist for a solid foundation. The Taylor series (presented in video 11) will be used in
chapter 10.
2.1 Derivatives
Derivatives are expressions for the slope of a curve at arbitrary points. Common notations for this
operation on a function like f (x) include
f (x) = xn
10 Chapter 2. Calculus
f ′ (x) = nxn−1
h(x) = f (x)g(x)
h′ (x) = f ′ (x)g(x) + f (x)g ′ (x)
h(x) = f (g(x))
h′ (x) = f ′ (g(x)) · g ′ (x)
For example
2.2 Integrals
The integral is the inverse operation of the derivative and calculates the area under a curve. Here is
an example of one based on table 2.2.
∫
eat dt
1 at
e +C
a
The arbitrary constant C is needed because when you take a derivative, constants are discarded be-
cause vertical offsets don’t affect the slope. When performing the inverse operation, we don’t have
enough information to determine the constant.
However, we can provide bounds for the integration.
∫ t
eat dt
0
( )t
1 at
e + C
a
( ) ( )0
1 at 1 a·0
e +C − e +C
a a
2.3 Tables 11
( ) ( )
1 at 1
e +C − +C
a a
1 at 1
e +C − −C
a a
1 at 1
e −
a a
Let u = ωt.
du = ω dt
1
dt = du
ω
∫
1
cos u du
ω
∫
1
cos u du
ω
1
sin u + C
ω
1
sin ωt + C
ω
2.3 Tables
2.3.1 Common derivatives and integrals
12 Chapter 2. Calculus
∫
f (x) dx f (x) f ′ (x)
ax a 0
1 2
2 ax ax a
1 a+1
a+1 x xa axa−1
1 ax
ae eax aeax
− cos(x) sin(x) cos(x)
sin(x) cos(x) − sin(x)
cos(x) − sin(x) − cos(x)
− sin(x) − cos(x) sin(x)
3. Dynamics
∑
where F is the sum of all forces applied to an object in Newtons, m is the mass of the object in
kg, and a is the net acceleration of the object in sm2 .
1
x(t) = x0 + v0 t + at2
2
where x(t) is an object’s position at time t, x0 is the initial position, v0 is the initial velocity, and a is
the acceleration.
∑
where τ is the sum of all torques applied to an object in Newton-meters, I is the moment of inertia
of the object in kg-m2 (also called the rotational mass), and α is the net angular acceleration of the
object in rad
s2
.
1
θ(t) = θ0 + ω0 t + αt2
2
where θ(t) is an object’s angle at time t, θ0 is the initial angle, ω0 is the initial angular velocity, and
α is the angular acceleration.
14 Chapter 3. Dynamics
where ⃗vB is the velocity vector at point B, ⃗vA is the velocity vector at point A, ωA is the angular
velocity vector at point A, and ⃗rB|A is the distance vector from point A to point B (also described as
the “distance to B relative to A”).
First, we’ll derive vl .
⃗vl = vc ĵ + ω k̂ × −rb î
⃗vl = vc ĵ − ωrb ĵ
⃗vl = (vc − ωrb )ĵ
|⃗vl | = vc − ωrb
vl = vc − ωrb (3.1)
⃗vr = vc ĵ + ω k̂ × rb î
⃗vr = vc ĵ + ωrb ĵ
⃗vr = (vc + ωrb )ĵ
|⃗vr | = vc + ωrb
vr = vc + ωrb (3.2)
Hills by northbound freeway between Santa Maria and Ventura
4. Model examples
A model is a set of differential equations describing how the system behaves over time. There are
two common approaches for developing them.
1. Collecting data on the physical system’s behavior and performing system identification with it.
2. Using physics to derive the system’s model from first principles.
We’ll use the second approach in this book.
The models derived here should cover most types of motion seen on an FRC robot. Furthermore,
they can be easily tweaked to describe many types of mechanisms just by pattern-matching. There’s
only so many ways to hook up a mass to a motor in FRC. The flywheel model can be used for spinning
mechanisms, the elevator model can be used for spinning mechanisms transformed to linear motion,
and the single-jointed arm model can be used for rotating servo mechanisms (it’s just the flywheel
model augmented with a position state).
These models assume all motor controllers driving DC brushed motors are set to brake mode instead
of coast mode. Brake mode behaves the same as coast mode except where the applied voltage is zero.
In brake mode, the motor leads are shorted together to prevent movement. In coast mode, the motor
leads are an open circuit.
4.1 Pendulum
Kinematics and dynamics are a rather large topics, so for now, we’ll just focus on the basics required
for working with the models in this book. We’ll derive the same model, a pendulum, using three
approaches: sum of forces, sum of torques, and conservation of energy.
θ
θ
y0
y1 θ0
mg sin θ
mg cos θ h
θ
mg
(b) Trigonometry of a pendulum
(a) Force diagram of a pendulum
resolved into components parallel and perpendicular to the bob’s instantaneous motion. The direction
of the bob’s instantaneous velocity always points along the red axis, which is considered the tangential
axis because its direction is always tangent to the circle. Consider Newton’s second law
F = ma
where F is the sum of forces on the object, m is mass, and a is the acceleration. Because we are only
concerned with changes in speed, and because the bob is forced to stay in a circular path, we apply
Newton’s equation to the tangential axis only. The short violet arrow represents the component of the
gravitational force in the tangential axis, and trigonometry can be used to determine its magnitude.
Therefore
−mg sin θ = ma
a = −g sin θ
where g is the acceleration due to gravity near the surface of the earth. The negative sign on the right
hand side implies that θ and a always point in opposite directions. This makes sense because when a
pendulum swings further to the left, we would expect it to accelerate back toward the right.
This linear acceleration a along the red axis can be related to the change in angle θ by the arc length
formulas; s is arc length and l is the length of the pendulum.
s = lθ (4.1)
ds dθ
v= =l
dt dt
d2 s d2 θ
a= 2 =l 2
dt dt
Therefore
d2 θ
l = −g sin θ
dt2
4.1 Pendulum 17
d2 θ g
= − sin θ
dt2 l
g
θ̈ = − sin θ
l
τ =r×F
First start by defining the torque on the pendulum bob using the force due to gravity.
τ = l × Fg
where l is the length vector of the pendulum and Fg is the force due to gravity.
For now just consider the magnitude of the torque on the pendulum.
|τ | = −mgl sin θ
where m is the mass of the pendulum, g is the acceleration due to gravity, l is the length of the
pendulum and θ is the angle between the length vector and the force due to gravity.
Next rewrite the angular momentum.
L = r × p = mr × (ω × r)
|L| = mr2 ω
dθ
|L| = ml2
dt
d d2θ
|L| = ml2 2
dt dt
dL
According to τ = dt , we can just compare the magnitudes.
d2 θ
−mgl sin θ = ml2
dt2
g d2 θ
− sin θ = 2
l dt
g
θ̈ = − sin θ
l
∆U = mgh
1
∆K = mv 2
2
Since no energy is lost, the gain in one must be equal to the loss in the other
1
mv 2 = mgh
2
The change in velocity for a given change in height can be expressed as
√
v= 2gh
dθ
Using equation (4.1), this equation can be rewritten in terms of dt .
dθ √
v=l = 2gh
dt
dθ 2gh
= (4.2)
dt l
where h is the vertical distance the pendulum fell. Look at figure 4.1b, which presents the trigonom-
etry of a pendulum. If the pendulum starts its swing from some initial angle θ0 , then y0 , the vertical
distance from the pivot point, is given by
y0 = l cos θ0
y1 = l cos θ
h = l(cos θ − cos θ0 )
√
dθ 2g
= (cos θ − cos θ0 )
dt l
4.2 DC brushed motor 19
This equation is known as the first integral of motion. It gives the velocity in terms of the location
and includes an integration constant related to the initial displacement (θ0 ). We can differentiate by
applying the chain rule with respect to time. Doing so gives the acceleration.
√
d dθ d 2g
= (cos θ − cos θ0 )
dt dt dt l
d2 θ 1 − 2gl sin θ dθ
2
= √
dt 2 2g (cos θ − cos θ ) dt
l 0
2g
√
2
d θ 1 − l sin θ 2g
2
= √ (cos θ − cos θ0 )
dt 2 2g (cos θ − cos θ ) l
l 0
d2 θ g
= − sin θ
dt2 l
g
θ̈ = − sin θ
l
V
ωm
Vemf = Kv
V is the voltage applied to the motor, I is the current through the motor in Amps, R is the resistance
across the motor in Ohms, ωm is the angular velocity of the motor in radians per second, and Kv
is the angular velocity constant in radians per second per Volt. This circuit reflects the following
relation.
20 Chapter 4. Model examples
ωm
V = IR + (4.3)
Kv
τm = Kt I (4.4)
where τm is the torque produced by the motor in Newton-meters and Kt is the torque constant in
Newton-meters per Amp. Therefore
τm
I=
Kt
τm ωm
V = R+ (4.5)
Kt Kv
τm = Kt I
τm
Kt =
I
4.3 Elevator 21
τm,stall
Kt = (4.6)
Istall
where τm,stall is the stall torque and Istall is the stall current of the motor from its datasheet.
To find R, recall equation (4.3).
ωm
V = IR +
Kv
V = Istall R
V
R= (4.7)
Istall
where Istall is the stall current of the motor and V is the voltage applied to the motor at stall.
To find Kv , again recall equation (4.3).
ωm
V = IR +
Kv
ωm
V − IR =
Kv
ωm
Kv =
V − IR
ωm,f ree
Kv = (4.8)
V − If ree R
where ωm,f ree is the angular velocity of the motor under no load (also known as the free speed), and
V is the voltage applied to the motor when it’s spinning at ωm,f ree , and If ree is the current drawn by
the motor under no load.
If several identical motors are being used in one gearbox for a mechanism, multiply the stall torque
by the number of motors.
4.3 Elevator
4.3.1 Equations of motion
This elevator consists of a DC brushed motor attached to a pulley that drives a mass up or down.
Gear ratios are written as output over input, so G is greater than one in figure 4.4.
Based on figure 4.4
τm G = τp (4.9)
22 Chapter 4. Model examples
R ωp
I ωm
Vemf
m vm
V G
r
circuit mechanics
where G is the gear ratio between the motor and the pulley and τp is the torque produced by the
pulley.
rFm = τp (4.10)
where r is the radius of the pulley. Substitute equation (4.9) into equation (4.5).
τp
G ωm
V = R+
Kt Kv
τp ωm
V = R+
GKt Kv
rFm ωm
V = R+ (4.11)
GKt Kv
ωm = Gωp (4.12)
where ωp is the angular velocity of the pulley. The velocity of the mass (the elevator carriage) is
vm = rωp
vm
ωp = (4.13)
r
Substitute equation (4.13) into equation (4.12).
vm
ωm = G (4.14)
r
Substitute equation (4.14) into equation (4.11).
4.4 Flywheel 23
rFm G vrm
V = R+
GKt Kv
RrFm G
V = + vm
GKt rKv
Solve for Fm .
RrFm G
=V − vm
GKt rKv
( )
G GKt
Fm = V − vm
rKv Rr
GKt 2
G Kt
Fm = V − vm (4.15)
Rr Rr2 Kv
∑
F = mam (4.16)
∑
where F is the sum of forces applied to the elevator carriage, m is the mass of the elevator carriage
in kilograms, and am is the acceleration of the elevator carriage.
mam = Fm
R Gravity is not part of the modeled dynamics because it complicates the state-space model and
the controller will behave well enough without it.
( )
GKt G2 K t
mam = V − vm
Rr Rr2 Kv
GKt G2 Kt
am = V − vm (4.17)
Rrm Rr2 mKv
4.4 Flywheel
4.4.1 Equations of motion
This flywheel consists of a DC brushed motor attached to a spinning mass of non-negligible moment
of inertia.
Gear ratios are written as output over input, so G is greater than one in figure 4.5.
We will start with the equation derived earlier for a DC brushed motor, equation (4.5).
τm ωm
V = R+
Kt Kv
24 Chapter 4. Model examples
R ωf
I ωm J
Vemf
V G
circuit mechanics
Solve for the angular acceleration. First, we’ll rearrange the terms because from inspection, V is the
model input, ωm is the state, and τm contains the angular acceleration.
R 1
V = τm + ωm
Kt Kv
Solve for τm .
R 1
V = τm + ωm
Kt Kv
R 1
τm =V − ωm
Kt Kv
Kt Kt
τm = V − ωm
R Kv R
(τ ) Kt Kt
f
= V − (Gωf )
G R Kv R
τf Kt GKt
= V − ωf
G R Kv R
GKt G2 Kt
τf = V − ωf (4.18)
R Kv R
τf = J ω̇f (4.19)
where J is the moment of inertia of the flywheel and ω̇f is the angular acceleration. Substitute
equation (4.19) into equation (4.18).
GKt G2 Kt
(J ω̇f ) = V − ωf
R Kv R
4.5 Drivetrain 25
GKt G2 Kt
ω̇f = V − ωf (4.20)
RJ Kv RJ
4.5 Drivetrain
4.5.1 Equations of motion
This drivetrain consists of two DC brushed motors per side which are chained together on their
respective sides and drive wheels which are assumed to be massless.
ωl ωr
J
r
rb
GKt G2 Kt
τ= V − ω (4.21)
R Kv R
where τ is the torque applied by one wheel of the drivetrain, G is the gear ratio of the drivetrain, Kt
is the torque constant of the motor, R is the resistance of the motor, and Kv is the angular velocity
constant. Since τ = rF and ω = vr where v is the velocity of a given drivetrain side along the ground
and r is the drivetrain wheel radius
GKt G2 Kt ( v )
(rF ) = V −
R Kv R r
GKt G2 Kt
rF = V − v
R Kv Rr
GKt G2 Kt
F = V − v
Rr Kv Rr2
G2 Kt GKt
F =− v+ V
Kv Rr2 Rr
G2l Kt Gl Kt
Fl = − vl + Vl
Kv Rr2 Rr
G2 Kt Gr Kt
Fr = − r 2 vr + Vr
Kv Rr Rr
where the l and r subscripts denote the side of the robot to which each variable corresponds.
G2 K 2
Let C1 = − KvlRrt2 , C2 = Gl Kt
Rr , C3 = − KGvrRr
Kt
2 , and C4 =
Gr Kt
Rr .
Fl = C1 vl + C2 Vl (4.22)
26 Chapter 4. Model examples
Fr = C3 vr + C4 Vr (4.23)
∑
F = ma
Fl + Fr = mv̇
v̇l + v̇r
Fl + Fr = m
2
2
(Fl + Fr ) = v̇l + v̇r
m
2
v̇l = (Fl + Fr ) − v̇r (4.24)
m
∑
τ = J ω̇
( )
v̇r − v̇l
τl + τr = J
2rb
v̇r − v̇l
(−rb Fl ) + (rb Fr ) = J
2rb
J
−rb Fl + rb Fr = (v̇r − v̇l )
2rb
J
−Fl + Fr = 2 (v̇r − v̇l )
2rb
2rb2
(−Fl + Fr ) = v̇r − v̇l
J
2r2
v̇r = v̇l + b (−Fl + Fr )
J
( )
2 2r2
v̇r = (Fl + Fr ) − v̇r + b (−Fl + Fr )
m J
2r 2
2
2v̇r = (Fl + Fr ) + b (−Fl + Fr )
m J
1 rb2
v̇r = (Fl + Fr ) + (−Fl + Fr ) (4.25)
m J
1 1 r2 r2
v̇r = Fl + Fr − b Fl + b Fr
m
( m) J( J )
1 rb2 1 r2
v̇r = − Fl + + b Fr (4.26)
m J m J
4.6 Single-jointed arm 27
Substitute equation (4.25) back into equation (4.24) to obtain an expression for v̇l .
( )
2 1 rb2
v̇l = (Fl + Fr ) − (Fl + Fr ) + (−Fl + Fr )
m m J
r 2
1
v̇l = (Fl + Fr ) − b (−Fl + Fr )
m J
1 rb2
v̇l = (Fl + Fr ) + (Fl − Fr )
m J
1 1 r2 r2
v̇l = Fl + Fr + b Fl − b Fr
m
( m) J( J )
1 rb2 1 r2
v̇l = + Fl + − b Fr (4.27)
m J m J
( ) ( )
1 r2 1 r2
v̇r = − b Fl + + b Fr
m J m J
( 2 ) ( )
1 rb 1 rb2
v̇r = − (C1 vl + C2 Vl ) + + (C3 vr + C4 Vr ) (4.28)
m J m J
( ) ( )
1 rb2 1 rb2
v̇l = + Fl + − Fr
m J m J
( ) ( )
1 r2 1 r2
v̇l = + b (C1 vl + C2 Vl ) + − b (C3 vr + C4 Vr ) (4.29)
m J m J
τm ωm
V = R+
Kt Kv
Solve for the angular acceleration. First, we’ll rearrange the terms because from inspection, V is the
model input, ωm is the state, and τm contains the angular acceleration.
R 1
V = τm + ωm
Kt Kv
Solve for τm .
28 Chapter 4. Model examples
m
R ωarm
l
I ωm
Vemf
V G
circuit mechanics
R 1
V = τm + ωm
Kt Kv
R 1
τm =V − ωm
Kt Kv
Kt Kt
τm = V − ωm
R Kv R
(τ ) Kt Kt
arm
= V − (Gωf )
G R Kv R
τarm Kt GKt
= V − ωarm
G R Kv R
GKt G2 Kt
τarm = V − ωarm (4.30)
R Kv R
where J is the moment of inertia of the arm and ω̇arm is the angular acceleration. Substitute equation
(4.31) into equation (4.30).
GKt G2 Kt
(J ω̇arm ) = V − ωarm
R Kv R
GKt G2 Kt
ω̇arm = V − ωarm (4.32)
RJ Kv RJ
J can be approximated as the moment of inertia of a thin rod rotating around one end. Therefore
4.7 Rotating claw 29
1
J = ml2 (4.33)
3
where m is the mass of the arm and l is the length of the arm.
6 PID controllers . . . . . . . . . . . . . . . . . . . . . . 35
6.1 The definition
6.2 Response types
6.3 Types of PID controllers
6.4 General control theory perspective
6.5 Manual tuning
6.6 Limitations
Figure 5.1 shows a system with a hypothetical input and output. Since the output is twice the ampli-
tude of the input, the system has a gain of 2.
t K t
The open-loop gain is the total gain from the sum node at the input to the output branch. The feedback
gain is the total gain from the output back to the input sum node. The circle’s output is the sum of
its inputs.
Figure 5.3 is a block diagram with more formal notation in a feedback configuration.
34 Chapter 5. Control system basics
+
input open-loop output
∓
feedback
+
X(s) P1 Y (s)
∓
P2
Y (s) P1
= (5.1)
X(s) 1 ∓ P1 P2
6. PID controllers
Kp e(t)
Kd de(t)
dt
where e(t) is the position error at the current time t, τ is the integration variable, Kp is the
proportional gain, Ki is the integral gain, and Kd is the derivative gain.
The integral integrates from time 0 to the current time t. We use τ for the integration because we
need a variable to take on multiple values throughout the integral, but we can’t use t because we
already defined that as the current time.
If the position controller formulation is measuring and controlling velocity instead, the error e(t)
becomes dedt . Substituting this into equation (6.1) yields
∫ t
de de d2 e
u(t) = Kp + Ki dτ + Kd 2
dt 0 dτ dt
de 2
d e
u(t) = Kp + Ki e(t) + Kd 2 (6.2)
dt dt
So the velocity de
dt is integrated by the integral term. By the fundamental theorem of calculus, the
derivative and integral cancel because they are inverse operations. This produces just the error e(t),
so the Ki term has the effect of proportional control. Furthermore, the Kp term in equation (6.2)
behaves like a derivative term for velocity PID control due to the de de
dt . Letting ev = dt , this means
the velocity controller is analogous to theorem 6.3.1.
38 Chapter 6. PID controllers
Note this isn’t strictly true because the fundamental theorem of calculus requires that e(t) is continu-
ous, but when we actually implement the controller, e(t) is discrete. Therefore, the result here is only
correct up to the accuracy of the iterative integration method used. We’ll discuss approximations like
these in section 10.3 and how they affect controller behavior.
Theorem 6.3.1 — Velocity PID controller.
∫ t
u(t) = Kp ev (t) + Ki ev (τ ) dτ (6.3)
0
where ev (t) is the velocity error at the current time t, τ is the integration variable, Kp is now the
derivative gain, and Ki is now the proportional gain.
Integral control for the velocity is analogous to the throttle pedal on a car. One must hold the throttle
pedal (the control input) at a nonzero value to keep the car traveling at the reference velocity.
R Note: For a real velocity control implementation, a steady-state feedforward and proportional
control are preferred to integral control.
ek − ek−1
uk = Kp ek + Kd
dt
where uk is the control input at timestep k and ek is the error at timestep k. ek is defined as ek =
rk − xk where rk is the reference and xk is the current state at timestep k.
R Note: Adding an integral gain to the controller is an incorrect way to eliminate steady-state
error. A better approach would be to tune it with an integrator added to the plant, but this
requires a model. Since we are doing output-based rather than model-based control, our only
option is to add an integrator to the controller.
Beware that if Ki is too large, integral windup can occur. Following a large change in reference, the
integral term can accumulate an error larger than the maximal control input. As a result, the system
overshoots and continues to increase until this accumulated error is unwound.
6.6 Limitations
PID’s heuristic method of tuning is a reasonable choice when there is no a priori knowledge of the
system dynamics. However, controllers with much better response can be developed if a dynamical
model of the system is known. Furthermore, PID only applies to single-input, single-output (SISO)
systems and can drive up to two states to references by using both the proportional and integral terms.
We’ll revisit this in subsection 7.6.2.
This page intentionally left blank
Grass clearing by Interdisciplinary Sciences building and Thimann Labs at UCSC
This chapter briefly discusses what transfer functions are, how the locations of poles and zeroes affects
system response and stability, and how controllers affect pole locations. The case studies cover various
aspects of PID control using the algebraic approach of transfer functions.
1
The Dirac delta function is zero everywhere except at the origin. The nonzero region has an infinitesimal width and
has a height such that the area within that region is 1.
42 Chapter 7. Laplace domain analysis
Im(jω)
Re(σ)
To extend our analogy of each coordinate being represented by some basis, we now have the y coor-
dinate representing the oscillation frequency of the system response (the frequency domain) and also
the x coordinate representing the speed at which that oscillation decays and the system converges to
zero (i.e., a decaying exponential). Figure 7.7 shows this for various points.
If we move the component frequencies in the Fmajor4 chord example parallel to the real axis to
σ = −25, the resulting time domain response attenuates according to the decaying exponential
e−25t (see figure 7.4).
Note that this explanation as a basis isn’t exact because the Laplace basis isn’t orthogonal (that is,
the x and y coordinates affect each other and have cross-talk). In the frequency domain, we had a
basis of sine waves that we represented as delta functions in the frequency domain. Each frequency
contribution was independent of the others. In the Laplace domain, this is not the case; a pure
1
exponential is s−a (a rational function where a is a real number) instead of a delta function. This
function is nonzero at points that aren’t actually frequencies present in the time domain. Figure 7.5
demonstrates this, which shows the Laplace transform of the Fmajor4 chord plotted in 3D.
Notice how the values of the function around each component frequency decrease according to
√ 1 in the x and y directions (in just the x direction, it would be x1 ).
2 2
x +y
∫ ∞
L{f (t)} = F (s) = f (t)e−st dt
0
We won’t be computing any Laplace transforms by hand using this formula (everyone in the real world
looks these up in a table anyway). Common Laplace transforms (assuming zero initial conditions)
44 Chapter 7. Laplace domain analysis
are shown in table 7.1. Of particular note are the Laplace transforms for the derivative, unit step2 ,
and exponential decay. We can see that a derivative is equivalent to multiplying by s, and an integral
is equivalent to multiplying by 1s . We’ll discuss the decaying exponential in subsection 7.3.1.
Table 7.1: Common Laplace transforms and Laplace transform properties with zero initial conditions
zeroes
z }| {
(s − 9 + 9i)(s − 9 − 9i)
H(s) = (7.1)
s(s + 10)
| {z }
poles
R Imaginary poles and zeroes always come in complex conjugate pairs (e.g., −2 + 3i, −2 − 3i).
2
The unit step u(t) is defined as 0 for t < 0 and 1 for t ≥ 0.
46 Chapter 7. Laplace domain analysis
The locations of the closed-loop poles in the complex plane determine the stability of the system.
Each pole represents a frequency mode of the system, and their location determines how much of
each response is induced for a given input frequency. Figure 7.7 shows the impulse responses in the
time domain for transfer functions with various pole locations. They all have an initial condition of
1.
Im(jω)
Stable Unstable
t
t
t
LHP RHP
t
t t
Re(σ)
t t t
When a system is stable, its output may oscillate but it converges to steady-state. When a system is
marginally stable, its output oscillates at a constant amplitude forever. When a system is unstable, its
output grows without bound.
Location Stability
Left Half-plane (LHP) Stable
Imaginary axis Marginally stable
Right Half-plane (RHP) Unstable
poles always move toward the zeroes, zeroes impose a “speed limit” on the system response because
it takes a finite amount of time to move the wrong direction, then change directions.
One example of this type of system is bicycle steering. Try riding a bicycle without holding the
handle bars, then poke the right handle; the bicycle turns right. Furthermore, if one is holding the
handlebars and wants to turn left, rotating the handlebars counterclockwise will make the bicycle fall
toward the right. The rider has to lean into the turn and overpower the nonminimum phase dymamics
to go the desired direction.
Another example is a segway. To move forward by some distance, the segway must first roll backward
to rotate the segway forward. Once the segway starts falling in that direction, it begins rolling forward
to avoid falling over until it reaches the target distance. At that point, the segway increases its forward
speed to pitch backward and slow itself down. To come to a stop, the segway rolls backward again
to level itself out.
+
X(s) K G Y (s)
−
Y (s) KG
Gcl (s) = = (7.2)
X(s) 1 + KGH
The numerator is the open-loop gain and the denominator is one plus the gain around the feedback
loop, which may include parts of the open-loop gain (see appendix D.1 for a derivation). As another
example, the transfer function from the input to the error is
E(s) 1
Gcl (s) = = (7.3)
X(s) 1 + KGH
The roots of the denominator of Gcl (s) are different from those of the open-loop transfer function
KG(s). These are called the closed-loop poles.
K
G(s) =
s((Js + b)(Ls + R) + K 2 )
Figure 7.9: Root locus showing pole moving to- Figure 7.10: Root locus showing poles moving
ward negative infinity toward asymptotes
This plant has the root locus shown in figure 7.12. In proportional feedback, the plant is unstable for
large values of K. However, if we remove the unstable pole by setting L in the transfer function to
zero, we get the root locus in figure 7.13. For small values of K, both systems are stable and have
nearly indistinguishable step responses due to the exceedingly small contribution from the fast pole
(see figures 7.14 and 7.15). The high frequency dynamics only cause instability for large values of K
that induce fast system responses. In other words, the system responses of the second-order model
and its first-order approximation are similar for low frequency operating regimes.
Why can’t unstable poles close to the origin be ignored in the same way? The response of high
frequency stable poles decays rapidly. Unstable poles, on the other hand, represent unstable dynamics
which cause the system output to grow to infinity. Regardless of how slow these unstable dynamics
are, they will eventually dominate the response.
50 Chapter 7. Laplace domain analysis
Figure 7.12: Root locus of second-order DC Figure 7.13: Root locus of first-order DC
brushed motor plant brushed motor plant
Figure 7.14: Step response of second-order DC Figure 7.15: Step response of first-order DC
brushed motor plant brushed motor plant
umax < u
kmax (r − x) < k(r − x)
kmax < k
For the inequality to hold, kmax must be less than the original value for k. This reduced gain is
evident in a system response when there is a linear change in state instead of an exponential one as it
7.6 Case studies of Laplace domain analysis 51
approaches the reference. This is due to the control effort no longer following a decaying exponential
plot. Once the system is closer to the reference, the controller will stop saturating and produce realistic
controller values again.
Ki
K(s) = Kp + + Kd s (7.4)
s
Θ̇(s) K
G(s) = = (7.5)
V (s) (Js + b)(Ls + R) + K 2
K(s) = Kp
When these are in unity feedback, the transfer function from the input voltage to the error is
E(s) 1
=
V (s) 1 + K(s)G(s)
1
E(s) = V (s)
1 + K(s)G(s)
1
E(s) = ( ) V (s)
K
1 + (Kp ) (Js+b)(Ls+R)+K 2
1
E(s) = Kp K
V (s)
1+ (Js+b)(Ls+R)+K 2
Notice that the steady-state error is nonzero. To fix this, an integrator must be included in the con-
troller.
Ki
K(s) = Kp +
s
The same steady-state calculations are performed as before with the new controller.
E(s) 1
=
V (s) 1 + K(s)G(s)
1
E(s) = V (s)
1 + K(s)G(s)
( )
1 1
E(s) = ( )( )
1 + Kp + Ksi K s
(Js+b)(Ls+R)+K 2
( )
1 1
ess = lim s ( ) ( )
s→0
1 + Kp + sKi K s
(Js+b)(Ls+R)+K 2
1
ess = lim ( )( )
s→0 Ki K
1 + Kp + s (Js+b)(Ls+R)+K 2
1 s
ess = lim ( )( )
s→0
1 + Kp + Ki K s
s (Js+b)(Ls+R)+K 2
s
ess = lim ( )
s→0 K
s + (Kp s + Ki ) (Js+b)(Ls+R)+K 2
0
ess = ( )
K
0 + (Kp (0) + Ki ) (J(0)+b)(L(0)+R)+K 2
0
ess = K
Ki bR+K 2
It should be noted that ess in equation (7.7) approaches zero for Kp = ∞. This is known as a bang-
bang controller. In practice, an infinite switching frequency cannot be achieved, but it may be close
enough for some performance specifications.
ω
V = IR + (7.8)
Kv
τ = IKt (7.9)
dω
τ =J (7.10)
dt
For an explanation of where these equations come from, read section 4.2.
dω
First, we’ll solve for dt in terms of V .
Substitute equation (7.9) into equation (7.8).
ω
V = IR +
Kv
( )
τ ω
V = R+
Kt Kv
( )
J dω
dt ω
V = R+
Kt Kv
dω
Solve for dt .
54 Chapter 7. Laplace domain analysis
J dω
dt ω
V = R+
Kt Kv
ω J dω
V − = dt R
Kv Kt
( )
dω Kt ω
= V −
dt JR Kv
dω Kt Kt
=− ω+ V
dt JRKv JR
Kt Kt
sω = − ω+ V (7.11)
JRKv JR
ω
Solve for the transfer function H(s) = V.
Kt Kt
sω = − ω+ V
JRKv JR
( )
Kt Kt
s+ ω= V
JRKv JR
Kt
ω JR
= Kt
V s + JRK v
V = Kp (ωgoal − ω)
Kt Kt
sω = − ω+ Kp (ωgoal − ω)
JRKv JR
ω
Solve for the transfer function H(s) = ωgoal .
Kt Kt Kp
sω = −
ω+ (ωgoal − ω)
JRKv JR
Kt Kt Kp Kt Kp
sω = − ω+ ωgoal − ω
JRKv JR JR
( )
Kt Kt Kp Kt Kp
s+ + ω= ωgoal
JRKv JR JR
7.6 Case studies of Laplace domain analysis 55
Kt Kp
ω
=( JR )
ωgoal s+ Kt
+
Kt Kp
JRKv JR
( )
Kt Kp
This has a pole at − Kt
JRKv + JR . Assuming that that quantity is negative (i.e., we are stable),
1
that pole corresponds to a time constant of Kt Kt Kp .
JRKv
+ JR
As can be seen above, a flywheel has a single pole. It therefore only needs a single pole controller to
place all of its poles anywhere.
R This analysis assumes that the motor is well coupled to the mass and that the time constant of
the inductor is small enough that it doesn’t factor into the motor equations. In Austin Schuh’s
experience with 971’s robots, these are pretty good assumptions.
Next, we’ll try a PD loop. (This will use a perfect derivative, but anyone following along closely
already knows that we can’t really take a derivative here, so the math will need to be updated at some
point. We could switch to discrete time and pick a differentiation method, or pick some other way
of modeling the derivative.)
V = Kp (ωgoal − ω) + Kd s(ωgoal − ω)
Kt Kt
sω = − ω+ (Kp (ωgoal − ω) + Kd s(ωgoal − ω))
JRKv JR
Kt Kt Kp Kt Kd s
sω = − ω+ (ωgoal − ω) + (ωgoal − ω)
JRKv JR JR
Kt Kt Kp Kt Kp Kt Kd s Kt Kd s
sω = − ω+ ωgoal − ω+ ωgoal − ω
JRKv JR JR JR JR
Kt Kd s Kt Kt Kp Kt Kp Kt Kd s
sω + ω+ ω+ ω= ωgoal + ωgoal
JR JRKv JR JR JR
( ( ) )
Kt Kd Kt Kt Kp Kt
s 1+ + + ω= (Kp + Kd s) ωgoal
JR JRKv JR JR
Kt
ω JR (K p + Kd s)
=( ( ) )
ωgoal s 1+ Kt Kd
+ Kt
+
Kt Kp
JR JRKv JR
Kt Kt Kp
K +
So, we added a zero at − Kdp and moved our pole to − JRKvKt KJR
d
. This isn’t progress. We’ve added
1+ JR
more complexity to our system and, practically speaking, gotten nothing good out of it. Zeroes should
56 Chapter 7. Laplace domain analysis
be avoided if at all possible because they amplify unwanted high frequency modes of the system. At
least this is a stable zero, but it’s still undesirable.
In summary, derivative doesn’t help on a flywheel. Kd may help if the real system isn’t ideal, but we
don’t suggest relying on that.
8 Linear algebra . . . . . . . . . . . . . . . . . . . . . . 59
8.1 Vectors
8.2 Linear combinations, span, and basis vectors
8.3 Linear transformations and matrices
8.4 Matrix multiplication as composition
8.5 The determinant
8.6 Inverse matrices, column space, and null space
8.7 Nonsquare matrices as transformations between dimen-
sions
8.8 Eigenvectors and eigenvalues
8.9 Miscellaneous notation
9 State-space controllers . . . . . . . . . . . . . . 85
9.1 From PID control to model-based control
9.2 What is a dynamical system?
9.3 State-space notation
9.4 Controllability
9.5 Observability
9.6 Closed-loop controller
9.7 Pole placement
9.8 LQR
9.9 Case studies of controller design methods
9.10 Model augmentation
9.11 Feedforwards
9.12 Integral control
8. Linear algebra
Modern control theory borrows concepts from linear algebra. At first, linear algebra may appear very
abstract, but there are simple geometric intuitions underlying it. First, watch 3Blue1Brown’s preview
video for the Essence of linear algebra video series (5 minutes) [4]. The goal here is to provide an
intuitive, geometric understanding of linear algebra as a method of linear transformations.
While only a subset of the material from the videos will be presented here that we think is relevant
to this book, we highly suggest watching the whole series [3].
R The following sections are essentially transcripts of the video content for those who don’t want
to watch an hour of YouTube videos. However, we suggest watching the videos instead because
animations are better at conveying the geometric intuition involved than text.
8.1 Vectors
8.1.1 What is a vector?
The fundamental building block for linear algebra is the vector. Broadly speaking, there are three
distinct but related ideas about vectors: the physics student perspective, the computer science student
perspective, and the mathmetician’s perspective.
The physics student perspective is that vectors are arrows pointing in space. A given vector is defined
by its length and direction, but as long as those two facts are the same, you can move it around and
it’s still the same vector. Vectors in the flat plane are two-dimensional, and those sitting in broader
space that we live in are three-dimensional.
The computer science perspective is that vectors are ordered lists of numbers. For example, let’s
say you were doing some analytics about house prices and the only features you cared about where
square footage and price. You might model each house with a pair of numbers where the first indicates
square footage and the second indicates price. Notice the order matters here. In the lingo, you’d be
60 Chapter 8. Linear algebra
modeling houses as two-dimensional vectors where, in this context, vector is a synonym for list, and
what makes it two-dimensional is that the length of that list is two.
The mathematician, on the other hand, seeks to generalize both these views by saying that a vector
can be anything where there’s a sensible notion of adding two vectors and multiplying a vector by a
number (operations that we’ll talk about later on). The details of this view are rather abstract and
won’t be needed for this book as we’ll favor a more concrete setting. We bring it up here because it
hints at the fact that the ideas of vector addition and multiplication by numbers will play an important
role throughout linear algebra.
[ ]
3
−1
Every pair of numbers represents one and only one vector, and every vector is associated with one
and only one pair of numbers. In three dimensions, there is a third axis called the z-axis which is
perpendicular to both the x and y axes. In this case, each vector is associated with an ordered triplet
of numbers. The first is how far to move along the x-axis, the second is how far to move parallel to
the y-axis, and the third is how far to then move parallel to this new z-axis. For example:
2
1
3
Every triplet of numbers represents one unique vector in space, and every vector in space represents
exactly one triplet of numbers.
8.1 Vectors 61
[ ] [ ]
1 3
+
2 −1
When you take the vector sum using this tip-to-tail method, you can think of a four-step path from
the origin to the tip of the second vector: “walk 1 to the right, then 2 up, then 3 to the right, then 1
down.” Reorganizing these steps so that you first do all of the rightward motion, then do all of the
vertical motion, you can read it as saying, “first move 1 + 3 to the right, then move 2 + (−1) up,” so
the new vector has coordinates 1 + 3 and 2 + (−1).
[ ] [ ] [ ]
1 3 1+3
+ =
2 −1 2 + (−1)
In general, vector addition in this list-of-numbers conception looks like matching up their terms, and
adding each one together.
[ ] [ ] [ ]
x1 x2 x1 + x2
+ =
y1 y2 y1 + y2
use the word “scalar” interchangeably with the word “number”. Numerically, stretching out a vector
by a factor of, say, 2, corresponds to multiplying each of its components by that factor, 2.
[ ] [ ]
3 6
2· =
1 2
So in the conception of vectors as lists of numbers, multiplying a given vector by a scalar means
multiplying each one of those components by that scalar.
[ ] [ ]
x 2x
2· =
y 2y
R See the corresponding Essence of linear algebra video for a more visual presentation (5 minutes)
[11].
a⃗v + bw
⃗
Where does this word “linear” come from? Why does this have anything to do with lines? This isn’t
the etymology, but if you fix one of those scalars and let the other one change its value freely, the tip
of the resulting vector draws a straight line.
8.2.3 Span
Now, if you let both scalars range freely and consider every possible resultant vector, there are three
things that can happen. For most pairs of vectors, you’ll be able to reach every possible point in the
plane; every two-dimensional vector is within your grasp. However, in the unlucky case where your
two original vectors happen to line up, the tip of the resulting vector is limited to just a single line
passing through the origin. The vectors could also both be zero, in which case the resultant vector is
just at the origin.
The set of all possible vectors that you can reach with a linear combination of a given pair of vectors
is called the span of those two vectors. So, restating what we just discussed in this lingo, the span of
most pairs of 2D vectors is all vectors in 2D space, but when they line up, their span is all vectors
whose tip sits on a certain line.
Remember how we said that linear algebra revolves around vector addition and scalar multiplication?
The span of two vectors is a way of asking, “What are all the possible vectors one can reach using
only these two fundamental operations, vector addition and scalar multiplication?”
Thinking about a whole collection of vectors sitting on a line gets crowded, and even more so to
think about all two-dimensional vectors at once filling up the plane. When dealing with collections
of vectors like this, it’s common to represent each one with just a point in space where the tip of the
vector was. This way, if you want to think about every possible vector whose tip sits on a certain line,
just think about the line itself.
Likewise, to think about all possible two-dimensional vectors at once, conceptualize each one as the
point where its tip sits. In effect, you’re thinking about the infinite, flat sheet of two-dimensional
space itself, leaving the arrows out of it.
In general, if you’re thinking about a vector on its own, think of it as an arrow, and if you’re dealing
with a collection of vectors, it’s convenient to think of them all as points. Therefore, for our span
example, the span of most pairs of vectors ends up being the entire infinite sheet of two-dimensional
space, but if they line up, their span is just a line.
The idea of span gets more interesting if we start thinking about vectors in three-dimensional space.
For example, given two vectors in 3D space that are not pointing in the same direction, what does it
mean to take their span? Their span is the collection of all possible linear combinations of those two
vectors, meaning all possible vectors you get by scaling each vector in some way, then adding them
together.
You can imagine turning two different knobs to change the two scalars defining the linear combination,
adding the scaled vectors and following the tip of the resulting vector. That tip will trace out a flat
sheet cutting through the origin of three-dimensional space. This flat sheet is the span of the two
vectors. More precisely, the span of the two vectors is the set of all possible vectors whose tips sit on
that flat sheet.
64 Chapter 8. Linear algebra
So what happens if we add a third vector and consider the span of all three? A linear combination of
three vectors is defined similarly as it is for two; you’ll choose three different scalars, scale each of
those vectors, then add them all together. The linear combination of ⃗v , w,
⃗ and ⃗u looks like
a⃗v + bw
⃗ + c⃗u
where a, b, and c are allowed to vary. Again, the span of these vectors is the set of all possible linear
combinations.
Two different things could happen here. If your third vector happens to be sitting on the span of
the first two, then the span doesn’t change; you’re trapped on that same flat sheet. In other words,
adding a scaled version of that third vector to the linear combination doesn’t give you access to any
new vectors. However, if you just randomly choose a third vector, it’s almost certainly not sitting
on the span of those first two. Then, since it’s pointing in a separate direction, it unlocks access to
every possible three-dimensional vector. As you scale that new third vector, it moves around that
span sheet of the first two, sweeping it through all of space.
Another way to think about it is that you’re making full use of the three, freely-changing scalars that
you have at your disposal to acces the full three dimensions of space.
In other words, one of the vectors can be expressed as a linear combination of the others since it’s
already in the span of the others.
On the other hand, if each vector really does add another dimension to the span, they’re said to be
linearly independent.
Now with all that terminology, and hopefully some good mental images to go with it, the technical
definition of a basis of a space is as follows.
Definition 8.2.1 — Basis of a vector space. The basis of a vector space is a set of linearly
independent vectors that span the full space.
R See the corresponding Essence of linear algebra video for a more visual presentation (10 min-
utes) [6].
8.3 Linear transformations and matrices 65
[ ][ ] [ ]
1 −3 5 (1)(5) + (−3)(7)
=
2 4 7 (2)(5) + (4)(7)
In particular, we want to show you a way to think about matrix-vector multiplication that doesn’t rely
on memorization of the procedure shown above.
So why use the word “transformation” instead of “function” if they mean the same thing? It’s to be
suggestive of a certain way to visualize this input-output relation. You see, a great way to understand
functions of vectors is to use movement. If a transformation takes some input vector to some out-
put vector, we imagine that input vector moving over to the output vector. Then to understand the
transformation as a whole, we might imagine watching every possible input vector move over to its
corresponding output vector. it gets really crowded to think about all the vectors all at once, where
each one is an arrow. Therefore, as we mentioned in the previous section, it’s useful to conceptualize
each vector as a single point where its tip sits rather than an arrow. To think about a transformation
taking every possible input vector to some output vector, we watch every point in space moving to
some other point.
The effect of various transformations moving around all of the points in space gives the feeling of
compressing and morphing space itself. As you can imagine though, arbitrary transformations can
look complicated. Luckily, linear algebra limits itself to a special type of transformation, ones that
are easier to understand, called “linear” transformations. Visually speaking, a transformation is linear
if it has two properties: all straight lines must remain as such, and the origin must remain fixed in
place. In general, you should think of linear transformations as keeping grid lines parallel and evenly
spaced.
You only need to record where the two basis vectors, î and ĵ, each land, and everything else will follow
from that. For example, consider the vector v with coordinates (−1, 2), meaning ⃗v = −1î + 2ĵ. If
we play some transformation and follow where all three of these vectors go, the property that grid
lines remain parallel and evenly spaced has a really important consequence: the place where ⃗v lands
will be −1 times the vector where î landed plus 2 times the vector where ĵ landed. In other words, it
started off as a certain linear combination of î and ĵ and it ends up as that same linear combination of
where those two vectors landed. This means you can deduce where ⃗v must go based only on where î
and ĵ each land. For this transformation, î lands on the coordinates (1, −2) and ĵ lands on the x-axis
at the coordinates (3, 0).
Adding that all together, you can deduce that ⃗v has to land on the vector (5, 2).
[ ]
−1(1) + 2(3)
Transformed ⃗v =
−1(−2) + 2(0)
[ ]
5
Transformed ⃗v =
2
This is a good point to pause and ponder, because it’s pretty important. This gives us a technique
to deduce where any vectors land, so long as we have a record of where î and ĵ each land, without
needing to watch the transformation itself.
Given a vector with more general coordinates x and y, it will land on x times the vector where î lands
(1, −2), plus y times the vector where ĵ lands (3, 0). Carrying out that sum, you see that it lands at
(1x + 3y, −2x + 0y).
[ ] [ ]
1 3
î → ĵ →
−2 0
[ ] [ ] [ ] [ ]
x 1 3 1x + 3y
→x +y =
y −2 0 −2x + 0y
Given any vector, this formula will describe where that vector lands.
What all of this is saying is that a two dimensional linear transformation is completely described by
just four numbers: the two coordinates for where î lands and the two coordinates for where ĵ lands.
It’s common to package these coordinates into a two-by-two grid of numbers, called a two-by-two
matrix, where you can interpret the columns as the two special vectors where î and ĵ each land. If î
lands on the vector (3, −2) and ĵ lands on the vector (2, 1), this two-by-two matrix would be
8.3 Linear transformations and matrices 67
[ ]
3 2
−2 1
If you’re given a two-by-two matrix describing a linear transformation and some specific vector, say
(5, 7), and you want to know where that linear transformation takes that vector, you can multiply the
coordinates of the vector by the corresponding columns of the matrix, then add together the result.
[ ][ ] [ ] [ ]
3 2 5 3 2
=5 +7
−2 1 7 −2 1
This corresponds with the idea of adding the scaled versions of our new basis vectors.
Let’s see what this looks like in the most general case where your matrix has entries a, b, c, d.
[ ]
a b
c d
Remember, this matrix is just a way of packaging the information needed to describe a linear trans-
formation. Always remember to interpret that first column, (a, c), as the place where the first basis
vector lands and that second column, (b, d), as the place where the second basis vector lands.
When we apply this transformation to some vector (x, y), the result will be x times (a, c) plus y times
(b, d). Together, this gives a vector (ax + by, cx + dy).
[ ][ ] [ ] [ ] [ ]
a b x a b ax + by
=x +y =
c d y c d cx + dy
You could even define this as matrix-vector multiplication when you put the matrix on the left of
the vector like it’s a function. Then, you could make high schoolers memorize this, without showing
them the crucial part that makes it feel intuitive (yes, that was sarcasm). Isn’t it more fun to think
about these columns as the transformed versions of your basis vectors and to think about the result
as the appropriate linear combination of those vectors?
[ ]
0 −1
1 0
To ascertain what happens to any vector after a 90° rotation, you could just multiply its coordinates
by this matrix.
[ ][ ]
0 −1 x
1 0 y
68 Chapter 8. Linear algebra
Here’s a fun transformation with a special name, called a “shear”. In it, î remains fixed so the first
column of the matrix is (1, 0), but ĵ moves over to the coordinates (1, 1) which become the second
column of the matrix.
[ ]
1 1
0 1
And, at the risk of being redundant here, figuring out how shear transforms a given vector comes
down to multiplying this matrix by that vector.
[ ][ ]
1 1 x
0 1 y
Let’s say we want to go the other way around, starting with a matrix, say with columns (1, 2) and
(3, 1), and we want to deduce what its transformation looks like. Pause and take a moment to see if
you can imagine it.
[ ]
1 3
2 1
One way to do this is to first move î to (1, 2). Then, move ĵ to (3, 1), always moving the rest of space
in such a way that that keeps grid lines parallel and evenly spaced.
Suppose that the vectors that î and ĵ land on are linearly dependent as in the following matrix (that
is, it has linearly dependent columns).
[ ]
2 −2
1 −1
If you recall from last section, this means that one vector is a scaled version of the other, so that
linear transformation compresses all of 2D space onto the line where those two vectors sit. This is
also known as the one-dimensional span of those two linearly dependent vectors.
To sum up, linear transformations are a way to move around space such that the grid lines remain
parallel and evenly spaced and such that the origin remains fixed. Delightfully, these transformations
can be described using only a handful of numbers: the coordinates of where each basis vector lands.
Matrices give us a language to describe these transformations where the columns represent those
coordinates and matrix-vector multiplication is just a way to compute what that transformation does
to a given vector. The important take-away here is that every time you see a matrix, you can interpret
it as a certain transformation of space. Once you really digest this idea, you’re in a great position
to understand linear algebra deeply. Almost all of the topics coming up, from matrix multiplication
to determinants, eigenvalues, etc. will become easier to understand once you start thinking about
matrices as transformations of space.
R See the corresponding Essence of linear algebra video for a more visual presentation (11 min-
utes) [7].
8.4 Matrix multiplication as composition 69
[ ]
1 −1
1 −0
This new matrix captures the overall effect of applying a rotation then a shear but as one single action
rather than two successive ones.
Here’s one way to think about that new matrix: if you were to feed some vector through the rotation
then the shear, the long way to compute where it ends up is to, first, multiply it on the left by the
rotation matrix; then, take whatever you get and multiply that on the left by the shear matrix.
[ ] ([ ] [ ])
1 1 0 −1 x
0 1 1 0 y
This is, numerically speaking, what it means to apply a rotation then a shear to a given vector, but the
result should be the same as just applying this new composition matrix we found to that same vector.
This applies to any vector because this new matrix is supposed to capture the same overall effect as
the rotation-then-shear action.
[ ] ([ ] [ ]) [ ][ ]
1 1 0 −1 x 1 −1 x
=
0 1 1 0 y 1 0 y
Based on how things are written down here, it’s reasonable to call this new matrix the “product” of
the original two matrices.
[ ][ ] [ ]
1 1 0 −1 1 −1
=
0 1 1 0 1 0
We can think about how to compute that product more generally in just a moment, but it’s way too
easy to get lost in the forest of numbers. Always remember that multiplying two matrices like this
has the geometric meaning of applying one transformation then another.
One oddity here is that we are reading the transformations from right to left; you first apply the
transformation represented by the matrix on the right, then you apply the transformation represented
by the matrix on the left. This stems from function notation, since we write functions on the left of
variables, so every time you compose two functions, you always have to read it right to left.
Let’s look at another example. Take the matrix with columns (1, 1) and (−2, 0).
70 Chapter 8. Linear algebra
[ ]
1 −2
M1 =
1 0
Next, take the matrix with columns (0, 1) and (2, 0).
[ ]
0 2
M2 =
1 0
The total effect of applying M1 then M2 gives us a new transformation, so let’s find its matrix. First,
we need to determine where î goes. After applying M1 , the new coordinates of î, by definition, are
given by that first column of M1 , namely, (1, 1). To see what happens after applying M2 , multiply
the matrix for M2 by that vector (1, 1). Working it out the way described in the last section, you’ll
get the vector (2, 1).
[ ][ ] [ ] [ ] [ ]
0 2 1 0 2 2
=1 +1 =
1 0 1 1 0 1
This will be the first column of the composition matrix. Likewise, to follow ĵ, the second column of
M1 tells us that it first lands on (−2, 0). Then, when we apply M2 to that vector, you can work out
the matrix-vector product to get (0, −2).
[ ][ ] [ ] [ ] [ ]
0 2 −2 0 2 0
= −2 +0 =
1 0 0 1 0 −2
[ ][ ] [ ]
0 2 1 −2 2 0
=
1 0 1 0 1 −2
[ ][ ] [ ]
a b e f ? ?
=
c d g h ? ?
To follow where î goes, start by looking at the first column of the matrix on the right, since this is
where î initially lands. Multiplying that column by the matrix on the left is how you can tell where
the intermediate version of î ends up after applying the second transformation.
[ ][ ] [ ] [ ] [ ]
a b e a b ae + bg
=e +g =
c d g c d ce + dg
So the first column of the composition matrix will always equal the left matrix times the first column
of the right matrix. Likewise, ĵ will always initially land on the second column of the right matrix,
8.5 The determinant 71
so multiplying by this second column will give its final location, and hence, that’s the second column
of the composition matrix.
[ ][ ] [ ] [ ] [ ]
a b f a b af + bh
=f +h =
c d h c d cf + dh
[ ][ ] [ ]
a b e f ae + bg af + bh
=
c d g h ce + dg cf + dh
Notice there’s a lot of symbols here, and it’s common to be taught this formula as something to
memorize along with a certain algorithmic process to help remember it. Before memorizing that
process, you should get in the habit of thinking about what matrix multiplication really represents:
applying one transformation after another. This will give you a much better conceptual framework
that makes the properties of matrix multiplication much easier to understand.
?
(AB)C = A(BC)
If you try to work through this numerically, it’s horrible, and unenligthening for that matter. However,
when you think about matrix multiplication as applying one transformation after another, this property
is just trivial. Can you see why? What it’s saying is that if you first apply C then B, then A, it’s the
same as applying C, then B then A. There’s nothing to prove, you’re just applying the same three
things one after the other all in the same order. This might feel like cheating, but it’s not. This is a
valid proof that matrix multiplication is associative, and even better than that, it’s a good explanation
for why that property should be true.
R See the corresponding Essence of linear algebra video for a more visual presentation (10 min-
utes) [8].
[ ]
3 0
0 2
It scales î by a factor of 3 and scales ĵ by a factor of 2. Now, if we focus our attention on the one-by-
one square whose bottom sits on î and whose left side sits on ĵ, after the transformation, this turns
into a 2 by 3 rectangle. Since this region started out with area 1 and ended up with area 6, we can say
the linear transformation has scaled its area by a factor of 6. Compare that to a shear whose matrix
has columns (1, 0) and (1, 1) meaning î stays in place and ĵ moves over to (1, 1).
[ ]
1 1
0 1
That same unit square determined by î and ĵ gets slanted and turned into a parallelogram, but the
area of that parallelogram is still 1 since its base and height each continue to each have length 1. Even
though this transformation pushes things about, it seems to leave areas unchanged (at least in the case
of that one uint square).
Actually though, if you know how much the area of that one single unit square changes, you can know
how the area of any possible region in space changes. First off, notice that whatever happens to one
square in the grid has to happen to any other square in the grid no matter the size. This follows from
the fact that grid lines remain parallel and evenly spaced. Then, any shape that’s not a grid square can
be approximated by grid squares pretty well with arbitrarily good approximations if you use small
enough grid squares. So, since the areas of all those tiny grid squares are being scaled by some single
amount, the area of the shape as a whole will also be scaled by that same single amount.
([ ])
0 2
det =3
−1.5 1
The determinant of a matrix is commonly denoted by vertical bars instead of square brackets.
0 2
−1.5 1 = 3
1
The determinant of a transformation would be 2 if it compresses all areas by a factor of 12 .
8.5 The determinant 73
0.5 0.5
−0.5 0.5 = 0.5
The determinant of a 2D transformation is zero if it compresses all of space onto a line or even onto
a single point since then, the area of any region would become zero.
4 2
2 1 = 0
That last example proved to be pretty important. It means checking if the determinant of a given
matrix is zero will give a way of computing whether the transformation associated with that matrix
compresses everything into a smaller dimension.
This analogy so far isn’t quite right. The full concept of a determinant allows for negative values.
1 2
3 4 = −2
What would scaling an area by a negative amount even mean? This has to do with the idea of ori-
entation. A 2D transformation with a negative determinant essentially flips space over. Any trans-
formations that do this are said to “invert the orientation of space”. Another way to think about it
is in terms of î and ĵ. In their starting positions, ĵ is to the left of î. If, after a transformation, ĵ is
now on the right side of î, the orientation of space has been inverted. Whenever this happens, the
determinant will be negative. The absolute value of the determinant still tells you the factor by which
areas have been scaled.
For example, the matrix with columns (1, 1) and (2, −1) encodes a transformation that has determi-
nant −3.
1 2
1 −1 = −3
This means that space gets flipped over and areas are scaled by a factor of 3.
Why would this idea of a negative area scaling factor be a natural way to describe orientation-flipping?
Think about the series of transformations you get by slowly letting î rotate closer and closer to ĵ. As
î gets closer, all the areas in space are getting compressed more and more meaning the determinant
approaches zero. Once î lines up perfectly with ĵ, the determinant is zero. Then, if î continues,
doesn’t it feel natural for the determinant to keep decreasing into negative numbers?
direction of k̂. If you can still do that after the transformation, orientation has not changed and the
determinant is positive. Otherwise, if after the transformation it only makes sense to do that with
your left hand, orientation has been flipped and the determinant is negative.
Here’s part of an intution for where this formula comes from. Let’s say that the terms b and c were
both zero. Then, the term a tells you how much î is stretched in the x-direction and the term d tells
you how much ĵ is stretched in the y-direction. Since those other terms are zero, it should make
sense that ad gives the area of the rectangle that the unit square turns into. Even if only one of b
or c are zero, you’ll have a parallelogram with a base of a and a height d, so the area should still
be ad. Loosely speaking, if both b and c are nonzero, then that bc term tells you how much this
parallelogram is stretched or compressed in the diagonal direction.
If you feel like computing determinants by hand is something that you need to know (you won’t for
this book), the only way to get it down is to just practice it with a few. This is all triply true for 3D
determinants. There is a formula, and if you feel like that’s something you need to know, you should
practice with a few matrices.
a b c
e f d f d e
d e f = a
h i − b g i + c g h
g h i
We don’t think those computations fall within the essence of linear algebra, but understanding what
the determinant represents falls within that essence.
R See the corresponding Essence of linear algebra video for a more visual presentation (10 min-
utes) [10].
just about any technical discipline, is that it lets us solve certain systems of equations. When we
say “system of equations”, we mean there is a list of variables, things you don’t know, and a list of
equations relating them. For example,
6x − 3y + 2z = 7
x + 2y + 5z = 0
2x − 8y − z = −2
2x + 5y + 3z = −3
4x + 0y + 8z = 0
1x + 3y + 0z = 2
This is called a “linear system of equations”. You might notice that this looks a lot like matrix-
vector multiplication. In fact, you can package all of the equations together into a single vector
equation, where you have the matrix containing all the constant coefficients, a vector containing all
the constant coefficients, and a vector containing all the variables. Their matrix-vector product equals
some different constant vector.
2 5 3 x −3
4 0 8 y = 0
1 3 0 z 2
Let’s name that constant matrix A, denote the vector holding the variables with x, and call the con-
stant vector on the right-hand side v. This is more than just a notational trick to get our system of
equations written on one line. It sheds light on a pretty cool geometric interpretation for the problem.
Ax = v
The matrix A corresponds with some linear transformation, so solving Ax = v means we’re looking
for a vector x which, after applying the transformation A, lands on v.
Think about what’s happening here for a moment. You can hold in your head this really complicated
idea of multiple variables all intermingling with each other just by thinking about compressing or
morphing space and trying to determine which vector lands on another.
76 Chapter 8. Linear algebra
To start simple, let’s say you have a system with two equations and two unknowns. This means the
matrix A is a 2 × 2 matrix, and v and x are each two-dimensional vectors.
2x + 2y = −4
1x + 3y = −1
[ ][ ] [ ]
2 2 x −4
=
1 3 y −1
8.6.2 Inverse
How we think about the solutions to this equation depends on whether the transformation associated
with A compresses all of space into a lower dimension, like a line or a point, or if it leaves everything
spanning the full two dimensions where it started. In the language of the last section, we subdivide
into the case where A has zero determinant and the case where A has nonzero determinant.
Let’s start with the most likely case where the determinant is nonzero, meaning space does not get
compressed into a zero area region. In this case, there will always be one and only one vector that
lands on v, and you can find it by playing the transformation in reverse. Following where v goes as
we undo the transformation, you’ll find the vector x such that A times x equals v.
When you play the transformation in reverse, it actually corresponds to a separate linear transforma-
tion, commonly called the “inverse of A” denoted A−1 .
[ ]−1
−1 3 1
A =
0 2
For example, if A was a counterclockwise rotation by 90°, then the inverse of A would be a clockwise
rotation by 90°.
[ ] [ ]
0 −1 0 1
A= A−1 =
1 0 −1 0
If A was a rightward shear that pushes ĵ one unit to the right, the inverse of A would be a leftward
shear that pushes ĵ one unit to the left.
In general, A−1 is the unique transformation with the property that if you first apply A, then follow
it with the transformation A−1 , you end up back where you started. Applying one transformation
after another is captured algebraically with matrix multiplication, so the core property of this trans-
formation A−1 is that A−1 A equals the matrix that corresponds to doing nothing.
The transformation that does nothing is called the “identity transformation”. It leaves î and ĵ each
where they are, unmoved, so its columns are (1, 0) and (0, 1).
[ ]
−1 1 0
A A=
0 1
Once you find this inverse, which in practice, you do with a computer, you can solve your equation
by multipling this inverse matrix by v.
8.6 Inverse matrices, column space, and null space 77
Ax = v
−1
A Ax = A−1 v
x = A−1 v
Again, what this means geometrically is that you’re playing the transformation in reverse and following
v. This nonzero determinant case, which for a random choice of matrix is by far the most likely one,
corresponds with the idea that if you have two unknowns and two equations, it’s almost certainly the
case that there’s a single, unique solution.
This idea also makes sense in higher dimensions when the number of equations equals the number
of unknowns. Again, the system of equations can be translated to the geometric interpretation where
you have some transformation, A, some vector v, and you’re looking for the vector x that lands on v.
As long as the transformation A doesn’t compress all of space into a lower dimension, meaning, its
determinant is nonzero, there will be an inverse transformation, A−1 , with the property that if you
first do A, then you do A−1 , it’s the same as doing nothing. To solve your equation, you just have to
multiply that reverse transformation matrix by the vector v.
When the determinant is zero and the transformation associated with this system of equations com-
presses space into a smaller dimension, there is no inverse. You cannot uncompress a line to turn it
into a plane. At least, that’s not something that a function can do. That would require transforming
each individual vector into a whole line full of vectors, but functions can only take a single input to
a single output.
Similarly, for three equations and three unknowns, there will be no inverse if the corresponding
transformation compresses 3D space onto the plane, or even if it compresses it onto a line, or a point.
Those all correspond to a determinant of zero since any region is compressed into something with
zero volume.
It’s still possible that a solution exists even when there is no inverse. It’s just that when your trans-
formation compresses space onto, say, a line, you have to be lucky enough that the vector v exists
somewhere on that line.
vectors gives you all possible outputs. In other words, the column space is the span of the columns
of your matrix, so a more precise definition of rank would be that it’s the number of dimensions in
the column space. When this rank is as high as it can be, meaning it equals the number of columns,
we call the matrix “full rank”.
This set of vectors that lands on the origin is called the null space or the kernel of your matrix. It’s
the space of all vectors that become null in the sense that they land on the zero vector. In terms of
the linear system of equations Ax = v, when v happens to be the zero vector, the null space gives
you all the possible solutions to the equation.
Again, there’s a lot not covered here, most notably how to compute these things. We also had to limit
the scope to examples where the number of equations equals the number of unknowns. The goal here
is not to try to teach everything: it’s that you come away with a strong intuition for inverse matrices,
column space, and null space, and that those intuitions make any future learning that you do more
fruitful.
R See the corresponding Essence of linear algebra video for a more visual presentation (12 min-
utes) [5].
By now, you have most of the background you need to start pondering a question like this on your
own, but we’ll start talking through it, just to give a little mental momentum.
It’s perfectly reasonable to talk about transformations between dimensions, such as one that takes 2D
vectors to 3D vectors. Again, what makes one of these linear is that grid lines remain parallel and
evenly spaced, and that the origin maps to the origin.
8.8 Eigenvectors and eigenvalues 79
Encoding one of these transformations with a matrix the same as what we’ve done before. You look
at where each basis vector lands and write the coordinates of the landing spots as the coordinates
of the landing spots as the columns of a matrix. For example, the following is a transformation that
takes î to the coordinates (2, −1, −2) and ĵ to the coordinates (0, 1, 1).
2 0
−1 1
−2 1
Notice, this means the matrix encoding our transformation has three rows and two columns, which,
to use standard terminology, makes it a 3 × 2 matrix. In the language of last section, the column
space of this matrix, the place where all the vectors land, is a 2D plane slicing through the origin of
3D space. The matrix is still full rank since the number of dimensions in this column space is the
same as the number of dimensions of the input space.
If you see a 3 × 2 matrix out in the wild, you can know that it has the geometric interpretation of
mapping two dimensions to three dimensions since the two columns indicate that the input space has
two basis vectors, and the three rows indicate that the landing spots for each of those basis vectors is
described with three separate coordinates.
For a 2 × 3 matrix, the three columns indicate a starting space that has three basis vectors, so it
starts in three dimensions; and the two rows indicate that the landing spot for each of those three
basis vectors is described with only two coordinates, so they must be landing in two dimensions. It’s
a transformation from 3D space onto the 2D plane.
You could also have a transformation from two dimensions to one dimension. One-dimensional space
is really just the number line, so a transformation like this takes in 2D vectors and returns numbers.
Thinking about gridlines remaining parallel and evenly spaced is messy due to all the compression
happening here, so in this case, the visual understanding for what linearity means is that if you have a
line of evenly spaced dots, it would remain evenly spaced once they’re mapped onto the number line.
One of these transformations is encoded with a 1 × 2 matrix, each of whose two columns has just a
single entry. The two columns represent where the basis vectors land, and each one of those columns
requires just one number, the number that that basis vector landed on.
R See the corresponding Essence of linear algebra video for a more visual presentation (4 minutes)
[9].
[ ]
3 1
0 2
Focus in on what it does to one particular vector and think about the span of that vector, the line
passing through its origin and its tip. Most vectors are going to get knocked off their span during
80 Chapter 8. Linear algebra
the transformation, but some special vectors do remain on their own span meaning the effect that the
matrix has on such a vector is just to stretch it or compress it like a scalar.
For this specific example, the basis vector î is one such special vector. The span of î is the x-axis,
and from the first column of the matrix, we can see that î moves over to three times itself still on that
x-axis. What’s more, due to the way linear transformations work, any other vector on the x-axis is
also just stretched by a factor of 3, and hence, remains on its own span.
A slightly sneakier vector that remains on its own span during this transformation is (−1, 1). It ends
up getting stretched by a factor of 2. Again, linearity is going to imply that any other vector on the
diagonal line spanned by this vector is just going to get stretched out by a factor of 2.
For this transformation, those are all the vectors with this special property of staying on their span.
Those on the x-axis get stretched out by a factor of 3 and those on the diagonal line get stretched
out by a factor of 2. Any other vector is going to get rotated somewhat during the transformation
and knocked off the line that it spans. As you might have guessed by now, these special vectors are
called the eigenvectors of the transformation, and each eigenvector has associated with it an eigenvalue,
which is just the factor by which it’s stretched or compressed during the transformation.
Of course, there’s nothing special about stretching vs compressing or the fact that these eigenval-
ues happen to be positive. In another example, you could have an eigenvector with eigenvalue − 12 ,
meaning that the vector gets flipped and compressed by a factor of 12 .
[ ]
0.5 −1
−1 0.5
The important part here is that it stays on the line that it spans out without getting rotated off of it.
I won’t cover the full details on methods for computing eigenvectors and eigenvalues here, but I’ll try
to give an overview of the computational ideas that are most important for a conceptual understanding.
Symbolically, an eigenvector look like the following
Av = λv
8.8 Eigenvectors and eigenvalues 81
A is the matrix representing some transformation, v is the eigenvector, and λ is a number, namely
the corresponding eigenvalue. This expression is saying that the matrix-vector product Av gives the
same result as just scaling the eigenvector v by some value λ. Finding the eigenvectors and their
eigenvalues of the matrix A involves finding the values of v and λ that make this expression true.
It’s awkward to work with at first because that left-hand side represents matrix-vector multiplication,
but the right-hand side is scalar-vector multiplication. Let’s rewrite the right-hand side as some kind
of matrix-vector multiplication using a matrix which has the effect of scaling any vector by a factor
of λ. The columns of such a matrix will represent what happens to each basis vector, and each basis
vector is simply multiplied by λ, so this matrix will have the number λ down the diagonal and zeroes
everywhere else.
λ 0 0
0 λ 0
0 0 λ
The common way to write this is to factor out λ and write it as λI where I is the identity matrix with
ones down the diagonal.
Av = (λI)v
With both sides looking like matrix-vector multiplication, we can subtract off that right-hand side
and factor out v.
Av − (λI)v = 0
(A − λI)v = 0
We now have a new matrix A − λI, and we’re looking for a vector v such that this new matrix times
v gives the zero vector. This will always be true if v itself is the zero vector, but that’s boring. We
want a nonzero eigenvector. The only way it’s possible for the product of a matrix with a nonzero
vector to become zero is if the transformation associated with that matrix compresses space into a
lower dimension. That compression corresponds to a zero determinant for the matrix.
det(A − λI) = 0
To be concrete, let’s say your matrix A has columns (2, 1) and (2, 3), and think about subtracting
off a variable amount λ.
([ ])
2−λ 2
det =0
1 3−λ
The goal is to find a value of λ that will make this determinant zero meaning the tweaked transfor-
mation compresses space into a lower dimension. In this case, that value is λ = 1. Of course, if we
had chosen some other matrix, the eigenvalue might not necessarily be 1.
This is kind of a lot, but let’s unravel what this is saying. When λ = 1, the matrix A − λI compresses
space onto a line. That means there’s a nonzero vector v such that (A − λI)v equals the zero vector.
82 Chapter 8. Linear algebra
(A − λI)v = 0
Remember, we care about that because it means Av = λv, which you can read off as saying that
the vector v is an eigenvector of A staying on its own span during the transformation A. For the
following example
[ ]
2 2
v = 1v
1 3
Av = λv
Av − λIv = 0
(A − λI)v = 0
det(A − λI) = 0
To see this in action, let’s visit the example from the start with a matrix whose columns are (3, 0) and
(1, 2). To determine if a value λ is an eigenvalue, subtract it from the diagonals of this matrix and
compute the determinant.
[ ]
3 1
0 2
[ ]
3−λ 1
0 2−λ
([ ])
3−λ 1
det = (3 − λ)(2 − λ) − 1 · 0
0 2−λ
= (3 − λ)(2 − λ)
We get a certain quadratic polynomial in λ. Since λ can only be an eigenvalue if this determinant
happens to be zero, you can conclude that the only possible eigenvalues are λ = 2 and λ = 3.
To determine what the eigenvectors are that actually have one of these eigenvalues, say λ = 2, plug
in that value of λ to the matrix and then solve for which vectors this diagonally altered matrix sends
to zero.
[ ][ ] [ ]
3−2 1 x 0
=
0 2−2 y 0
If you computed this the way you would any other linear system, you’d see that the solutions are all
the vectors on the diagonal line spanned by (−1, 1). This corresponds to the fact that the unaltered
matrix has the effect of stretching all those vectors by a factor of 2.
8.8 Eigenvectors and eigenvalues 83
[ ]
0 −1
1 0
This doesn’t have any eigenvectors since it rotates every vector off its own span. If you actually tried
computing the eigenvalues of a rotation like this, notice what happens.
[ ]
0 −1
1 0
[ ]
−λ −1
1 −λ
([ ])
−λ −1
det = (−λ)(−λ) − (−1)(1)
1 −λ
= λ2 + 1 = 0
The only roots of that polynomial are the imaginary numbers i and −i. The fact that there are no
real number solutions indicates that there are no eigenvectors.
R Interestingly though, the fact that multiplication by i in the complex plane looks like a 90°
rotation is related to the fact that i is an eigenvalue of this transformation of 2D real vectors.
The specifics of this are out of scope, but note that eigenvalues which are complex numbers
generally correspond to some kind of rotation in the transformation.
[ ]
1 1
0 1
All the vectors on the x-axis are eigenvectors with eigenvalue 1. In fact, these are the only eigenvec-
tors.
([ ])
1−λ 1
det = (1 − λ)(1 − λ) = 0
0 1−λ
(1 − λ)2 = 0
[ ]
2 0
0 2
The only eigenvalue is 2, but every vector in the plane gets to be an eigenvector with that eigenvalue.
R See the corresponding Essence of linear algebra video for a more visual presentation (17 min-
utes) [2].
1 0 0
0 1 0
0 0 1
The matrix denoted by 0m×n is a matrix filled with zeroes with m rows and n columns.
The T in AT denotes transpose, which flips the matrix across its diagonal such that the rows become
columns and vice versa.
The † in B† denotes the Moore-Penrose pseudoinverse given by B† = (BT B)−1 BT . The pseudoin-
verse is used when the matrix is nonsquare and thus not invertible to produce a close approximation
of an inverse in the least squares sense.
Night sky above Dufour Street in Santa Cruz, CA
9. State-space controllers
R Chapters from here on use the frccontrol Python package to demonstrate the concepts dis-
cussed and perform the complex math required. See appendix B for how to install it.
When we want to command a system to a set of states, we design a controller with certain control laws
to do it. PID controllers use the system outputs with proportional, integral, and derivative control
laws. In state-space, we also have knowledge of the system states so we can do better.
Modern control theory uses state-space representation to model and control systems. State-space
representation models systems as a set of state, input, and output variables related by first-order
differential equations that describe how the system’s state changes over time given the current states
and inputs.
Model-based control has a completely different mindset. Controls designers using model-based con-
trol care about developing an accurate model of the system, then driving the states they care about
to zero (or to a reference). Integral control is added with uerror estimation if needed to handle
model uncertainty, but we prefer not to use it because its response is hard to tune and some of its
destabilizing dynamics aren’t visible during simulation.
86 Chapter 9. State-space controllers
( )
ω = ωmax 1 − e−t
where ω is the angular velocity and ωmax is the maximum angular velocity. If DC brushed motors
are said to behave linearly, then why is this?
Linearity refers to a system’s equations of motion, not its time domain response. The equation defin-
ing the motor’s change in angular velocity over time looks like
ω̇ = −aω + bV
where ω̇ is the derivative of ω with respect to time, V is the input voltage, and a and b are constants
specific to the motor. This equation, unlike the one shown before, is actually linear because it only
consists of multiplications and additions relating the input V and current state ω.
Also of note is that the relation between the input voltage and the angular velocity of the output
shaft is a linear regression. You’ll see why if you model a DC brushed motor as a voltage source
and generator producing back-EMF (in the equation above, bV corresponds to the voltage source
and −aω corresponds to the back-EMF). As you increase the input voltage, the back-EMF increases
linearly with the motor’s angular velocity. If there was a friction term that varied with the angular
velocity squared (air resistance is one example), the relation from input to output would be a curve.
Friction that scales with just the angular velocity would result in a lower maximum angular velocity,
but because that term can be lumped into the back-EMF term, the response is still linear.
q × p Laplace transforms to represent it. Not only is the resulting algebra unwieldy, but it only works
for linear systems. Including nonzero initial conditions complicates the algebra even more. State-
space representation uses the time domain instead of the Laplace domain, so it can model nonlinear
systems1 and trivially supports nonzero initial conditions.
Students are still taught classical control first because it provides a framework within which to under-
stand the results we get from the fancy mathematical machinery of modern control.
ẋ = Ax + Bu (9.1)
y = Cx + Du (9.2)
In the continuous case, the change in state and the output are linear combinations of the state vector
and the input vector. The A and B matrices are used to map the state vector x and the input vector
u to a change in the state vector ẋ. The C and D matrices are used to map the state vector x and
the input vector u to an output vector y.
9.4 Controllability
State controllability implies that it is possible – by admissible inputs – to steer the states from any
initial value to any final value within some finite time window.
1
This book focuses on analysis and control of linear systems. See chapter 12 for more on nonlinear control.
88 Chapter 9. State-space controllers
([ ])
rank B AB A2 B · · · An−1 B = n (9.5)
where rank is the number of linearly independent rows in a matrix and n is the number of state
variables.
The matrix in equation (9.5) being rank-deficient means the inputs cannot apply transforms along all
axes in the state-space; the transformation the matrix represents is collapsed into a lower dimension.
The condition number of the controllability matrix C is defined as σσmax (C)
min (C)
where σmax is the max-
2
imum singular value and σmin is the minimum singular value. As this number approaches infinity,
one or more of the states becomes uncontrollable. This number can also be used to tell us which actu-
ators are better than others for the given system; a lower condition number means that the actuators
have more control authority.
9.5 Observability
Observability is a measure for how well internal states of a system can be inferred by knowledge of
its external outputs. The observability and controllability of a system are mathematical duals (i.e., as
controllability proves that an input is available that brings any initial state to any desired final state,
observability proves that knowing enough output values provides enough information to predict the
initial state of the system).
Theorem 9.5.1 — Observability. A continuous time-invariant linear state-space model is ob-
servable if and only if
C
CA
rank = n
.. (9.6)
.
CA n−1
where rank is the number of linearly independent rows in a matrix and n is the number of state
variables.
The matrix in equation (9.6) being rank-deficient means the outputs do not contain contributions from
every state. That is, not all states are mapped to a linear commbination in the output. Therefore, the
outputs alone are insufficient to estimate all the states.
The condition number of the observability matrix O is defined as σσmax (O)
min (O)
where σmax is the maxi-
2
mum singular value and σmin is the minimum singular value. As this number approaches infinity,
one or more of the states becomes unobservable. This number can also be used to tell us which
sensors are better than others for the given system; a lower condition number means the outputs
produced by the sensors are better indicators of the system state.
2
Singular values are a generalization of eigenvalues for nonsquare matrices.
9.6 Closed-loop controller 89
ẋ = Ax + BK(r − x)
ẋ = Ax + BKr − BKx
ẋ = (A − BK)x + BKr (9.7)
Now for the output equation. Substitute the control law into equation (9.2).
y = Cx + D(K(r − x))
y = Cx + DKr − DKx
y = (C − DK)x + DKr (9.8)
Now, we’ll do the same for the discrete system. We’d like to know whether the system defined by
equation (9.3) operating with the control law uk = K(rk − xk ) converges to the reference rk .
Instead of commanding the system to a state using the vector u directly, we can now specify a vector of
desired states through r and the controller will choose values of u for us over time to make the system
90 Chapter 9. State-space controllers
converge to the reference. For equation (9.9) to reach steady-state, the eigenvalues of A − BK must
be in the left-half plane. For equation (9.11) to have a bounded output, the eigenvalues of A − BK
must be within the unit circle.
The eigenvalues of A − BK are the poles of the closed-loop system. Therefore, the rate of conver-
gence and stability of the closed-loop system can be changed by moving the poles via the eigenvalues
of A − BK. A and B are inherent to the system, but K can be chosen arbitrarily by the controller
designer.
In general, pole placement should only be used if you know what you’re doing. It’s much easier to let
LQR place the poles for you, then use those as a starting point for pole placement.
9.8 LQR
Instead of placing the poles of a closed-loop system manually, LQR design places the poles for us
based on acceptable error and control effort constraints. “LQR” stands for “Linear-Quadratic Reg-
ulator”. This method of controller design uses a quadratic function for the cost-to-go defined as the
sum of the error and control effort over time for the linear system ẋ = Ax + Bu.
∫∞
( )
J= xT Qx + uT Ru dt
0
where J represents a tradeoff between state excursion and control effort with the weighting factors
Q and R. LQR finds a control law u that minimizes the cost function. Q and R slide the cost along
a Pareto boundary between state tracking and control effort (see figure 9.1). Pareto optimality for
this problem means that an improvement in state tracking cannot be obtained without using more
control effort to do so. Also, a reduction in control effort cannot be obtained without sacrificing state
tracking performance. Pole placement, on the other hand, will have a cost anywhere on, above, or to
the right of the Pareto boundary (no cost can be inside the boundary).
9.8 LQR 91
The minimum of LQR’s cost function is found by setting the derivative of the cost function to zero
and solving for the control law u. However, matrix calculus is used instead of normal calculus to take
the derivative.
The feedback control law that minimizes J, which we’ll call the “optimal control law”, is shown in
theorem 9.8.1.
Theorem 9.8.1 — Optimal control law.
u = −Kx (9.13)
This means that optimal control can be achieved with simply a set of proportional gains on all the
states. This control law will make all states converge to zero assuming the system is controllable. To
converge to nonzero states, a reference vector r can be added to the state x.
Theorem 9.8.2 — Optimal control law with nonzero reference.
u = K(r − x) (9.14)
To use the control law, we need knowledge of the full state of the system. That means we either have
to measure all our states directly or estimate those we do not measure.
See appendix D.2 for how K is calculated in Python. If the result is finite, the controller is guaranteed
to be stable and robust with a phase margin of 60 degrees [20].
R LQR design’s Q and R matrices don’t need discretization, but the K calculated for continuous
time and discrete time systems will be different.
92 Chapter 9. State-space controllers
∫∞ ( [( )2 ( )2 ] [( )2 ( )2 ])
x1 xn u1 un
J= ρ + ... + + + ... + dt
x1,max xn,max u1,max un,max
0
ρ 1
x21,max
0 ... 0 u21,max
0 ... 0
.. ..
ρ
. 1
.
0 x22,max 0 u22,max
Q= R=
.. .. .. ..
. . 0 . . 0
ρ 1
0 ... 0 x2n,max
0 ... 0 u2n,max
Small values of ρ penalize control effort while large values of ρ penalize state excursions. Large
values would be chosen in applications like fighter jets where performance is necessary. Spacecrafts
would use small values to conserve their limited fuel supply.
[ ] [ ]
− Jb Kt
0 [ ] [ ]
A= J B= C= 1 0 D= 0
− KLe −RL
1
L
Figure 9.2 shows the response using poles placed at (0.1, 0) and (0.9, 0) and LQR with the following
cost matrices.
[ ]
1
0 [ 1
]
Q= 202 R=
1 122
0 402
LQR selected poles at (0.593, 0) and (0.955, 0). Notice with pole placement that as the current pole
moves left, the control effort becomes more aggressive.
9.10 Model augmentation 93
Figure 9.2: Second-order CIM motor response with pole placement and LQR
Matrix augmentation is the process of appending rows or columns to a matrix. In state-space, there
are several common types of augmentation used: plant augmentation, controller augmentation, and
observer augmentation.
By augmenting the plant with a bias term with no dynamics (represented by zeroes in its rows in A
and B, the observer will attempt to estimate a value for this bias term that makes the model best
reflect the measurements taken of the real system. Note that we’re not collecting any data on this bias
term directly; it’s what’s known as a hidden state. Rather than our inputs and other states affecting
it directly, the observer determines a value for it based on what is most likely given the model and
94 Chapter 9. State-space controllers
current measurements. We just tell the plant what kind of dynamics the term has and the observer
will estimate it for us.
y = Cx + Du
[ ] [ ] [ ]
y C D
= x+ u
u −K 0
9.10.5 Examples
Snippet 9.1 shows how one packs together the following augmented matrix in Python.
[ ]
A−I B
C D
import numpy as np
# fmt: off
A = np. matrix ([[-b / J, Kt / J],
[-Ke / L, -R / L]])
B = np. matrix ([[0] ,
[1 / L]])
C = np. matrix ([[1 , 0]])
D = np. matrix ([[0]])
# fmt: on
Section 9.12 demonstrates model augmentation for different types of integral control.
9.11 Feedforwards
Feedforwards are used to inject information about either the system’s dynamics (like a model does)
or the intended movement into a controller. Feedforward is generally used to handle parts of the
control actions we already know must be applied to make a system track a reference, then let the
feedback controller correct for at runtime what we do not or cannot know about the system. We will
present two ways of implementing feedforward for state feedback.
xc = Nx yc
Nx converts desired outputs yc to desired states xc (also known as r). For steady-state, that is
The second steady-state feedforward converts the desired outputs y to the control input required at
steady-state.
uc = Nu yc
Nu converts the desired outputs y to the control input u required at steady-state. For steady-state,
that is
96 Chapter 9. State-space controllers
Continuous case
To find the control input required at steady-state, set equation (9.1) to zero.
ẋ = Ax + Bu
y = Cx + Du
0 = Axss + Buss
yss = Cxss + Duss
[ ] [ ]
0 ANx + BNu
= y
yss CNx + DNu ss
[ ] [ ]
0 ANx + BNu
=
1 CNx + DNu
[ ] [ ][ ]
0 A B Nx
=
1 C D Nu
[ ] [ ]† [ ]
Nx A B 0
=
Nu C D 1
Discrete case
Now, we’ll do the same thing for the discrete system. To find the control input required at steady-state,
set equation (9.3) to zero.
0 = (A − I)xss + Buss
yss = Cxss + Duss
[ ] [ ]
0 (A − I)Nx + BNu
= yss
yss CNx + DNu
[ ] [ ]
0 (A − I)Nx + BNu
=
1 CNx + DNu
[ ] [ ][ ]
0 A − I B Nx
=
1 C D Nu
[ ] [ ]† [ ]
Nx A−I B 0
=
Nu C D 1
xss = Nx yss
N†x xss = yss
uss = Nu yss
uss = Nu (N†x xss )
uss = Nu N†x xss
uf f = Nu N†x r
Continuous:
[ ] [ ]† [ ]
Nx A B 0
= (9.17)
Nu C D 1
Discrete:
[ ] [ ]† [ ]
Nx A−I B 0
= (9.18)
Nu C D 1
uf f = Nu N†x r (9.19)
In the augmented matrix, B should contain one column corresponding to an actuator and C should
contain one row whose output will be driven by that actuator. More than one actuator or output can
be included in the computation at once, but the result won’t be the same as if they were computed
independently and summed afterward.
After computing the feedforward for each actuator-output pair, the respective collections of Nx
and Nu matrices can summed to produce the combined feedforward.
If the augmented matrix in theorem 9.11.1 is square (number of inputs = number of outputs), the
normal matrix inverse can be used instead.
where uf f is the feedforward input. Note that this feedforward equation does not and should not
take into account any feedback terms. We want to find the optimal uf f such that we minimize the
tracking error between rk+1 and rk .
To solve for uf f , we need to take the inverse of the nonsquare matrix B. This isn’t possible, but we
can find the pseudoinverse given some constraints on the state tracking error and control effort. To
find the optimal solution for these sorts of trade-offs, one can define a cost function and attempt to
minimize it. To do this, we’ll first solve the expression for 0.
This expression will be the state tracking cost we use in our cost function.
Our cost function will use an H2 norm with Q as the state cost matrix with dimensionality states ×
states and R as the control input cost matrix with dimensionality inputs × inputs.
R rk+1 − Ark will only return a nonzero vector if the reference isn’t following the system dynam-
ics. If it is, the feedback controller already compensates for it. This feedforward compensates
for any unmodeled dynamics reflected in how the reference is changing (or not changing). In
the case of a constant reference, the feedforward opposes any system dynamics that would
change the state over time.
∂(Ax+b)T C(Dx+e)
Theorem 9.11.3 ∂x = AT C(Dx + e) + DT CT (Ax + b)
∂(Ax+b)T C(Ax+b)
Corollary 9.11.4 ∂x = 2AT C(Ax + b) where C is symmetric.
Proof:
∂(Ax + b)T C(Ax + b)
= AT C(Ax + b) + AT CT (Ax + b)
∂x
∂(Ax + b)T C(Ax + b)
= (AT C + AT CT )(Ax + b)
∂x
C is symmetric, so
Given theorem 9.11.2 and corollary 9.11.4, find the minimum of J by taking the partial derivative
with respect to uf f and setting the result to 0.
∂J
= 2BT Q(Buf f − (rk+1 − Ark )) + 2Ruf f
∂uf f
0 = 2BT Q(Buf f − (rk+1 − Ark )) + 2Ruf f
0 = BT Q(Buf f − (rk+1 − Ark )) + Ruf f
0 = BT QBuf f − BT Q(rk+1 − Ark ) + Ruf f
BT QBuf f + Ruf f = BT Q(rk+1 − Ark )
(BT QB + R)uf f = BT Q(rk+1 − Ark )
uf f = (BT QB + R)−1 BT Q(rk+1 − Ark )
R If the cost matrix Q isn’t included in the cost function (that is, Q is set to the identity matrix),
Kf f becomes the Moore-Penrose pseudoinverse of B given by B† = (BT B)−1 BT .
uf f = Vapp (9.24)
where Vapp is a constant. Another feedforward holds a single-jointed arm steady in the presence of
gravity. It has the following form.
where Vapp is the voltage required to keep the single-jointed arm level with the ground, and θ is
the angle of the arm relative to the ground. Therefore, the force applied is greatest when the arm is
parallel with the ground and zero when the arm is perpendicular to the ground (at that point, the joint
supports all the weight).
Note that the elevator model could be augmented easily enough to include gravity and still be linear,
but this wouldn’t work for the single-jointed arm since a trigonometric function is required to model
the gravitational force in the arm’s rotating reference frame3 .
With integral control added, the reference is always the desired position, but there is no way to tell
the controller the desired velocity.
Consider carefully whether integral control is necessary. One can get relatively close without integral
control, and integral adds all the issues listed above. Below, it is assumed that the controls designer
has determined that integral control will be worth the inconvenience.
There are three methods FRC team 971 has used over the years:
1. Augment the plant as described earlier. For an arm, one would add an “integral of position”
state.
2. Add an integrator to the output of the controller, then estimate the control effort being applied.
971 has called this Delta U control. The upside is that it doesn’t have the windup issue described
above; the integrator only acts if the system isn’t behaving like the model, which was the original
intent. The downside is working with it is very confusing.
3. Estimate an “error” in the observer and compensate for it. This quantity is the difference
between what was applied and what was observed to happen. To use it, you simply add it to
your control input and it will converge.
We’ll present the first and third methods since the third is strictly better than the second.
∫
xI = e dt
ẋI = e = r − Cx
[˙] [ ][] [ ] [ ]
x A 0 x B 0
= + u+ r
xI −C 0 xI 0 I
[˙] [ ][ ] [ ][ ]
x A 0 x B 0 u
= +
xI −C 0 xI 0 I r
u = K(r − x) − KI xI
([ ] [ ])
[ ] r x
u = K KI −
0 xI
ẋ = Ax + B (u + uerror )
9.12 Integral control 103
ẋ = Ax + Bu + Buerror
ẋ = Ax + Bu + Berror uerror
where Berror is the column vector that maps uerror to changes in the rest of the state the same way
B does for u. Berror is only a column of B if uerror corresponds to an existing input within u.
The plant is augmented as
[ ] [ ][ ] [ ]
x˙ A Berror x B
= + u
uerror 0 0 uerror 0
[ ]
[ ] x
y= C 0 + Du
uerror
With this model, the observer will estimate both the state and the uerror term. The controller is
augmented similarly. r is augmented with a zero for the goal uerror term.
u = K (r − x) − kerror uerror
([ ] [ ])
[ ] r x
u = K kerror −
0 uerror
where kerror is a column vector with a 1 in a given row if uerror should be applied to that input or a
0 otherwise.
This process can be repeated for an arbitrary error which can be corrected via some linear combina-
tion of the inputs.
This page intentionally left blank
Chaparral by Merril Apartments at UCSC
The complex plane discussed so far deals with continuous systems. In decades past, plants and con-
trollers were implemented using analog electronics, which are continuous in nature. Nowadays, mi-
croprocessors can be used to achieve cheaper, less complex controller designs. Discretization con-
verts the continuous model we’ve worked with so far from a set of differential equations like
ẋ = x − 3 (10.1)
where the difference equation is run with some update period denoted by T , by ∆T , or sometimes
sloppily by dt.
While higher order terms of a differential equation are derivatives of the state variable (e.g., ẍ in
relation to equation (10.1)), higher order terms of a difference equation are delayed copies of the
state variable (e.g., xk−1 with respect to xk in equation (10.2)).
s-plane z-plane
(0, 0) (1, 0)
imaginary axis edge of unit circle
(−∞, 0) (0, 0)
there are other considerations like control effort, robustness, and noise immunity. These will be
discussed in more detail with LQR and LQE.
If poles from (1, 0) to (0, 0) on the x-axis approach infinity, then what do poles from (−1, 0) to
(0, 0) represent? Them being faster than infinity doesn’t make sense. Poles in this location exhibit
oscillatory behavior similar to complex conjugate pairs. See figures 10.2 and 10.3. The jaggedness
of these signals is due to the frequency of the system dynamics being above the Nyquist frequency.
The discretized signal doesn’t have enough samples to reconstruct the continuous system’s dynamics.
Figure 10.2: Single poles in various locations in Figure 10.3: Complex conjugate poles in vari-
z-plane ous locations in z-plane
1 def
The aliases of a frequency f can be expressed as falias (N ) = |f − N fs |. For example, if a 200 Hz sine wave is
sampled at 150 Hz, the observer will see a 50 Hz signal instead of a 200 Hz one.
108 Chapter 10. Digital control
Figure 10.4: The samples of two sine waves can be identical when at least one of them is at a frequency
above half the sample rate. In this case, the 2 Hz sine wave is above the Nyquist frequency 1.5 Hz.
well.
Forward Euler z = 1 + Ts z = 1 + Ts
1
Reverse Euler z= 1−T s z = 1 + T s + T 2 s2 + T 3 s3 + . . .
Table 10.2: Taylor series expansions of discretization methods (scalar case). The zero-order hold
discretization method is exact.
∞
∑ 1 k
eX = X (10.3)
k!
k=0
To understand why the matrix exponential is used in the discretization process, consider the set of
differential equations ẋ = Ax we use to describe systems (systems also have a Bu term, but we’ll
10.6 The Taylor series 113
ignore it for clarity). The solution to this type of differential equation uses an exponential. Since we
are using matrices and vectors here, we use the matrix exponential.
x(t) = eAt x0
where x0 contains the initial conditions. If the initial state is the current system state, then we can
describe the system’s state over time as
xk+1 = eAT xk
∞ n
∑
t t
e =
n!
n=0
where a finite upper bound on the number of terms produces an approximation of et . As n increases,
the polynomial terms increase in power and the weights by which they are multiplied decrease. For
et and some other functions, the Taylor series expansion equals the original function for all values of
t as the number of terms approaches infinity2 . Figure 10.11 shows the Taylor series expansion of et
around t = 0 for a varying number of terms.
We’ll expand the first few terms of the Taylor series expansion in equation (10.3) for X = AT so
we can compare it with other methods.
∑
3
1 1 1
(AT )k = I + AT + A2 T 2 + A3 T 3
k! 2 6
k=0
Table 10.3 compares the Taylor series expansions of the discretization methods for the matrix case.
These use a more complex formula which we won’t present here.
Table 10.3: Taylor series expansions of discretization methods (matrix case). The zero-order hold
discretization method is exact.
2
Functions for which their Taylor series expansion converges to and also equals it are called analytic functions.
114 Chapter 10. Digital control
Each of them has different stability properties. The bilinear transform preserves the (in)stability of
the continuous time system.
ẋ = Ac x + Bc u + w
y = Cc x + Dc u + v
where w is the process noise, v is the measurement noise, and both are zero-mean white noise sources
with covariances of Qc and Rc respectively. w and v are defined as normally distributed random
variables.
w ∼ N (0, Qc )
v ∼ N (0, Rc )
xk+1 = Ad xk + Bd uk + wk
yk = Cd xk + Dd uk + vk
with covariances
10.7 Zero-order hold for state-space 115
wk ∼ N (0, Qd )
vk ∼ N (0, Rd )
Ad = eAc T (10.4)
∫ T
Bd = eAc τ dτ Bc = A−1
c (Ad − I)Bc (10.5)
0
Cd = Cc (10.6)
Dd = Dc (10.7)
∫ T
T
Qd = eAc τ Qc eAc τ dτ (10.8)
τ =0
1
Rd = Rc (10.9)
T
where a subscript of d denotes discrete, a subscript of c denotes the continuous version of the
corresponding matrix, T is the sample period for the discrete system, and eAc T is the matrix
exponential of Ac .
and Qd is the lower-right quadrant multiplied by the upper-right quadrant [18]. To compute Ad and
Bd in one step, one can utilize the following property.
A B [ ]
T
0 0 Ad Bd
e =
0 I
This page intentionally left blank
Fake plant in hotel lobby in Ventura, CA
Up to now, we’ve just been teaching what tools are available. Now, we’ll go into specifics on how to
apply them and provide advice on certain applications.
The code shown in each example can be obtained from frccontrol’s Git repository at https://
github.com/calcmogul/frccontrol/tree/master/examples. See appendix B for setup in-
structions.
11.1 Pendulum
11.1.1 Write model in state-space representation
Below is the model for a pendulum
g
θ̈ = − sin θ
l
where θ is the angle of the pendulum and l is the length of the pendulum.
Since state-space representation requires that only single derivatives be used, they should be broken up
as separate states. We’ll reassign θ̇ to be ω so the derivatives are easier to keep straight for state-space
representation.
g
ω̇ = − sin θ
l
θ̇ = ω
g
ω̇ = − sin θ
l
118 Chapter 11. State-space model examples
Since this model is nonlinear, we should linearize it. We will use the small angle approximation
(sin θ = θ for small values of θ).
θ̇ = ω
g
ω̇ = − θ
l
[˙] [ ][ ]
θ 0 1 θ
= (11.1)
ω − gl 0 ω
[ ]
C= 1 0
A′ = A − BK
B′ = BK
C′ = C − DK
D′ = DK
11.2 Elevator 119
11.2 Elevator
11.2.1 Continuous state-space model
The position and velocity of the elevator can be written as
ẋm = vm (11.2)
v̇m = am (11.3)
GKt G2 Kt
am = V − vm
Rrm Rr2 mKv
GKt G2 Kt
v̇m = V − vm
Rrm Rr2 mKv
G2 Kt GKt
v̇m =− 2 vm + V (11.4)
Rr mKv Rrm
ẋ = Ax + Bu
y = Cx + Du
[ ]
x
x= y=x u=V
vm
[ ] [ ]
0 1 0 [ ]
A= G2 Kt B = GKt C= 1 0 D=0 (11.5)
0 − Rr2 mKv Rrm
120 Chapter 11. State-space model examples
x
xaug = vm y = x u = V
uerror
[ ] [ ]
A B B [ ]
Aaug = Baug = Caug = C 0 Daug = D (11.6)
01×2 0 0
[ ]
[] r
Kaug = K 1 raug = (11.7)
0
This will compensate for unmodeled dynamics such as gravity. However, using a constant feedfor-
ward to counteract gravity is preferred over this method.
11.2.3 Simulation
Python Control will be used to discretize the model and simulate it. One of the frccontrol examples1
creates and tests a controller for it.
R Python Control currently doesn’t support finding the transmission zeroes of MIMO systems with
a different number of inputs than outputs, so control.pzmap() and frccontrol.System.plot_pzmaps()
fail with an error if Slycot isn’t installed.
Figure 11.1 shows the pole-zero maps for the open-loop system, closed-loop system, and observer.
Figure 11.2 shows the system response with them.
Figure 11.2 shows the system response.
11.2.4 Implementation
The script linked above also generates two files: ElevatorCoeffs.h and ElevatorCoeffs.cpp. These can
be used with the WPILib StateSpacePlant, StateSpaceController, and StateSpaceObserver classes in
C++ and Java. A C++ implementation of this elevator controller is available online2 .
R Instead of implementing uerror estimation to compensate for gravity, one can apply a constant
voltage feedforward since input voltage is proportional to force and gravity is a constant force.
1
https://github.com/calcmogul/frccontrol/blob/master/examples/elevator.py
2
https://github.com/calcmogul/allwpilib/tree/state-space/wpilibcExamples/src/main/cpp/
examples/StateSpaceElevator
11.2 Elevator 121
11.3 Flywheel
11.3.1 Continuous state-space model
By equation (4.20)
G2 Kt GKt
ω̇f = − ωf + V
Kv RJ RJ
ẋ = Ax + Bu
y = Cx + Du
x = ωf y = ωf u=V
2
A = −K
G Kt
v RJ
B= GKt
RJ C=1 D=0 (11.8)
[ ]
ωf
x= y = ωf u=V
uerror
[ ] [ ]
A B B [ ]
Aaug = Baug = Caug = C 0 Daug = D (11.9)
0 0 0
[ ]
[ ] r
Kaug = K 1 raug = (11.10)
0
This will compensate for unmodeled dynamics such as projectiles slowing down the flywheel.
11.3.3 Simulation
Python Control will be used to discretize the model and simulate it. One of the frccontrol examples3
creates and tests a controller for it.
Figure 11.3 shows the pole-zero maps for the open-loop system, closed-loop system, and observer.
Figure 11.4 shows the system response with them.
Notice how the control effort when the reference is reached is nonzero. This is the two-state feedfor-
ward compensating for the system dynamics attempting to slow the flywheel down when no voltage
is applied.
3
https://github.com/calcmogul/frccontrol/blob/master/examples/flywheel.py
11.3 Flywheel 123
11.3.4 Implementation
The script linked above also generates two files: FlywheelCoeffs.h and FlywheelCoeffs.cpp. These
can be used with the WPILib StateSpacePlant, StateSpaceController, and StateSpaceObserver classes
in C++ and Java. A C++ implementation of this flywheel controller is available online4 .
11.4 Drivetrain
11.4.1 Continuous state-space model
The position and velocity of each drivetrain side can be written as
ẋl = vl (11.11)
v̇l = v̇l (11.12)
ẋr = vr (11.13)
v̇r = v̇r (11.14)
( ) ( )
1 rb2 1 rb2
v̇l = + (C1 vl + C2 Vl ) + − (C3 vr + C4 Vr )
m J m J
( ) ( )
1 r2 1 r2
v̇r = − b (C1 vl + C2 Vl ) + + b (C3 vr + C4 Vr )
m J m J
ẋ = Ax + Bu
y = Cx + Du
xl [ ] [ ]
vl xl V
x= y= u= l
xr xr Vr
vr
0 ( 1 ) 0 ( 0 ) ( 0 ) ( 0 )
rb2 rb2 1 r2 r2
0 m − J C3 − Jb C4
1 1
m + J C1 0 m + Jb C2 1
A= B=
m
0 0 0 1 0 0
( 2
) ( 2
) ( 2
) ( 2
)
r r r r
m − J C1 0 m − J C2
1 1 1 1
0 b
m + J C3
b b
m + J C4
b
[ ]
1 0 0 0
C= D = 02×2
0 0 1 0
(11.15)
G2 K 2
where C1 = − KvlRrt2 , C2 = Gl K t
Rr , C3 = − KGvrRr
Kt
2 , and C4 =
Gr Kt
Rr .
4
https://github.com/calcmogul/allwpilib/tree/state-space/wpilibcExamples/src/main/cpp/
examples/StateSpaceFlywheel
11.4 Drivetrain 125
x [ ] [ ]
uerror,l y V
xaug
= yaug = u= l
uerror,r ω Vr
uerror,angle
where ω is the angular rate of the robot’s center of mass measured by a gyroscope.
1
0 [ ]
Bω =
−1
Cω = 0 − 1
2rb 0 1
2rb
[ ] [ ]
A B Bω B
Aaug = Baug =
[ 03×4 0 ]
3×2 0 3×1 [03×2 ] (11.16)
C 02×3 D
Caug = Daug =
Cω 01×3 01×2
The augmentation of A with B maps the left and right wheel velocity uerror terms to their respective
states. The augmentation of A with Bω maps the angular velocity uerror term to corresponding
changes in the left and right wheel positions.
Cω maps the left and right wheel velocities to an angular velocity estimate that the observer can
compare against the gyroscope measurement.
[ ] r
1 0 0 [ ] 0
Kerror = Kaug = K Kerror raug
= (11.17)
0 1 0 0
0
This will compensate for unmodeled dynamics such as understeer due to the wheel friction inherent
in skid-steer robots.
R The process noise for the angular velocity uerror term should be the encoder model uncertainty.
The augmented measurement noise term is obviously for the gyroscope measurement.
126 Chapter 11. State-space model examples
11.4.3 Simulation
Python Control will be used to discretize the model and simulate it. One of the frccontrol examples5
creates and tests a controller for it.
R Python Control currently doesn’t support finding the transmission zeroes of MIMO systems with
a different number of inputs than outputs, so control.pzmap() and frccontrol.System.plot_pzmaps()
fail with an error if Slycot isn’t installed.
Figure 11.5 shows the pole-zero maps for the open-loop system, closed-loop system, and observer.
Figure 11.6 shows the system response with them.
Figure 11.6 shows the system response.
Given the high inertia in drivetrains, it’s better to drive the reference with a motion profile instead of
a step input for reproducibility.
11.4.4 Implementation
The script linked above also generates two files: DrivetrainCoeffs.h and DrivetrainCoeffs.cpp. These
can be used with the WPILib StateSpacePlant, StateSpaceController, and StateSpaceObserver classes
in C++ and Java. A C++ implementation of this drivetrain controller is available online6 .
5
https://github.com/calcmogul/frccontrol/blob/master/examples/drivetrain.py
6
https://github.com/calcmogul/allwpilib/tree/state-space/wpilibcExamples/src/main/cpp/
examples/StateSpaceDrivetrain
11.5 Single-jointed arm 127
By equation (4.32)
G2 Kt GKt
ω̇arm = − ωarm + V
Kv RJ RJ
ẋ = Ax + Bu
y = Cx + Du
[ ]
θarm
x= y = θarm u = V
ωarm
[ ] [ ]
0 1 0 [ ]
A= G2 Kt B = GKt C= 1 0 D=0 (11.20)
0 − Kv RJ RJ
The plant and observer augmentations should be performed before the model is discretized. After the
controller gain is computed with the unaugmented discrete model, the controller may be augmented.
Therefore, the plant and observer augmentations assume a continuous model and the controller aug-
mentation assumes a discrete controller.
[ ]
x
xaug = y = θarm u = V
uerror
[ ] [ ]
A B B [ ]
Aaug = Baug = Caug = C 0 Daug = D (11.21)
01×2 0 0
[ ]
[ ] r
Kaug = K 1 raug = (11.22)
0
This will compensate for unmodeled dynamics such as gravity or other external loading from lifted ob-
jects. However, if only gravity compensation is desired, a feedforward of the form uf f = Vgravity cos θ
is preferred where Vgravity is the voltage required to hold the arm level with the ground and θ is the
angle of the arm with the ground.
11.5.3 Simulation
Python Control will be used to discretize the model and simulate it. One of the frccontrol examples7
creates and tests a controller for it.
R Python Control currently doesn’t support finding the transmission zeroes of MIMO systems with
a different number of inputs than outputs, so control.pzmap() and frccontrol.System.plot_pzmaps()
fail with an error if Slycot isn’t installed.
Figure 11.7 shows the pole-zero maps for the open-loop system, closed-loop system, and observer.
Figure 11.8 shows the system response with them.
Figure 11.8 shows the system response.
11.5.4 Implementation
The script linked above also generates two files: SingleJointedArmCoeffs.h and SingleJointedArm-
Coeffs.cpp. These can be used with the WPILib StateSpacePlant, StateSpaceController, and StateS-
paceObserver classes in C++ and Java. A C++ implementation of this single-jointed arm controller
is available online8 .
7
https://github.com/calcmogul/frccontrol/blob/master/examples/single_jointed_arm.py
8
https://github.com/calcmogul/allwpilib/tree/state-space/wpilibcExamples/src/main/cpp/
examples/StateSpaceSingleJointedArm
11.5 Single-jointed arm 129
While many tools exist for designing controllers for linear systems, all systems in reality are inherently
nonlinear. We’ll briefly mention some considerations for nonlinear systems.
12.1 Introduction
Recall from linear system theory that we defined systems as having the following form:
ẋ = Ax + Bu + Γw
y = Cx + Du + v
In this equation, A and B are constant matrices, which means they are both time-invariant and linear
(all transformations on the system state are linear ones, and those transformations remain the same
for all time). In nonlinear and time-variant systems, the state evolution and output are defined by
arbitrary functions of the current states and inputs.
ẋ = f (x, u, w)
y = h(x, u, v)
Nonlinear functions come up regularly when attempting to control the pose of a vehicle in the global
coordinate frame instead of the vehicle’s rotating local coordinate frame. Converting from one to
the other requires applying a rotation matrix, which consists of sine and cosine operations. These
functions are nonlinear.
132 Chapter 12. Nonlinear control
12.2 Linearization
One way to control nonlinear systems is to linearize the model around a reference point. Then, all
the powerful tools that exist for linear controls can be applied. This is done by taking the partial
derivative of the functions.
Linearization of a nonlinear equation is a Taylor series expansion to only the first-order terms (that
is, terms whose variables have exponents on the order of x1 ). This is where the small angle approxi-
mations for sin θ and cos θ (θ and 1 respectively) come from.
Higher order partial derivatives can be added to better approximate the nonlinear dynamics. We typ-
ically only linearize around equilibrium points1 because we are interested in how the system behaves
when perturbed from equilibrium. An FAQ on this goes into more detail [15]. To be clear though,
linearizing the system around the current state as the system evolves does give a closer approximation
over time.
Note that linearization with static matrices (that is, with a time-invariant linear system) only works
if the original system in question is feedback linearizable.
1
Equilibrium points are points where ẋ = 0. At these points, the system is in steady-state.
12.4 Control law for nonholonomic wheeled vehicle 133
the controller to correct and the robot may not reach the desired global pose. This is due to multiple
endpoints existing for the robot which have the same encoder path arc lengths.
Instead of using wheel path arc lengths (which are in the robot’s local coordinate frame), nonlinear
controllers like pure pursuit and Ramsete use global pose. The controller uses this extra information
to guide a linear reference tracker like an LQR controller back in by adjusting the references of the
LQR controller.
e1 cos θ sin θ 0 xd − x
e2 = − sin θ cos θ 0 yd − y
e3 0 0 1 θd − θ
where e1 is the tracking error in x, e2 is the tracking error in y, and e3 is the tracking error in θ. The
3 × 3 matrix is a rotation matrix that transforms the error in the pose (represented by xd − x, yd − y,
and θd − θ) from the global coordinate frame into the vehicle’s coordinate frame.
Multiplying the matrices out gives
We will use the following control laws u1 and u2 for velocity and turning rate respectively.
u1 = −k1 e1
(12.4)
u2 = −k2 vd sinc(e3 )e2 − k3 e3
sin e3
where k1 , k2 , and k3 are time-varying gains and sinc(e3 ) is defined as e3 .
Substitute equations (12.1), (12.2), and (12.3) into the control laws.
Our velocity and turning rate commands for the vehicle will use the following nonlinear transforma-
tion of the inputs.
v = vd cos e3 − u1
ω = ωd − u2
Theorem 12.4.1 Assuming that vd and ωd are bounded with bounded derivatives, and that
vd (t) → 0 or ωd (t) → 0 when t → ∞, the control laws in equation (12.4) globally asymptotically
stabilize the origin e = 0.
Proof:
To prove convergence, the paper previously mentioned uses the following Lyapunov function.
k2 2 e2
V = (e1 + e22 ) + 3
2 2
where k2 is a tuning constant, e1 is the tracking error in x, e2 is the tracking error in y, and e3 is
the tracking error in θ.
The time derivative along the solutions of the closed-loop system is nonincreasing since
Thus, ∥e(t)∥ is bounded, V̇ (t) is uniformly continuous, and V (t) tends to some limit value. Using
the Barbalat lemma, V̇ (t) tends to zero [19].
v and ω should be the references for a reference tracker for the drivetrain. This can be a linear
controller. x, y, and θ are obtained via a nonlinear pose estimator (see section 15.1 for how to
implement one).
0 ( 1 ) 0 ( 0 ) ( 0 ) ( 0 )
2
rb rb2 1 r2 r2
0 m − J C3 − Jb C4
1 1
+ C1 0 m + Jb C2 1
A= B=
m J m
0 0 ) 0 ( 1 ) 0 0
( 2 2
( 2
) ( 2
)
rb r r r
0 1
− C1 0 1
m + J C3
b
m − J C2
1 b 1
m + J C4
b
[ m J
]
1 0 0 0
C= D = 02×2
0 0 1 0
G2 K 2
where C1 = − KvlRrt2 , C2 = Gl Kt
Rr , C3 = − KGvrRr
Kt
2 , and C4 =
Gr Kt
Rr .
To obtain a left/right velocity reference tracker, we can just remove the position states from the model.
136 Chapter 12. Nonlinear control
( ) ( ) ( ) ( )
rb2 rb2 rb2 rb2
1
+ J C1
1
− J C3
1
+ J C2
1
− J C4
A= ( m ) (m ) B= ( m ) (m )
rb2 rb2 rb2 rb2
−1
J C1
1
+ J C3
1
− J C2
1
+ J C4 (12.9)
[ ]
m m m m
1 0
C= D = 02×2
0 1
G2 K 2
where C1 = − KvlRrt2 , C2 = Gl K t
Rr , C3 = − KGvrRr
Kt
2 , and C4 =
Gr Kt
Rr .
See https://github.com/calcmogul/state-space-guide/blob/master/code/ramsete_
decoupled.py for an implementation.
Linear/angular velocity reference tracker
Since the Ramsete controller produces velocity and turning rate commands, it would be more conve-
nient if the states are velocity and turning rate instead of left and right wheel velocity. We’ll create a
second model that has velocity and angular velocity states and see how well it performs.
( ) ( )
1 rb2 1 rb2
v̇l = + (C1 vl + C2 Vl ) + − (C3 vr + C4 Vr )
m J m J
( ) ( )
1 rb2 1 rb2
v̇r = − (C1 vl + C2 Vl ) + + (C3 vr + C4 Vr )
m J m J
( ) ( )
1 r2 1 r2
v̇c + ω̇rb = + b (C1 (vc − ωrb ) + C2 Vl ) + − b (C3 (vc + ωrb ) + C4 Vr )
m J m J
(12.10)
( ) ( )
1 rb2 1 rb2
v̇c − ω̇rb = − (C1 (vc − ωrb ) + C2 Vl ) + + (C3 (vc + ωrb ) + C4 Vr )
m J m J
(12.11)
Now, we need to solve for v̇c and ω̇. First, we’ll add equation (12.10) to equation (12.11).
2 2
2v̇c = (C1 (vc − ωrb ) + C2 Vl ) + (C3 (vc + ωrb ) + C4 Vr )
m m
1 1
v̇c = (C1 (vc − ωrb ) + C2 Vl ) + (C3 (vc + ωrb ) + C4 Vr )
m m
1 1 1 1
v̇c = (C1 + C3 )vc + (−C1 + C3 )ωrb + C2 Vl + C4 Vr
m m m m
1 rb 1 1
v̇c = (C1 + C3 )vc + (−C1 + C3 )ω + C2 Vl + C4 Vr
m m m m
12.4 Control law for nonholonomic wheeled vehicle 137
2rb2 2r2
2ω̇rb = (C1 (vc − ωrb ) + C2 Vl ) − b (C3 (vc + ωrb ) + C4 Vr )
J J
rb rb
ω̇ = (C1 (vc − ωrb ) + C2 Vl ) − (C3 (vc + ωrb ) + C4 Vr )
J J
rb rb rb rb
ω̇ = (C1 − C3 )vc + (−C1 − C3 )ωrb + C2 Vl − C4 Vr
J J J J
r 2
rb rb rb
ω̇ = (C1 − C3 )vc + b (−C1 − C3 )ω + C2 Vl − C4 Vr
J J J J
[ rb
] [1 ]
1 1
m (C1 + C3 ) m (−C1 + C3 ) m C2 m C4
A= rb2 B=
rb
(C − C3 ) J (−C1 − C3 )
rb
J C2 − rJb C4
[J 1 ] (12.12)
1 −rb
C= D = 02×2
1 rb
G2 K 2
where C1 = − KvlRrt2 , C2 = Gl K t
Rr , C3 = − KGvrRr
Kt
2 , and C4 =
Gr Kt
Rr .
See https://github.com/calcmogul/state-space-guide/blob/master/code/ramsete_
coupled.py for an implementation.
Reference tracker comparison
Figures 12.1 and 12.2 shows how well each reference tracker performs.
Figure 12.1: Left/right velocity reference Figure 12.2: Linear/angular velocity reference
tracker response to a motion profile tracker response to a motion profile
demonstrates the Ramsete controller with the velocity / angular velocity reference tracker for a typical
FRC drivetrain with the reference tracking behavior shown in figure 12.6.
The Ramsete controller behaves relatively the same in each case, but the left/right velocity reference
tracker tracks the references produced by the Ramsete controller better and with smaller control
efforts overall. This is likely due to the second controller having coupled dynamics. That is, the
control inputs don’t act independently on the system states. In the coupled controller, v and ω require
opposing control actions to reach their respective references, which results in them fighting each other.
This hypothesis is supported by the condition number of the coupled controller’s controllability matrix
being larger (2.692 for coupled and 1.314 for decoupled).
Therefore, theorem 12.4.3 is a superior reference tracker to theorem 12.4.4 due to its decoupled
dynamics, even though conversions are required between it and the Ramsete controller’s commands.
State-space observers are used to estimate states which cannot be measured directly. This can be due
to noisy measurements or the state not being measurable (a hidden state). This information can be
used for localization, which is the process of using external measurements to determine an agent’s
pose1 , or orientation in the world.
One type of state estimator is LQE. “LQE” stands for “Linear-Quadratic Estimator”. Similar to LQR,
it places the estimator poles such that it minimizes the sum of squares of the error. The Luenberger
observer and Kalman filter are examples of these.
Computer vision can also be used for localization. By extracting features from an image taken by
the agent’s camera, like a retroreflective target in FRC, and comparing them to known dimensions,
one can determine where the agent’s camera would have to be to see that image. This can be used to
correct our state estimate in the same way we do with an encoder or gyroscope.
1
An agent is a system-agnostic term for independent controlled actors like robots or aircraft.
142 Chapter 13. State-space observers
Variables denoted with a hat are estimates of the corresponding variable. For example, x̂ is the
estimate of the true state x.
Notice that a Luenberger observer has an extra term in the state evolution equation. This term uses the
difference between the estimated outputs and measured outputs to steer the estimated state toward
the true state. Large values of L trust the measurements more while small values trust the model
more.
R Using an estimator forfeits the performance guarantees from earlier, but the responses are still
generally very good if the process and measurement noises are small enough. See John Doyle’s
paper Guaranteed Margins for LQG Regulators for a proof.
A Luenberger observer combines the prediction and update steps of an estimator. To run them
separately, use the equations in theorem 13.1.2 instead.
13.1 Luenberger observer 143
Predict step
x̂− −
k+1 = Ax̂k + Buk (13.5)
Update step
− −1
k+1 = x̂k+1 + A L(yk − ŷk )
x̂+ (13.6)
ŷk = Cx̂−
k (13.7)
For equation (13.8) to have a bounded output, the eigenvalues of A − LC must be within the unit
circle. These eigenvalues represent how fast the estimator converges to the true state of the given
model. A fast estimator converges quickly while a slow estimator avoids amplifying noise in the
measurements used to produce a state estimate.
As stated before, the controller and estimator are dual problems. Controller gains can be found assum-
ing perfect estimator (i.e., perfect knowledge of all states). Estimator gains can be found assuming
an accurate model and a controller with perfect tracking.
The effect of noise can be seen if it is modeled stochastically as
Stochastic control theory is a subfield of control theory that deals with the existence of uncertainty
either in observations or in the noise that drives the evolution of a system. We assign probability
distributions to this random noise and aim to achieve a desired control task despite the presence of
this noise.
Stochastic optimal control is concerned with doing this with minimum cost defined by some cost
functional, like we did with LQR earlier. First, we’ll cover the basics of probability and how we rep-
resent linear stochastic systems in state-space representation. Then, we’ll derive an optimal estimator
using this knowledge, the Kalman filter, and demonstrate creative applications of the Kalman filter
theory.
14.1 Terminology
First, we should provide definitions for terms that have specific meanings in this field.
A causal system is one that uses only past information. A noncausal system also uses information
from the future. A filter is a causal system that filters information through a probabilistic model to
produce an estimate of a desired quantity that can’t be measured directly. A smoother is a noncausal
system, so it uses information from before and after the current state to produce a better estimate.
function over a range gives the probability that the sample falls within that range. Let x be a random
variable, and let p(x) denote the probability density function of x. The probability that the value of
x will be in the interval x ∈ [x1 , x1 + dx] is p(x1 ) dx1 (see figure 14.1).
A probability of zero means that the sample will not occur and a probability of one means that the
sample will always occur. Probability density functions require that no probabilities are negative and
that the sum of all probabilities is 1. If the probabilities sum to 1, that means one of those outcomes
must happen.
∫ ∞
p(x) ≥ 0, p(x) dx = 1
−∞
∫ ∞
x = E[x] = x p(x) dx
−∞
∫ ∞
E[f (x)] = f (x) p(x) dx
−∞
The mean of a random variable is denoted by an overbar (e.g., x). The expectation of the difference
between a random variable and its mean converges to zero. In other words, the expectation of a
random variable is its mean.
14.2 Introduction to probability 147
∫ ∞
E[x − x] = (x − x) p(x) dx
∫−∞
∞ ∫ ∞
E[x − x] = x p(x) dx − x p(x) dx
−∞ −∞
∫ ∞ ∫ ∞
E[x − x] = x p(x) dx − x p(x) dx
−∞ −∞
E[x − x] = x − x · 1
E[x − x] = 0
14.2.3 Variance
Informally, variance is a measure of how far the outcome of a random variable deviates from its mean.
Later, we will use variance to quantify how confident we are in the estimate of a random variable.
The standard deviation is the square root of the variance.
∫ ∞
var(x) = σ = E[(x − x) ] =
2 2
(x − x)2 p(x) dx
−∞
√
std[x] = σ = var(x)
∫ ∞ ∫ ∞
E[x] = x dx dy
∫−∞ −∞
∞ ∫ ∞
E[y] = y dx dy
∫−∞ −∞
∞ ∫ ∞
E[f (x, y)] = f (x, y) dx dy
−∞ −∞
The variance of a joint PDF measures how a variable correlates with itself.
∫ ∫ ∞
∞
var(x) = Σxx = E[(x − x) ] = 2
∞ (x − y)2 p(x, y) dx dy
− −∞
148 Chapter 14. Stochastic control theory
∫ ∞ ∫ ∞
var(y) = Σyy = E[(y − y)2 ] = (y − y)2 p(x, y) dx dy
−∞ −∞
14.2.5 Covariance
A covariance is a measurement of how a variable correlates with another. If they vary in the same
direction, the covariance increases. If they vary in opposite directions, the covariance decreases.
∫ ∞ ∫ ∞
cov(x, y) = Σxy = E[(x − x)(y − y)] = (x − y)(y − y) p(x, y) dx dy
−∞ −∞
14.2.6 Correlation
Correlation is defined as
Σxy
ρ(x, y) = √ , |ρ(x, y)| ≤ 1
Σxx Σyy
14.2.7 Independence
Two random variables are independent if the following relation is true.
This means that the values of x do not correlate with the values of y. That is, the outcome of one
random variable does not affect another’s outcome. If we assume independence,
∫ ∞ ∫ ∞
E[xy] = xy p(x, y) dx dy
−∞ −∞
14.2 Introduction to probability 149
∫ ∞ ∫ ∞
E[xy] = xy p(x) p(y) dx dy
∫−∞
∞
−∞
∫ ∞
E[xy] = x p(x) dx y p(y) dy
−∞ −∞
E[xy] = E[x]E[y]
E[xy] = x y
∫ ∞
p(x) = p(x, y) dy
−∞
∫ ∞
∗
C(y ) = p(x, y = y ∗ ) dx
−∞
1
p(x|y ∗ ) = p(x, y = y ∗ )
C(y ∗ )
1
The scale factor C(y ∗ ) is used to scale the area under the PDF to 1.
If x and y are independent, then p(x|y) = p(x), p(y|x) = p(y), and p(x, y) = p(x) p(y).
150 Chapter 14. Stochastic control theory
∫ ∞
E[x|y] = x p(x|y) dx = f (y), E[x|y] ̸= E[x]
∫−∞
∞
E[y|x] = y p(y|x) dy = f (x), E[y|x] ̸= E[y]
−∞
x1
x2
x=
. . .
xn
The elements of x are scalar variables jointly distributed with a joint density p(x1 , x2 , . . . , xn ). The
expectation is
∫ ∞
E[x] = x = x p(x) dx
−∞
E[x1 ]
E[x2 ]
E[x] = .
.
.
E[xn ]
∫ ∞ ∫ ∞
E[xi ] = ... xi p(x1 , x2 , . . . , xn ) dx1 . . . dxn
∫−∞
∞
−∞
This n × n matrix is symmetric and positive semidefinite. A positive semidefinite matrix satisfies the
relation that for any v ∈ Rn for which v ̸= 0, vT Σv ≥ 0. In other words, the eigenvalues of Σ are
all greater than or equal to zero.
Σxy = cov(x, y)
Σxy = E[(x − x)(y − y)T ]
Σxy = E[xyT ] − E[xyT ] − E[xyT ] + E[xyT ]
Σxy = E[xyT ] − E[x]yT − xE[yT ] + xyT
Σxy = E[xyT ] − xyT − xyT + xyT
Σxy = E[xyT ] − xyT (14.1)
∫ ∫
E[xyT ] = xyT p(x) p(y) dx dyT
∫X Y ∫
T
E[xy ] = p(x) x dx p(y) yT dyT
X Y
E[xyT ] = xyT (14.2)
Σz = cov(z, z)
Σz = E[(z − z)(z − z)T ]
Σz = E[(Ax + By − Ax − By)(Ax + By − Ax − By)T ]
Σz = E[(A(x − x) + B(y − y))(A(x − x) + B(y − y))T ]
Σz = E[(A(x − x) + B(y − y))((x − x)T AT + (y − y)T BT )]
Σz = E[A(x − x)(x − x)T AT + A(x − x)(y − y)T BT +
B(y − y)(x − x)T AT + B(y − y)(y − y)T BT ]
E[x] = x
var(x) = σ 2
1 (x−x)2
p(x) = √ e− 2σ 2
2πσ 2
While we could use any random variable to represent a random process, we use the Gaussian random
variable a lot in probability theory due to the central limit theorem.
Definition 14.2.1 — Central limit theorem. When independent random variables are added,
their properly normalized sum tends toward a normal distribution (a Gaussian distribution or “bell
curve”).
This is the case even if the original variables themselves are not normally distributed. The theorem is a
key concept in probability theory because it implies that probabilistic and statistical methods that work
for normal distributions can be applicable to many problems involving other types of distributions.
For example, suppose that a sample is obtained containing a large number of independent observa-
tions, and that the arithmetic mean of the observed values is computed. The central limit theorem
says that the computed values of the mean will tend toward being distributed according to a normal
distribution.
E[wk ] = 0
E[wk wkT ] = Qk
E[vk ] = 0
E[vk vkT ] = Rk
where Qk is the process noise covariance matrix and Rk is the measurement noise covariance matrix.
We assume the noise samples are independent, so E[wk wjT ] = 0 and E[vk vkT ] = 0 where k ̸= j.
Furthermore, process noise samples are independent from measurement noise samples.
We’ll compute the expectation of these equations and their covariance matrices, which we’ll use later
for deriving the Kalman filter.
σ02 σ2
E[x|z1 ] = µ = z 1 + x0 (14.3)
σ02 + σ2 2
σ0 + σ 2
σ 2 σ02
E[(x − µ)2 |z1 ] = (14.4)
σ02 + σ 2
14.5 Kalman filter 155
The expected value, which is also the maximum likelihood value, is the linear combination of the
prior expected (maximum likelihood) value and the measurement. The expected value is a reasonable
estimator of x.
σ02 σ2
x̂ = E[x|z1 ] = z 1 + x0 (14.5)
σ02 + σ 2 σ02 + σ 2
x̂ = w1 z1 + w2 x0
Note that the weights w1 and w2 sum to 1. When the prior (i.e., prior knowledge of state) is uninfor-
mative (a large variance)
σ02
w1 = lim 2 =0 (14.6)
σ02 →0 σ0 + σ 2
σ2
w2 = lim 2 =1 (14.7)
σ02 →0 σ0 + σ 2
and x̂ = z1 . That is, the weight is on the observations and the estimate is equal to the measurement.
Let us assume we have a model providing an almost exact prior for x. In that case, σ02 approaches 0
and
σ02
w1 = lim 2 =1 (14.8)
σ02 →0 σ0 + σ 2
σ2
w2 = lim 2 =0 (14.9)
σ02 →0 σ0 + σ 2
The Kalman filter uses this optimal fusion as the basis for its operation.
14.5.1 Derivations
− −
k+1 = x̂k+1 +Kk+1 (yk+1 −Hk+1 x̂k+1 ), we want to find the
Given the posteriori update equation x̂+
value of K that minimizes the error covariance, because doing this minimizes the estimation error.
− −
k+1 = cov(xk+1 − (x̂k+1 + Kk+1 (yk+1 − Hx̂k+1 )))
P+
− −
k+1 = cov(xk+1 − (x̂k+1 + Kk+1 (Hk+1 xk+1 + vk+1 − Hx̂k+1 )))
P+
− −
k+1 = cov(xk+1 − (x̂k+1 + Kk+1 Hk+1 xk+1 + Kk+1 vk+1 − Kk+1 Hx̂k+1 ))
P+
156 Chapter 14. Stochastic control theory
− −
k+1 = cov(xk+1 − x̂k+1 − Kk+1 Hk+1 xk+1 − Kk+1 vk+1 + Kk+1 Hx̂k+1 )
P+
− −
k+1 = cov(xk+1 − x̂k+1 − Kk+1 Hk+1 (xk+1 − x̂k+1 ) − Kk+1 vk+1 )
P+
−
k+1 = cov((I − Kk+1 Hk+1 )(xk+1 − x̂k+1 ) − Kk+1 vk+1 )
P+
−
k+1 = cov((I − Kk+1 Hk+1 )(xk+1 − x̂k+1 )) + cov(Kk+1 vk+1 )
P+
−
k+1 = (I − Kk+1 Hk+1 )cov(xk+1 − x̂k+1 )(I − Kk+1 Hk+1 ) + Kk+1 cov(vk+1 )Kk+1
P+ T T
−
k+1 = (I − Kk+1 Hk+1 )Pk+1 (I − Kk+1 Hk+1 ) + Kk+1 Rk+1 Kk+1
P+ T T
Kalman gain
The error in the a posteriori state estimation is xk+1 − x̂−k+1 . We want to minimize the expected
value of the square of the magnitude of this vector. This is equivalent to minimizing the trace of the
a posteriori estimate covariance matrix P− k+1 .
−
k+1 = (I − Kk+1 Hk+1 )Pk+1 (I − Kk+1 Hk+1 ) + Kk+1 Rk+1 Kk+1
P+ T T
− −
k+1 = (Pk+1 − Kk+1 Hk+1 Pk+1 )(I − Kk+1 Hk+1 ) + Kk+1 Rk+1 Kk+1
P+ T T
− −
k+1 = (Pk+1 − Kk+1 Hk+1 Pk+1 )(I − Hk+1 Kk+1 ) + Kk+1 Rk+1 Kk+1
P+ T T T T
− −
k+1 = Pk+1 (I − Hk+1 Kk+1 ) − Kk+1 Hk+1 Pk+1 (I − Hk+1 Kk+1 ) + Kk+1 Rk+1 Kk+1
P+ T T T T T T T
− − − −
k+1 = Pk+1 − Pk+1 Hk+1 Kk+1 − Kk+1 Hk+1 Pk+1 + Kk+1 Hk+1 Pk+1 Hk+1 Kk+1 +
P+ T T T T
Kk+1 (Hk+1 P− T T
k+1 Hk+1 + Rk+1 )Kk+1
− − −
k+1 = Pk+1 − Pk+1 Hk+1 Kk+1 − Kk+1 Hk+1 Pk+1 + Kk+1 Sk+1 Kk+1
P+ T T T
(14.10)
− − −
k+1 ) = tr(Pk+1 ) − tr(Pk+1 Hk+1 Kk+1 ) − tr(Kk+1 Hk+1 Pk+1 ) + tr(Kk+1 Sk+1 Kk+1 )
tr(P+ T T T
− −T T −
k+1 ) = tr(Pk+1 ) − tr((Kk+1 Hk+1 Pk+1 ) ) − tr(Kk+1 Hk+1 Pk+1 ) + tr(Kk+1 Sk+1 Kk+1 )
tr(P+ T
P−
k+1 is symmetric, so we can drop the transpose.
− − −
k+1 ) = tr(Pk+1 ) − tr((Kk+1 Hk+1 Pk+1 ) ) − tr(Kk+1 Hk+1 Pk+1 ) + tr(Kk+1 Sk+1 Kk+1 )
tr(P+ T T
The trace of a matrix is equal to the trace of its transpose since the elements used in the trace are on
the diagonal.
14.5 Kalman filter 157
− − −
k+1 ) = tr(Pk+1 ) − tr(Kk+1 Hk+1 Pk+1 ) − tr(Kk+1 Hk+1 Pk+1 ) + tr(Kk+1 Sk+1 Kk+1 )
tr(P+ T
− −
k+1 ) = tr(Pk+1 ) − 2 tr(Kk+1 Hk+1 Pk+1 ) + tr(Kk+1 Sk+1 Kk+1 )
tr(P+ T
∂
Theorem 14.5.2 ∂A tr(AC) = CT
∂ tr(P+
k+1 )
= 0 − 2(Hk+1 P− T
k+1 ) + 2Kk+1 Sk+1
∂K
∂ tr(P+
k+1 )
= −2P−T T
k+1 Hk+1 + 2Kk+1 Sk+1
∂K
∂ tr(P+
k+1 )
= −2P− T
k+1 Hk+1 + 2Kk+1 Sk+1
∂K
0 = −2P− T
k+1 Hk+1 + 2Kk+1 Sk+1
2Kk+1 Sk+1 = 2P− T
k+1 Hk+1
Kk+1 Sk+1 = P− T
k+1 Hk+1
Kk+1 = P− T −1
k+1 Hk+1 Sk+1
Kk+1 = P− T −1
k+1 Hk+1 Sk+1
Kk+1 Sk+1 KTk+1 = P− T T
k+1 Hk+1 Kk+1
− − −
k+1 = Pk+1 − Pk+1 Hk+1 Kk+1 − Kk+1 Hk+1 Pk+1 + Kk+1 Sk+1 Kk+1
P+ T T T
− − − −
k+1 = Pk+1 − Pk+1 Hk+1 Kk+1 − Kk+1 Hk+1 Pk+1 + Pk+1 Hk+1 Kk+1
P+ T T T T
− −
k+1 = Pk+1 − Kk+1 Hk+1 Pk+1
P+
−
k+1 = (I − Kk+1 Hk+1 )Pk+1
P+
158 Chapter 14. Stochastic control theory
Predict step
x̂−
k+1 = Φx̂k + Buk (14.11)
P− − T
k+1 = ΦPk Φ + ΓQΓ
T
(14.12)
Update step
Kk+1 = P− T − T
k+1 H (HPk+1 H + R)
−1
(14.13)
x̂+
k+1 = x̂−
k+1 + Kk+1 (yk+1 − Hx̂−
k+1 ) (14.14)
+
Pk+1 = (I − Kk+1 H)P−
k+1 (14.15)
H, Q, and R from the equations derived earlier are made constants here. Φ is replaced with A for
continuous systems.
R To implement a discrete time Kalman filter from a continuous model, the model and continuous
time Q and R matrices can be discretized using theorem 10.7.1.
Unknown states in a Kalman filter are generally represented by a Wiener (pronounced VEE-ner)
14.5 Kalman filter 159
process1 . This process has the property that its variance increases linearly with time t.
14.5.3 Setup
Equations to model
The following example system will be used to describe how to define and initialize the matrices for a
Kalman filter.
A robot is between two parallel walls. It starts driving from one wall to the other at a velocity of
0.8cm/s and uses ultrasonic sensors to provide noisy measurements of the distances to the walls in
front of and behind it. To estimate the distance between the walls, we will define three states: robot
position, robot velocity, and distance between the walls.
xk+1 = xk + vk ∆T (14.16)
vk+1 = vk (14.17)
xw
k+1 = xw
k (14.18)
xk
xk = v k (14.19)
xwk
1 1 0 0 0
xk+1 = 0 0 0 xk + 0.8 + 0.1 wk (14.20)
0 0 1 0 0
where the Gaussian random variable wk has a mean of 0 and a variance of 1. The observation model
is
[ ]
1 0 0
yk = x + θk (14.21)
−1 0 1 k
where the covariance matrix of Gaussian measurement noise θ is a 2 × 2 matrix with both diagonals
10cm2 .
The state vector is usually initialized using the first measurement or two. The covariance matrix
entries are assigned by calculating the covariance of the expressions used when assigning the state
vector. Let k = 2.
[ ]
Q= 1 (14.22)
[ ]
10 0
R= (14.23)
0 10
yk,1
x̂ = (yk,1 − yk−1,1 )/dt (14.24)
yk,1 + yk,2
1
Explaining why we use the Wiener process would require going much more in depth into stochastic processes and
Itô calculus, which is outside the scope of this book.
160 Chapter 14. Stochastic control theory
10 10/dt 10
P = 10/dt 20/dt2 10/dt (14.25)
10 10/dt 20
Initial conditions
To fill in the P matrix, we calculate the covariance of each combination of state variables. The
resulting value is a measure of how much those variables are correlated. Due to how the covariance
calculation works out, the covariance between two variables is the sum of the variance of matching
terms which aren’t constants multiplied by any constants the two have. If no terms match, the variables
are uncorrelated and the covariance is zero.
In P11 , the terms in x1 correlate with itself. Therefore, P11 is x1 ’s variance, or P11 = 10. For
P21 , One term correlates between x1 and x2 , so P21 = 10 dt . The constants from each are sim-
ply multiplied together. For P22 , both measurements are correlated, so the variances add together.
20
Therefore, P22 = dt 2 . It continues in this fashion until the matrix is filled up. Order doesn’t matter
for correlation, so the matrix is symmetric.
Selection of priors
Choosing good priors is important for a well performing filter, even if little information is known.
This applies to both the measurement noise and the noise model. The act of giving a state variable a
large variance means you know something about the system. Namely, you aren’t sure whether your
initial guess is close to the true state. If you make a guess and specify a small variance, you are telling
the filter that you are very confident in your guess. If that guess is incorrect, it will take the filter a
long time to move away from your guess to the true value.
Covariance selection
While one could assume no correlation between the state variables and set the covariance matrix
entries to zero, this may not reflect reality. The Kalman filter is still guarenteed to converge to the
steady-state covariance after an infinite time, but it will take longer than otherwise.
Noise model selection
We typically use a Gaussian distribution for the noise model because the sum of many independent
random variables produces a normal distribution by the central limit theorem. Kalman filters only
require that the noise is zero-mean. If the true value has an equal probability of being anywhere
within a certain range, use a uniform distribution instead. Each of these communicates information
regarding what you know about a system in addition to what you do not.
Process noise and measurement noise covariance selection
Recall that the process noise covariance is Q and the measurement noise covariance is R. To tune
the elements of these, it can be helpful to take a collection of measurements, then run the Kalman
filter on them offline to evaluate its performance.
The diagonal elements of R are the variances of each measurement, which can be easily determined
from the offline measurements. The diagonal elements of Q are the variances of each state. They
represent how much each state is expected to deviate from the model.
Selecting Q is more difficult. If the data is trusted too much over the model, one risks overfitting
the data. One should balance estimating any hidden states sufficiently with actually filtering out the
noise.
Modeling other noise colors
The Kalman filter assumes a model with zero-mean white noise. If the model is incomplete in some
e = y − Hx̂
way, whether it’s missing dynamics or assumes an incorrect noise model, the residual y
14.5 Kalman filter 161
To handle other colors of noise in a Kalman filter, define that color of noise in terms of white noise
and augment the model with it.
14.5.4 Simulation
Figure 14.3 shows the state estimates and measurements of the Kalman filter over time. Figure 14.4
shows the position estimate and variance over time. Figure 14.5 shows the wall position estimate
and variance over time. Notice how the variances decrease over time as the filter gathers more
measurements. This means that the filter becomes more confident in its state estimates.
The final precisions in estimating the position of the robot and the wall are the square roots of the
corresponding elements in the covariance matrix. That is,√
0.5188 m and 0.4491 m respectively. They
are smaller than the precision of the raw measurements, 10 = 3.1623 m. As expected, combining
the information from several measurements produces a better estimate than any one measurement
alone.
Kalman filter theory provides a way to place the poles of the Luenberger observer optimally in the
same way we placed the poles of the controller optimally with LQR. The eigenvalues of the Kalman
filter are
Figure 14.4: Robot position estimate and variance with Kalman filter
Figure 14.5: Wall position estimate and variance with Kalman filter
14.6 Kalman smoother 163
Keyword arguments :
sys -- discrete state -space model
Q -- process noise covariance matrix
R -- measurement noise covariance matrix
Returns :
Kalman gain , error covariance matrix .
"""
m = sys.A. shape [0]
return K, P
Snippet 14.1. Steady-state Kalman gain and error covariance matrices calculation in Python
The Kalman smoother does a forward pass on the available data, then a backward pass through the
system dynamics so it takes into account the data before and after the current time. This produces
state variances that are lower than that of a Kalman filter.
We will modify the robot model so that instead of a velocity of 0.8cm/s with random noise, the
velocity is modeled as a random walk from the current velocity.
164 Chapter 14. Stochastic control theory
xk
xk = v k (14.27)
xwk
1 1 0 0
xk+1 = 0 1 0 xk + 0.1 wk
(14.28)
0 0 1 0
14.7 MMAE
MMAE stands for Multiple Model Adaptive Estimation. MMAE runs multiple Kalman filters with
different models on the same data. The Kalman filter with the lowest residual has the highest likeli-
hood of accurately reflecting reality. This can be used to detect certain system states like an aircraft
engine failing without needing to invest in costly sensors to determine this directly.
For example, say you have three Kalman filters: one for turning left, one for turning right, and one
for going straight. If the control input is attempting to fly the plane straight and the Kalman filter for
going left has the lowest residual, the aircraft’s left engine probably failed.
∂f (x, 0, 0)
Γ=
∂w
From there, the continuous Kalman filter equations are used like normal to compute the error covari-
ance matrix P and Kalman gain matrix. The state estimate update can still use the function h(x) for
accuracy.
14.8 Nonlinear observers 167
− −
k+1 = x̂k+1 + Kk+1 (yk+1 − h(x̂k+1 ))
x̂+
xk+1 = xk + vk cos θk T
yk+1 = yk + vk sin θk T
where T is the sample period. xd , yd , and θd are obtained from a desired time-based trajectory.
This odometry approach assumes that the robot follows a straight path between samples (that is,
ω = 0). We can obtain a more accurate approximation by including first order dynamics for the
heading θ.
x
x = y
θ
vx , vy , and ω are the x and y velocities of the robot within its local coordinate frame, which will be
treated as constants. These values in a column vector are called a ”twist”.
R There are two coordinate frames used here: robot and global. A superscript on the left side of a
matrix denotes the coordinate frame in which that matrix is represented. The robot’s coordinate
frame is denoted by R and the global coordinate frame is denoted by G.
R
dx = R vx dt
R
dy = R vy dt
R
dθ = R ω dt
To transform this into the global frame, we apply a counterclockwise rotation matrix where θ changes
over time.
G R
dx cos θ(t) − sin θ(t) 0 vx
dy = sin θ(t) cos θ(t) 0 vy dt
dθ 0 0 1 ω
G R
dx cos ωt − sin ωt 0 vx
dy = sin ωt cos ωt 0 vy dt
dθ 0 0 1 ω
Now, integrate the matrix equation (matrices are integrated element-wise). This derivation heavily
utilizes the integration method described in section 2.2.1.
G sin ωt cos ωt
R t
∆x 0 vx
ω
∆y = − cos ωt
ω
sin ωt
0 vy
ω ω
∆θ 0 0 t ω
0
G sin ωt cos ωt−1
R
∆x ω ω 0 vx
∆y = 1−cos ωt sin ωt
0 vy
ω ω
∆θ 0 0 t ω
This equation assumes a starting orientation of θ = 0. For nonzero starting orientations, we can apply
a counterclockwise rotation by θ.
G sin ωt R
∆x cos θ − sin θ 0 ω
cos ωt−1
ω 0 vx
∆y = sin θ cos θ 0 1−cos ωt sin ωt
0 vy
ω ω
∆θ 0 0 1 0 0 t ω
If we factor out a t, we can use change in pose between updates instead of velocities.
G sin ωt R
∆x cos θ − sin θ 0 ω
cos ωt−1
ω 0 vx
∆y = sin θ cos θ 0 1−cos ωt sin ωt
0 vy
ω ω
∆θ 0 0 1 0 0 t ω
G sin ωt R
∆x cos θ − sin θ 0 ωt
cos ωt−1
ωt 0 vx
∆y = sin θ cos θ 0 1−cos ωt sin ωt
0 vy t
ωt ωt
∆θ 0 0 1 0 0 1 ω
15.1 Nonlinear pose estimation 171
G sin ωt R
∆x cos θ − sin θ 0 ωt
cos ωt−1
ωt 0 vx t
∆y = sin θ cos θ 0 1−cos ωt sin ωt
0 vy t
ωt ωt
∆θ 0 0 1 0 0 1 ωt
G R R
∆x cos θ − sin θ 0 sin ∆θ
∆θ
cos ∆θ−1
∆θ 0 ∆x
∆y = sin θ cos θ 0 1−cos ∆θ sin ∆θ
0 ∆y
∆θ ∆θ
∆θ 0 0 1 0 0 1 ∆θ
The previous version used the current velocity and projected the model forward to the next timestep
(into the future). As such, the prediction must be done after any controller calculations are performed.
With the second version, the locally measured pose deltas can only be measured using past samples,
so the model update must be performed before any controller calculations to advance the model to
the current timestep.
When the robot is traveling on a straight trajectory (ω = 0), some expressions within the equation
above are indeterminate. We can approximate these with Taylor series expansions.
sin ωt t3 ω 2
=t− + ...
ω 6
sin ωt t3 ω 2
∼t−
ω 6
cos ωt − 1 t2 ω t4 ω 3
=− + − ...
ω 2 4
cos ωt − 1 t2 ω
∼−
ω 2
1 − cos ωt t2 ω t4 ω 3
= − + ...
ω 2 4
1 − cos ωt t2 ω
∼
ω 2
If we let ω = 0, we should get the standard kinematic equations like x = vt with a rotation applied
to them.
sin ωt t3 · 02
∼t− =t
ω 6
cos ωt − 1 t2 · 0
∼− =0
ω 2
1 − cos ωt t2 · 0
∼ =0
ω 2
G R
∆x cos θ − sin θ 0 t 0 0 vx
∆y = sin θ cos θ 0 0 t 0 vy
∆θ 0 0 1 0 0 t ω
172 Chapter 15. Pose estimation
G
∆x cos θ − sin θ 0 vx t
∆y = sin θ cos θ 0 vy t
∆θ 0 0 1 ωt
As expected, the equations simplify to the first order case with a rotation matrix applied to the veloc-
ities in the robot’s local coordinate frame.
Differential drive robots have vy = 0 since they only move in the direction of the current heading,
which is along the x-axis. Therefore,
G
∆x cos θ − sin θ 0 vx t
∆y = sin θ cos θ 0 0
∆θ 0 0 1 ωt
G
∆x vx t cos θ
∆y = vy t sin θ
∆θ ωt
or
G R sin ∆θ R
∆x cos θ − sin θ 0 ∆θ
cos ∆θ−1
∆θ 0 ∆x
∆y = sin θ cos θ 0 1−cos ∆θ sin ∆θ
0 ∆y (15.2)
∆θ ∆θ
∆θ 0 0 1 0 0 1 ∆θ
where G denotes global coordinate frame and R denotes robot’s coordinate frame.
For sufficiently small ω:
Figure 15.1 shows the error in the global pose coordinates over time for the simpler odometry method
compared to the method using twists (uses the Ramsete controller from subsection 12.4.1).
15.1 Nonlinear pose estimation 173
The highest error is 0.0035m, or roughly an eighth inch, in x over a 10m path starting with a 2m
displacement. This is negligible when considering other possible sources of error like turning scrub
on skid steer robots. Perhaps the difference is more noticeable for paths with higher curvatures and
longer duration.
This page intentionally left blank
V
Motion planning
If smooth, predictable motion of a system over time is desired, it’s best to only change a system’s
reference as fast as the system is able to physically move. Motion profiles, also known as trajectories,
are used for this purpose. For multi-state systems, each state is given its own trajectory. Since these
states are usually position and velocity, they share different derivatives of the same profile.
For one degree of freedom (1 DOF) point-to-point movements in FRC, the most commonly used
profiles are the trapezoidal profile (figure 16.1) and the S-curve profile (figure 16.2). These profiles
accelerate the system to a maximum velocity from rest, then decelerate it later such that the final
acceleration velocity, are zero at the moment the system arrives at the desired location.
These profiles are given their names based on the shape of their velocity trajectory. The trapezoidal
profile has a velocity trajectory shaped like a trapezoid and the S-curve profile has a velocity trajectory
shaped like an S-curve.
In the context of a point-to-point move, a full S-curve consists of seven distinct phases of motion.
Phase I starts moving the system from rest at a linearly increasing acceleration until it reaches the
178 Chapter 16. Motion profiles
maximum acceleration. In phase II, the profile accelerates at this maximum acceleration rate until
it must start decreasing as it approaches the maximum velocity. This occurs in phase III when the
acceleration linearly decreases until it reaches zero. In phase IV, the velocity is constant until de-
celeration begins, at which point the profiles decelerates in a manner symmetric to phases I, II and
III.
A trapezoidal profile, on the other hand, has three phases. It is a subset of an S-curve profile, hav-
ing only the phases corresponding to phase II of the S-curve profile (constant acceleration), phase
IV (constant velocity), and phase VI (constant deceleration). This reduced number of phases under-
scores the difference between these two profiles: the S-curve profile has extra motion phases which
transition between periods of acceleration, and periods of nonacceleration; the trapezoidal profile
has instantaneous transitions between these phases. This can be seen in the acceleration graphs of
the corresponding velocity profiles for these two profile types.
16.1 Jerk
The motion characteristic that defines the change in acceleration, or transitional period, is known as
”jerk”. Jerk is defined as the rate of change of acceleration with time. In a trapezoidal profile, the
jerk (change in acceleration) is infinite at the phase transitions, while in the S-curve profile the jerk
is a constant value, spreading the change in acceleration over a period of time.
From figures 16.1 and 16.2, we can see S-curve profiles are smoother than trapezoidal profiles. Why,
however, do the S-curve profile result in less load oscillation? For a given load, the higher the jerk,
the greater the amount of unwanted vibration energy will be generated, and the broader the frequency
spectrum of the vibration’s energy will be.
This means that more rapid changes in acceleration induce more powerful vibrations, and more vibra-
tional modes will be excited. Because vibrational energy is absorbed in the system mechanics, it may
cause an increase in settling time or reduced accuracy if the vibration frequency matches resonances
in the mechanical system.
What S-curve form is right for a given system? On an application by application basis, the specific
choice of the form of the S-curve will depend on the mechanical nature of the system and the desired
performance specifications. For example, in medical applications which involve liquid transfers that
should not be jostled, it would be appropriate to choose a profile with no phase II and VI segment at
all. Instead the acceleration transitions would be spread out as far as possible, thereby maximizing
smoothness.
In other applications involving high speed pick and place, overall transfer speed is most important,
so a good choice might be an S-curve with transition phases (phases I, III, V, and VII) that are five to
fifteen percent of phase II and VI. In this case, the S-curve profile will add a small amount of time to
the overall transfer time. However, the reduced load oscillation at the end of the move considerably
16.3 Profile equations 179
decreases the total effective transfer time. Trial and error using a motion measurement system is gen-
erally the best way to determine the right amount of “S” because modelling high frequency dynamics
is difficult to do accurately.
Another consideration is whether that “S” segment will actually lead to smoother control of the system.
If the high frequency dynamics at play are negligible, one can use the simpler trapezoidal profile.
1
x(t) = x0 + v0 t + at2
2
v(t) = v0 + at
where x(t) is the position at time t, x0 is the initial position, v0 is the initial velocity, and a is the
acceleration at time t. The S-curve profile equations also include jerk.
1 1
x(t) = x0 + v0 t + at2 + jt3
2 6
1 2
v(t) = v0 + at + jt
2
a(t) = a0 + jt
where j is the jerk at time t, a(t) is the acceleration at time t, and a0 is the initial acceleration.
More derivations are required to determine when to start and stop the different profile phases. The
derivations for a trapezoid profile are in appendix D.5 and the derivations for an S-curve profile are
in appendix D.6.
stepper motors because there is less torque available at higher speeds. However, notice that starting
and ending accelerations are very high, and there is no “S” phase where the acceleration smoothly
transitions to zero. If load oscillation is a problem, parabolic profiles may not work as well as an
S-curve despite the fact that a standard S-curve profile is not optimized for a stepper motor from the
standpoint of the torque/speed curve.
D Derivations . . . . . . . . . . . . . . . . . . . . . . . . 191
D.1 Transfer function in feedback
D.2 Optimal control law
D.3 Zero-order hold for state-space
D.4 Kalman filter as Luenberger observer
D.5 Trapezoidal motion profile
D.6 S-curve motion profile
Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Bibliography . . . . . . . . . . . . . . . . . . . . . . . 199
Online
Miscellaneous
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
This page intentionally left blank
Sunset in an airplane over New Mexico
X(s) P1 P2 Y (s)
X(s) P1 P2 Y (s)
+
X(s) P1 Y (s)
±
P2
X(s) P1 ± P2 Y (s)
+
X(s) P1 Y (s)
±
P2
P1 +
X(s) P2 Y (s)
P2
±
+
X(s) P1 Y (s)
∓
P2
P1
X(s) 1±P1 P 2 Y (s)
+
X(s) P1 Y (s)
∓
P2
1 −
X(s) P1 P2 Y (s)
P2
∓
To install Python packages, run pip3 install --user pkg where pkg should be the name of the
package. Using --user makes installation not require root privileges. Packages can be upgraded
with pip3 install --user --upgrade pkg.
This page intentionally left blank
Sunset in an airplane over New Mexico
There are two canonical forms used to represent state-space models: controllable canonical form and
observable canonical form. They are used to guarantee controllability and observability of a system
respectively, which are mathematical duals of each other. That is, the controller and estimator (state
observer) are complementary problems.
n1 s3 + n2 s2 + n3 s + n4
G(s) = (C.1)
s4 + d1 s3 + d2 s2 + d3 s + d4
0 1 0 0 0
0 0 1 0 0
ẋ(t) =
0
x(t) + u(t) (C.2)
0 0 1 0
−d4 −d3 −d2 −d1 1
[ ]
y(t) = n4 n3 n2 n1 x(t) (C.3)
0 0 0−d4 n4
1 0 0
−d3
ẋ(t) = x(t) + n3 u(t) (C.4)
0 1 0−d2 n2
0 0 1−d1 n1
[ ]
y(t) = 0 0 0 1 x(t) (C.5)
Sunset in an airplane over New Mexico
D. Derivations
+ Z(s)
X(s) G(s) Y (s)
−
H(s)
Y (s) = Z(s)G(s)
Z(s) = X(s) − Y (s)H(s)
X(s) = Z(s) + Y (s)H(s)
X(s) = Z(s) + Z(s)G(s)H(s)
Y (s) Z(s)G(s)
=
X(s) Z(s) + Z(s)G(s)H(s)
Y (s) G(s)
= (D.1)
X(s) 1 + G(s)H(s)
Y (s) G(s)
= (D.2)
X(s) 1 ∓ G(s)H(s)
192 Appendix D. Derivations
where positive feedback uses the top sign and negative feedback uses the bottom sign.
ẋ = Ax + Bu (D.3)
∫∞
( )
J= xT Qx + uT Ru dt
0
where J represents a tradeoff between state excursion and control effort with the weighting factors
Q and R, the feedback control law which minimizes J is
u = −Kx
where K is given by
( )
K = R−1 BT P + NT
and P is found by solving the continuous time algebraic Riccati equation defined as
( )
AT P + PA − (PB + N) R−1 BT P + NT + Q = 0
or alternatively
AT P + PA − PBR−1 BT P + Q = 0
with
A = A − BR−1 NT
Q = Q − NR−1 NT
Snippet D.1 computes the optimal infinite horizon, discrete time LQR controller.
import control as cnt
import numpy as np
import scipy as sp
Keyword arguments :
A -- numpy . matrix ( states x states ), The A matrix .
B -- numpy . matrix ( inputs x states ), The B matrix .
Q -- numpy . matrix ( states x states ), The state cost matrix .
R -- numpy . matrix ( inputs x inputs ), The control effort cost matrix .
Returns :
numpy. matrix ( states x inputs ), K
"""
m = sys.A. shape [0]
Other formulations of LQR for finite horizon and discrete time can be seen on Wikipedia [13].
MIT OpenCourseWare has a rigorous proof of the results shown above [21].
d At
e = AeAt = eAt A
dt
which we recognize as
d ( −At )
e x(t) = e−At Bu(t)
dt
∫ t
−At
e x(t) − e x(0) = 0
e−Aτ Bu(τ ) dτ
0
∫ t
x(t) = eAt x(0) + eA(t−τ ) Bu(τ ) dτ
0
which is an analytical solution to the continuous model. Now we want to discretize it.
def
xk = x(kT )
∫ kT
xk = e AkT
x(0) + eA(kT −τ ) Bu(τ ) dτ
0
∫ (k+1)T
xk+1 = e A(k+1)T
x(0) + eA((k+1)T −τ ) Bu(τ ) dτ
0
∫ kT ∫ (k+1)T
A((k+1)T −τ )
xk+1 = e A(k+1)T
x(0) + e Bu(τ ) dτ + eA((k+1)T −τ ) Bu(τ ) dτ
0 kT
∫ kT ∫ (k+1)T
xk+1 = e A(k+1)T
x(0) + eA((k+1)T −τ ) Bu(τ ) dτ + eA(kT +T −τ ) Bu(τ ) dτ
0 kT
( ∫ kT ) ∫ (k+1)T
xk+1 = eAT eAkT x(0) + eA(kT −τ ) Bu(τ ) dτ + eA(kT +T −τ ) Bu(τ ) dτ
0 kT
| {z }
xk
We assume that u is constant during each timestep, so it can be pulled out of the integral.
(∫ )
(k+1)T
xk+1 = eAT xk + eA(kT +T −τ ) dτ Buk
kT
The second term can be simplified by substituting it with the function v(τ ) = kT + T − τ . Note
that dτ = −dv.
(∫ )
v((k+1)T )
xk+1 = e AT
xk − e Av
dv Buk
v(kT )
(∫ 0 )
xk+1 = e AT
xk − eAv
dv Buk
T
(∫ T )
xk+1 = eAT xk + Av
e dv Buk
0
−1 Av T
xk+1 = e AT
xk + A e |0 Buk
−1 AT
xk+1 = e AT
xk + A A0
(e −e )Buk
xk+1 = eAT xk + A−1 (eAT − I)Buk
−
k+1 = Ax̂k + Buk + L(yk − ŷk )
x̂+ (D.4)
ŷk = Cx̂−
k (D.5)
where a superscript of minus denotes a priori and plus denotes a posteriori estimate. Combining
equation (D.4) and equation (D.5) gives
− −
k+1 = Ax̂k + Buk + L(yk − Cx̂k )
x̂+ (D.6)
The following is a Kalman filter that considers the current update step and the next predict step
together rather than the current predict step and current update step.
Update step
Kk = P− T − T
k H (HPk H + R)
−1
(D.7)
x̂+
k = x̂−
k + Kk (yk − Hx̂−
k) (D.8)
P+k = (I − Kk H)P−
k (D.9)
Predict step
x̂+ +
k+1 = Ax̂k + Buk (D.10)
P−
k+1 = AP+
kA
T
+ ΓQΓ T
(D.11)
− −
k+1 = A(x̂k + Kk (yk − Hx̂k )) + Buk
x̂+
− −
k+1 = Axk + AKk (yk − Hx̂k ) + Buk
x̂+
− −
k+1 = Ax̂k + Buk + AKk (yk − Hx̂k )
x̂+
− −
k+1 = Ax̂k + Buk + L(yk − Cx̂k )
x̂+ (D.12)
which matches equation (D.6). Therefore, the eigenvalues of the Kalman filter observer can be ob-
tained by
eig(A − LC)
eig(A − (AKk )(H))
eig(A(I − Kk H)) (D.13)
196 Appendix D. Derivations
− −
k+1 = x̂k+1 + K(yk+1 − Hx̂k+1 )
x̂+
− −1 −
k+1 = x̂k+1 + A L(yk+1 − Cx̂k+1 )
x̂+
− −1
k+1 = x̂k+1 + A L(yk+1 − ŷk+1 )
x̂+
The predict step is the same as the Kalman filter’s. Therefore, a Luenberger observer run with pre-
diction and update steps is written as follows.
Predict step
x̂− −
k+1 = Ax̂k + Buk (D.14)
Update step
− −1
k+1 = x̂k+1 + A L(yk+1 − ŷk+1 )
x̂+ (D.15)
ŷk+1 = Cx̂−
k+1 (D.16)
Glossary
agent An independent actor being controlled through autonomy or human-in-the-loop (e.g., a robot,
aircraft, etc.).
control effort A term describing how much force, pressure, etc. an actuator is exerting.
control input The input of a plant used for the purpose of controlling it.
control law Also known as control policy, is a mathematical formula used by the controller to deter-
mine the input u that is sent to the plant. This control law is designed to drive the system
from its current state to some other desired state.
control system Monitors and controls the behavior of a system.
controller Used in positive or negative feedback with a plant to bring about a desired system state
by driving the difference between a reference signal and the output to zero.
discretization The process by which a continuous (e.g., analog) system or controller design is con-
verted to discrete (e.g., digital).
disturbance An external force acting on a system that isn’t included in the system’s model.
disturbance rejection The quality of a feedback control system to compensate for external forces
to reach a desired reference.
feedback gain The gain from the output to an earlier point in a control system diagram.
gain A proportional value that shows the relationship between the magnitude of an input signal to
the magnitude of an output signal at steady-state.
gain margin See section 7.7 on gain and phase margin.
linearization A method by which a nonlinear system’s dynamics are approximated by a linear system.
localization The process of using measurements of the environment to determine an agent’s pose.
198 Glossary
model A set of mathematical equations that reflects some aspect of a physical system’s behavior.
noise immunity The quality of a system to have its performance or stability unaffected by noise in
the outputs (see also: robustness).
observer In control theory, a system that provides an estimate of the internal state of a given real
system from measurements of the input and output of the real system.
open-loop gain The gain directly from the input to the output, ignoring loops.
output Measurements from sensors.
output-based control Controls the system’s state via the outputs.
overshoot The amount by which a system’s state surpasses the reference after rising toward it.
time-invariant The system’s fundamental response does not change over time.
tracking In control theory, the process of making the output of a control system follow the reference.
unity feedback A feedback network in a control system diagram with a feedback gain of 1.
Sunset near Porter Academic building at UCSC
Bibliography
Online
[13] Wikipedia Commons. Linear-quadratic regulator. : https : / / en . wikipedia . org /
wiki / Linear % E2 % 80 % 93quadratic _ regulator (visited on 03/24/2018) (cited on
page 193).
[15] Sean Humbert. Why do we have to linearize around an equilibrium point? : https : / /
www . cds . caltech . edu / %7Emurray / courses / cds101 / fa02 / faq / 02 - 10 - 09 _
linearization.html (visited on 07/12/2018) (cited on page 132).
[16] Kapitanyuk, Proskurnikov, and Cao. A guiding vector field algorithm for path following control
of nonholonomic mobile robots. : https://arxiv.org/pdf/1610.04391.pdf (visited
on 08/09/2018) (cited on page 138).
[17] Edgar Kraft. A Quaternion-based Unscented Kalman Filter for Orientation Tracking. : https:
//kodlab.seas.upenn.edu/uploads/Arun/UKFpaper.pdf (visited on 07/11/2018)
(cited on page 167).
[18] Charles F. Van Loan. Computing Integrals Involving the Matrix Exponential. : https :
/ / www . cs . cornell . edu / cv / ResearchPDF / computing . integrals . involving .
Matrix.Exp.pdf (visited on 06/21/2018) (cited on page 115).
[19] Luca, Oriolo, and Vendittelli. Control of Wheeled Mobile Robots: An Experimental Overview.
: https : / / www . dis . uniroma1 . it / ~labrob / pub / papers / Ramsete01 . pdf
(visited on 08/09/2018) (cited on pages 133, 134).
[20] MIT OpenCourseWare. Linear Quadratic Regulator. : https://ocw.mit.edu/courses/
mechanical-engineering/2-154-maneuvering-and-control-of-surface-and-
underwater-vehicles-13-49-fall-2004/lecture-notes/lec19.pdf (visited on
06/26/2018) (cited on page 91).
[21] Russ Tedrake. Chapter 9. Linear Quadratic Regulators. : http : / / underactuated .
csail.mit.edu/underactuated.html?chapter=lqr (visited on 07/08/2018) (cited on
page 193).
200 Bibliography
[22] Eric A. Wan and Rudolph van der Merwe. The Unscented Kalman Filter for Nonlinear Esti-
mation. : https://www.seas.harvard.edu/courses/cs281/papers/unscented.
pdf (visited on 06/26/2018) (cited on page 167).
Misc
[1] FRC team 254. Motion Planning and Control in FRC. 2015. : https://www.youtube.
com/watch?v=8319J1BEHwM (cited on page 180).
[2] 3Blue1Brown. Eigenvectors and eigenvalues. 2016. : https://youtu.be/PFDu9oVAE-g
(cited on page 84).
[3] 3Blue1Brown. Essence of linear algebra. 2016. : https://www.youtube.com/playlist?
list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab (cited on page 59).
[4] 3Blue1Brown. Essence of linear algebra preview. 2016. : https://youtu.be/kjBOesZCoqc
(cited on page 59).
[5] 3Blue1Brown. Inverse matrices, column space, and null space. 2016. : https://youtu.
be/uQhTuRlWMxw (cited on page 78).
[6] 3Blue1Brown. Linear combinations, span, and basis vectors. 2016. : https://youtu.
be/k7RM-ot2NWY (cited on page 64).
[7] 3Blue1Brown. Linear transformations and matrices. 2016. : https : / / youtu . be /
kYB8IZa5AuE (cited on page 68).
[8] 3Blue1Brown. Linear transformations and matrices. 2016. : https : / / youtu . be /
XkY2DOUCWMU (cited on page 71).
[9] 3Blue1Brown. Nonsquare matrices as transformations between dimensions. 2016. : https:
//youtu.be/v8VSDg_WQlA (cited on page 79).
[10] 3Blue1Brown. The determinant. 2016. : https://youtu.be/Ip3X9LOh2dk (cited on
page 74).
[11] 3Blue1Brown. Vectors, what even are they? 2016. : https://youtu.be/fNk_zzaMoSs
(cited on page 62).
[12] 3Blue1Brown. Essence of calculus. 2017. : https://www.youtube.com/playlist?
list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr (cited on page 9).
[14] Brian Douglas. Gain and Phase Margins Explained! 2015. : https : / / youtu . be /
ThoA4amCAX4 (cited on page 56).
Sunset near Porter Academic building at UCSC
Index