Robotics, Vision and Control

Fundamental algorithms in MATLAB: Second Edition



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

Chapter 2

page 24

in the third paragraph on this page the coordinate frame names are reversed

“This type of matrix is known as a rotation matrix since it transforms a point from frame {V}{B}to {B}{V} and is denoted …”

thanks Manuel Zanutelli Cosio, added 20200517.

page 50

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

\(𝐜′_2=𝐜′_3 \times 𝐜′_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 62
  • Q11 is the same as Q9
  • Q14, the app is no longer available.

thanks Haidar Obeid, added 20190806.

Chapter 3

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 67

Two terms are swapped in (3.8), it should read



Thanks Nico Diefenbach, added 20200419.

page 68

The code line

w = w + wd*dt; attitude = attitude .**dt);

should read

w = w + wd*dt; attitude = attitude .**dt);

since w*dt is the infinitesimal angular displacement which is converted to a unit quaternion and compounded with the attitude from the previous timestep.

thanks Chen Peng, added 20190811.

page 71

The equation for velocity is wrong, it should be

\(\dot{s}(𝑡)=5𝐴𝑡^4+4𝐵𝑡^3+3𝐶𝑡^2+2𝐷𝑡+𝐸 \)

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

thanks Ahmed Mohamed, added 20181202.

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 88

The equation at the bottom of page 88 has the operands to the cross product reversed.  The code example at the top of page 90 is correct.

thanks Ronghao Zheng, added 20200517.

Chapter 4

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}\).

thanks Andrew Vardy, added 20190114.

page 108

The second matrix equation has a missing term, the expression 𝑘𝜌cos𝛼 should be 𝑘𝜌𝜌cos𝛼.  The correct equation is:


thanks Iain McCulloch, added 20190407.

page 108

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


thanks Haidar Obeid, added 20180723.

Chapter 5

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)

Chapter 7

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 𝛼𝑗sin𝜃𝑗 should be 𝑎𝑗sin𝜃𝑗

thanks Willem Remie, added 20180506.

Chapter 9

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.

Chapter 11

page 321

It’s not stated explicitly but z_i and z_o are both positive.  At the end of paragraph two I write that z_i < -f whereas I should have written z_i > f.

thanks Huseyin Emre Mutlu, added 20200621.

Chapter 14

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)

Chapter 15

Page 543

The first equation in (15.2) should be


thanks Farrokh Janabi-Sharifi, added 20190929.

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

Chapter 16

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')
Appendix C
Page 605

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

thanks Parker Lusk, added 20180121.