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

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

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

The fourth term is $$2Dt$$ not $$2D$$ as printed.

##### 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^*$$

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

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

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

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

$\dot{X} = Y \omega_z – Z \omega_y – v_x$

##### 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 $$(-\ell_2,\ell_1)$$ is a normal to the line, and $$(\ell_1,\ell_2)$$  is parallel to the line.