# Errata

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 rvc@petercorke.com 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.

### Versions

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 24

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

“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×𝐜1

##### 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

##### page 62
• Q11 is the same as Q9
• Q14, the app is no longer available.

##### page 65

>> 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;

##### page 67

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

##### page 68

The code line

w = w + wd*dt; attitude = attitude .* UnitQuaternion.omega(wd*dt);

w = w + wd*dt; attitude = attitude .* UnitQuaternion.omega(w*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.

##### page 71

The equation for velocity is wrong, it should be

𝑠˙(𝑡)=5𝐴𝑡4+4𝐵𝑡3+3𝐶𝑡2+2𝐷𝑡+𝐸

The fourth term is 2𝐷𝑡 not 2𝐷 as printed.

##### page 77

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

𝛽=𝛽+𝜃

##### page 87

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

##### 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.

##### 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  𝜔˙ should be 𝑦˙.  The correct equation is:

⎛⎝⎜⎜⎜𝑥˙𝑦˙𝜃˙⎞⎠⎟⎟⎟=⎛⎝⎜⎜cos𝜃sin𝜃0001⎞⎠⎟⎟(𝑣𝜔)

##### page 108

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

⎛⎝⎜⎜⎜𝜌˙𝛼˙𝛽˙⎞⎠⎟⎟⎟=⎛⎝⎜⎜⎜𝑘𝜌𝜌cos𝛼𝑘𝜌sin𝛼𝑘𝛼𝛼𝑘𝛽𝛽𝑘𝜌sin𝛼⎞⎠⎟⎟⎟

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

##### 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 543

The first equation in (15.2) should be

𝑋˙=𝑌𝜔𝑧𝑍𝜔𝑦𝑣𝑥

##### 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
plot2(squeeze(p(:,i,:))')
end
##### 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 (2,1) is a normal to the line, and (1,2)  is parallel to the line.