卡尔曼滤波的推导

卡尔曼滤波的推导

1 最小二乘法

在一个线性系统中,若\(x\)为常量,是我们要估计的量,关于\(x\)的观测方程如下:

\[ y = Hx + v \tag{1.1}\]

\(H\)是观测矩阵(或者说算符),\(v\)是噪音,\(y\)是观察量。若关于\(x\)的最佳估计为\(\hat{x}\),误差可定义为\(\epsilon_y\):

\[ \epsilon_y = y - H\hat{x} \tag{1.2}\]

定义代价函数\(J\)为:

\[ J = \epsilon_{y1}^2 + \epsilon_{y2}^2 + ... + \epsilon_{yk}^2 \tag{1.3}\]

将方程\((1.2)\)代入\((1.3)\)可得:

\[ J=\left(y-H\hat{x}\right)^T\left(y-H\hat{x}\right)=y^Ty-x^TH^Ty-y^TH\hat{x}+\hat{x}^TH^TH\hat{x} \tag{1.4} \]

使代价函数\(J\)最小的就是最佳估计,对\(J\)求偏导,并使之为0:

\[ \frac{\partial J}{\partial \hat{x}}=-2y^TH+2\hat{x}^TH^TH=0 \tag{1.5}\]

解得:

\[ \hat{x} = \left(H^TH\right)^{-1}H^Ty \tag{1.6} \]

2 递推最小二乘法

线性系统的递推估计值可以写成以下形式:

\[ y_k=H_kx+v_k \tag{2.1} \]
\[ \hat{x}_k = \hat{x}_{k-1} + K_k\left(y_k-H_k\hat{x}_{k-1}\right) \tag{2.2} \]

其中是\(K_k\)待定的增益矩阵,\(y_k-H_k\hat{x}_{k-1}\)为修正项。先考虑线性递推估计器的估计误差均值,要注意的是这里和式\((1.2)\)有所不同,但本质都是一样东西:

\[ \begin{split} E\left(\epsilon_{x,k}\right) &= E\left(x-\hat{x}_k\right) \cr &= E\left(x- \hat{x}_{k-1}-K_k\left(y_k-H_k\hat{x}_{k-1}\right)\right) \newline &= E\left(\epsilon_{x,k-1}-K_k\left(H_kx+v_k-H_k\hat{x}_{k-1}\right)\right) \cr &= E\left(\epsilon_{x,k-1}-K_kH_k\left(x-\hat{x}_{k-1}\right)-K_kv_k\right) \cr &=\left(I-K_kH_k\right)E\left(\epsilon_{x,k-1}\right)-K_kE\left(v_k\right) \end{split} \tag{2.3} \]

类似地,代价函数\(J_k\)表达为:

\[ J_k=E(\epsilon_{x1,k}^2+\epsilon_{x2,k}^2+...+\epsilon_{xn,k}^2)=E(\epsilon_{x,k}^T\epsilon_{x,k})=E(Tr(\epsilon_{x,k}\epsilon_{x,k}^T))=Tr(P_k) \tag{2.4}\]

其中\(P_k\)为估计误差的协方差矩阵,利用式\((2.3)\)可以得到:

\[ \begin{split} P_k &= E\left(\epsilon_{x,k}\epsilon_{x,k}^T\right) \newline &=E\left\{\left[(I-K_kH_k)E(\epsilon_{x,k-1})-K_kE(v_k)\right]\left[(I-K_kH_k)E(\epsilon_{x,k-1})-K_kE(v_k)\right]^T\right\} \cr &=(I-K_kH_k)E(\epsilon_{x,k}\epsilon_{x,k}^T)(I-K_kH_k)^T - K_kE(v_k\epsilon_{x,k-1}^T) \cr & \quad -(I-K_kH_k)E(\epsilon_{x,k-1}v_k^T)K_k^T+K_kE(v_kv_k^T)K_k^T \end{split} \tag{2.5} \]

由于\(\epsilon_{x,k-1}\)\(v_k\)是相互独立的,所以有:

\[ E(v_k\epsilon_{x,k-1}^T)=E(v_k)E(\epsilon_{x,k-1})=0 \tag{2.6} \]

\(R_k=E(v_kv_k^T)\)为噪声的协方差矩阵,式\((2.5)\)变成:

\[ P_k = (I-K_kH_k)P_{k-1}(1-K_kH_k)^T + K_kR_kK_k^T \tag{2.7} \]

我们的目标是求出待定的增益矩阵\(K_k\),对\(J_k\)求偏导,并使之为0可得:

\[ \frac{\partial J_k}{\partial K_k}=2(I-K_kH_k)P_{k-1}(-H_k)^T+2K_kR_k = 0 \tag{2.8} \]

\(K_k\)解得以下:

\[ \begin{split} (I-K_kH_k)P_{k-1}H_k^T=K_kR_k \cr K_k(R_k+H_kP_{k-1}H_k^T)=P_{k-1}H_k^T \cr K_k=P_{k-1}H_k^T\left(R_k+H_kP_{k-1}H_k^T\right)^{-1} \end{split} \tag{2.9} \]

递推最小二乘法总结如下:

a. 初始估计值:

\[ \hat{x}_0 = E(x) \tag{2.10} \]
\[ P_0 = E\left[(x - \hat{x}_0)(x-\hat{x}_0)^T\right] \tag{2.11}\]

b. 对于k=1,2,3…:
假设线性系统的观测方程如下:

\[ y_k = H_kx + v_k \tag{2.12} \]

其中是\(v_k\)均值为0,协方差矩阵为\(R_k\)的随机变量,每步测量的噪声都是相互独立的,则矩阵为\(R_k\)对角矩阵,也就是说测量的噪声为白噪声。

更新方程如下:
\[K_k = P_{k-1}H_k^T\left(R_k + H_kP_{k-1}H_k^T\right)^T \tag{2.13}\]
\[\hat{x}_k = \hat{x}_{k-1} + K_k(y_k - H_k\hat{x}_{k-1}) \tag{2.14}\]
\[ P_k = (I-K_kH_k)P_{k-1}(I-K_kH_k)^T+K_kR_kK_k^T \tag{2.15}\]

3 递推最小二乘法的更简洁表示

首先要为估计误差协方差表达式寻找一个新的形式。把式\((2.14)\)代入式\((2.15)\)中,可以得到:

\[ P_k=\left[I-P_{k-1}H_k^TH_k\right]P_{k-1}\left[I-P_{k-1}H_k^TH_k\right]^T + K_kR_kK_k^T \tag{3.1}\]

其中\(S_k=R_k+H_kP_{k-1}H_k^T\),再把\(K_k\)代入并展开可得(考虑到\(S_k\)\(P_k\)的对称性):

\[ \begin{split} P_k &= P_{k-1} - 2P_{k-1}H_k^TS_k^{-1}H_kP_{k-1}+P_{k-1}H_k^TS_k^{-1}H_kP_{k-1}H_k^TS_k^{-1}H_kP_{k-1} \cr &\quad + P_{k-1}H_k^TS_k^{-1}R_kS_k^{-1}H_kP_{k-1} \cr &=P_{k-1} - 2P_{k-1}H_k^TS_k^{-1}H_kP_{k-1}+P_{k-1}H_k^TS_k^{-1}S_kS_k^{-1}H_kP_{k-1} (合并最后两项)\cr &=P_{k-1}-P_{k-1}H_k^TS_k^{-1}H_kP_{k-1} \end{split} \tag{3.2} \]

\(K_k=P_{k-1}H_k^TS_k^{-1}\)可以得到:

\[ P_k = (I - K_kH_k)P_{k-1} \tag{3.3}\]

对于式\((3.2)\),可以得到以下的表达:

\[ P_k = P_{k-1} - P_{k-1}H_k^T\left(R_k+H_kP_{k-1}H_k^T\right)^{-1}H_kP_{k-1} \tag{3.4}\]

两边求逆,并用矩阵反演定理\(\left(A-BD^{-1}C\right)^{-1}=A^{-1}+A^{-1}B\left(D-CA^{-1}B\right)^{-1}CA^{-1}CA^{-1}\)可以得到:

\[ \begin{split} P_k^{-1} &= P_{k-1}^{-1}+P_{k-1}^{-1}P_{k-1}H_k^T\left(R_k+H_kP_{k-1}H_k^T-H_kP_{k-1}P_{k-1}^{-1}P_{k-1}H_k^T\right)^{-1}H_kP_{k-1}P_{k-1}^{-1} \cr &=P_{k-1}^{-1}+H_k^TR_k^{-1}H_k \end{split} \tag{3.5} \]

由式\((2.13)\)可得:

\[ \begin{split} K_k&=P_kP_k^{-1}P_{k-1}H_k^T\left(R_k+H_kP_{k-1}H_k^T\right)^{-1} \cr &=P_k\left(P_{k-1}^{-1}+H_k^TP_{k-1}^{-1}H_k\right)P_{k-1}H_k^T(R_k+H_kP_{k-1}H_k^T)^{-1} \cr &=P_k(H_k^T+H_k^TR_k^{-1}H_kP_{k-1}H_k^T)(R_k+H_kP_{k-1}H_k^T)^{-1} \cr &=P_kH_k^T(I+R_k^{-1}H_kP_{k-1}H_k^T)(R_k+H_kP_{k-1}H_k^T)^{-1} \cr &=P_kH_k^TR_k^{-1}(R_k+H_kP_{k-1}H_k^T)(R_k+H_kP_{k-1}H_k^T)^{-1} \cr &=P_kH_k^TR_k^{-1} \end{split} \tag{3.6} \]

可以得到式\((2.13)\)的简洁形式是\((3.3)\),式\((2.15)\)的简洁形式是\((3.6)\)

4 协方差的传播

对于离散时间的线性系统,可以以下式子表达:

\[ x_k = F_{k-1}x_{k-1}+G_{k-1}u_{k-1}+w_{k-1} \tag{4.1} \]

其中,\(u_k\)是已知的输入,\(w_k\)是零均值的白噪声,协方差为\(Q_k\)。那么状态\(x_k\)的均值\(\overline{x}_k\)随时间有怎样的变化?如果对式\((4.1)\)两边取期望将会得到状态随着时间的传播方程:

\[ \overline{x}_k = E(x_k) =F_{k-1}\overline{x}_{k-1}+G_{k-1}u_{k-1} \tag{4.2} \]

\(x_k\)的协方差随时间会有怎么样的变化?通过式\((4.1)\)和式\((4.2)\)可以得到:

\[ \begin{split} &\quad (x_k-\overline{x}_k)(x_k - \overline{x}_k)^T \cr &=(F_{k-1}\overline{x}_{k-1}+G_{k-1}u_{k-1}-\overline{x}_k)(F_{k-1}\overline{x}_{k-1}+G_{k-1}u_{k-1}-\overline{x}_k)^T \cr &=[F_{k-1}(x_{k-1}-\overline{x}_{k-1})+w_{k-1}][F_{k-1}(x_{k-1}-\overline{x}_{k-1})+w_{k-1}]^T \cr &=F_{k-1}(x_{k-1}-\overline{x}_{k-1})(x_{k-1}-\overline{x}_{k-1})^TF_{k-1}^T+w_{k-1}w_{k-1}^T+\cr &\quad F_{k-1}(x_{k-1}-\overline{x}_{k-1})w_{k-1}^T+w_{k-1}(x_{k-1}-\overline{x}_{k-1})^TF_{k-1}^T \cr \end{split} \tag{4.3} \]

对上述的式子求期望就能到得协方差。由于\((x_{k-1}-\overline{x}_{k-1})\)\(w_{k-1}\)相互独立,所以它们之间的协方差为0,因些可以得到:

\[ P_k=E((x_k-\overline{x}_k)(x_k - \overline{x}_k)^T)=F_{k-1}P_{k-1}F_{k-1}^T+Q_{k-1} \tag{4.4}\]

这个就是协方差的传播方程。

5 离散卡尔曼滤波的推导

终于来我们最重要的环节了,就是要推导卡尔曼滤波。和之前一样,先来假设一个线性离散系统,如下:

\[ \begin{split} x_k &= F_{k-1}x_{k-1}+G_{k-1}u_{k-1}+w_{k-1} \cr y_k &= H_kx_k+v_k \cr \end{split} \tag{5.1} \]

\(w_k\)\(v_k\)是零均值且相互独立的噪声,有已知的协方差矩阵\(Q_k\)\(R_k\),可以有以下:

\[ \begin{split} w_k \quad &\tilde{} \quad (0, Q_k) \cr v_k \quad &\tilde{} \quad (0, R_k) \cr E[w_kw_k^T] &= Q_k\delta_{k-j} \cr E[v_kv_k^T] &= R_k\delta_{k-j} \cr E[v_kw_k^T] &= 0 \cr \end{split} \tag{5.2} \]

其中\(\delta_{k-j}\)\(Kronecker-\delta\)函数,是信号与处理中常用的单位脉冲函数,如果\(k=j\),那么\(\delta_{k-j}=1\),否则等于0。我们的目的是在已知的系统动态方程和带噪声测量{\(y_k\)}的基础上估计状态量\(x_k\)。 对于状态估计可以的信息量,取决于我们要解决问题的本身。

如果我们利用包括k时刻和k时刻之前的测量信息来估计\(x_k\),那么能得到一个后验估计\(\hat{x}_k^+\),上标的“+”号表示这个估计的后验,获取后验估计\(\hat{x}_k^+\)是在k时刻与k时刻之前的测量值的条件下计算\(x_k\)的期望值,即:

\[ \hat{x}_k^+ = E\left[x_k | y_1, y_2,...,y_k\right]=后验估计 \tag{5.3} \]

如果利用k时刻之前但不包括k时刻的测量值来估计\(x_k\),那么能得到一个先验估计\(\hat{x}_k^-\),同样可以计算相应的期望值得到先验估计:

\[ \hat{x}_k^- = E\left[x_k | y_1, y_2,...,y_{k-1}\right]=先验估计 \tag{5.4} \]

如果我们已经知道了k时刻之后的测量值,可以利用这些信息对\(x_k\)进行估计,这个叫做平滑估计,即:

\[ \hat{x}_{k|k+N} = E\left[x_k | y_1, y_2,...,y_{k+N}\right]=平滑估计 \tag{5.5} \]

如果我们已经知道了k时刻之前有\(M\)个测量值未知,可以利用这些信息对\(x_k\)进行估计,这个叫做预测估计,即:

\[ \hat{x}_{k|k-M} = E\left[x_k | y_1, y_2,...,y_{k-M}\right]=预测估计 \tag{5.6} \]

从利用信息的多少可以看到关于\(x_k\)的最优估计次序依次是平滑估计、后验估计、先验估计、预测估计,因为用多的信息量肯定能得到不比信息量少的结果差。

\(\hat{x}_0^+\)来表示没有使用任何测量结果(信息)得到的初始值,第一个测量值是在时间\(k=1\)时测量得到的。我们可以用初始状态\(x_0\)的期望来得到\(\hat{x}_0^+\),即有:

\[ \hat{x}_0^+= E(x_0) \tag{5.7}\]

类似地,定义\(P_k^-\)\(P_k^+\)分别是先验估计与后验估计的协方差,即:

\[ \begin{split} P_k^+=E\left[(x_k-\hat{x}_k^+)(x_k-\hat{x}_k^+)^T\right] \newline P_k^-=E\left[(x_k-\hat{x}_k^-)(x_k-\hat{x}_k^-)^T\right] \newline \end{split} \tag{5.8} \]

系统以\(\hat{x}_0^+\)为最优的初始状态,那么怎么推算到下一个时间点(也就是\(\hat{x}_1^-\))呢?参加式\((4.2)\)的状态传播方程,可以得到:

\[ \hat{x}_1^- = F_0\hat{x}_0^+ + G_0u_0 \tag{5.9} \]

上述的方程可以推广到更一般的情况,即为状态\(\hat{x}\)的时间更新方程:

\[ \hat{x}_k^- =F_{k-1}\hat{x}_{k-1}^++G_{k-1}u_{k-1} \tag{5.10} \]

同理由式\((4.4)\)可以得到协议差\(P\)的时间更新方程:

\[ P_k^- = F_{k-1}P_{k-1}^+F_{k-1}^T+Q_{k-1} \tag{5.11}\]

上面我们已经得到状态\(\hat{x}\)与协方差\(P\)的时间更新方程,这个更新方程是不用测量值来参与的,如果在\(k\)时刻测得到了\(y_k\),那么如何在\(\hat{x}_k^-\)\(y_k\)的基础上得到后验估计\(\hat{x}_k^+\)呢?参考递推最小二乘法,我同样可以得到测量的更新方程:

\[ \begin{split} K_k &= P_k^-H_k^T(H_kP_k^-H_k^T+R_k)^{-1}=P_k^+H_k^TR_k^{-1} \cr \hat{x}_k^+ &= \hat{x}_k^- + K_k(y_k - H_k\hat{x}_k^-) \cr p_k^+ &= (I-K_kH_k)P_k^-(I-K_kH_k)^T+K_kR_kK_k^T \cr &=[(P_k^-)^{-1}+H_k^TR_k^{-1}H_k]^{-1} = (I - K_kH_k)P_k^- \cr \end{split} \tag{5.12} \]

其中\(\hat{x}_k\)\(P_k\)叫做测量更新方程,\(K_k\)叫做卡尔曼滤波增益。下表是最小二乘估计的递推形式与卡尔曼滤波器的对比关系:

递推最小二乘估计卡尔曼滤波器
\(\hat{x}_{k-1}\)\(y_k\)处理前的估计值\(\hat{x}_k^-\)先验估计
\(P_{k-1}\)\(y_k\)处理前的协方差估计值\(P_k^-\)先验协方差估计
\(\hat{x}_k\)\(y_k\)处理后的估计值\(\hat{x}_k^+\)后验估计
\(P_k\)\(y_k\)处理后的协方差估计值\(P_k^+\)后验协方差估计

离散卡尔曼滤波的总结如下:

1. 动态线性系统的方程如下:

\[ \begin{split} & x_k = F_{k-1}x_{k-1}+G_{k-1}u_{k-1}+w_{k-1} \cr & y_k = H_kx_k+v_k \cr & E[w_kw_k^T] = Q_k\delta_{k-j} \cr & E[v_kv_k^T] = R_k\delta_{k-j} \cr & E[v_kw_k^T] = 0 \cr \end{split} \tag{5.13} \]

2. 卡尔曼滤波器的初始化如下:

\[ \begin{split} \hat{x}_0^+ &= E(x_0) \newline P_0^+ &=E\left[(x_0-\hat{x}_0^+)(x_0-\hat{x}_0^+)^T\right] \newline \end{split} \tag{5.14} \]

3. 卡尔曼滤波器的时间更新方程与测量更新方程如下, \(k=1,2,3,...\)

\[ \begin{split} P_k^- &= F_{k-1}P_{k-1}^+F_{k-1}^T+Q_{k-1} \cr K_k &= P_k^-H_k^T(H_kP_k^-H_k^T+R_k)^{-1}=P_k^+H_k^TR_k^{-1} \cr \hat{x}_k^- &=F_{k-1}\hat{x}_{k-1}^++G_{k-1}u_{k-1} \cr \hat{x}_k^+ &= \hat{x}_k^- + K_k(y_k - H_k\hat{x}_k^-) \cr p_k^+ &= (I-K_kH_k)P_k^-(I-K_kH_k)^T+K_kR_kK_k^T \cr &=[(P_k^-)^{-1}+H_k^TR_k^{-1}H_k]^{-1} \cr &= (I - K_kH_k)P_k^- \cr \end{split} \tag{5.15} \]

从上述的方程可以看到:1). \(P_k^-\)\(P_k^+\)\(K_k\)是不取决于量测值\(y_k\)的,所以可以脱机运算,预先计算好这些量可以使计算机达到实时运行的需求;2). 如果\(x_k\)是一个常量,那么\(F_k=I\)\(Q_k=0\)\(u_k=0\),这种情况下卡尔曼滤波就变成了最小二乘估计,反过来说卡尔曼滤波是最小二乘法的推广,本质上是通过减少动态系统状态的方差来达到最优的估计;3).要注意的是\(p_k^+\)的第一个形式比第三个形式在数值计算上更加稳定、鲁棒性更好,因为第一个表达式只要\(p_k^-\)是对称的正定矩阵,那么\(p_k^+\)也一定是对称的正定矩阵。

【防止爬虫转载而导致的格式问题——链接】:http://www.cnblogs.com/heguanyou/p/7502909.html

转载于:https://www.cnblogs.com/heguanyou/p/7502909.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java注释-保留

考虑一下Java批注: public interface AnAnnotaton {}带有此注释的类: AnAnnotaton class AnAnnotatedClass{}还有一个测试,检查类中是否存在此批注: import static org.hamcrest.MatcherAssert.assertThat; import static org.h…

MYSQL查询选修三门以上课程_SQL高级查询的练习题

Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表问题:1、查询“001”课程比“002”课程成绩高的所有学生的学号;select a.S# from (select s#,score from SC where C#001) a,(select s#,s…

Determing client's IP

AuthorDeterming clients IPАнатоли&23.04.2009 18:39:46Registered userHow to determine clients IP address in THTTPServer.OnClientConnected, THTTPServer.OnClientDisonnected and TRtcFunction.OnExecute events?Danijel Tkalcec [RTC]23.04.2009 19:45:05…

mysql aa复制_MySQL的复制架构与优化

MySQL的复制架构与优化###########原理###########1.主服务器将更新的数据的sql语句(例如,insert,update,delete等)写入到二进制文件中(由log-bin选项开启)。此二进制文件由一个索引文件跟踪维护。2.从服务器连接(使用I/O线程连接)主服务器&a…

如何安装Gradle

Gradle是一个简单而强大的构建工具。 它类似于Ant构建工具。 它可以很好地管理构建,还可以处理构建依赖性。 Gradle最好的部分是它是开源项目。 如果您正在考虑安装并尝试一下,那么您来对地方了。 Gradle的开发周期为4周,因此,每隔…

nmap使用指南

一、目标指定 1.CIDR标志位 192.168.1.0/24 2.指定范围 192.168.1.1-255 192.168.1-255.1&#xff08;任意位置&#xff09;3.IPv6地址只能用规范的IPv6地址或主机名指定。 CIDR 和八位字节范围不支持IPv6&#xff0c;因为它们对于IPv6几乎没什么用。 -iL <文件名> 主机名…

#Pragma Pack(n)与内存分配

#pragma pack(n) 解释一&#xff1a; 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n)&#xff0c;n1,2,4,8,16来改变这一系数&#xff0c;其中的n就是你要指定的“对齐系数”。 规则&#xff1a; 1、数据成员对齐规…

Java死了还是无敌?

作家艾萨克阿西莫夫&#xff08;Isaac Asimov&#xff09;曾经说过“唯一不变的就是变化”。 这不仅仅是软件行业中的一个短语&#xff0c;这是绝对的事实。 曾经有一天&#xff0c;Corba为王&#xff0c;但Web Services篡夺了它。 即使在Web服务领域&#xff0c;过去也全都是关…

mysql数据库访问问题吗_#MySQL数据库无法远程访问的问题

在 Ubuntu上装了mysql&#xff0c;因为项目的数据库是mysql&#xff0c;将项目放在tomcat里面webapp下面&#xff0c;一直启动不成功。本来一直以为是jdbc驱动问题&#xff0c;后来发现不是。1.cd /etc/mysql 找到my.cnf查找到bind-address&#xff0c;将 bind-address127.0.0.…

SolidEdge如何复制特征 建立类似于UG 块的概念

直接CtrlC和CtrlV可以实现特征的复制粘贴 按N键可以改变特征方向 已经复制完成的特征要进行定位&#xff0c;则右击该特征&#xff0c;编辑轮廓&#xff0c;可以进行聪慧尺寸的标注 使用特征库的方式&#xff0c;就像UG的块一样&#xff0c;可以给所有零件调用。在任意位置新建…

Gradle自定义插件

本教程介绍了创建Gradle独立自定义插件的方法。 它涵盖以下主题 创建任务&#xff0c;并在“自定义”插件中使用它 独立的自定义插件 简短的插件ID 使用settings.gradle自定义Gradle设置 项目信息&#xff1a; 摇篮版本&#xff1a;1.1 操作系统平台&#xff1a;Ubuntu 1…

mysql映射文件_Mybatis SQL映射文件

简单查询insert添加insert可以使用数据库支持的自动生成主键策略&#xff0c;设置useGeneratedKeys”true”&#xff0c;然后把keyProperty 设成对应的列&#xff0c;就搞定了。比如说上面的StudentEntity 使用auto-generated 为id 列生成主键.还可以使用selectKey元素。下面例…

监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

在实际的应用中&#xff0c;我们常常需要实现在移动app和浏览器中点击返回、后退、上一页等按钮实现自己的关闭页面、调整到指定页面或执行一些其它操作的 需求&#xff0c;那在代码中怎样监听当点击微信、支付宝、百度糯米、百度钱包等app的返回按钮或者浏览器的上一页或后退按…

第七天作业

---恢复内容开始--- 作业一&#xff1a;nginx服务 二进制安装nginx包 作为web服务修改配置文件 让配置生效&#xff0c;验证配置 直至出现epel的两个文件&#xff0c;否则reinstall, 接下来写配置文件&#xff0c; 这款软件的服务目录&#xff0c; 在里面编辑一些东西&#xff…

Java测试提示

介绍 我喜欢自动化测试。 在一次极少的转移到op-ed 1中&#xff0c;我想到了一些想法&#xff08;阅读–意见&#xff09;。 在开始如何最好地构成您的测试之前&#xff0c;我先简单问一下–测试的原因是什么&#xff1f; 大致来说&#xff0c;我认为它们是&#xff1a; 减少…

pdo mysql fedora_在Fedora 23 Server和Workstation上安装LAMP(Linux, Apache, MariaDB和PHP)

在安装LAMP之前&#xff0c;建议先更新系统包$ sudo dnf update第一步&#xff1a;安装Apache Web服务器1.在Fedora 23安装Apache&#xff0c;你可以运行下面的命令&#xff1a;$ sudo dnf install httpd2.安装完成后&#xff0c;我们设置在系统启动时自动启动Apache&#xff0…

洛谷P1937 [USACO10MAR]仓配置Barn Allocation

题目描述 Farmer John recently opened up a new barn and is now accepting stall allocation requests from the cows since some of the stalls have a better view of the pastures. The barn comprises N (1 < N < 100,000) stalls conveniently numbered 1..N; sta…

人脸数据库大全(包括人脸识别、关键点检测、表情识别,人脸姿态等等)

搞计算机视觉的人&#xff0c;对人脸技术并不陌生。在做实验的时候需要各种数据集进行训练&#xff0c;却往往苦于找不到合适的数据集&#xff0c;这篇文章将给大家带来一点福音。 目前为止最全的是人脸数据库总结&#xff1a; The Color FERET Database, USA The FERET progra…

JavaFX游戏(四连环)

这是我的第一个JavaFX游戏教程&#xff0c;也是我关于JavaFX面板的第一篇博客文章。 我仅用200几行代码就完成了这款四连环游戏&#xff0c;足以应付一个简单的游戏。 我在这里使用GridPane面板对磁盘进行布局&#xff0c;GridPane是JavaFX布局窗格之一&#xff0c;但它与另一个…

vs使用了未初始化的局部变量怎么解决_C程序为什么要初始化?

作者:守望,Linux应用开发者,目前在公众号【编程珠玑】 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。 前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题。 什么是初始化 初始化…