当前位置: 首页 > news >正文

DeepSORT中的卡尔曼滤波

本文是看了DeepSORT方法视频之后,关于其中使用的卡尔曼滤波的理解

DeepSORT视频链接

首先贴几个比较好的,与本文由有关的几个帖子
图说卡尔曼滤波,一份通俗易懂的教程
卡尔曼滤波(Kalman Filter)原理与公式推导
卡尔曼滤波:从入门到精通
协方差的计算:X,Y是随机变量,A,B是常数矩阵,如何证明cov(AX,BY)=Acov(X,Y)B’?
协方差的计算方法
矩阵求导
两个高斯分布乘积的理论推导
首先是视频中的一张图请添加图片描述

预测阶段

x ^ k − = A x ^ k − 1 \hat{x}_k^-=A\hat{x}_{k-1} x^k=Ax^k1
P k − = A P k − 1 A T + Q , P k − ∈ R 8 , 8 P_k^-=AP_{k-1}A^T+Q, P_k^- \in R^{8,8} Pk=APk1AT+Q,PkR8,8

更新阶段

K k = P k − C T C P k − C T + R , K k ∈ R 8 , 4 K_k=\frac{P_k^-C^T}{CP_k^-C^T+R}, K_k\in R^{8,4} Kk=CPkCT+RPkCT,KkR8,4
x k ^ = x ^ k − + K k ( y k − C x ^ k − ) , C ∈ R 4 , 8 , x ^ k − ∈ R 8 , 1 , y k ∈ R 4 , 1 \hat{x_k}=\hat{x}_k^-+K_k(y_k-C\hat{x}_k^-), C\in R^{4,8}, \hat{x}_k^-\in R^{8,1}, y_k\in R^{4,1} xk^=x^k+Kk(ykCx^k),CR4,8,x^kR8,1,ykR4,1
P k = ( I − K k C ) P k − P_k=(I-K_kC)P_k^- Pk=(IKkC)Pk

整个过程中,矩阵A和矩阵C保持不变,具体如下所示。C是状态观测矩阵,比如,如果我们现在的观测值是速度,而需要的是位置,那么C就是由速度变化到位置的变换矩阵。而在这里,C是由检测框变换到检测框的变换矩阵,因此C里都是1
请添加图片描述详细步骤:

1.获得第一帧输出的检测框参数初始化

x ^ k − \hat{x}_k^- x^k P k − P_k^- Pk首先被初始化
x ^ 0 − = [ x , y , r , h , 0 , 0 , 0 , 0 ] , ∈ R 1 , 8 \hat{x}_0^-=[x,y,r,h,0,0,0,0], \in R^{1,8} x^0=[x,y,r,h,0,0,0,0],R1,8
P k − P_k^- Pk x ^ 0 − , ∈ R 8 , 8 \hat{x}_0^-, \in R^{8,8} x^0R8,8 有关,差了一个系数,代码如下所示

# self._std_weight_position = 0.05
# self._std_weight_velocity = 0.00625
std = [2 * self._std_weight_position * measurement[3],   #2 * self._std_weight_position * measurement[3],    1e-2,    2 * self._std_weight_position * measurement[3],     10 * self._std_weight_velocity * measurement[3],    10 * self._std_weight_velocity * measurement[3],   1e-5,    10 * self._std_weight_velocity * measurement[3]] 
covariance = np.diag(np.square(std))

2.预测下一时刻(第二帧中检测框的位置,图中的Prediction过程)

x ^ k − \hat{x}_k^- x^k正常计算,
P k − 中的 Q P_k^-中的 Q Pk中的Q是一个随机噪声,其为

std_pos = [ self._std_weight_position * mean[3],     self._std_weight_position * mean[3],   1e-2,    self._std_weight_position * mean[3]] std_vel = [self._std_weight_velocity * mean[3],    self._std_weight_velocity * mean[3],    1e-5,    self._std_weight_velocity * mean[3]] motion_cov = np.diag(np.square(np.r_[std_pos, std_vel]))  mean = np.dot(self._motion_mat, mean)covariance = np.linalg.multi_dot(( self._motion_mat, covariance, self._motion_mat.T)) + motion_cov

3.完成配对,给每一个轨迹匹配一个检测框

4.更新过程(Update)

def project(self, mean, covariance):     """Project state distribution to measurement space.      Parameters     ----------     mean : ndarray         The state's mean vector (8 dimensional array).     covariance : ndarray         The state's covariance matrix (8x8 dimensional).      Returns     -------     (ndarray, ndarray)         Returns the projected mean and covariance matrix of the given state         estimate.      """     std = [ self._std_weight_position * mean[3],        self._std_weight_position * mean[3],        1e-1,         self._std_weight_position * mean[3]]    innovation_cov = np.diag(np.square(std))      mean = np.dot(self._update_mat, mean)     covariance = np.linalg.multi_dot((  self._update_mat, covariance, self._update_mat.T))     return mean, covariance + innovation_covdef update(self, mean, covariance, measurement):    """Run Kalman filter correction step.      Parameters     ----------     mean : ndarray         The predicted state's mean vector (8 dimensional).     covariance : ndarray         The state's covariance matrix (8x8 dimensional).     measurement : ndarray         The 4 dimensional measurement vector (x, y, a, h), where (x, y)         is the center position, a the aspect ratio, and h the height of the         bounding box.     Returns    -------     (ndarray, ndarray)         Returns the measurement-corrected state distribution.     """     projected_mean, projected_cov = self.project(mean, covariance)      #求解AX=b中的xchol_factor, lower = scipy.linalg.cho_factor(projected_cov, lower=True, check_finite=False)     kalman_gain = scipy.linalg.cho_solve((chol_factor,lower), np.dot(covariance, self._update_mat.T).T,         check_finite=False).T     innovation = measurement - projected_mean      new_mean = mean + np.dot(innovation, kalman_gain.T)     new_covariance = covariance - np.linalg.multi_dot((         kalman_gain, projected_cov, kalman_gain.T))     return new_mean, new_covariance

本文在卡尔曼滤波:从入门到精通的基础上,又添加了一些个人的理解

导论

卡尔曼滤波本质上是一个数据融合算法,将具有同样测量目的、来自不同传感器、(可能) 具有不同单位 (unit) 的数据融合在一起,得到一个更精确的目的测量值。事实上,卡尔曼滤波是将两个高斯分布相乘而得到的一个新的高斯分布。

简述

首先考虑一个SLAM问题

  • 运动方程: x t = F t ⋅ x t − 1 + B t ⋅ u t + ω t (1) x_t=F_t \cdot x_{t-1}+B_t\cdot u_t+\omega_t \tag{1} xt=Ftxt1+Btut+ωt(1)
  • 观测方程: z t = H t ⋅ x t + v t (2) z_t=H_t \cdot x_t+v_t \tag{2} zt=Htxt+vt(2)

其中:

x t x_t xt t t t 时刻的状态向量,包括了相机位姿、路标坐标等信息,也可能有速度、朝向等信息;
u t u_t ut为运动测量值,如加速度,转向等等;
F t F_t Ft为状态转换方程,将 t − 1 t-1 t1 时刻的状态转换至 t t t 时刻的状态;
B t B_t Bt 是控制输入矩阵,将运动测量值​ 的作用映射到状态向量上;
ω t \omega_t ωt是预测的高斯噪声,其均值为0,协方差矩阵为 Q t Q_t Qt​ 。

z t z_t zt为传感器的测量值;
H t H_t Ht为转换矩阵,它将状态向量映射到测量值所在的空间中,由于估计值和预测值可能不同,单位也不同,因此需要 H t H_t Ht来进行变换。
v t v_t vt为测量的高斯噪声,其均值为0,协方差矩阵为​ R t R_t Rt

一个小例子:
用一个在解释卡尔曼滤波时最常用的一维例子:小车追踪。如下图所示:
请添加图片描述
状态向量 x t x_t xt为小车的位置和速度:

x t = [ s t v t ] (3) x_t= \begin{bmatrix} s_t\\ v_t\\ \end{bmatrix} \tag{3} xt=[stvt](3)
其中, s t s_t st为t时刻的位移, v t v_t vt为t时刻的速度

{ s t = s t − 1 + v t ⋅ △ t + 1 2 ⋅ u t ⋅ △ t 2 v t = v t − 1 + u t ⋅ △ t (4) \begin{cases} s_t& =s_{t-1}+v_t\cdot \vartriangle t+\frac{1}{2}\cdot u_t\cdot \vartriangle t ^2\\ v_t& = v_{t-1} + u_t\cdot \vartriangle t \tag{4} \end{cases} {stvt=st1+vtt+21utt2=vt1+utt(4)

写成矩阵的形式
[ s t v t ] = [ 1 △ t 0 1 ] [ s t − 1 v t − 1 ] + [ △ t 2 2 △ t ] ⋅ u t (5) \begin{bmatrix} s_t\\ v_t\\ \end{bmatrix}= \begin{bmatrix} 1&\vartriangle t\\ 0&1\\ \end{bmatrix} \begin{bmatrix} s_{t-1}\\ v_{t-1}\\ \end{bmatrix}+ \begin{bmatrix} \frac{\vartriangle t ^2}{2}\\ \vartriangle t\\ \end{bmatrix}\cdot u_t \tag{5} [stvt]=[10t1][st1vt1]+[2t2t]ut(5)
跟之前的运动方程对比,就知道
F t = [ 1 △ t 0 1 ] , B t = [ △ t 2 2 △ t ] F_t = \begin{bmatrix} 1&\vartriangle t\\ 0&1\\ \end{bmatrix},B_t= \begin{bmatrix} \frac{\vartriangle t ^2}{2}\\ \vartriangle t\\ \end{bmatrix} Ft=[10t1],Bt=[2t2t]
上式就写为
x ^ t ∣ t − 1 = F t ⋅ x ^ t − 1 + B t ⋅ u t (6) \hat{x}_{t|t-1}=F_t\cdot\hat{x}_{t-1}+B_t\cdot u_t \tag{6} x^tt1=Ftx^t1+Btut(6)
与公式(1)的不同是,公式(1)中的值 x t x_t xt都是真实值,因此其中包含有误差,而公式(6)中的 x ^ t ∣ t − 1 \hat{x}_{t|t-1} x^tt1是由运动学方程计算出来的,因此其中不包含误差。
联立公式(1)和(6)可得:
x t − x ^ t ∣ t − 1 = F ⋅ ( x t − 1 − x ^ t ∣ t − 1 ) + ω t x_t-\hat{x}_{t|t-1}=F\cdot (x_{t-1}-\hat{x}_{t|t-1})+\omega_t xtx^tt1=F(xt1x^tt1)+ωt
接下来计算真实值 x t x_t xt的协方差矩阵,首先明确一点矩阵 x t x_t xt是一个矩阵,它的形式如下所示:
x t = [ x 1 T , x 2 T , ⋯ , x n T ] = [ x 1 , 1 x 1 , 2 ⋯ x 1 , n − 1 x 1 , n x 2 , 1 x 2 , 2 ⋯ x 2 , n − 1 x 2 , n ⋮ ⋮ ⋮ ⋮ ⋮ x m , 1 x m , 2 ⋯ x 1 , m − 1 x 1 , m ] ∈ R m , n x_t=[x_1^T,x_2^T,\cdots,x_n^T]= \begin{bmatrix} x_{1,1}&x_{1,2}&\cdots&x_{1,n-1}&x_{1,n}\\ x_{2,1}&x_{2,2}&\cdots&x_{2,n-1}&x_{2,n}\\ \vdots&\vdots&\vdots&\vdots&\vdots\\ x_{m,1}&x_{m,2}&\cdots&x_{1,m-1}&x_{1,m}\\ \end{bmatrix}\in R^{m,n} xt=[x1T,x2T,,xnT]= x1,1x2,1xm,1x1,2x2,2xm,2x1,n1x2,n1x1,m1x1,nx2,nx1,m Rm,n
也就是说 x t x_t xt中包含了n个状态量,并且每个状态量是一个m维向量,也就是存住了t个时刻的量。
还需要注意一点的是,且
x ^ t ∣ t − 1 \hat{x}_{t|t-1} x^tt1为t时刻的状态矩阵 x t x_t xt 中不同状态量的均值。且
x ^ t ∣ t − 1 = [ m e a n ( x 1 ) m e a n ( x 2 ) ⋮ m e a n ( x n ) ] \hat{x}_{t|t-1}= \begin{bmatrix} mean(x_1)\\ mean(x_2)\\ \vdots\\ mean(x_n)\\ \end{bmatrix} x^tt1= mean(x1)mean(x2)mean(xn)
这也好理解,因为 x t x_t xt中应当是真实值,但是真实值事实上永远不可能知道的。不过呢,真实值的均值可以通过计算 x ^ t ∣ t − 1 \hat{x}_{t|t-1} x^tt1得到,并且在均值的附近有误差,也就是一个在均值附近是一个高斯分布。那么接下来求矩阵 x t x_t xt的协方差矩阵就好理解了。

P t ∣ t − 1 = E [ ( x t − x ^ t ∣ t − 1 ) ( x t − x ^ t ∣ t − 1 ) T ] = E [ ( F ( x t − x ^ t ∣ t − 1 ) + ω t ) ⋅ ( F ( x t − x ^ t ∣ t − 1 ) + ω t ) T ] = F E [ ( x t − x ^ t ∣ t − 1 ) ⋅ ( x t − x ^ t ∣ t − 1 ) T ] F T + E [ F ( x t − x ^ t ∣ t − 1 ) ⋅ ω t T ] + E [ ω t ⋅ ( F ( x t − x ^ t ∣ t − 1 ) ) T ] + E [ ω t ⋅ ω t T ] \begin{equation} \begin{aligned} P_{t|t-1}&=E[(x_t-\hat{x}_{t|t-1})(x_t-\hat{x}_{t|t-1})^T] \\ & = E[(F(x_t-\hat{x}_{t|t-1})+\omega_t)\cdot (F(x_t-\hat{x}_{t|t-1})+\omega_t)^T] \\ & =FE[(x_t-\hat{x}_{t|t-1})\cdot (x_t-\hat{x}_{t|t-1})^T]F^T\\ &+E[F(x_t-\hat{x}_{t|t-1})\cdot \omega_t^T]+E[\omega_t\cdot (F(x_t-\hat{x}_{t|t-1}))^T] \\ &+E[\omega_t \cdot \omega_t^T] \end{aligned} \tag{} \end{equation} Ptt1=E[(xtx^tt1)(xtx^tt1)T]=E[(F(xtx^tt1)+ωt)(F(xtx^tt1)+ωt)T]=FE[(xtx^tt1)(xtx^tt1)T]FT+E[F(xtx^tt1)ωtT]+E[ωt(F(xtx^tt1))T]+E[ωtωtT]()
其中 E [ F ( x t − x ^ t ∣ t − 1 ) ⋅ ω t T ] E[F(x_t-\hat{x}_{t|t-1})\cdot \omega_t^T] E[F(xtx^tt1)ωtT]表示矩阵 F ( x t − x ^ t ∣ t − 1 ) F(x_t-\hat{x}_{t|t-1}) F(xtx^tt1) ω t T \omega_t^T ωtT矩阵的协方差,且由于这两者这件并无关系,所以
E [ F ( x t − x ^ t ∣ t − 1 ) ⋅ ω t T ] = 0 E[F(x_t-\hat{x}_{t|t-1})\cdot \omega_t^T] =0 E[F(xtx^tt1)ωtT]=0同理
E [ ω t ⋅ ( F ( x t − x ^ t ∣ t − 1 ) ) T ] = 0 E[\omega_t\cdot (F(x_t-\hat{x}_{t|t-1}))^T]=0 E[ωt(F(xtx^tt1))T]=0
注意公式中的E表示的是期望,这里是由于协方差的计算方式不同,在matlab中的计算公式课本上的有所不同,这里知道就可以了。
因此就可以得到协方差的预测公式
P t ∣ t − 1 = F E [ ( x t − x ^ t ∣ t − 1 ) ⋅ ( x t − x ^ t ∣ t − 1 ) T ] F + E [ ω t ⋅ ω t T ] = F P t − 1 F T + Q t \begin{equation} \begin{aligned} P_{t|t-1}& =FE[(x_t-\hat{x}_{t|t-1})\cdot (x_t-\hat{x}_{t|t-1})^T]F+E[\omega_t \cdot \omega_t^T]\\ &=FP_{t-1}F^T+Q_t \end{aligned} \tag{} \end{equation} Ptt1=FE[(xtx^tt1)(xtx^tt1)T]F+E[ωtωtT]=FPt1FT+Qt()

由以上的步骤,我们就得到了预测值和预测值的协方差矩阵,接下来就需要将预测值与观测值进行融合了。由于预测值是符合高斯分布,观测值也符合高斯分布,那么融合的本质就是将这个两个高斯分布乘起来,乘起来还是一个高斯分布,那么乘起来之后的高斯分布的均值和方差的公式推导,见帖子两个高斯分布乘积的理论推导

现在我们有n个预测量,假设有k个观测量为
x t − x ^ t ∣ t − 1 = F ⋅ ( x t − 1 − x ^ t ∣ t − 1 ) + ω t x_t-\hat{x}_{t|t-1}=F\cdot (x_{t-1}-\hat{x}_{t|t-1})+\omega_t xtx^tt1=F(xt1x^tt1)+ωt
接下来计算真实值 x t x_t xt的协方差矩阵,首先明确一点矩阵 x t x_t xt是一个矩阵,它的形式如下所示:

z t = [ z 1 z 2 ⋮ z n ] z_t= \begin{bmatrix} z_1\\ z_2\\ \vdots\\ z_n\\ \end{bmatrix} zt= z1z2zn
x t x_t xt z t z_t zt 之间由于单位不同,因此需要使用一个转化矩阵H,即
z t = H ⋅ x t z_t=H\cdot x_t zt=Hxt写成矩阵形式就是
[ z 1 z 2 ⋮ z k ] = H ⋅ [ x 1 x 2 ⋮ x n ] \begin{bmatrix} z_1\\ z_2\\ \vdots\\ z_k\\ \end{bmatrix}= H\cdot \begin{bmatrix} x_{1}\\ x_{2}\\ \vdots\\ x_{n}\\ \end{bmatrix} z1z2zk =H x1x2xn

相关文章:

DeepSORT中的卡尔曼滤波

本文是看了DeepSORT方法视频之后,关于其中使用的卡尔曼滤波的理解 DeepSORT视频链接 首先贴几个比较好的,与本文由有关的几个帖子 图说卡尔曼滤波,一份通俗易懂的教程 卡尔曼滤波(Kalman Filter)原理与公式推导 卡尔…...

【Linux网络服务】SSH远程访问及控制

一、openssh服务器 1.1ssh协议 SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能; SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令&#xff1…...

AutoGPT的出现,会让程序员失业吗?

最近,一个叫AutoGPT的模型火了,在GitHub上线数周Star数就直线飙升。截至目前,AutoGPT的Star数已经达到87k,马上接近90k,超过了PyTorch的65k。 根据AutoGPT的命名,就可以发现其神奇之处在于“auto”&#x…...

微信小程序php+vue 校园租房指南房屋租赁系统

本着诚信的原则,平台必须要掌握出租方必要的真实可信的信息,这样就可以防止欺诈事件的发生,事后也可以联系找到出租方。并且租金等各方面规范标准化,在这易租房诚信可信的平台让承租方与出租方充分有效对接,既方便了承…...

水果FL Studio21最新中文完整版下载更新及内容介绍

简单总结一下,本次小版本更新最重要的内容,我个人认为是对于M1芯片的适配。其余的比如EQ2,3x这些我们很熟悉的插件虽说也有更新,但是估计并没有特别大的改动。我个人的话会先放一段时间,等下次有其他更让我感兴趣的内容…...

springboot+vue小区物业管理系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的小区物业管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…...

GEEer成长日记二十三:chatGPT可以帮我们提取水体边缘吗?

欢迎关注公众号:GEEer成长日记 目录 01 首先,chatGPT是什么? 02 进入正题,如何进行边缘检测? chatGPT推出之后,引发了激烈的讨论,今天带各位看看它在GEE方面能为我们做什么。原本想着它可以…...

程序员阿里三面无理由挂了,被HR一句话噎死,网友:这可是阿里啊

进入互联网大厂一般都是“过五关斩六将”,难度堪比西天取经,但当你真正面对这些大厂的面试时,有时候又会被其中的神操作弄的很是蒙圈。 近日,某位程序员发帖称,自己去阿里面试,三面都过了,却被…...

js面试题

在全局作用域下声明了一个变量 arr, 它的初始值是一个空数组 第二段代码,循环计数器变量i的初始值为0,循环条件是i的值小于2, 也就是说当i的值为0或者1时, 循环条件才能成立 才能够进入到循环体 当i的值为2时循环条件不成立&…...

SpringCloud --- Gateway服务网关

一、简介 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 二、为…...

【java】CGLIB动态代理原理

文章目录 1. 简介2. 示例3. 原理4. JDK动态代理与CGLIB动态代理区别(面试常问) 1. 简介 CGLIB的全称是:Code Generation Library。 CGLIB是一个强大的、高性能、高质量的代码生成类库,它可以在运行期扩展Java类与实现Java接口&a…...

ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局

第一章、生态安全评价理论及方法介绍 一、生态安全评价简介 ​ 二、生态服务能力简介 ​ 三、生态安全格局构建研究方法简介 ​ 第二章、平台基础一、ArcGIS Pro介绍1. ArcGIS Pro简介2. ArcGIS Pro基础3. ArcGIS Pro数据编辑4. ArcGIS Pro空间分析5. 模型构建器6. ArcGIS Pro…...

openstack安装应答文件时报错处理

环境:centos7 在执行packstack --answer-file./answer.ini命令后,一般需要几分钟才能完成,如何在applying IP controler.pp时报错,需要注意以下几点: 0.关闭firewalld和selinux(必须) system…...

SpringBoot整合MongoDB

文章目录 一、环境准备二、集合操作三、文档操作3.1 实体类3.2 添加文档3.3 查询文档3.4 修改文档3.5 删除文档 提示&#xff1a;以下是本篇文章正文内容&#xff0c;MongoDB 系列学习将会持续更新 一、环境准备 ①添加 SpringData 依赖&#xff1a; <dependency><…...

线程同步机制与互斥锁

线程同步机制 在多线程编程&#xff0c;一些敏感数据不允许被多个线程同时访问&#xff0c;此时就使用同步访问技术&#xff0c;保证数据在任何时刻&#xff0c;最多有一个线程访问&#xff0c;以保证数据的完整性。也可以这里理解:线程同步&#xff0c;即当有一个线程在对内存…...

Python算法设计 - 编码加密

一、编码加密 编码加密应用十分广泛&#xff0c;特别是在大数据时代&#xff0c;也因此信息安全变得尤为重要 有时我会读到“OTP是一种无法被破解的加密方式”&#xff0c;当然&#xff0c;文末会附上一个完全被破解的OTP加密的例子 问题在于&#xff0c;人们经常会觉得完美的…...

数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)

目录 基本介绍 平衡因子 平衡二叉树 平衡二叉树的高度 基本介绍 什么是平衡二叉树&#xff1f; 以一个例子来解释一下&#xff1a; 搜索树结点按不同的插入次序&#xff0c;将会导致不同的深度和平均查找长度ASL 在二叉搜索树中查找一个元素&#xff1a; &#xff08…...

【浓缩概率】浓缩概率思想帮我蒙选择题的概率大大提升!

今天在学习的时候遇到一个很有趣的思想叫作浓缩概率&#xff0c;可以帮我们快速解决一下概率悖论问题&#xff01; 什么是概率 计算概率有下面两个最简单的原则&#xff1a; 原则一、计算概率一定要有一个参照系&#xff0c;称作「样本空间」&#xff0c;即随机事件可能出现…...

两小时让你全方位的认识文件(一)

想必友友们在生活中经常会使用到各种各样的文件&#xff0c;那么我们是否了解它其中的奥秘呢&#xff0c;今天阿博就带领友友们深入地走入文件&#x1f6e9;️&#x1f6e9;️&#x1f6e9;️ 文章目录 一.为什么使用文件二.什么是文件三.文件的打开和关闭四.文件的顺序读写 一…...

基于Java+Springboot+vue网上商品订单转手系统设计和实现

基于JavaSpringbootvue网上商品订单转手系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...