From c5f7477a987ccaa333dc48c997bfe8530ebe099a Mon Sep 17 00:00:00 2001 From: Henry Moore Date: Fri, 1 Nov 2024 13:10:50 -0600 Subject: [PATCH] Switch to latex for equations (#8) * switch to latex for equations * update to use math mode instead of 3299563 --- doc/Constraints.md | 25 +++++++++++++----- doc/constraints-generic_cost_equation.gif | Bin 2292 -> 0 bytes doc/constraints-least_squares_equation.gif | Bin 1706 -> 0 bytes ...constraints-observation_model_equation.gif | Bin 3525 -> 0 bytes doc/constraints-pose_2d_prior_equation.gif | Bin 4202 -> 0 bytes ...raints-state_transition_model_equation.gif | Bin 3039 -> 0 bytes 6 files changed, 18 insertions(+), 7 deletions(-) delete mode 100644 doc/constraints-generic_cost_equation.gif delete mode 100644 doc/constraints-least_squares_equation.gif delete mode 100644 doc/constraints-observation_model_equation.gif delete mode 100644 doc/constraints-pose_2d_prior_equation.gif delete mode 100644 doc/constraints-state_transition_model_equation.gif diff --git a/doc/Constraints.md b/doc/Constraints.md index 263c3e12b..4d74a0bbf 100644 --- a/doc/Constraints.md +++ b/doc/Constraints.md @@ -15,7 +15,9 @@ documentation is highly recommended. The nonlinear least-squares system used by the Ceres Solver is written as: -![least squares equation](constraints-least_squares_equation.gif) +```math +\mathrm{arg\ min}_{x} \left(\frac{1}{2} \sum_i \rho_i \left(||f(x_{i_1},...,x_{i_k})||^2\right)\right) +``` In Ceres Solver parlance, ρ() is called a "loss function". f() is called a "cost function", which accepts one or more inputs, x. And the inputs, x, are called "parameter blocks". The "parameter blocks" themselves may be @@ -42,8 +44,9 @@ are acceptable. The "cost function" is the main component of the Constraint object. It is responsible for computing the cost to be minimized by the Ceres Solver optimizer. The cost function must implement some sort of equation to generate a score for arbitrary input values. In its most generic form, that equation is written simply as: - -![generic cost equation](constraints-generic_cost_equation.gif) +```math +\begin{bmatrix} r_1 \\ ... \\ r_i\end{bmatrix} = f\left(\begin{bmatrix}x_{1_1} \\ ... \\ x_{1_j}\end{bmatrix}, ..., \begin{bmatrix}x_{n_1} \\ ... \\ x_{n_k}\end{bmatrix}\right) +``` where f() is the cost function, x1 through xn are the input Variables, each of which may contain multi-dimensional data, and ri are one or more dimensions of the computed costs. In Ceres Solver notation, @@ -57,8 +60,9 @@ one or more outputs. However, in practice there are two common forms for cost fu An observation model, sometimes called a sensor model, predicts a sensor measurement based on the current estimates of the system Variables. The cost is then computed as the difference between the predicted sensor measurement and the actual sensor measurement, normalized by the measurement uncertainty. - -![observation model equation](constraints-observation_model_equation.gif) +```math +\begin{bmatrix} r_1 \\ ... \\ r_i\end{bmatrix} = \left(\begin{bmatrix}z_1 \\ ... \\ z_i\end{bmatrix} - h\left(\begin{bmatrix}x_{1_1} \\ ... \\ x_{1_j}\end{bmatrix}, ..., \begin{bmatrix}x_{n_1} \\ ... \\ x_{n_k}\end{bmatrix}\right)\right) \cdot \Sigma ^{-\frac{1}{2}} +``` where z is the sensor measured, h() is the sensor prediction function, and Σ is the covariance matrix. Within the least-squares minimization, the entire cost function will get squared. By dividing by the square root of the @@ -72,7 +76,9 @@ A state transition model, sometimes called a motion model, predicts the value of current estimates of the system Variables. This is generally used to enforce a physical model of the system, such as known vehicle kinematics. -![state transition model equation](constraints-state_transition_model_equation.gif) +```math +\begin{bmatrix} r_1 \\ ... \\ r_i\end{bmatrix} = \left(\begin{bmatrix}x_{t_1} \\ ... \\ x_{t_i}\end{bmatrix} - f\left(\begin{bmatrix}x_{{t-1}_1} \\ ... \\ x_{{t-1}_i}\end{bmatrix}\right)\right) \cdot \Sigma ^{-\frac{1}{2}} +``` where xt is the current Variable estimate for time _t_, xt-1 is the current Variable estimate for time _t-1_, f() is the state prediction function that implements the desired kinematic or dynamic model @@ -245,7 +251,12 @@ modeled this way. Our cost function will follow the "observation model", where t predict the sensor measurement, and the cost will be the different between the measured and the prediction normalized by the measurement uncertainty. -![2D pose prior cost equation](constraints-pose_2d_prior_equation.gif) +```math +\begin{bmatrix} \mathrm{cost}_1 \\ \mathrm{cost}_2 \\ \mathrm{cost}_3\end{bmatrix} += \left(\begin{bmatrix}z_x \\ z_y \\ z_{yaw}\end{bmatrix} +- \begin{bmatrix}position_x \\ position_y \\ orientation_{yaw}\end{bmatrix}\right) +\cdot \Sigma ^{-\frac{1}{2}} +``` We will make use of Ceres Solver's automatic derivative system to compute the Jacobians. For that to work, we must implement the cost function equation as a functor object (has an `operator()` method). To compute the cost, our diff --git a/doc/constraints-generic_cost_equation.gif b/doc/constraints-generic_cost_equation.gif deleted file mode 100644 index 9fc2ac5241300585d9ea61bc8ee16b30190f601d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2292 zcmV1hJf!z+?~s5V^X-$)nNGC=18{zk$@zM+CUe zwcFg6vfl-)~5CIst0stQ@F$Dg{Nt}3MBp{P<2tGihsoVk+#7->O7$YUe z6^D3|bG5~xiJfG8Mw2+8s1E>0W1d5?OhL^RCk0rI0bz*>r9W8&xFNCG34AiT76A*a zEDE%QQVLKvG={Z|00t;HpCBD~vNey`3LlCCU!S;gEZ!*B&P zw;L-3C~#2$33yUqdWC^li$N2bm=}srz(T+l3=ok378u?(LL#bpXq$q7In*I`W2^`O z1TE@E9B-A3_8yZx5(z*HKLlACe!)074tG%2C5Dnz4jG=9Mht-1NKlYuM0t5|Mp}>370UF|QBQgQ0q*FF& zsVB>E>1){GU~F`rKJV-ca=U}}D?t`e)Pyn!`>4!7FiVls#5h9n*kFhIaY zzoODB4aFX-Q4uXzwQQAV{>s2zWW%nKY$?+wMcrqBbZcj|G4OYtFM`hE<%{XIcBg!2 zh-)UfDzt!Lwy13TiM$L^hfgv5o=Wc}`UMQ%y0*3}*`3RbWpJefr!WGhnVM6pvI?tv zXR4uO>?^{(q>9%^`GU-?$H_4kfB_HF8gWY_P+GCJChvUqK; zBH~+$zLfC%F`y$Pz%$aCs*@89_!K>J$v)fcD%0~lU9%Vu47NZbGjOLWtT*?Yb<$}M zRPaMyug%15W*?#Sxa8hVEv#_2Jufg0$vlI6XQSH-)Qsr;Y!S>A5I5k)2Ef2SHpnNe z(Vrk*h~jty(Ly@@ek+>HY(VgL`PD~%4GHIe2O;_6H#9)N?6lWDy8{%*K)}5<@OPx) z�bw=tr$niImh=s?WmzySzwBEba71P*Ng6dZy5;oH+Yelii1 z|2+lC>vGu*pTYJ#D8g?}yb)}DhWz~y$8P)ov&)?dDq;lR*^Pg~sh{)^crZX6uYI*} zfWqYCJk({5Gh~xP291F}{mcY(Xt>1htkAkz=!ZKM)JK>|IGPcrP+(O!-D+GY!b`|d zJfWds3ma&J53a-k*aBh-gh;(wSVM3$;LZ)D(S#s6acMSi00EFl#1mBUN#c;gm32&l$EkP;BEijoX5f&(6oGjcnN z1+iuX5k!iN3Y38Za3Q}N5Y3OlBa+a#Fv!$#O#yd=gkJ2RsaK)xj|%ci97M@RP#U3W znLLw20)Rv&wlQxEgd#mAmdfxrVr7MlW#`T`Js8?RWVH;B&T?r=SZ=KdtLzx7US`Gl z5HphW>ZKs=^vGa#23*g4WwoT)zZ-A|7uE!fe9kq$Wg3%?Mfl8M!WkBPG?HYNjHWL4 z<~oS5^Czp!Cd~qAzhnC1Dfj$I%svUta{@ytw}eGNIl>%Lx^kcL^rsCRLYIZwgFn23 z=l%uxxj>1UF#w3M=s584MU6r)k$B*y%WlA*t%#Hxj#wiOA!^WKh6b0bVuw56p%5N2 z^90O+V?-X)kADOtZDmX;Q4w-f4RXdBx>*TDERq+T(vz9;ndE2+6B3t{gq3dNXdtB8 z5|Y3KXPg1kR_%h54n+m1BTFhJUIVVr$C-DP-!1Rd6@7OZP6O-b{j0EZ@4v7Q00Np<3zJLI;6oheRp{?DQw z_P7T;J^G?(dfO5Mv`4qhv_?j4JD%-y$GMYT={6Ta9`g)M2NI%?jP_as`A}>no=pKP z9$;L#mI8SjB=4j0@t^^zV2>9n;%*s4V44`XO*irk5h6eU#Hu%hGkw$xLxEbwI%JYC zD$$8jWZLu|cfBN%QF}-{9VxLOz|*9fZ-Q%t9kofpiha;SkMLX^17=xjD(j8Wc;OWg zV7R?{00ba_ME|BvXx&=Tdej5mAES&=Coq%=44|F?kTb?IIBSM)kRrr7xfJ+-v2(<* zDFRH&O#q;rkHfO89JGW~SuQ{``g@L0j5nw5LM{%5yXHb{7_@O{*#jDRKxOcH28}$k z249~c0OPi70fd%xL%JFL5CH<;c&_h!@28I1Z%8Z}kH}llmTWqo(5O-0yndfQ$p3&>bQK7A1RMqe4haMd4|pMgk}d`V0}V`*8G{uC zcn&5A2LTN|1Da+95(WX0r>GR16{7)uCo}>(4WO`K0tyBa45c2#y|NSnc&aA|%s2yw zIk~-?B?b??3*#9FR7| z&K-796fCgd?!kry(FjTqV65H+0t*>VaA+aH1BCtn7F4XFj6o4>ck(?6a-pFHj{q9% zYXH#V1z;K_aKu+rLI7R?k0iizugS2M8#OdADF9@Gkv1zVFgYt}r=AiT6pe~uz$YjV zBu;RdAwb3o3?gy8@Ug1S3Iuqi13+Ns+6)Trv~8jcCf%Dpt9Rk2Le==tAbH^bOO^wG;&LL0;@b?S=p#GVSqe=GYG2^ zEKC&wtO^x|#-E=UMxi_X0ses#06%d+0|tOuaFhj=G3eO=s+=>J6R(&S zVE_}pR9J!>&<8*vk%)I#TkI6z&N;(Pz<_WQLo~07cGN zeof#Bg2m0U6#$?S!pjx{Bz8cMM>j=21{rFpViYWUSp?0BRlMPSnZ-auG1^ z5z465@WT|aq9q9)y1I&o(!fhW0!PMBZ?m6{jAXPhz`6pA-aTN01M*T!D8buiia~Eu z1w#WnQhE?`2PvWu^a47c+cV70h#S!X@w4g)-} z;|Kxdqt!$)DH|EheulfE^d-KEhmP3UgHvn`4kc-`fAE4?4 z%v~%(5TF>4oN9_3Fn|I64j3e#ntIR_?~0@(@Yx*=h;EQ|n!^lw>7xgb77m46X@X!F zIb89!g#X!Vy07sXm|X_UaEddc-5zxTnkw**1^c#GQS%Zg-&643d{{v7Ex!}A1nKQw za0fG=5a>jo(RoBA1ys8DCc3LoR|X4siNV=9eNVvx=5I8%RPqCm0JSh{K>$k-Kg00} z0}AMgqcV^_6d(X97IQ-I*fErlSzu`vG=ax1P`U(62!Cw5%psDLfoPDRgVgw+Ib0B~ z4WQ5i>p+09eo;T%)keLjIwf}n=7isjE73s8#+ zFXDoPao~s&z)t=MfKveAEbw>i#03h@fy5PjKq}pE-w6_MoI6560P7h*o)+-IRB`~4QNUl>{8tNCj-W;v2;3_3 zVnY^G(lA^oKq--s83V}h1=z}fGA?I;YFhJ}iBLoW8si9}^k9F;e8Tpeur%nk-~cT| zNvYP!2XKb-ok=J}A|)Bh{MhrJ_{=9hg$U1nI)NNTbRQx8Nzh5WZbfwzL1XS$(1uQe z0HXi}4P9sh1c^k)p%~4m03d`sM#67{H7C}2sE%G4vgu&Gc@Y80aihzI}xJ1LpX AlmGw# diff --git a/doc/constraints-observation_model_equation.gif b/doc/constraints-observation_model_equation.gif deleted file mode 100644 index 25a37d3128ab8faf18571687cfeca29940eae9b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3525 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 diff --git a/doc/constraints-pose_2d_prior_equation.gif b/doc/constraints-pose_2d_prior_equation.gif deleted file mode 100644 index 54e432c27b1dce8920fc27614aa3302a160ac819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4202 zcmaKl_dnH(2|LQdi&4{Rh6!A6`E_Uymo{oP~j*=N!lu7z2P`zkUG#fJUQRT3T>8 zoS&cH^z^ixoLopqNJ&Wvi^Y2R@?}(16qQPS@ZiDw_wPw0lD4)s7K_c#&zF>x{NMNg zNA5cm^q-;r-~87EV8?89#v7o*zojjB7c6v6=|;#aH6KpR$r7%I+GZ^>yS0js6>M~S z#y=B(xT2w(G{Lu9Dyp*z^zU#kwcRc6!FOlf z>$m3PQ|(e79kv`)E6$yK*vAwAJvDgJj~0rX?O$LH{bf7%eBEYM1zrF4)k``GOxdcL z6IfaQl(4o-`S8Q`5WtEbERbbn5&RqcR5G!A;2N+iuHX-mBm44R)S*XrOp`>AD1zM( zl*oi%JGLsLvgyMDJp7VS)(rbfV@4qc+VstCf{6gLK%C}%M|QRYmf-KP20GuMYSWN0 z^-K{3$H_dZxO@=!q6yCnXt4pax)!7(SqDw@AJ?!vfruo^3R{UlOEO3u>346t7$g|( zNhpk1=0a&^sT1%35wE%=$u-)>`_%qRqWfpCXkpYt6&7-udilUtc>f3c%isvEwyZgr3JE z7!#&-I0kkhah@oY{WD&i09b5fknwyaBPojkG_!=K2;%L?8d*FL`9)XD-bj6hm1VS* z$@W4SHxTGxp_%C9a0bV>O4G*RP&QZk99KO3=pQIOQ*L8|p7q(fMjSXJjem=zGMlrA z5gc-sJmPAATZZlh5xVtJzo8dcYoDaVThswmOKXRuDqyTMd;Pp^(&SyUT*f5+1V`LN z63^maHiPSw@v-2T`1J`S6U_g36ZcPrFz|=bKl?*PrdK6bi(=Y1*Q7v0hmB~@llVui zU7}@m4bVE>KvX?AG!WH%RjCYHvXipV@jO=&km&x1cS*l+3?>d$--c`1YgUK#-tzRS zF}DB-@UKx?%>|Cebtq5MMkRidKM}!5{Mr!k&mcWWWWv-`81E;AvccM z%X9We)6m$1=ZgMjf4Y7c_5R_X~Gmf1MvWRxBfxw zXG-`(m6`jW2y123cYpvIA^xY^+RHHofipRavd|YUrBi>v#7`yM$FElN!0HS;Wx zbdZI(957>63|iNzitRVE?2Dhrod0~ki+avxc;GPvy;ski9-yiTbtmc4m>?*6sG@)U z+=jl}103U(rCq&jG$dm5?vOHGE2U=@@1yyha9pr;=Ust1Sv7bgcFzzT5ZJy(T**9G z3VTH=9)7XSplA`7U#M5@%J8kN8ln0gZbtLL1=?lyhW9n9KGaU6Ce9kj3g>Lx|J9a~ zJk{y(Z|Rl27~j3lftx442OA{Bes!DBF+RE7NpHWeRDl^Aw6klceG2?5yY%14#W_V< zqsf7z>P^>B05Zr1_U{T}ar+nFm+c$D=zRXHg#`O%R zgMGV!BoCE_n+u{Z-0*8xBbh@ca4!-yaPJ%?qT1A^8GlkAMo zHrV8|CExJ5>t+g@RiD)(jR0-WAB(9E>3~^D%Ck@_g$$28-)VVK{nT^zgPbTOpGuK7 zQM&muU?30yx-dk|zO0JNuqLeY|NT7EC9t)4@a6o5(mF@8#4ff)!ClEwfzvE)%V38PYrlNA3Jwq}I@`zm?+xt&S2rqlspVg~4$^WTPgFnj8im9Xhm2mT$^MztxH}(n zHd8trT0LJ6PZ#IdAK5?&ugz4xi?eRD9MqVysUKvQp=%|1>@J@`o4!Ws+jUgako>R? zh(SF`Z)$KjGg4T!WA9A=Tt@yG_$@S2qZCtp#yHZ{(!v4Lyf5tR7&GbQ|BTxSU$-JA zsq)^$6bS1o-|>H*=uqO&Gr>?$S8cv@ew$v{yLVr0{1C;FHRj%{s8{sigSL60m+|qP zT}i()+@$S`pRJKkO{Xq9<$KRbepcrA-e-6|MVq*3>b6DFr{mz1N)yjb@s79C{=dyx zzx8^;ZIZBBJ$6oX-jiZnHZzJjKy#?q#U))vx#T!GnM2 zX!WWg2h~6I6mF~X)|pFT-)*Y)%bkkW$-hHUyl#^EJz=Ob%t zpXnDiqxf*D*Gf^24d;rWyt}GOu)n6?XMRY%aMD4+z}f^j6hdqAI9Yef(NwmdBOO{= zT!qsOM?*T=ibc^Hb}Pm+7#GjV>OEmX+;brTdTSq=5viZbb6XbPV>8pq%xrZ_2%{&? zDW<74OV0YSEI^XTZfmqh_s^&8uIEW}F{5;kGHvH;Q8|Qo{UguSw8gLz^Nx1WpW29D zDIdHNT~u_|UXg_*7*{PmHdONk#y2mco|&)g45lxp@-v^3m{kGE*D)^~4`uSZk9ETP z`ojq_74sQ0+Mbs~-dSw%E|eK(w$I99&MNQTwK$eBRiBxN4PCLc(nriVKE2K}b-V#45`L6QZNjP2#k2 zz9^biExS60ddf%j@kd~yts{m(0_!J<$!$FTCxkvv@ZbBej6!q+hBEiMlVDO3^E|)f za+R}2wC|E*mJQ4Q?r0x-FW7dp=jqtdk4?TQic4HNw+!c=(i0m4SMcRst+!LfeYrpQ zWlu#r^4V`Llvk7Hm>zb)>u)9}HjAUl>M{z_{q5t6zbGFT^iJ5~dp*tu9v^3C0(7zVd^7_(qd9NK_Yx z&W^*t9g>1GNj8T`pl6ofz~`*&;(B`o&pJa~6#ht>Pw2$PTNsedfRh|0q?Ihi-x7>t z(a|q%T=~ZQDVDe+cI!(n`34t8#DHSCDe;RbH@PWCJxm>i6b-hpFCx?^@{fo^Y&!?W8KuPS{}YaV$dOiH~IGv zgg92u^7b}Zg3Qtg)u=2`o|d z`7^lUnNo7uqCza^H~P4lxWL!q;bcs?t|(3S@=@63KXfxyLp26cM3NLmv~|CQ(h znCI$8OnT7#pa=`~&0O@Y-W#L7S5=43WQXFPFYrQ(Jd%5*vyhpkQIL*m<~}#$gkGu1 z3(t{Hp4TnlOIvY0p&I%IB^vaAQiYPQ__F#^oRm3k%@ocXO5v7*mr}gPygeIul+0?& z>n3IRzj+6xLQG2Nr#F0R5Bwau!*W&ho^Ivjk0?yYm3O{lMC&QlF6pO%M50EGV)W7@ zuu6IFya)WQ&8bxRYNy*=hRm%M-IzQEr#wzy1_fs5g>`Qev6ms1on9TtTacq6PHa3E@d z8q;1ie;3rf?k2zkYAXwCi|^H+IjSXTBVU$egko+;6xX1YHI==>HcU|;Aa$CYBr{79 z=@=YT3?thp(~~O--w%84dA(h>k%QC<46ICiOKA9LTFh*6e@zg1*IJ3F?1aTm#l;`T;>PwHtB<6%qDZ=-itK=fD9-PS;SsjxChGFx<_>X5%iz7R z#BaG`COn$X*TBSU8Yb(t3&KWC-*mmK%7v?S$BU}1QgnG=s}%FF^8+HOuOlkuMGhTM zC^pRcoA$Kg-E3Uziyd8$@H-<%QsirQhFfF=)-4qt@NmS-q6kr8`Lv?cr~y0L02)Uu zXg!X07nYNV9GB1DhhMs=f{2qg^Azb-jS8=&wM5d8^!7SavGhj6V^!%VVKKjhpyl!k zRTra#c?olqG~|z_@mbCbNXOG$rp0z9n^r#}&q*QJ|7=dIZj^Xr9=+fV2;^SPG-}^0 zNxi+$If-rmT8~DW@hTC4&LA_uclnHtaU*mi^v+Up`WR`n2V!e1!cS1AQSN}k%!Sf# zHx^^Z#JV-iyL&oxG7Dl(LTi^I?oW+jU~7^FeeOm<)m@+D*N1`6&&r)RJxETT#?+m_ zAks>-XmVdqyy>a5zT(N;_|vQ&lDNQ#1fBIJ8@iKIR!+w(meL&BomRN|vgoenQ{M84 z`W2%@+M~=Xep53)=rY4$c5A>f#^A4nU+0gs#*!_Zq x>4S0PJYPfH6nueKpInNlKCCaABW7_1)Mp3miGv%v{r&Vof7gLaB4EJy{{S3(LMH$K diff --git a/doc/constraints-state_transition_model_equation.gif b/doc/constraints-state_transition_model_equation.gif deleted file mode 100644 index f8dd22c0d772b52c28cb919c49b710c8ea3f747f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3039 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