Despite my utmost effort the book has errors: typos, grammatical and substantive.  This page is for reporting substantive errors not typos. I am however interested in knowing about all errors so please email me at and provide enough information to locate the error, and tell me what you think the error is. By default I will acknowledge you, let me know if you don’t want this.

The convention here is that new text is shown in bold, and text to be deleted is shown in strike through font.


There are currently three versions of the book – you can identify the version from the copyright page (page iv):

  1. The second edition published in 2017.
  2. The first edition, second printing, published in early 2013.
  3. The first edition, first printing published in 2011.

All errata for the first edition can be found here.

Errata for second edition

page 50

The equation at the top of the page has two terms swapped, it should be

\(\mathbf{c}^\prime_2 =\mathbf{c}^\prime_3 \times \mathbf{c}^\prime_1 \)

thanks Pekka Forsman, added 20180821.

page 60

In the 2D column of the table:

Orientation is a 3×3 2×2 rotation matrix

Pose is a 4×4 3×3 transformation matrix

thanks Erwin Coumans, added 20180110.

page 65

The results on this page are computed based on

>> TB=SE3(1,2,0)*SE3.RzRx(pi/2)

a rotation about the x-axis, not z-axis as in the book.

Further down the page we should use the adjoint of TCB not TBC

>> vc = TBCTCB.Ad * vb;

thanks Willem Remie, added 20171203.

page 71

The equation for velocity is wrong, it should be

\(\dot{s}(t) = 5At^4 + 4Bt^3 + 3Ct^2 + 2Dt + E\)

The fourth term is \(2Dt\) not \(2D\) as printed.

thanks Ahmed Mohamed, added 20181202.

page 77

The last equation in the first row of equations on the page has some terms swapped, it should be

\( \beta^\prime = \beta + \theta^* \)

thanks Haidar Obeid, added 20180723.

page 87

Equation (3.25) has a notational error, a superscript ended up on the wrong side of the dot operator.  It should read


thanks Ronghao Zheng, added 20190519.

page 105

In Fig 4.6, the top left shaded box should be labelled “distance control”, not “speed control”.

page 107

In the topmost equation,  there is an error in the 3-vector on the left-hand side.  The middle element, shown as  \( \dot{\omega} \) should be \( \dot{y} \).  The correct equation is:

\[\begin{pmatrix} \dot{x} \\ \dot{y} \\ \dot{\theta} \end{pmatrix} =\begin{pmatrix} \cos \theta & 0 \\ \sin \theta & 0 \\ 0 & 1 \end{pmatrix}\begin{pmatrix} v \\ \omega \end{pmatrix}\]

thanks Andrew Vardy, added 20190114.

page 108

The second matrix equation has a missing term, the expression \( -k_\rho \cos \alpha \) should be \( -k_\rho \rho \cos \alpha \).  The correct equation is:

\[ \begin{pmatrix} \dot{\rho} \\ \dot{\alpha} \\ \dot{\beta} \end{pmatrix} =\begin{pmatrix} -k_\rho \rho \cos \alpha \\ k_\rho \sin \alpha – k_\alpha \alpha – k_\beta \beta \\ -k_\rho \sin \alpha \end{pmatrix} \]

thanks Iain McCulloch, added 20190407.

page 142

The variables start and goal are not set by the code example.

>> lp.plan('cost', [1 10 10])
>> lp.query(start, goal);>> lp.query([1 2 pi/2], [2 -2 0]);
A* path cost 35 
>> lp.plot()
page 146
>> plot_vehicle(p, 'box', 'size', [20 30], 'fill', 'r', 'alpha', 0.1)
>> plot_vehicle(p, 'box', 'size', [20 30], 'fillcolor', 'r', 'alpha', 0.1)
page 196
>> a1 = 1;
>> E = Rz('q1') * Tx(a1) * Tz('q2')
>> E = Rz('q1') * Tx(a1) * Tx('q2')
page 198

There’s an error in (7.3), the element in the second row and fourth column \( \alpha_j \sin \theta_j \) should be \( a_j \sin \theta_j \)

thanks Willem Remie, added 20180506.

page 273

Fig 9.21 shows a Simulink model for computed-torque control sl_ctorque.  The torque is computed from the desired position and velocity rather than the actual position and velocity as described in (9.13).  If the controller is tracking well then these will be close and the discrepancy minor but the error dynamics of (9.14) will likely not be obeyed.  To be true to (9.13) the model should be changed: the q and qd inputs to the RNE block should come from the q and qd outputs of the Robot block.

thanks Edoardo Farniolli.

page 509
>> plot_poly(p1, 'wo', 'fill', 'b', 'alpha', 0.2);
>> plot_poly(p1, 'wo', 'fillcolor', 'b', 'alpha', 0.2);
page 510
>> plot_poly(p2, 'k', 'fill', 'r', 'alpha', 0.2)
>> plot_poly(p2, 'k', 'fillcolor', 'r', 'alpha', 0.2)
Page 551

The command

>> plot2(p)

won’t work because p has dimensions 2x4x501, and the indexes are respectively: u/v ordinate, corner and timestep.  To plot the trajectory of corner 1 over time in the uv-plane use

>> plot2(squeeze(P(:,1,:))')

To plot the trajectories of all 4 corners you need to use a loop

>> clf
>> for i=1:4
  hold on
Page 571
>> T_C0 = SE3(0.3, 0.3, -2)*SE3.Rz(0.4);
>> vs = IBVS_sph(cam, 'T0', T_C0, 'verbose')
>> vs = IBVS_sph(cam, 'pose0', T_C0, 'verbose')
Page 605

Section C.2.1, the definitions of the vectors parallel and normal to the line are swapped.  The non homogeneous vector \((-\ell_2,\ell_1)\) is a normal to the line, and \((\ell_1,\ell_2)\)  is parallel to the line.

thanks Parker Lusk, added 20180121.