卡尔曼滤波(附C++代码)

news2024/10/7 15:22:29

是什么

任何时候对于动态系统存在不确定信息,都可使用卡尔曼滤波(Kalman Filter,下面简称为KF)对系统下一步要做什么做出有根据的猜测。

KF对于连续变化的系统是理想的,优点是占用内存小而且速度快,非常适用于实时问题和嵌入式系统。

使用KF可以干啥

举例:制造了一个可以在树林里游荡的小机器人,它需要知道自己的确切位置,这样它才能导航。

假设机器人状态表示为向量 x k → \overrightarrow{x_k} xk ,包含位置和速度:
x k → = ( p ⃗ , v ⃗ ) \overrightarrow{x_k}=(\vec{p}, \vec{v}) xk =(p ,v )

状态可以是任何想要追踪的东西。

我们可以从GPS传感器及我们发送给机器人的指令来获取机器人的状态,但是这两个来源都存在一定的不确定性和误差。

如果利用所有可以获取到的信息,可能会给出更好的判断,这就是KF的作用。

KF如何看待我们的问题

继续使用一个仅有位置和速度的简单状态
x ⃗ = [ p v ] \vec{x}=\left[\begin{array}{l} p \\ v \end{array}\right] x =[pv]

我们不知道实际的位置和速度是多少;位置和速度的组合有很多,但其中一些比其他的可能性更大

在这里插入图片描述
KF假设两个变量都是随机的并且符合高斯分布,每个变量都有平均值KaTeX parse error: Undefined control sequence: \μ at position 1: \̲μ̲(随机分布的中心)和方差 σ 2 \sigma^2 σ2(不确定性)

在这里插入图片描述

在上图中,位置和速度是不相关的。

下图中位置和速度是相关的,观察到特定位置的可能性与速度有关。

在这里插入图片描述
追踪这种关系可以给我们提供更多的信息,一个测量值告诉我们其他测量值可能是什么。这就是卡尔曼滤波器的目标,我们想要从不确定的测量中尽可能多地压缩信息!

这种相关性由协方差矩阵表示,矩阵的每个元素 Σ i j \Sigma_{i j} Σij表示第i个状态变量和第j个状态变量的相关程度。协方差矩阵是对称阵,由 Σ \Sigma Σ表示,每个元素表示为 Σ i j \Sigma_{i j} Σij

在这里插入图片描述

使用矩阵描述问题

要将关于状态的知识建模成高斯分布,需要知道 k k k时刻的两条信息:最佳估计 x ^ k \hat{\mathbf{x}}_{\mathbf{k}} x^k(平均值)和它的协方差矩阵 P k \mathbf{P}_{\mathbf{k}} Pk

x ^ k = [  position   velocity  ] P k = [ Σ p p Σ p v Σ v p Σ v v ] \hat{\mathbf{x}}_k=\left[\begin{array}{l} \text { position } \\ \text { velocity } \end{array}\right] \mathbf{P}_k=\left[\begin{array}{ll} \Sigma_{p p} & \Sigma_{p v} \\ \Sigma_{v p} & \Sigma_{v v} \end{array}\right] x^k=[ position  velocity ]Pk=[ΣppΣvpΣpvΣvv]

随后,需要一种方式来看当前状态( k − 1 k-1 k1时刻)并预测下个状态( k k k时刻)

在这里插入图片描述

可以用矩阵 F k \mathbf{F}_{\mathbf{k}} Fk来表示这个预测步骤
在这里插入图片描述

它将原始估计中的每个点移动到一个新的预测位置,如果原始估计是正确的,系统就会移动到这个位置。

使用运动学公式预测下一时刻的位置和速度
p k = p k − 1 + Δ t v k − 1 v k = v k − 1 \begin{array}{lr} p_k=p_{k-1}+\Delta t v_{k-1} \\ v_k= v_{k-1} \end{array} pk=pk1+Δtvk1vk=vk1

写成矩阵形式
x ^ k = [ 1 Δ t 0 1 ] x ^ k − 1 = F k x ^ k − 1 \begin{aligned} \hat{\mathbf{x}}_k & =\left[\begin{array}{cc} 1 & \Delta t \\ 0 & 1 \end{array}\right] \hat{\mathbf{x}}_{k-1} \\ & =\mathbf{F}_k \hat{\mathbf{x}}_{k-1} \end{aligned} x^k=[10Δt1]x^k1=Fkx^k1

现在有了预测矩阵给出下一状态,但是仍然不知如何更新协方差矩阵。

首先记住一个公式:
Cov ⁡ ( x ) = Σ Cov ⁡ ( A x ) = A Σ A T \begin{aligned} \operatorname{Cov}(x) & =\Sigma \\ \operatorname{Cov}(\mathbf{A} x) & =\mathbf{A} \Sigma \mathbf{A}^T \end{aligned} Cov(x)Cov(Ax)=Σ=AΣAT
将上面两个式子结合,可得
x ^ k = F k x ^ k − 1 P k = F k P k − 1 F k T \begin{aligned} \hat{\mathbf{x}}_k & =\mathbf{F}_k \hat{\mathbf{x}}_{k-1} \\ \mathbf{P}_k & =\mathbf{F}_{\mathbf{k}} \mathbf{P}_{k-1} \mathbf{F}_k^T \end{aligned} x^kPk=Fkx^k1=FkPk1FkT

外部影响

可能还会存在一些与状态无关的变化,外界世界可能也会影响系统

例如,如果状态模拟火车的运动,火车操作员可能会推油门,导致火车加速。

将这些外部世界的影响装入一个 u k → \overrightarrow{\mathrm{u}_k} uk 向量中,将其作为预测的修正项。

假如已知加速度 a a a,由运动学公式:
p k = p k − 1 + Δ t v k − 1 + 1 2 a Δ t 2 v k = v k − 1 + a Δ t \begin{aligned} & p_k=p_{k-1}+\Delta t v_{k-1}+\frac{1}{2} a \Delta t^2 \\ & v_k=\quad v_{k-1}+a \Delta t \end{aligned} pk=pk1+Δtvk1+21aΔt2vk=vk1+aΔt
x ^ k = F k x ^ k − 1 + [ Δ t 2 2 Δ t ] = F k x ^ k − 1 + B k u k → \begin{aligned} \hat{\mathbf{x}}_k & =\mathbf{F}_k \hat{\mathbf{x}}_{k-1}+\left[\begin{array}{c} \frac{\Delta t^2}{2} \\ \Delta t \end{array}\right] \\ & =\mathbf{F}_k \hat{\mathbf{x}}_{k-1}+\mathbf{B}_k \overrightarrow{u_k} \end{aligned} x^k=Fkx^k1+[2Δt2Δt]=Fkx^k1+Bkuk
B k \mathbf{B}_k Bk被称为控制矩阵, u k → \overrightarrow{\mathrm{u}_k} uk 被称为运动向量,对于没有外部影响的系统可以省略这些项。

外部不确定性

例如如果我们跟踪一架四轴飞行器,它可能会受到风的冲击。如果我们追踪的是轮式机器人,轮子可能会打滑,或者地面上的颠簸会让它减速。我们无法跟踪这些事情,如果这些发生了,我们的预测可能会出错,因为我们没有考虑这些额外的力。

可以在每个预测步骤之后加上一些不确定性来对不确定性进行建模

在这里插入图片描述
可以说每个点 x ^ k − 1 \hat{\mathbf{x}}_{k-1} x^k1都被移动到一个协方差为 Q k \mathbf{Q}_k Qk的高斯分布中的某处,也可以说我们将未知的外部影响当作具有协方差 Q k \mathbf{Q}_k Qk的噪声。

在这里插入图片描述
这将会产生一个与之前具有不同协方差和相同平均值的高斯分布。

在这里插入图片描述
现在预测步骤可以表示为:
x ^ k = F k x ^ k − 1 + B k u k → P k = F k P k − 1 F k T + Q k \begin{aligned} \hat{\mathbf{x}}_k & =\mathbf{F}_k \hat{\mathbf{x}}_{k-1}+\mathbf{B}_k \overrightarrow{u_k} \\ \mathbf{P}_k & =\mathbf{F}_{\mathbf{k}} \mathbf{P}_{k-1} \mathbf{F}_k^T+\mathbf{Q}_k \end{aligned} x^kPk=Fkx^k1+Bkuk =FkPk1FkT+Qk

也就是说新的最佳估计是由以前的最佳估计做出的预测加上对已知外部影响的修正

而新的不确定性是从旧的不确定性中预测出来的,还有一些来自环境的额外不确定性。

现在由 x ^ k \hat{\mathbf{x}}_k x^k P k \mathbf{P}_k Pk可以对系统将来的状态有一个模糊的估计。

如果能从传感器获取一些信息,会发生什么呢?

通过测量细化估计

使用矩阵 H k \mathbf{H}_k Hk表示传感器。
在这里插入图片描述
可以用通常的方式表示出传感器读数分布:
μ ⃗ expected  = H k x ^ k Σ expected  = H k P k H k T \begin{aligned} \vec{\mu}_{\text {expected }} & =\mathbf{H}_k \hat{\mathbf{x}}_k \\ \boldsymbol{\Sigma}_{\text {expected }} & =\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T \end{aligned} μ expected Σexpected =Hkx^k=HkPkHkT
KF很擅长处理传感器噪声,换句话说传感器多少都有点不可靠,最初估计的每个状态可能都会导致一定范围的传感器读数。
在这里插入图片描述
在这里插入图片描述
不确定性的协方差用 R k \mathbf{R}_k Rk表示,分布的平均值就是我们观察到的读数,用 Z k → \overrightarrow{\mathbf{Z}_k} Zk 表示

所以现在有两个高斯分布,一个围绕着转换后预测值的平均值,一个围绕着真实的传感器读数。
在这里插入图片描述
必须试着调和上面的两个值。

什么是最可能的状态呢?对于任何可能的读数 ( z 1 , z 2 ) \left(z_1, z_2\right) (z1,z2),需要下面两种可能性都满足,一个是传感器读数 z k → \overrightarrow{\mathbf{z}_k} zk 是错误测量的可能性;另一个是之前的估计认为 ( z 1 , z 2 ) \left(z_1, z_2\right) (z1,z2)是该看到的读数的可能性。

由概率相关的知识,上述两个可能性都为真的概率就是将两者的概率相乘,所以将两个高斯分布相乘。

在这里插入图片描述
上图中重叠的部分比之前的估计都精确的多,该部分的均值就是两种估计最可能出现的情况,也能给出在现有信息的情况下对于真实状态的最佳猜测。

这就出现了另一个高斯分布
在这里插入图片描述
也就是说,将两个高斯分布相乘,得到的是一个新的高斯分布。

组合高斯分布

从一维的角度来看,公式为
N ( x , μ , σ ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 \mathcal{N}(x, \mu, \sigma)=\frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{(x-\mu)^2}{2 \sigma^2}} N(x,μ,σ)=σ2π 1e2σ2(xμ)2
蓝色曲线就是红绿相乘得到的高斯曲线

在这里插入图片描述
N ( x , μ 0 , σ 0 ) ⋅ N ( x , μ 1 , σ 1 ) = ? N ( x , μ ′ , σ ′ ) \mathcal{N}\left(x, \mu_0, \sigma_0\right) \cdot \mathcal{N}\left(x, \mu_1, \sigma_1\right) \stackrel{?}{=} \mathcal{N}\left(x, \mu^{\prime}, \sigma^{\prime}\right) N(x,μ0,σ0)N(x,μ1,σ1)=?N(x,μ,σ)

经过推导,可得
k = σ 0 2 σ 0 2 + σ 1 2 μ ′ = μ 0 + k ( μ 1 − μ 0 ) σ ′ 2 = σ 0 2 − k σ 0 2 \begin{aligned} \mathbf{k} & =\frac{\sigma_0^2}{\sigma_0^2+\sigma_1^2} \\ \mu^{\prime} & =\mu_0+\mathbf{k}\left(\mu_1-\mu_0\right) \\ {\sigma^{\prime}}^2 & =\sigma_0^2-\mathbf{k} \sigma_0^2 \end{aligned} kμσ2=σ02+σ12σ02=μ0+k(μ1μ0)=σ02kσ02
写成矩阵形式如下:
K = Σ 0 ( Σ 0 + Σ 1 ) − 1 μ ⃗ ′ = μ 0 → + K ( μ 1 → − μ 0 → ) Σ ′ = Σ 0 − K Σ 0 \begin{aligned} & \mathbf{K}=\Sigma_0\left(\Sigma_0+\Sigma_1\right)^{-1} \\ & \vec{\mu}^{\prime}=\overrightarrow{\mu_0}+\mathbf{K}\left(\overrightarrow{\mu_1}-\overrightarrow{\mu_0}\right) \\ & \Sigma^{\prime}=\Sigma_0-\mathbf{K} \Sigma_0 \end{aligned} K=Σ0(Σ0+Σ1)1μ =μ0 +K(μ1 μ0 )Σ=Σ0KΣ0

矩阵 K \mathbf{K} K被称为卡尔曼增益

进行组合

将之前的两个分布:预测值 ( μ 0 , Σ b ) = ( H k x ^ k , H k P k H k T ) \left(\mu_0, \Sigma \mathrm{b}\right)=\left(\mathbf{H}_k \hat{\mathbf{x}}_k, \mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T\right) (μ0,Σb)=(Hkx^k,HkPkHkT)和观测值 ( μ 1 , Σ 1 ) = ( z k → , R k ) \left(\mu_1, \Sigma_1\right)=\left(\overrightarrow{\mathbf{z}_k}, \mathbf{R}_k\right) (μ1,Σ1)=(zk ,Rk),代入上面的式子,可以得到重叠:
H k x ^ k ′ = H k x ^ k + K ( z k → − H k x ^ k ) H k P k ′ H k T = H k P k H k T − K H k P k H k T \begin{aligned} \mathbf{H}_k \hat{\mathbf{x}}_k^{\prime} & =\mathbf{H}_k \hat{\mathbf{x}}_k & & +\mathbf{K}\left(\overrightarrow{\mathbf{z}_k}-\mathbf{H}_k \hat{\mathbf{x}}_k\right) \\ \mathbf{H}_k \mathbf{P}_k^{\prime} \mathbf{H}_k^T & =\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T & & -\mathbf{K H}_k \mathbf{P}_k \mathbf{H}_k^T \end{aligned} Hkx^kHkPkHkT=Hkx^k=HkPkHkT+K(zk Hkx^k)KHkPkHkT

卡尔曼增益为
K = H k P k H k T ( H k P k H k T + R k ) − 1 \mathbf{K}=\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T\left(\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T+\mathbf{R}_k\right)^{-1} K=HkPkHkT(HkPkHkT+Rk)1

将上面的式子进行化简可得
x ^ k ′ = x ^ k + K ′ ( z k → − H k x ^ k ) P k ′ = P k − K ′ H k P k K ′ = P k H k T ( H k P k H k T + R k ) − 1 \begin{gathered} \hat{\mathbf{x}}_k^{\prime}=\hat{\mathbf{x}}_k+\mathbf{K}^{\prime}\left(\overrightarrow{\mathbf{z}_k}-\mathbf{H}_k \hat{\mathbf{x}}_k\right) \\ \mathbf{P}_k^{\prime}=\mathbf{P}_k-\mathbf{K}^{\prime} \mathbf{H}_k \mathbf{P}_k \\ \mathbf{K}^{\prime}=\mathbf{P}_k \mathbf{H}_k^T\left(\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T+\mathbf{R}_k\right)^{-1} \end{gathered} x^k=x^k+K(zk Hkx^k)Pk=PkKHkPkK=PkHkT(HkPkHkT+Rk)1

上面的式子给出了更新步骤,这样 x ^ k ′ \hat{\mathbf{x}}_k^{\prime} x^k就是新的最佳估计,然后就可以继续进行多次的预测和更新。
在这里插入图片描述
整个过程如上图。

总结

所有需要记住的式子就是:

x ^ k = F k x ^ k − 1 + B k u k → P k = F k P k − 1 F k T + Q k \begin{aligned} \hat{\mathbf{x}}_k & =\mathbf{F}_k \hat{\mathbf{x}}_{k-1}+\mathbf{B}_k \overrightarrow{\mathbf{u}_k} \\ \mathbf{P}_k & =\mathbf{F}_{\mathbf{k}} \mathbf{P}_{k-1} \mathbf{F}_k^T+\mathbf{Q}_k \end{aligned} x^kPk=Fkx^k1+Bkuk =FkPk1FkT+Qk

x ^ k ′ = x ^ k + K ′ ( z k → − H k x ^ k ) P k ′ = P k − K ′ H k P k \begin{aligned} \hat{\mathbf{x}}_k^{\prime} & =\hat{\mathbf{x}}_k+\mathbf{K}^{\prime}\left(\overrightarrow{\mathbf{z}_k}-\mathbf{H}_k \hat{\mathbf{x}}_k\right) \\ \mathbf{P}_k^{\prime} & =\mathbf{P}_k-\mathbf{K}^{\prime} \mathbf{H}_k \mathbf{P}_k \end{aligned} x^kPk=x^k+K(zk Hkx^k)=PkKHkPk

K ′ = P k H k T ( H k P k H k T + R k ) − 1 \mathbf{K}^{\prime}=\mathbf{P}_k \mathbf{H}_k^T\left(\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T+\mathbf{R}_k\right)^{-1} K=PkHkT(HkPkHkT+Rk)1
这些就可以用来对任何线性系统进行建模,对于非线性系统可以使用扩展的KF

简而言之

KF的核心过程如下图:
在这里插入图片描述
上述两个状态逐渐迭代罢了

代码实现

#include <iostream>
#include <math.h>
#include <tuple>

using namespace std;

double new_mean, new_var;

// 更新:传感器获取到比较准确的位置信息后来更新当前的预测位置,也就是纠正预测的错误。
tuple<double, double> measurement_update(double mean1, double var1, double mean2, double var2)
{
    new_mean = (var2 * mean1 + var1 * mean2)/(var1 + var2);
    new_var = 1 / (1 / var1 + 1 / var2);
    return make_tuple(new_mean, new_var);
}

// 预测:当前状态环境下,对下一个时间段t的位置估计计算的值。
tuple<double, double> state_prediction(double mean1, double var1, double mean2, double var2)
{
    new_mean = mean1 + mean2;
    new_var = var1 + var2;
    return make_tuple(new_mean, new_var);
}

int main()
{
    //Measurements and measurement variance
    double measurements[5] = {5, 6, 7, 8, 9};
    double measurement_sig = 4;

    //Motions and motion variance
    double motion[5] = {1, 1, 2, 1, 1};
    double motion_sig = 2;

    //Initial state
    double mu = 0;
    double sig = 1000;

    for (int i=0; i<sizeof(measurements)/sizeof(measurements[0]); i++)
    {
        tie(mu, sig) = measurement_update(mu, sig, measurements[i], measurement_sig);
        printf("update: [%f, %f]\n", mu, sig);
        tie(mu, sig) = state_prediction(mu, sig, motion[i], motion_sig);
        printf("predict: [%f, %f]\n", mu, sig);
    }
    return 0;
}

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

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

相关文章

在Linux中安装RabbitMQ

RabbitMQ下载网址 Socat下载网址 erlang下载网址 RabbitMQ安装包依赖于Erlang语言包的支持&#xff0c;所以需要先安装Erlang语言包&#xff0c;再安装RabbitMQ安装包 通过Xftp软件将这三个压缩包上传到linux中的opt目录下 ,双击即可 在安装之前先查询…

Android oss policy上传

OSS Policy方式上传 一、 流程对比1.1 普通上传1.2 服务端签名后直传 二、获取上传的policy签名配置三、请求OSS上传文件四、调用应用服务器接口同步文件五、关于上传OSS报错注意事项六、附送链接 一、 流程对比 1.1 普通上传 缺点&#xff1a; 上传慢&#xff1a;用户数据需…

数学建模常用模型(五):多元回归模型

数学建模常用模型&#xff08;五&#xff09;&#xff1a;多元回归模型 由于客观事物内部规律的复杂性及人们认识程度的限制&#xff0c;无法分析实际对象内在的因果关系&#xff0c;建立合乎机理规律的数学模型。所以在遇到有些无法用机理分析建立数学模型的时候&#xff0c;…

docker中运行RabbitMq的启用插件指南

我们使用 Docker 来运行 RabbitMQ&#xff0c;有时需要启用一些插件&#xff0c;这个与正常安装的启用插件的步骤会有所不同。以下是在 Docker 中启用 RabbitMQ 插件的一般步骤&#xff1a; 首先&#xff0c;确认已经将 rabbitmq_delayed_message_exchange-3.12.0.ez 插件文件复…

raid5两块磁盘掉线导致阵列崩溃的服务器数据恢复案例

服务器数据恢复环境&#xff1a; DELL PowerVault系列某型号存储&#xff0c;15块硬盘搭建了一组RAID5磁盘阵列。 服务器故障&检测&#xff1a; 存储设备raid5阵列中一块磁盘由于未知原因离线&#xff0c;管理员对该磁盘阵列进行了同步操作。在同步的过程中又有一块磁盘指示…

使用 hbuilderx 配置 MuMu模拟器进行调试

第一步 先安装MuMu模拟器&#xff0c;调成手机模式。 第二步 查看MuMu模拟器监听的端口。 在安装目录下 /vms/MuMuPlayer-12.0-0/MuMuPlayer-12.0-0 旧端口7555&#xff0c;新端口号16384 切换到安装目录下的 /shell&#xff0c;然后shift右击&#xff0c;打开 powershell&a…

【服务器数据恢复】raid5崩溃的redhat linux系统数据恢复案例

服务器数据恢复环境&#xff1a; 一台ibm某型号服务器&#xff0c;5块硬盘组建一组raid5磁盘阵列&#xff0c;redhat linux操作系统&#xff0c;上层部署有oracle数据库。 服务器故障&#xff1a; raid5阵列中两块硬盘离线&#xff0c;服务器崩溃。经过初检发现故障服务器中的…

基于SpringBoot的医护人员排班系统【附开题(bao告)和万字文档(Lun文)和搭建文档】

主要功能 前台登录&#xff1a; ①首页&#xff1a;医院信息展示、医护信息展示、排班信息展示、投诉信息展示 ②医院信息&#xff1a;名称查询、医院查看、医院简介、可以点赞、可以评论、点我收藏 ③医护信息&#xff1a;根据工号、姓名查询、点击查看医护信息、可以收藏 ④…

Simulink仿真模块 - Band-Limited White Noise

Band-Limited White Noise模块的功能是在连续系统中引入白噪声。它所在的库为: Simulink / Sources 如图所示: Band-Limited White Noise 模块生成适合在连续系统或混合系统中使用的正态分布随机数。 白噪声仿真 从理论上讲,连续白噪声的相关时间为 0,功率谱密度 …

飞利浦的护眼台灯好用吗?南卡/飞利浦/雷士对比测评,看看哪款更好用!

日常生活中&#xff0c;灯光对于我们重要性不用多说。不管是学习还是办公等环境都需要合适的光线&#xff0c;而台灯作为补充光线小型家电&#xff0c;基本每个家庭里都会备着一台&#xff0c;特别是对于长期使用电脑的上班族或者需要长时间学习的学生这类人员。但是台灯的种类…

【大数据技术】hive 窗口函数sum range between的详细介绍

【大数据技术】hive 窗口函数sum range between的详细介绍 数据准备 建表 create table range_test( name string, month int , sales int ) row format delimited fields terminated by "," ;插入数据 load data local inpath "/home/xx/test/1.t…

双击就能运行的Win95,流畅稳定还内置大型游戏

像咱这样的新时代互联网民工&#xff0c;上班面对 Win10/11 下班也还是一样&#xff0c;难免有时候觉得腻。 回味起当初的 Win7、Win8、Win XP &#xff0c;不管当初受过什么伤&#xff0c;现在只有美好的回忆。 大家可能还想象过&#xff0c;用现在配置去运行老系统。 不知高…

uniapp 小程序 vue TypeError: Cannot read property ‘toString‘ of undefined

是因为对字符串使用toString的时候页面中的数据还没有加载 。错误代码&#xff1a; 可以使用 v-if 修改为&#xff1a;

AR是现实的商业创新,还是虚幻的电子梦境?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 在本期节目中&#xff0c;我们将深入探讨AVAR的创始人胡雅婷的创业故事。 我们从年轻人偏爱虚拟偶像和热衷元宇宙创业的社会话题出发&…

递归的深层次理解+初始搜索算法

1)什么是递归:就是函数自己调用自己的过程 2)为什么会使用到递归:主问题->相同的子问题&#xff0c;相同的子问题->一样相同的子问题 3)递归结束的条件:也就是细节和出口最小的不能在继续进行分割的子问题 4)宏观看待递归的过程: 1)不要在意递归展开的细节图 2)那递归的函…

全面分析MySQL?ERROR?1045出现的原因及解决

目录 通常从网上都能找到解决方案 1.停止服务2.跳过验证3.修改密码4.重启服务原因分析 SO 解决办法 在命令行输入mysql -u root –p&#xff0c;输入密码&#xff0c;或通过工具连接数据库时&#xff0c;经常出现下面的错误信息&#xff0c;相信该错误信息很多人在使用MySQL…

使用Kali Linux 暴力破解wifi密码详细步骤

使用Kali Linux 暴力破解wifi密码详细步骤所谓暴力破解就是穷举法&#xff0c;将密码字典中每一个密码依次去与握手包中的密码进行匹配&#xff0c;直到匹配成功。所以能否成功破解wifi密码取决于密码字典本身是否包含了这个密码。破解的时间取决于CPU的运算速度以及密码本身的…

信息安全-数据安全-数据安全平台建设实践

背景 在大数据时代&#xff0c;数据已经成为公司的核心竞争力。此前&#xff0c;我们介绍了美团酒旅起源数据治理平台的建设与实践&#xff0c;主要是通过各种数据分析挖掘手段&#xff0c;为公司发展决策和业务开展提供数据支持。 近期&#xff0c;业内数据安全事件频发&…

日本社交网络市场:Facebook 与本土巨头的竞争分析

摘要&#xff1a;Facebook作为全球最大的社交媒体平台之一&#xff0c;成功地击败了日本的本土社交网站&#xff0c;包括Mixi、DeNA和Gree等。 社交媒体在全球范围内迅速崛起&#xff0c;改变了人们的社交方式和信息传播方式。然而&#xff0c;在不同国家和地区&#xff0c;由于…

尚硅谷Docker实战教程-笔记08【高级篇,Docker复杂安装详说】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【基础篇&#xff0c;Docker理念简介、官网介绍、平台入门图解、平台架构图解】…