Kalman Filter in SLAM (4) ——Iterated Extended Kalman Filter (IEKF, 迭代扩展卡尔曼滤波)

news2024/9/23 15:31:50

在这里插入图片描述


文章目录

  • 1. IEKF 概述
  • 2. IEKF 的核心思想
    • 2.1. The Motivation of Iteration
    • 2.2. IEKF 迭代线性化步骤
  • 3. IEKF 的推导
    • 3.1. 预测公式
    • 3.2. 校正公式

1. IEKF 概述

由于非线性模型中做了线性化近似,当非线性程度越强时,误差就会较大,但是由于线性化的工作点离真值越近, 线性化的误差就越小,因此解决该问题的一个方法是,通过迭代逐渐找到准确的线性化点,从而提高精度。 在EKF的推导中,其他保持不变,仅改变观测的线性化工作点,则有

g ( x k , n k ) ≈ y o p , k + G k ( x k − x o p , k ) + C k n k \boldsymbol{g}\left(\boldsymbol{x}_{k}, \boldsymbol{n}_{k}\right) \approx \boldsymbol{y}_{\mathrm{op}, k}+\boldsymbol{G}_{k}\left(\boldsymbol{x}_{k}-\boldsymbol{x}_{\mathrm{op}, k}\right)+\boldsymbol{C}_{k} \boldsymbol{n}_{k} g(xk,nk)yop,k+Gk(xkxop,k)+Cknk

其中,
y o p , k = g ( x o p , k , 0 ) G k = ∂ g ( x k , n k ) ∂ x k ∣ x o p , k , 0 C k = ∂ g ( x k , n k ) ∂ n k ∣ x o p , k , 0 \begin{aligned} &\boldsymbol{y}_{\mathrm{op}, k}=\boldsymbol{g}\left(\boldsymbol{x}_{\mathrm{op}, k}, \mathbf{0}\right) \\ &\boldsymbol{G}_{k}=\left.\frac{\partial \boldsymbol{g}\left(\boldsymbol{x}_{k}, \boldsymbol{n}_{k}\right)}{\partial \boldsymbol{x}_{k}}\right|_{\boldsymbol{x}_{\mathrm{op}, k}, \boldsymbol{0}} \\ &\boldsymbol{C}_{k}=\left.\frac{\partial \boldsymbol{g}\left(\boldsymbol{x}_{k}, \boldsymbol{n}_{k}\right)}{\partial \boldsymbol{n}_{k}}\right|_{\boldsymbol{x}_{\mathrm{op}, \boldsymbol{k}}, \mathbf{0}} \end{aligned} yop,k=g(xop,k,0)Gk=xkg(xk,nk) xop,k,0Ck=nkg(xk,nk) xop,k,0

按照与之前同样的方式进行推导,可得到滤波的校正过程为

K k = P ^ k G k T ( G k P ^ k G k T + C k R k C k T ) − 1 x ˇ k = x ^ k + K k ( y k − y o p , k − G k ( x ^ k − x o p , k ) ) P ˇ k = ( 1 − K k G k ) P ^ k \begin{aligned} \boldsymbol{K}_{k} &=\hat{\boldsymbol{P}}_{k} \boldsymbol{G}_{k}^{\mathrm{T}}\left(\boldsymbol{G}_{k} \hat{\boldsymbol{P}}_{k} \boldsymbol{G}_{k}^{\mathrm{T}}+\boldsymbol{C}_{k} \boldsymbol{R}_{k} \boldsymbol{C}_{k}^{\mathrm{T}}\right)^{-1} \\ \check{\boldsymbol{x}}_{k} &=\hat{\boldsymbol{x}}_{k}+\boldsymbol{K}_{k}\left(\boldsymbol{y}_{k}-\boldsymbol{y}_{\mathrm{op}, k}-\boldsymbol{G}_{k}\left(\hat{\boldsymbol{x}}_{k}-\boldsymbol{x}_{\mathrm{op}, k}\right)\right) \\ \check{\boldsymbol{P}}_{k} &=\left(\mathbf{1}-\boldsymbol{K}_{k} \boldsymbol{G}_{k}\right) \hat{\boldsymbol{P}}_{k} \end{aligned} KkxˇkPˇk=P^kGkT(GkP^kGkT+CkRkCkT)1=x^k+Kk(ykyop,kGk(x^kxop,k))=(1KkGk)P^k
可见唯一的区别是后验均值 x ˇ k \check{\boldsymbol{x}}_{k} xˇk 更新的公式与之前有所不同。滤波过程中,反复执行上面 3 个公式,以上次的后验均值作为本次的线性化工作点,即可达到减小非线性误差的目的。

2. IEKF 的核心思想

2.1. The Motivation of Iteration

其实原理就是上面的原理,只不过上面写的可能比较简略,所以这里再详细推导一下。

IEKF 的核心思想就是想 提高观测方程的线性化精度,因为我们之前的 EKF 都是把观测方程在IMU得到的 先验状态 x ^ k \boldsymbol {\hat {x}_k} x^k 处进行线性化,此时线性化是观测方程为:

z k = h ( x ^ k , 0 ) + H k ∣ x ^ k ( x k − x ^ k ) + V k ∣ x ^ k v k \boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) + \left. \boldsymbol H_{k} \right|_{\boldsymbol {\hat{x}_k}} (\boldsymbol x_{k} - \boldsymbol {\hat{x}}_{k}) + \left. \boldsymbol V_{k}\right|_{\boldsymbol {\hat{x}_k}} \boldsymbol v_{k} zk=h(x^k,0)+Hkx^k(xkx^k)+Vkx^kvk

先验状态 x ^ k \boldsymbol {\hat {x}}_k x^k 可能离我们的真实状态 x k \boldsymbol { {x}}_k xk 比较远,这样就导致我们得到的这个线性化方程中的系数矩阵都不准确,那么自然后面我们带入校正公式进行校正的时候,我们求得的 卡尔曼增益传感器观测值与预测观测值之间的差值 都不准确,也就是在先验状态上进行状态调整的那一项结果不准确,从而精度降低。

实际上 最准确的点是在真实状态 x k \boldsymbol { {x}}_k xk 处进行线性化,这样的 系数矩阵和展开点的函数值 都是最准确的,但是真实状态我们永远都不会知道,所以只能退而求其次,找一个 最接近真实状态的点 对观测方程进行线性化,这就是 IEKF 的思想。如下图所示,可以看到我们求得的后验状态由于离真实状态更近,所以在这个点对观测方程进行线性化得到的系数矩阵和展开点函数值都离真实状态更接近。

2.2. IEKF 迭代线性化步骤

(1)第一次对观测方程进行线性化的时候,我们只有先验状态值,所以只能在先验状态的地方进行线性化,得到方程:
z k = h ( x ^ k , 0 ) + H k ∣ x ^ k ( x k − x ^ k ) + V k ∣ x ^ k v k \boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) + \left. \boldsymbol H_{k} \right|_{\boldsymbol {\hat{x}_k}} (\boldsymbol x_{k} - \boldsymbol {\hat{x}}_{k}) + \left. \boldsymbol V_{k}\right|_{\boldsymbol {\hat{x}_k}} \boldsymbol v_{k} zk=h(x^k,0)+Hkx^k(xkx^k)+Vkx^kvk
然后经过卡尔曼滤波的校正公式之后,我们得到了一个
更接近真值状态的后验估计值
x ^ k 1 \boldsymbol {\hat {x}}^{1}_k x^k1

(2)把上一步得到的更接近真实状态的估计值 x ^ k 1 \boldsymbol {\hat {x}}^{1}_k x^k1作为观测方程的新的线性化展开点,再次展开:
z k = h ( x ^ k 1 , 0 ) + H k ∣ x ^ k 1 ( x k − x ^ k 1 ) + V k ∣ x ^ k 1 v k \boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\hat{x}}^{1}_{k}, \boldsymbol 0) + \left. \boldsymbol H_{k} \right|_{\boldsymbol {\hat{x}}^{1}_k} (\boldsymbol x_{k} - \boldsymbol {\hat{x}}^{1}_k) + \left. \boldsymbol V_{k}\right|_{\boldsymbol {\hat{x}}^{1}_k} \boldsymbol v_{k} zk=h(x^k1,0)+Hkx^k1(xkx^k1)+Vkx^k1vk
然后经过卡尔曼滤波的校正公式之后,我们得到了一个更接近真值状态的后验估计值 x ^ k 2 \boldsymbol {\hat {x}}^{2}_k x^k2

(3) 依此类推,每次对观测方程进行线性化展开的点都更加接近真实状态,这代表每次对观测方程的线性化展开结果都更加精确,得到的系数矩阵和展开点函数值更加精确。

3. IEKF 的推导

3.1. 预测公式

由于我们只是对观测方程的线性化点进行迭代,和状态方程没有关系,也就是和预测没有关系,所以这里预测公式不变。

带入上一时刻的后验状态到自变量中,即 x k − 1 ← x ˇ k − 1 : x ^ k = f ( x ^ k − 1 , 0 ) + F k − 1 ( x ˇ k − 1 − x ˇ k − 1 ) = f ( x ^ k − 1 , 0 ) P ^ k = F k − 1 P ˇ k − 1 F k − 1 T + Q 带入上一时刻的后验状态到自变量中,即\boldsymbol x_{k-1} \leftarrow \boldsymbol {\check{x}}_{k-1} : \\ \boldsymbol {\hat{x}}_{k} = \boldsymbol f(\boldsymbol {\hat{x}}_{k-1} , \boldsymbol 0) + \boldsymbol F_{k-1} (\boldsymbol {\check{x}}_{k-1} - \boldsymbol {\check{x}}_{k-1}) = \boldsymbol f(\boldsymbol {\hat{x}}_{k-1} , \boldsymbol 0) \\ \boldsymbol {\hat P}_{k} = \boldsymbol F_{k-1} \boldsymbol {\check P}_{k-1} \boldsymbol F_{k-1} ^{T}+ \boldsymbol Q 带入上一时刻的后验状态到自变量中,即xk1xˇk1:x^k=f(x^k1,0)+Fk1(xˇk1xˇk1)=f(x^k1,0)P^k=Fk1Pˇk1Fk1T+Q

3.2. 校正公式

首先时刻保持清醒的一个问题是:我们对观测方程进行迭代的时候,改变 只是对它进行线性化的工作点,而线性化之后我们带入这个线性化公式里面的 自变量 仍然是IMU得到的 先验估计状态,因为典型的线性卡尔曼滤波就是这么做的,是把 状态方程得到的先验值传感器测量值与先验状态预测观测值之间的差值 进行加权平均,作为在先验状态上的调整项。

(1)第一次迭代

这个时候线性化点和普通的 EKF 的线性化点是一样的,都是在IMU状态方程得到的先验状态处进行线性化,所以校正公式也是一样的(注意计算预测观测值 z k \boldsymbol {z}_k zk 时不知道噪声,所以简化为0):
观测方程在 I M U 的先验状态 x ^ k 处展开。带入 I M U 的先验状态到自变量中,即 x k ← x ^ k : z k = h ( x ^ k , 0 ) + H k ∣ x ^ k ( x ^ k − x ^ k ) = h ( x ^ k , 0 ) K k = P ^ k H T H P ^ k H T + R x ˇ k 1 = x ^ k + K k ( z m − z k ) = x ^ k + K k ( z m − h ( x ^ k , 0 ) ) P ˇ k = ( I − K k H ) P ^ k 观测方程在IMU的先验状态\boldsymbol {\hat{x}}_{k}处展开。带入IMU的先验状态到自变量中,即\boldsymbol x_{k} \leftarrow \boldsymbol {\hat{x}}_{k} : \\ \boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) + \left. \boldsymbol H_{k} \right|_{\boldsymbol {\hat{x}_k}} (\boldsymbol {\hat{x}}_{k} - \boldsymbol {\hat{x}}_{k}) = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) \\ \begin{gathered} \boldsymbol K_{k}=\frac{ \boldsymbol {\hat P}_{k} \boldsymbol H^{T}}{ \boldsymbol H \boldsymbol {\hat P}_{k} \boldsymbol H^{T} + \boldsymbol R} \\ \boldsymbol {\check {x}}^{1}_{k} = \boldsymbol {\hat{x}}_{k} + \boldsymbol {K}_{k}\left( \boldsymbol {z}_m - \boldsymbol {z}_k \right) = \boldsymbol {\hat{x}}_{k} + \boldsymbol {K}_{k}\left( \boldsymbol {z}_m - \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) \right) \\ \boldsymbol {\check P}_{k}=\left( \boldsymbol I- \boldsymbol K_{k} \boldsymbol H\right) \boldsymbol {\hat P}_{k} \end{gathered} 观测方程在IMU的先验状态x^k处展开。带入IMU的先验状态到自变量中,即xkx^k:zk=h(x^k,0)+Hkx^k(x^kx^k)=h(x^k,0)Kk=HP^kHT+RP^kHTxˇk1=x^k+Kk(zmzk)=x^k+Kk(zmh(x^k,0))Pˇk=(IKkH)P^k
(2)第二次迭代

此时上一次迭代得到了一个更加接近真实状态的后验估计值 x ˇ k 1 \boldsymbol{\check x}^{1}_k xˇk1,然后把它带入观测方程中进行线性化,得到更加准确的线性化观测方程(注意计算预测观测值 z k \boldsymbol {z}_k zk 时不知道噪声,所以简化为0):
观测方程在上一次迭代得到的后验状态 x ˇ k 1 处展开。带入 I M U 的先验状态到自变量中,即 x k ← x ^ k : z k = h ( x ˇ k 1 , 0 ) + H k ∣ x ˇ k 1 ( x ^ k − x ˇ k 1 ) K k = P ^ k H T H P ^ k H T + R x ˇ k 2 = x ^ k + K k ( z m − z k ) = x ^ k + K k ( z m − h ( x ˇ k 1 , 0 ) − H k ∣ x ˇ k 1 ( x ^ k − x ˇ k 1 ) ) P ˇ k = ( I − K k H ) P ^ k 观测方程在上一次迭代得到的后验状态\boldsymbol {\check{x}}^{1}_{k}处展开。带入IMU的先验状态到自变量中,即\boldsymbol x_{k} \leftarrow \boldsymbol {\hat{x}}_{k} : \\ \boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\check{x}}^{1}_{k}, \boldsymbol 0) + \left. \boldsymbol H_{k} \right|_{\boldsymbol {\check{x}}^{1}_{k}} (\boldsymbol {\hat{x}}_{k} - \boldsymbol {\check{x}}^{1}_{k}) \\ \begin{gathered} \boldsymbol K_{k}=\frac{ \boldsymbol {\hat P}_{k} \boldsymbol H^{T}}{ \boldsymbol H \boldsymbol {\hat P}_{k} \boldsymbol H^{T} + \boldsymbol R} \\ \boldsymbol {\check {x}}^{2}_{k} = \boldsymbol {\hat{x}}_{k} + \boldsymbol {K}_{k}\left( \boldsymbol {z}_m - \boldsymbol {z}_k \right) = \boldsymbol {\hat{x}}_{k} + \boldsymbol {K}_{k}\left( \boldsymbol {z}_m - \boldsymbol h(\boldsymbol {\check{x}}^{1}_{k}, \boldsymbol 0) - \left. \boldsymbol H_{k} \right|_{\boldsymbol {\check{x}}^{1}_{k}} (\boldsymbol {\hat{x}}_{k} - \boldsymbol {\check{x}}^{1}_{k}) \right) \\ \boldsymbol {\check P}_{k}=\left( \boldsymbol I- \boldsymbol K_{k} \boldsymbol H\right) \boldsymbol {\hat P}_{k} \end{gathered} 观测方程在上一次迭代得到的后验状态xˇk1处展开。带入IMU的先验状态到自变量中,即xkx^k:zk=h(xˇk1,0)+Hkxˇk1(x^kxˇk1)Kk=HP^kHT+RP^kHTxˇk2=x^k+Kk(zmzk)=x^k+Kk(zmh(xˇk1,0)Hkxˇk1(x^kxˇk1))Pˇk=(IKkH)P^k
(3)第三次迭代

此时上一次迭代得到了一个更加接近真实状态的后验估计值 x ˇ k 2 \boldsymbol {\check {x}}^{2}_{k} xˇk2,然后把它带入观测方程中进行线性化,得到更加准确的线性化观测方程:

观测方程在上一次迭代得到的后验状态 x ˇ k 2 处展开。带入 I M U 的先验状态到自变量中,即 x k ← x ^ k : z k = h ( x ˇ k 2 , 0 ) + H k ∣ x ˇ k 2 ( x ^ k − x ˇ k 2 ) K k = P ^ k H T H P ^ k H T + R x ˇ k 3 = x ^ k + K k ( z m − h ( x ˇ k 2 , 0 ) − H k ∣ x ˇ k 2 ( x ^ k − x ˇ k 2 ) ) P ˇ k = ( I − K k H ) P ^ k 观测方程在上一次迭代得到的后验状态\boldsymbol {\check{x}}^{2}_{k}处展开。带入IMU的先验状态到自变量中,即\boldsymbol x_{k} \leftarrow \boldsymbol {\hat{x}}_{k} : \\ \boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\check{x}}^{2}_{k}, \boldsymbol 0) + \left. \boldsymbol H_{k} \right|_{\boldsymbol {\check{x}}^{2}_{k}} (\boldsymbol {\hat{x}}_{k} - \boldsymbol {\check{x}}^{2}_{k}) \\ \begin{gathered} \boldsymbol K_{k}=\frac{ \boldsymbol {\hat P}_{k} \boldsymbol H^{T}}{ \boldsymbol H \boldsymbol {\hat P}_{k} \boldsymbol H^{T} + \boldsymbol R} \\ \boldsymbol {\check {x}}^{3}_{k} = \boldsymbol {\hat{x}}_{k} + \boldsymbol {K}_{k}\left( \boldsymbol {z}_m - \boldsymbol h(\boldsymbol {\check{x}}^{2}_{k}, \boldsymbol 0) - \left. \boldsymbol H_{k} \right|_{\boldsymbol {\check{x}}^{2}_{k}} (\boldsymbol {\hat{x}}_{k} - \boldsymbol {\check{x}}^{2}_{k}) \right) \\ \boldsymbol {\check P}_{k}=\left( \boldsymbol I- \boldsymbol K_{k} \boldsymbol H\right) \boldsymbol {\hat P}_{k} \end{gathered} 观测方程在上一次迭代得到的后验状态xˇk2处展开。带入IMU的先验状态到自变量中,即xkx^k:zk=h(xˇk2,0)+Hkxˇk2(x^kxˇk2)Kk=HP^kHT+RP^kHTxˇk3=x^k+Kk(zmh(xˇk2,0)Hkxˇk2(x^kxˇk2))Pˇk=(IKkH)P^k

注意:从上面的公式中可以发现,每次迭代过程中, K k \boldsymbol {K}_k Kk 矩阵都会变化,因为他会在校正公式中被使用。虽然 P ˇ k \boldsymbol {\check P}_k Pˇk 也会变化,但是他却对校正公式没有影响,因为它只是表征经过这次迭代后得到的后验估计值的置信度有多高。所以实际上我们只要 在最后一次迭代中计算一次 P ˇ k \boldsymbol {\check P}_k Pˇk即可,也就是最后迭代滤波完成,输出最终的滤波结果和对应的后验协方差矩阵。


在这里插入图片描述

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

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

相关文章

删库跑路现场还原

数据库是公司重要资产,在此类重要资产平台上,尤其是重要操作,应该保持敬畏心。数据库被删了?可怎么证明是某某某删了数据库?或者根本都不知道谁删除了数据库,又没抓现行,该怎么办?正…

品牌直播人气高达80w+,如何在B站打造品牌营销阵地?

2月9日,手机品牌REALME真我(以下简称“真我”),在B站开启一场「发布会」盛宴。这场发布会正是为新机“真我GT Neo5”发布进行全面宣传,在当日,真我品牌官方号在B站开启了一场线上新机发布会。来源-B站官方号…

云和虚拟化有什么区别?

云和虚拟化概念容易被混淆,特别是因为它们都围绕着用抽象资源创建有用的环境。但是,虚拟化是一项允许您从单个物理硬件系统创建多个模拟环境或专用资源的技术,而云是可在整个网络中抽象,汇总和共享可伸缩资源的IT环境。简而言之&a…

优化UnRaid容器的WebUI端口设置实现应用快捷访问的方法

文章目录前言详细流程前言 自从入了UnRaid的坑,发现Docker真是个好东西,各种各样的应用工具层出不穷,可以大大提高生产效率。然而在安装Docker应用后,对于如何方便的访问该应用,各个应用服务提供者给出的解决方案不是…

ip-guard如何通过准入网关对指定的服务器进行通讯加密保护?

1、准入网关在高级配置设置受保护服务器; WEB管理界面【系统工具】,点击【配置管理】,点击参数设置,进入高级配置界面,输入配置内容即可。 [ControlServer]

最受欢迎的大数据可视化

大数据可视化是进行各种大数据分析的最重要组成部分之一。 一旦原始数据流被以图像形式表示时,以此做决策就变得容易多了。 为了满足并超越客户的期望,大数据可视化工具应该具备这些特征:能够处理不同种类型的传入数据能够应用不同种类的过滤…

【华为机试真题 Python实现】2023年1、2月高频机试题

文章目录2023年1季度最新机试题机考注意事项1. 建议提前刷题2. 关于考试设备3. 关于语言环境3.1. 编译器信息3.2. ACM 模式使用sys使用input(推荐)3. 关于题目分值及得分计算方式4. 关于做题流程5. 关于作弊2023年1季度最新机试题 两个专栏现在有200博文…

银河麒麟V10SP1高级服务器版本离线RPM方式升级openssl openssh 自动化升级系统补丁实战实例全网唯一

银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主机系统可靠性、安全性、性能、扩展性和实时性等需求,依据CMMI5级标准研制的提供内生本质安全、云原生支…

主成分分析(PCA)原理

主成分分析(PCA)原理 在高维数据处理中,为了简化计算量以及储存空间,需要对这些高维数据进行一定程度上的降维,并尽量保证数据的不失真。PCA和ICA是两种常用的降维方法。 PCA:principal component analysi…

[思考进阶]06 养成“记笔记”的习惯,能够改变你的思考方式

目录前言一、10000张纸法则二、康奈尔笔记法三、东京大学笔记法四、养成“记笔记”的习惯除了要提升自己的技术能力,思维的学习和成长也非常非常重要,特推出此[思考进阶]系列,进行刻意练习,从而提升自己的认知。 前言 经常看到一…

BCELoss

1:单标签二分类:N是样本数,Yn是标签。范围在**[0,1]**。 公式: 举个例子: input torch.Tensor([[0.8, 0.9, 0.3]])#, [0.8, 0.9, 0.3], [0.8, 0.9, 0.3], [0.8, 0.9, 0.3]]) target torch.Tensor([[1, 1, 0]])#, […

weblogic-文件读取漏洞

weblogic-文件读取漏洞 0x00 前言 Weblogic存在管理后台,通过账号密码登录,由于管理员的疏忽,经常会使用弱口令,或者默认的账户名密码。因此存在弱口令爆破的风险。在本环境下模拟了一个真实的weblogic环境,其后台存…

Java:SpringBoot整合Spring Security实现认证与授权学习笔记

本文通过逐步学习Spring Security,由浅入深,SpringBoot整合Spring Security 分别实现自定义的HTTP Basic认证 和 Form表单认证。 本文是学习笔记,网上的教程五花八门,由于时间久远,很难拿来就用。 在此特别感谢IT老齐…

雪花算法(SnowFlake)

简介现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多个表…

使用三种方式创建servlet并配置访问成功

Servlet创建的方式 一、实现Servlet 接口 package com.openlab;import java.io.IOException;import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.Servl…

NPT、PT、G 、ZG、RC、M几种螺纹的区别

NPT、PT、G 、ZG、RC、M几种螺纹的区别一、NPT、PT、G 、ZG、RC、M几种螺纹的区别BSPT和BSP——英国规格的锥度螺纹NPT——美国规格的锥度螺纹PT ——日本的旧JIS规格锥度螺纹,相当于ISO规格的R,RcDIN2999——欧洲主要是德国的管道用螺纹NPT就是一般用途的美国标准锥…

利用Postman的简单运用解决小问题的过程

这几天在修改一个前后端分离的商城项目。项目前端向后端发出数据请求之后,收到的却是504网关超时错误。 但是控制台却不止报错了网关超时,还有跨域请求的问题: 根本搞不清是哪个问题导致了另外一个问题还是独立的两个问题。 直接点击网址访…

每天学一点之类的加载和反射

类加载 类在内存中的生命周期:加载–>使用–>卸载 类的加载又分为三个阶段: (1)加载:load 指将类型的clas字节码数据读入内存。 通过类的全名,获取类的二进制数据流。解析类的二进制数据流为方法…

【Go自学第二节】Go中的数组与切片

在Golang中,数组属于聚合类型,而切片属于引用类型。其实切片的底层逻辑就是用数组实现的,所以我们首先需要了解数组。 一、数组 Array 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例…

Unity 3D GUI教程||OnGUI TextArea 控件||OnGUI ScrollView 控件

OnGUI TextArea 控件 Unity 3D TextArea 控件用于创建一个多行的文本编辑区。用户可以在多行文本编辑区编辑文本内容。 该控件可以对超出控件宽度的文本内容实现换行操作。 TextArea 控件同样会将当前文本编辑区中的文本内容以字符串形式返回。 开发人员可以通过创建 Strin…