Skip to content
Peter Corke edited this page Feb 22, 2026 · 10 revisions

This page contains error and clarifications for the book. To create errata please post an Issue on Github and use the errata template.

Chapter 6

page 233, (6.22) Issue #15

This is the insertion Jacobian for the SLAM case, not the landmark-only case as it should be. For the landmark-only case the Jacobian is

$${\bf Y}_z = \frac{\partial {\bf y}}{\partial {\bf z}} = \left( \begin{array}{c|c} {\bf 1}_{M \times M} & {\bf 0}_{M \times 2} \\\ {\bf 0}_{2 \times M} & {\bf G}_z \end{array} \right)$$

For the SLAM case (6.22) applies using the definition of ${\bf G}_x$ from (6.27).

Chapter 7

page 299-300 Issue #15

The eval method for symbolic expressions has been deprecated, and the double method should be used instead.

This appears three times in the final two code snippets of this section.

Chapter 8

page 334 Issue #18

This book uses the spatial velocity convention $(\omega, v)$ so the last equation on the page is wrong and should be:

$$ \mathbf{J}_a(\boldsymbol{q}) = \begin{pmatrix} \mathbf{A}^{-1}(\boldsymbol{\varGamma}) & \mathbf{0}_{3\times 3} \cr \mathbf{0}_{3\times 3} & \mathbf{1}_{3\times 3} \cr \end{pmatrix} \mathbf{J}(\boldsymbol{q}) $$

and the following code snippet is also in error, and should be:

>> Ja = [inv(A) zeros(3); zeros(3) ones(3)]*J;

Chapter 9

page 381-2 Issue #20

There is an inconsistency between the Simulink system shown in Fig. 9.21 and the equation (9.16). The former computes $\boldsymbol{g}(\cdot)$ and $\mathbf{C}(\cdot)$ from the actual joint coordinates and velocity (the Config input to the Inverse Dynamics block), while the latter uses the demanded joint coordinates and velocity. In both cases, $\mathbf{M}(\cdot)$ is computed from the actual joint coordinates.

There are some interesting and practical real-world considerations involved in choosing to whether we would use actual (measured) or the demanded values of $\boldsymbol{q}$ and $\dot{\boldsymbol{q}}$:

  1. If the robot controller is doing a good job then the difference between actual and demand is small.
  2. Using actual joint angles to compute $\boldsymbol{g}(\cdot)$, $\mathbf{C}(\cdot)$, and $\mathbf{M}(\cdot)$ adds delay since those calculations can't be started until the joint angles find their way into the controller. Using demand eliminates that delay.
  3. Velocity estimation from encoders is not straightforward and introduces noise. The demand signal from the motion planner will be smoother.

In addition, the dynamic coefficients $\boldsymbol{g}(\cdot)$, $\mathbf{C}(\cdot)$, and $\mathbf{M}(\cdot)$ will not change significantly from one sample period to the next. A common "trick" in the early days of robot dynamic control was to compute those coefficients at a much lower rate in a background process. This retained almost all of the benefit of rigid-body dynamic compensation at much lower computational cost. The ZOH block Tfb in Fig. 9.21 is performing this "trick" which makes the difference between using actual or demanded values of $\boldsymbol{q}$ and $\dot{\boldsymbol{q}}$ fairly moot.

Chapter 11

page 471, (11.5.2) Issue #7

The function vision.LocalMaximaFinder has been [deprecated and removed](https://au.mathworks.com/help/vision/ref/vision.localmaximafinder-system-object.html from MATLAB 2024a. Use imregionalmax instead, but the arguments and return are quite different.

For more details see the errata for Appendix J.2 below.

page 566, (13.3.1)

The equation for $\phi$ should be

$$\phi = \tan^{-1} \frac{-Y}{X}$$

to match the x- and y-axis conventions shown in Fig. 13.16. That error has also been fixed in the code (pushed to GH 2025-03-02 commit 7af0aa414b150cd39973e7d18fa25d7868f27cc8).

Chapter 13, page 569, (13.3.2)

The equation for $\theta$ should be

$$\theta = \tan^{-1} \frac{Z}{\sqrt{X^2+Y^2}} + \frac{\pi}{2}$$

Unfortunately, the code implementation for $\theta$ within CatadioptricCamera.project_point() has a different error. Correcting that code error (pushed to GH 2025-03-02 commit 7af0aa414b150cd39973e7d18fa25d7868f27cc8) we get an alternative version of Fig 13.20. This version exhibits much more distortion because the cube is quite close to the camera.

fig13_20

Appendix C1.4.1, page 723

There's an error in the third code snippet on the page

x = inv(sqrtm(E))*y;
plot(x(:,1),x(:,2));

should be

x = inv(sqrtm(E))*y;
clf; plot(x(1,:),x(2,:));

because the arrays x and y are both 2x50, ie. each column is a point.

Appendix J.2, page 765 Issue #7

The function vision.LocalMaximaFinder has been [deprecated and removed](https://au.mathworks.com/help/vision/ref/vision.localmaximafinder-system-object.html from MATLAB 2024a. Use imregionalmax instead, but the arguments and return are quite different.

>> LMaxFinder = vision.LocalMaximaFinder(MaximumNumLocalMaxima=3, ...
>>   NeighborhoodSize=[3 3],Threshold=0);
>> LMaxFinder(z)
ans =
3 x 2 uint32 matrix
 3     4
 5     2
 5     4

becomes

>> [row,col] = ind2sub(size(z), find(imregionalmax(z)))
row =
     4
     2
col =
     3
     5

which finds only 2 of the maxima, compared to the previous 3. Maxim