-
Notifications
You must be signed in to change notification settings - Fork 27
Errata
This page contains error and clarifications for the book. To create errata please post an Issue on Github and use the errata template.
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
For the SLAM case (6.22) applies using the definition of
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.
page 334 Issue #18
This book uses the spatial velocity convention
and the following code snippet is also in error, and should be:
>> Ja = [inv(A) zeros(3); zeros(3) ones(3)]*J;
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 Config input to the Inverse Dynamics block), while the latter uses the demanded joint coordinates and velocity. In both cases,
There are some interesting and practical real-world considerations involved in choosing to whether we would use actual (measured) or the demanded values of
- If the robot controller is doing a good job then the difference between actual and demand is small.
- 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. - 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 Tfb in Fig. 9.21 is performing this "trick" which makes the difference between using actual or demanded values of
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.
The equation for
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).
The equation for
Unfortunately, the code implementation for 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.

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
RVC3 Wiki