This errata page focuses on factual errors that could interfere with the understanding of the presented material. General typos are usually not entered, none-the-less we still appreciate being informed about them.

Statistical Sensor Fusion by Fredrik Gustafsson

3nd edition, 2018

  • p32+ Sec 2.3.5 Safe Fusion of Dependent Estimates:
    Safe fusion (SF), as described in Alg 2.1, is not equivalent to Covariance intersection (CI) as indicated by the text. Instead SF, Alg 2.1, in all essential aspects matches what is denoted the Largest ellipsoid algorithm/Internal ellipsoid approximation on p 32. However, Fig 2.4, with the resulting ellipsoid enclosing the intersection of the two ellipsoids illustrates a CI solution. An appropriate illustration of Alg. 2.1 is that the resulting covariance ellipsoid is an axis aligned ellipse inside the intersection just touching the border of shaded area.
    Furthermore, it should be noted that only CI is conservative, or "safe", with respect to general cross-correlations between the two fused estimates. Alg 2.1 is conservative only under certain (nontrivial) assumptions, but does in many practical applications provide useful results that are less conservative than those provided by CI.
    For more information on the topic of conservative fusion of dependent estimates, please see the recent lic:
    Robin Forsling, "Decentralized Estimation Using Conservative Information Extraction", Linköping Studies in Science and Technology. Licentiate Thesis, No. 1897, 2020.
  • p50: In step 1 of Alg 3.1, the gradient should be computed without minus sign
  • p50: In step 3 of Alg 3.1 and the last equation on the page:  All occurrences of x should be \hat{x}^{(i)}, ie the last iterate of the estimate is used instead of x.
  • p51: The first equation, all occurrences of h(x_k) should be h_k(x_k).
  • p63 L-10:  The reference to Figure 3.4 should be Figure 3.5.
  • p67 (3.41f): It should be noted that the covariance matrix that is used as weight matrix in the norm is rank-deficient.  (An interpretation is that some degrees of freedom has already been used to estimate of the linear part.)  To get around this problem, use the Moore-Penrose pseudo-inverse when implementing (3.41f) which can be shown to deal with the singularity in a correct way.
  • p86 (4.19):  The = should be \approx,  the cost function in (4.19) is an approximation.  Properly implementing (3.41f) does introduce cross correlations, however, an approximation has been introduced to obtain a simpler expression.
  • p88 (4.27c): The second element in the vector last on the line should be x_2-\frac{p_{i,2}+p_{j,2}}{2} (the index is incorrect in the book).
  • p90 (4.40): In the expression for y, all r should only have one index, the first one.
  • p103 (5.5):  A transpose is missing, should be: \Pi=R^{-T/2}H (H^T R^{-1}H)^{-1}H^TR^{-1/2}.
  • p240 (9.44a,g,h):  The occurrences of u_k in (9.44a,g) should be substituted by T_su_k, and in \hat u_k with T_s\hat u_k in (9.44h).
  • p456 Table A.1: The 4th row should be changed to:
    E((y-\mu)^n) = 0, if n is odd
    E((y-\mu)^n) = (n-1)!!\sigma^n=(1\cdot3\cdot5\dots(n-1))\sigma^n, if n is even
  • p456 Table A.3: In the expression for p(y) the exponent for y should be (\nu/2-1) instead of (-\nu/2-1).

2nd edition, 2012

  • p11L-7: "arg min_x" should be "arg max_x".
  • p16: An entry for Chapter 10 has been added: "Chapter 10 explains how a bank of filters can be used to explore different hypotheses about the state evolution or parameter values in the models."
  • p33 point 3 Alg 2.1: Should be T=U_2^TD_1^{1/2}U_1^T.
  • p38L19: Should be x=(x^T, \lambda)^T for the augmented x.
  • p40L-6: The factor should be R\mathcal{I}(\mu)\geq 1.
  • p51L7: Remove the factor 2 after the second equality, to make the expressions consistent.
  • p52: The accuracy of the x0 estimate differs from what is obtained when using an up to date SigSys installation due to a bug that has since been fixed.
  • p77 Table 4.1: Substitute c for \beta in the two last columns of the RSS row.
  • p77 Table 4.1: Throughout the DOA row 1 and 2 should be exchanged when used as index.
  • p78(4.2): Remove the last equality and what follows.
  • p83: The left plots are all illustrating DOA and the right plots TOA, not the other way around as indicated in the text and captions.
  • p86L-9: Should be L=2 to match the illustration in Fig. 4.7.
  • p88 (4.28)+(4.29): In all occurrences of 1 and 2 as index should be exchanged.
  • p88 (4.29): The terms in the sum should be squared.
  • p90L-8: "squared range to the target." should be "squared range to the target from the origin."
  • p91 (4.43): The indices 1 and 2 should switch places.
  • p97L9: A + r_0 is missing in the TDOA expression.
  • p97L10: Exchange all occurrences of 1 and 2 in the index.
  • p116: Clarification, the erfc function used on this page differs from the erfc function usually used in mathematics!
  • p130 (6.8): The equation should be p(z|y)=p_{x|y}\star p_w(z) = \int_{-\infty}^\infty p_{x|y}(x-v)p_w(v)dv.
  • p132-133: All occurances of x^{MV} and x^{MAP} should have a hat, ie, \hat x^{MV} and \hat x^{MAP}.
  • p137 (6.16b): "x_k^{(j)}" should be "\pi_k^{(j)}".
  • p143: The last bullet point has been reformulated: "The posterior CRLB : this relates to the parametric CRLB, in the sense that the information matrix is averaged over all possible trajectories [P^{PostCRLB}_{k|k}]^{-1} = \int [P^{ParCRLB P}_{k|k}]^{-1}p(x_{1:k})\,dx_{1:k}.".
  • p144L2: "N. Bergman and Gordon (2001)" should be "Bergman, Doucet and Gordon (2001)".
  • p144 (6.28a): The last term should be "G_kQ_kG_k^T".
  • p146 (6.33a,c): The last term should be "GQG^T".
  • p147: The derivative in the second last equation should be d^2/dx_{k+1}dx_k.
  • p150L3: The last term should be "G_kQ_kG_k^T".
  • p151L12: "nl2ss" should be "nl2lss".
  • p151L14: "ss2nl" should be "lss2nl".
  • p157 (7.15): Add a '(' right after P_{1|0}.
  • p158 (7.16), (7.18): The (2,1) element of P should be P_{yx}.
  • p159L-11: Substitute \mu_\gamma for \mu_y.
  • p170L4: All H and R in the should have index k.
  • p186-187 (7.70,7.71,7.74a): The factor (H^T_k P_{k|k-1}H_k+R_k) should be (H_k P_{k|k-1}H^T_k+R_k), note the change of the placement of the transpose of H_k.
  • p234: The third bullet point has been reformulated: "The posterior CRLB relates to the parametric CRLB in the sense that the parametric information matrix is averaged over all possible trajectories [P^{PostCRLB}_{k|k}]^{-1} = E [P^{ParCRLB}_{k|k}]^{-1}. The expectation makes its computation quite complex in general.".<\li>
  • p241 (9.45d): The (1,1) element of Q_k should be (Q^{nl}_k)^T.
  • p244L-14: "C_k=0" should be "H_k = 0".
  • p247Fig9.5: Exchange the last sentence in the caption for "The PF covariance can according to (9.54) be decomposed into the MPF covariance and the conditional Kalman filter (condKF) covariance."
  • p266L-5: Replace "below" with "in Algorithm 10.3".
  • p267L-1: "Algorithm 10.5" should be "Algorithm 10.2".
  • p302L8: Clarification of the first sentence in the second paragraph: "The FastSLAM algorithm, as described in Montemerlo et al. (2002), has proven to be an enabling technology for many SLAM applications."
  • p317: Clarification, in the description of the bilinear transform s represents the derivative operator and z the discrete time time-delay operator.
  • p322: Methods a-c contains several typos, and some of the the underlying assumptions should be better investigated. Stay with methods d and e for now.
  • p328 (12.22b): All occurrences of N of the right hand side should be substituted for M.
  • p341L-6: "nl2ss" should be "nl2lss".
  • p344 Table 13.1: All discrete noise terms should be \bar w_t to distinguish them from the continuous counterparts.
  • 344 Table 13.1: The discrete time CA model should read: x(t+T)= \begin{pmatrix} I_n & TI_n& \frac{T^2}{2}I_n\\ 0_n & I_n & TI_n\\ 0_n & 0_n & I_n \end{pmatrix}x(t)+ \begin{pmatrix}\frac{T^3}{6} I_n\\ \frac{T^2}{2} I_n \\ TI_n\end{pmatrix}\bar{w}(t). Changes are made to the (2,2) and (3,3) elements of F that should all be I_n, the (2, 3) element that should be TI_n, and the (2, 1) element of G that should be T^2/2 I_n.
  • p409 (14.50): The equation should read: "r_k= \|x-p_k\| = \Bigl(\frac{y_k}{\bar{P}^0}\Bigr)^{-1/\beta}".
  • p456 Table A.1: Should be h(y) = (y^2, y)^T.
  • p466L12: Exchange "[...], and CT gives zero variance." for "[...], and CT gives half the correct variance."
  • p472L17: The second last expression should be: \frac{\frac{1}{M}\int_{-\infty}^\infty \pi(x)\,dx}{\frac{1}{M}}
  • p481FigB.3: The caption should be: "Histogram of samples generated with Gibbs sampling and true Laplace distribution density function."
  • p485(C.4): The "\geq" should be ">".
  • p491: In the bullet list, item 2 has been replaced by: "The likelihood function satisfies some regularity conditions to avoid degenerate cases.".
  • p491: In the bullet list, item 3 has been replaced by: "The information matrix is positive definite at the true parameter \mathcal{I}(\theta^o)> 0, so the information available in the measurement is sufficient for local identifiability."
  • p495(C.47): The last relation should be "=" instead of "\sim".

1st edition, 2010

  • p.31: new equation numbering starting from (2.5) again.
  • p.91, eq (4.40): 2,1 and 2 should be 1,1 and 1 in the index on the first row, and a similar shift on the second row.
  • Eq 2.14b: H(x^0-e) should be Hx^0-e
  • Tab A.1: E(y^n)= ...\sigma^2 should be \sigma^n
  • Sec 3.4.4: sigma points x^(i) should be e^(i)
  • Eq 13.11c: should be 3 times 3 matrix (remove fist column)
  • Eq E.13: (x-\hat{x}_N) should be (x_0-\hat{x}_N)
  • p51, a factor 1/2 is missing for the sum in the GML estimate.
  • p55, the dhstr code has some errors, check ex3 in sensorfusion.m.
  • p57, A factor 1/2 is missing in (3.23) before the trace.
  • p61, The three sigma points should be denoted e and not x at bottom of page.
  • p67, Missing superscripts to H_k in (3.45d,e,f), e.g. H_k^x
  • p69, the norm in the last equation on SLS loss function should include both R and the contribution from the estimation error, see the complement on SLS.
  • p71, The ML estimate of x should have a factor 0.5 before the sum.
  • p71, The norm in the last equation should be with respect to R_k+Cov(\hat{x}^l), the last term is missing.
  • p84, eq (4.9e): the inverse should also include '\sigma^2_e I +'.
  • p85, in (4.11), R_k should be \sigma_e^2.
  • p103, top line, R is missing an inverse.
  • p103, eq (5.5) is correct, but the derivation is lacking an initial 'V(0) - ', which is 'y^TR^{-1}y -' on all lines, that cancels the 'I-' in the last line defining Pi.
  • p103, The test statistic T(y) is defined in somewhat ambiguous ways, with or without 2 log, here and in the rest of the section.
  • p106, eq (5.10): The argument of the non-central chi-2 distribution is lacking R^{-1}.
  • p110, eq (5.15): superindex 1 and 2 should be swapped
  • p110, eq (5.18): factgor R_k^{-1} missing between the h(k)'s
  • p113, eq (5.24b): two missing transposes on first and third H.
  • p114, eq (5.26b): missing transpose on H
  • p114, eq (5.26a) and (5.29): P is defined as cov(x_i)
  • p115, eq (5.30d): argmin_c should be argmin_i
  • p118, m should be r in Alg 5.4 step 2.
  • p137 (6.12c) \pi_{k|k-1}^{j} should be \pi_{k-1|k-1}^{j} in both numerator and denominator
  • p146, eq (6.34b): h(x_k) should be H x_k
  • p157, first equation in page: k+1 should be k in first exponent, and the sum should start at m=1, not m=0.
  • p157, eq (7.15): t should be k in first exponent, k+1 should be k in second exponent, and the sum should start at m=1, not m=0.
  • p158-159: 2\pi^{N/2} should be 2\pi^{n_x/2} on two places
  • p173.7, H^TR^{-1}C -> H^TR^{-1}H
  • p177.-4, last part of \hat{\bar x}{n|k} -> last part of \hat{\bar x}{k|k}
  • p188, (7.78) should rather be \frac{4h^2}{12}\frac{2(1-\lambda)}{1+\lambda}, where h is the threshold in outlier detection.
  • p188, The time-interleaving should be y_{m:M:kM} for decimation rate M.
  • p189, Caption in Figure 7.2b should be xplot2.
  • p197, The third line in (8.3f) should appear in (8.2a) with a plus sign. The third line in (8.3h) should also have a plus sign.
  • p199, Third equation in the theorem: d_i should be \sigma_i.
  • p201, zx should be z^x in (8.12).
  • p216, There should be a hat on the first p in (9.13).
  • p225, (9.28b): equality should be proportional to
  • p229, first line: OPT-SIR should be OPT-EKF.
  • p240, Table 9.2, superindex p should be n.
  • p241, step 3 on line 6 should be step 2.
  • p246--247, mix of notation, on some occasions, N should be n, L should be l and t should be k to be consistent.
  • p255, the weight w is missing in the sum on line 2.
  • p271,step 3: there are three t that should be k
  • p272: the ss class has been renamed to lss to avoid conflicts in Matlab.
  • p290 (11.26a) \bar\cal{I}^{xx}_{k|k-1} -> \cal{I}^{xx}_{k-1|k-1} without bar, also compare (11.32c).
  • p291.-3 n_y \time n_y -> n_y^i \time n_y^i
  • p292 (11.32c) \bar\cal{I}^{xx}_{k|k} -> \cal{I}^{xx}_{k|k}
  • p314, eq (12.12): second equation, the minus sign should be a plus sign for x2.
  • p343, eq (13.11c): The first column should be deleted.
  • p343, below eq (13.11c): equality sign missing for \dot{q}=-1/2...
  • p344, eq (13.14): T/2 should be T^2/2 before S(q), but not before S(omega).
  • p344, eq (13.14):-S(\omega(t))I_4 should be \bar{S}(q(t)).
  • p345, eq (13.19a): R(q) should be Q(q)
  • p344, eq (13.20): the structure of both expressions are not right, the position of zeros and ones are left as an exercise. The idea is that the gradient H^a is the gradient of the last column of Q(q) wrt q (so there are two different formulations, at least).
  • p347, Table 13.4: for the first a(x), v^X and v^Y should switch on row 3 and 4. Last f(x), Y- should be Y+.
  • p360, eq (13.55): the initial '9' should be deleted.
  • p376, middle, R=2c/t -> R=ct/2
  • p385, N_{N_{cog}} -> N_{cog} (two occurances)
  • p393, (14.35b) Change (R+B/2)/(R-B/2) to (R-B/2)/(R+B/2).
  • p448, (A.4) what is given in the tables is not Q but 1-Q
  • p449, Table A.3, g(theta) should equal \nu+2, and a square is missing in the sum defining y in the comments.
  • p449, Table A.4, sum \mu_i should be sum \mu_i^2
  • p451, eq (A.8b): there should be 1/2 before the trace operator.
  • p452 (A.11b) 3\sigma^2 -> 3\sigma^4, and delete 2 in second sum.
  • p452 After A.14b C_i^TxC_i -> x^TC_ix
  • p452, eq (A.16): there should be 1/2 before the first trace operator.
  • p477 Ex C.2 Formula for p(y|\theta) is not correct. The factor 2\pi should be raised to the power -N/2, but det(P) to the power of -1/2.
  • p479 (C22b) and (C22c) missing factor 1/2 in exponent (three instances)
  • p457, ex A.2: \mu_x=(3,0)^T in this example, leading to a gradient [1 0;0 3], not [1 0;0 20]
  • p485 (C.46) swap 0 and 1
  • p488, eq (D.2b): the strange U sign should be a T.
  • p493 Ex D.4 \hat A^2 should be A^2 in last expression for log T.
  • p504 (E.13): x in the last term should be x_0 (two places), same thing on 6'th line on page 508.
  • p505, d should be n_x under E.16.
  • p508 Lemma E.6 -n_y should be -n_x
  • p509.-8 missing square in exponent

  • Statistical Sensor Fusion - Exercises by Christian Lundquist, Zoran Sjanic and Fredrik Gustafsson

    1st edition, 2015


    • (Apr 19, 2022) Page 16, exercise16c: Note, the CRLB is the lower bound for any unbiased estimation method.
    • (Sept 22, 2015) Page 21, exercise 4.9b: The exercise should to be reformulated as: "Estimate the target location. For this, create a new sensor model and perturb the target position a bit. Use the NLS method from the sensor model class. Plot the estimate with an uncertainty interval overlayed in the sensor model plot." This reformulation ensures that the question and answer are consistent. Furthermore, since the TOA measurement model is nonlinear, NLS instead of LS/WLS estimation should be used.
    • (Aug 2, 2018) Page 53 line -5, exercise 11.1: The reference Figure 5 should be Figure 11.1.
    • (Sept 22, 2015) Page 59, exercise 12.1: In the first sentence \theta and \omega should have a subscript t, i.e. x_t = (\theta_t,\omega_t).
    • (Sept 22, 2015) Page 60, exercise 12.3: "Discretisize" and "discretisized" should be replaced with "Discretize" and "discretized".


    • (Sept 22, 2015) Page 103, exercise 2.1d: \mu should be replaced with \sqrt{2 \pi \sigma^2}.
    • (Sept 22, 2015) Page 133, exercise 4.2, (4.2b): x_1^2 and x_2^2 should be replaced with x_{k,1}^2 and x_{k,2}^2.
    • (Feb 26, 2016) Page 134, (4.3b) should read y = H\bar{x} + e, and the last equality in (4.3c) \bar{x} =.
    • (Sept 22, 2015) Page 134, exercise 4.3, (4.3c): In the definition of the vector x, x^T x should be replaced with R^2.
    • (Apr 17, 2016) Page 138, exercise 4.2c: "H is quadratic" should be replaced with "H is square".
    • (Mar 29, 2018) Page 145, exercise 5.3a: (5.3b) \sigma is missing in two places to make the expression the proper pdf; however, this does not change the end result.
    • (Mar 29, 2018) Page 145, exercise 5.3a: (5.3f), the likelihood in the nominator should be conditioned on H_1 and the one in the denominator on H_0.
    • (Mar 29, 2018) Page 145, exercise 5.3a: (5.3g-i), the sign is wrong and a 1/\sigma^2 is missing, the end result should be: 1/\sigma^2(\sqrt{y_1^2+y_2^2}-1/2).
    • (Mar 29, 2018) Page 146, exercise 5.4b: The computation of T0 and T1 is incorrect, use the new expression for T(y) as derived above.
    • (Mar 29, 2018) Page 148, Figure 5.2, the caption should refer to Exercise 5.5, not 5.4.
    • (Apr 26, 2022) Page 168, exercise 7.2a: Factoring out A^(2k) in (7.2c) results in an intermediate step with a geometric sum that is only convergent as k->\infty if |A^-2| < 1, which is problematic when solving exercise 7.2b.  However, this is just superficial, as if the factor A^(2k) is kept in the sum, the corresponding geometric sum is convergent for |A|<1 instead.  A proper solution should make use of this, and also make note of this limitation.
    • (Sept 22, 2015) Page 169, exercise 7.2, (7.2j): R should be replaced with r.
    • (Sept 22, 2015) Page 187, exercise 8.6: In line 4 of the Matlab code (mms.px0 = 10*, the uncertainty of the initial state mms.px0 is defined in terms of the measurement noise However, since these two are in principle unrelated it is more intuitive to set mms.px0 to a reasonable value, independent of A reasonable choice for this is mms.px0 = ndist([0; 0; 0; 0], diag([.1, .1, .01, .01]));
    • (Sept 22, 2015) Page 221, exercise 11.1a: The output diag(mhat.P)' should be 10^{-3} smaller than the displayed output.
    • (Sept 22, 2015) Page 222, exercise 11.1c: To account for a sampling time T = 1 in the motion model, the line mmot.exmotion('cv2d') should be changed to mmot.exmotion('cv2d',T).
    • (Sept 22, 2015) Page 241, exercise 13.1, (13.1): All \phi's should be replaced with \Psi's.
    • (Sept 22, 2015) Page 242, exercise 13.2, (13.2b): All components of the state vector (so x, y, v, a, \psi and \omega) need to have a subscript t. Furthermore, in the second row in the state-space model the minus sign should be replaced by a plus, i.e. it should be: y_t + \tfrac{2 v_t}{\omega_t} \sin{\tfrac{\omega_t T}{2}} \sin{\psi_t + \tfrac{\omega_t T}{2} } to make the notation consistent with Table 13.4 on page 353 of the book.







    • (May 21, 2012) Page 192, Eq (9.1b) and (9.1e): The Gaussian in the denominator should have the mean f(x_0^i) instead of x_0^i. Compare with (9.30e) in the text book. Together with the comment from (Apr 20, 2012), the denominator should be N(y_1;f(x_0^i),Q+R).
    • (Apr 20, 2012) Page 168, (7.2): Last exponent should be ^{2(k-m)} instead of ^{k-m}
    • (Apr 20, 2012) Page 178, (8.1c-e) and (8.1i-k): All v_k should be replaced with 0.
    • (Apr 20, 2012) Page 179, (8.2d): Should end with the term 0.04\hat x_{k|k-1}^2 (^2 has been added)
    • (Apr 20, 2012) Page 180, (8.2n): r_2^{(i)} should be replaced with \sigma_2^{(i)}
    • (Apr 20, 2012) Page 192, (9.1b) and (9.1e): The Gaussian in the denominator should have the variance Q+R instead of R. Compare with (9.30e) in the text book.
    • (Apr 23, 2012) Page 265 , Exercise 16.3: Replace continuous velocity with constant velocity