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):
- The second edition published in 2017.
- The first edition, second printing, published in early 2013.
- 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 .* UnitQuaternion.omega(wd*dt);
should read
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.
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 plot2(squeeze(p(:,i,:))') end
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.