【Unity学习笔记】第十九 · 物理引擎约束求解解惑(LCP,最优,拉格朗日乘数法,SI,PGS,基于冲量法)

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/140309494

作者:CSDN@|Ringleader|


在学习物理引擎过程中,有几大问题一直困扰着我:

  1. 约束求解到底是LCP还是带约束最优问题?
  2. 约束求解过程中拉格朗日乘数法和带约束优化中的拉格朗日乘数法是一个东西吗?
  3. 基于力的约束求解、基于冲量、基于位置的约束求解区别?
  4. SI和PGS的区别?GS与PGS区别?

最优问题

在这里插入图片描述
上图给出了约束的两种形式,碰撞约束(不等式约束)和关节约束(等式约束)。解决约束的方式都是沿着碰撞法线或者连杆方向施加力或者冲量,使之满足约束。

现在的问题是,满足约束的方式有很多,为什么一定要沿着约束函数梯度方向?除非你认为沿着梯度方向解决约束最快或者说引入能量最小!

这意味着你默认这就是最优问题!

那么可能的最优目标是什么呢?如果从解决约束移动距离最小来看目标函数 f ( x ) f(x) f(x)就是 Δ x Δx Δx,如果是从引入能量最小来看目标函数 f ( x ) f(x) f(x)就是 1 2 m Δ v 2 \frac{1}{2}m Δv^2 21mΔv2,写成 Δ x Δx Δx形式就是 1 2 h 2 m Δ x 2 \frac{1}{2h^2}mΔx^2 2h21mΔx2 h h h为时间步长),写成矩阵的二次型形式就是 1 2 h 2 Δ x T M Δ x \frac{1}{2h^2}Δx^TMΔx 2h21ΔxTMΔx。(注:本文不讨论旋转

因为有基于冲量和基于位置解决约束思路,我这里统一用能量最小约化目标。

那么约束求解就变成了带约束的二次规划问题了(先讨论等式约束),即:
m i n i m i z e f ( Δ x ) = 1 2 h 2 Δ x T M Δ x s . t . C i ( x + Δ x ) = 0 , i ∈ N minimize \quad f(Δx)=\frac{1}{2h^2}Δx^TMΔx \\ s.t. \quad C_i(x+Δx) = 0,i∈N minimizef(Δx)=2h21ΔxTMΔxs.t.Ci(x+Δx)=0,iN

或者
m i n i m i z e f ( Δ v ) = 1 2 Δ v T M Δ v s . t . C i ( v + Δ v ) = 0 , i ∈ N minimize \quad f(Δv)=\frac{1}{2}Δv^TMΔv \\ s.t. \quad C_i(v+Δv) = 0,i∈N minimizef(Δv)=21ΔvTMΔvs.t.Ci(v+Δv)=0,iN

基于位置的约束求解

线性化处理约束
C i ( x + Δ x ) ≈ C i ( x ) + ∇ C i ( x ) Δ x C_i(x+Δx)≈C_i(x)+ ∇C_i(x)Δx Ci(x+Δx)Ci(x)+Ci(x)Δx

那么 C i ( x ) + ∇ C i ( x ) Δ x = 0 C_i(x)+ ∇C_i(x)Δx=0 Ci(x)+Ci(x)Δx=0,即 ∇ C i ( x ) Δ x = − C i ( x ) ∇C_i(x)Δx=-C_i(x) Ci(x)Δx=Ci(x)

联立所有约束,
J = [ ∇ C 1 ( x ) , ∇ C 2 ( x ) , . . . , ∇ C n ( x ) ] T J = [∇C_1(x),∇C_2(x),...,∇C_n(x)]^T J=[C1(x),C2(x),...,Cn(x)]T
b = [ − C 1 ( x ) , − C 2 ( x ) , . . . , − C n ( x ) ] T b = [-C_1(x),-C_2(x),...,-C_n(x)]^T b=[C1(x),C2(x),...,Cn(x)]T,

那么原二次规划问题就变为:

m i n i m i z e f ( Δ x ) = 1 2 h 2 Δ x T M Δ x s . t . J Δ x = b minimize \quad f(Δx)= \frac{1}{2h^2}Δx^TMΔx \\ s.t. \quad JΔx=b minimizef(Δx)=2h21ΔxTMΔxs.t.JΔx=b

使用拉格朗日乘数法求解,将带约束问题变为无约束问题:

拉格朗日函数: L ( Δ x , λ ) = 1 2 h 2 Δ x T M Δ x + λ T ( J Δ x − b ) L(Δx,λ)=\frac{1}{2h^2}Δx^TMΔx+λ^T(JΔx-b) L(Δx,λ)=2h21ΔxTMΔx+λT(JΔxb)


{ ∂ L ∂ Δ x = 1 h 2 M Δ x + J T λ = 0 ( 1 ) ∂ L ∂ λ = J Δ x − b = 0 ( 2 ) \begin{cases} \frac{\partial \mathcal{L}}{\partial \Delta x} = \frac{1}{h^2} M \Delta x + J^Tλ = 0 \quad\quad(1) \\ \frac{\partial \mathcal{L}}{\partial \lambda} = J \Delta x - b = 0 \quad\quad\quad\quad\quad(2) \\ \end{cases} {ΔxL=h21MΔx+JTλ=0(1)λL=JΔxb=0(2)

将第一项 Δ x = − h 2 M − 1 J T λ Δx=-h^2M^{-1}J^Tλ Δx=h2M1JTλ 带入第二项,得: − h 2 J M − 1 J T λ = b -h^2JM^{-1}J^Tλ=b h2JM1JTλ=b,令 A = − h 2 J M − 1 J T A=-h^2JM^{-1}J^T A=h2JM1JT
则解线性方程组 A λ = b Aλ=b Aλ=b 就可以得到λ,然后 Δ x = − h 2 M − 1 J T λ Δx=-h^2M^{-1}J^Tλ Δx=h2M1JTλ就可求解。

如果A是可逆的,我们可以通过求逆来求解;如果不可逆,我们可以使用数值方法来求解,如高斯赛德尔、雅可比法、牛顿法等。

基于冲量的约束求解

m i n i m i z e f ( Δ v ) = 1 2 Δ v T M Δ v s . t . C i ( v + Δ v ) = 0 , i ∈ N minimize \quad f(Δv)=\frac{1}{2}Δv^TMΔv \\ s.t. \quad C_i(v+Δv) = 0,i∈N minimizef(Δv)=21ΔvTMΔvs.t.Ci(v+Δv)=0,iN

同样,线性化约束 C i ( v + Δ v ) ≈ C i ( v ) + ∇ C i ( v ) Δ v = 0 C_i(v+Δv)≈C_i(v)+∇C_i(v)Δv=0 Ci(v+Δv)Ci(v)+Ci(v)Δv=0,原问题转为:
m i n i m i z e f ( Δ v ) = 1 2 Δ v T M Δ v s . t . J Δ v = b minimize \quad f(Δv)=\frac{1}{2}Δv^TMΔv \\ s.t. \quad JΔv=b \\ minimizef(Δv)=21ΔvTMΔvs.t.JΔv=b
其中 J = [ C 1 ( v ) , C 2 ( v ) , . . . , C n ( v ) ] T J=[C_1(v),C_2(v),...,C_n(v)]^T J=[C1(v),C2(v),...,Cn(v)]T b = [ − C 1 ( v ) , − C 2 ( v ) , . . . , − C n ( v ) ] T b=[-C_1(v),-C_2(v),...,-C_n(v)]^T b=[C1(v),C2(v),...,Cn(v)]T n n n为约束个数。

利用拉格朗日乘数法, L ( Δ v , λ ) = 1 2 Δ v T M Δ v + λ T ( J Δ v − b ) L(Δv,λ)=\frac{1}{2}Δv^TMΔv + λ^T(JΔv-b) L(Δv,λ)=21ΔvTMΔv+λT(JΔvb)

{ ∂ L ∂ Δ v = M Δ v + J T λ = 0 ( 3 ) ∂ L ∂ λ = J Δ v − b = 0 ( 4 ) \begin{cases} \frac{\partial \mathcal{L}}{\partial \Delta v} = M \Delta v + J^Tλ = 0 \quad\quad(3) \\ \frac{\partial \mathcal{L}}{\partial \lambda} = J \Delta v - b = 0 \quad\quad\quad\quad(4) \\ \end{cases} {ΔvL=MΔv+JTλ=0(3)λL=JΔvb=0(4)
− J M − 1 J T λ = b -JM^{-1}J^Tλ=b JM1JTλ=b,求解线性方程组可得λ和Δv。

不等式约束情况

以基于冲量的约束求解为例,
m i n i m i z e f ( Δ v ) = 1 2 Δ v T M Δ v s . t . J Δ v ≤ b minimize \quad f(Δv)=\frac{1}{2}Δv^TMΔv \\ s.t. \quad JΔv≤b \\ minimizef(Δv)=21ΔvTMΔvs.t.JΔvb
运用KKT条件下的拉格朗日乘数法,

L ( Δ v , λ ) = 1 2 Δ v T M Δ v + λ T ( J Δ v − b ) L(Δv,λ)=\frac{1}{2}Δv^TMΔv + λ^T(JΔv-b) L(Δv,λ)=21ΔvTMΔv+λT(JΔvb)
满足:
K K T 条件 { ∂ L ∂ Δ v = M Δ v + J T λ = 0 ( 5 ) J Δ v − b ≤ 0 ( 6 ) λ ≥ 0 ( 7 ) λ T ( J Δ v − b ) = 0 ( 8 ) KKT条件\begin{cases} \frac{\partial \mathcal{L}}{\partial \Delta v} = M \Delta v + J^Tλ = 0 \quad\quad(5)\\ JΔv-b≤0 \quad\quad\quad\quad\quad\quad\quad(6)\\ λ≥0 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad(7)\\ λ^T(JΔv-b)=0 \quad\quad\quad\quad\quad(8) \end{cases} KKT条件 ΔvL=MΔv+JTλ=0(5)JΔvb0(6)λ0(7)λT(JΔvb)=0(8)
第(8)项的条件称作互补松弛条件

分两种情况,第一种就是λ=0,即f(x)本身极值就在约束内,类似于碰撞约束中已经分离的情况,此时Δv=0,无需施加冲量;
第二种就是λ>0,因为松弛互补约束,必须 J Δ v − b = 0 JΔv-b=0 JΔvb=0,这和等式约束相同。

所以对于不等式约束,同样可以使用类似等式约束的拉格朗日乘数法,但需要对λ值进行钳值,保证λ≥0即可(约束≤0则λ≥0,约束≥0则λ≤0)。

对于其中的数学解释,可以参考下面文章:

寻找“最好”(4)——不等约束和KKT条件
Karush-Kuhn-Tucker (KKT)条件

物理上的理解可以参考《基于物理的建模与动画10.3节》碰撞约束的例子,其中 a − a^- a是碰撞前的加速度, a + a^+ a+是碰撞后的加速度。地面反作用力 f f f a + a^+ a+就有类似的互补性,如果 f = J λ f=Jλ f=Jλ就要求λ≥0,让对象至少不会往地面方向钻。
在这里插入图片描述

线性互补问题

从上面的分析可以看出,约束求解就是最优问题,很多文章虽然没有明确指出,但默认使用了上面的结论,也就是沿约束梯度方向,可以使约束求解引入的动能最小。

但为啥很多书籍和文章又称约束解决本质上是线性互补问题呢。
从前面不等约束求解使用KKT条件,其中的互补松弛条件能看出一些端倪。

我们先看一看在不使用优化思想下是怎么求解约束的。

约束力法

根据 C ˙ = J q ˙ = 0 \dot{C}=J\dot{q}=0 C˙=Jq˙=0,以及约束力于速度正交(理想约束下约束力不做功)→ F c T q ˙ = 0 F_c^T\dot{q}=0 FcTq˙=0,得到 F c F_c Fc J J J平行,所以 F c = J T λ F_c=J^Tλ Fc=JTλ
其中 F c = J T λ = ∇ C 1 λ 1 + ∇ C 2 λ 2 + … + ∇ C m λ m F_c=J^Tλ=∇C_1λ_1+∇C_2λ_2+…+∇C_mλ_m Fc=JTλ=C1λ1+C2λ2++Cmλm,m是梯度的维度。

同时根据 C ¨ = 0 \ddot{C}=0 C¨=0得到:

C ¨ = J ˙ q ˙ + J q ¨ = J ˙ q ˙ + J M − 1 ( F e x t + F c ) = J ˙ q ˙ + J M − 1 ( F e x t + J T λ ) = 0 \ddot{C}=\dot{J}\dot{q}+J\ddot{q} = \dot{J}\dot{q}+JM^{-1}(F_{ext}+F_c) = \dot{J}\dot{q}+JM^{-1}(F_{ext}+J^Tλ) =0 C¨=J˙q˙+Jq¨=J˙q˙+JM1(Fext+Fc)=J˙q˙+JM1(Fext+JTλ)=0

则, J M − 1 J T λ = − J ˙ q ˙ − J M − 1 F e x t JM^{-1}J^Tλ=- \dot{J}\dot{q}-JM^{-1}F_{ext} JM1JTλ=J˙q˙JM1Fext

只有λ是未知的,由此解这个线性方程组就能得到约束力 F c F_c Fc。那么对应速度和位置通过积分就能获得。

这就是约束力法解约束的思路。

但这个只是无摩擦力的理想约束下,且为等式约束得出的公式,其他复杂情况是否能用类似拉格朗日乘数法暂未可知。

而且基于力的方式求解可能不适合接触约束,因为两个物体的碰撞时,互相之间的力变化很快,而且有一个很大的峰值;而且存在摩檫力约束时,循环求解时可能导致一个无穷大的值。(这段话出自游戏物理引擎(四) 约束)
在这里插入图片描述

基于冲量法

类似的。
施加额外冲量 I = M Δ V = ∫ t t + Δ t F d t I=MΔV=\int_{t}^{t+Δt} Fdt I=MΔV=tt+ΔtFdt,半隐式欧拉法的话,力认为是恒定的,那么

M Δ V = F Δ t = J T λ Δ t MΔV=FΔt=J^TλΔt MΔV=FΔt=JTλΔt Δ V = M − 1 J T λ Δ t ΔV=M^{-1}J^TλΔt ΔV=M1JTλΔt

根据 C ˙ = J q ˙ = J V = 0 \dot{C}=J\dot{q}=JV=0 C˙=Jq˙=JV=0,其中 V = V= V=

C ˙ = J ( V i n i t + Δ V ) = J ( V i n i t + M − 1 J T λ Δ t ) = 0 \dot{C}=J(V_{init}+ΔV)=J(V_{init}+M^{-1}J^TλΔt)=0 C˙=J(Vinit+ΔV)=J(Vinit+M1JTλΔt)=0 推导出

J M − 1 J T λ Δ t = − J V i n i t JM^{-1}J^TλΔt=-JV_{init} JM1JTλΔt=JVinit

解这个线性方程组就能得到λ和Δv了,对应Δx也能得到。

如果只是通过上面解得出Δv,仅仅保证速度不会违反约束,而要保证位置同样不会违反约束,可以在速度约束加上Baumgarte 项,即 J V + b = 0 JV+b=0 JV+b=0,其中 b = − β e Δ t ( 0 < β < 1 ) b=-β\frac{e}{Δt} (0<β<1) b=βΔte(0<β<1),e代表误差项,例如碰撞约束中就是穿透深度,β代表约束违反修正速度。

基于位置法

C ( x + Δ x ) ≈ C ( x ) + ∇ C ( x ) Δ x = 0 C(x+Δx)≈C(x)+∇C(x)Δx=0 C(x+Δx)C(x)+C(x)Δx=0,那么 J Δ x = − C ( x ) JΔx=-C(x) JΔx=C(x),其中 J = ∇ C ( x ) J=∇C(x) J=C(x)
如果使用半隐式欧拉法, Δ x = v ′ Δ t = ( v i n i t + a Δ t ) Δ t = ( v i n i t + M − 1 J T λ Δ t ) Δ t Δx = v^{'}Δt=(v_{init}+aΔt)Δt=(v_{init}+M^{-1}J^TλΔt)Δt Δx=vΔt=(vinit+aΔt)Δt=(vinit+M1JTλΔt)Δt,

带入上面得到: J v i n i t Δ t + J M − 1 J T λ Δ t 2 = − C ( x ) Jv_{init}Δt+JM^{-1}J^TλΔt^2=-C(x) JvinitΔt+JM1JTλΔt2=C(x),则

J M − 1 J T λ Δ t 2 = − J v i n i t Δ t − C ( x ) JM^{-1}J^TλΔt^2=-Jv_{init}Δt-C(x) JM1JTλΔt2=JvinitΔtC(x),解这个线性方程组就能得到λ,然后Δx亦可得到。

赵航在基于约束的物理说 v i n i t = 0 v_{init}=0 vinit=0,我不知道是不是PBD不考虑速度还是怎么造成的,暂不做深究,思想都差不多。

比较约束求解中最优法和普通物理分析法

分别使用最优和不适用最优的方式,都独立给出了约束求解的方法。
比较一下,例如基于冲量的方法。
最优法 { ∂ L ∂ Δ v = M Δ v + J T λ = 0 ∂ L ∂ λ = J Δ v − b = 0 最优法\begin{cases} \frac{\partial \mathcal{L}}{\partial \Delta v} = M \Delta v + J^Tλ = 0 \\ \frac{\partial \mathcal{L}}{\partial \lambda} = J \Delta v - b = 0\\ \end{cases} 最优法{ΔvL=MΔv+JTλ=0λL=JΔvb=0

物理分析法 { M Δ V = F Δ t = J T λ Δ t C ˙ = J ( V i n i t + Δ V ) = 0 物理分析法\begin{cases} MΔV=FΔt=J^TλΔt \\ \dot{C}=J(V_{init}+ΔV)=0 \end{cases} 物理分析法{MΔV=FΔt=JTλΔtC˙=J(Vinit+ΔV)=0
在不考虑 b b b 项差异情况下,差别仅在λ,可以发现最优方式中的λ会暗含Δt项;

而基于位置的
{ 最优法 h 2 J M − 1 J T λ = C ( x ) 物理分析法 J M − 1 J T λ Δ t 2 = − J v i n i t Δ t − C ( x ) \begin{cases} 最优法\quad h^2JM^{-1}J^Tλ= C(x)\\ 物理分析法\quad JM^{-1}J^TλΔt^2=-Jv_{init}Δt-C(x) \end{cases} {最优法h2JM1JTλ=C(x)物理分析法JM1JTλΔt2=JvinitΔtC(x)
可以看到更是非常接近。(不知道是不是推导的问题,感觉两个λ符号相反?问题不大,思路对的就行)

可以看出,用最优方法和物理分析法,得到的结果是类似的,但数学最优方式推导简洁优美,而且很容易处理不等约束,拉格朗日乘数法数学意义明确。

相反,普通物理推导方式,对于拉格朗日乘数法使用的正确性含糊其辞,且推导方式较复杂。

所以这波啊,是数学完胜!!!

问题解答

通过上面的研究,问题基本明晰,约束求解本质上就是最优问题,拉格朗日乘数法的使用,就是求解这种带约束的优化问题,而所谓的线性互补问题,就是KKT条件中的互补松弛条件,两种方法使用的拉格朗日乘数法思路都一致,可能在λ的取值上存在差异。

基于力、基于冲量、基于位置求解思路上都很相近,主要区别就是算 C C C C ˙ \dot{C} C˙还是 C ¨ \ddot{C} C¨,然后用 λ λ λ替换里面的Δx、Δv或者Fc,最后求解含唯一未知数 λ λ λ的线性方程组即可。

SI、PGS本文没涉及,但已知结论就是它俩思想上一致,前者分别逐个求解单个λ,后者对每个λ矩阵中的一行也就是 λ i λ_i λi求解,数学上效果是一致的,可能在收敛性上存在差异。

而PGS比GS多一个限制λ范围大于等于0,也就是能够求解非等式约束罢了。

完毕!

参考目录

  1. Position Based Dynamics与二次规划
  2. 基于约束的物理
  3. PhysX原理与实现:一般约束
  4. 物理引擎之约束求解(一)——线性互补问题
  5. Video Game Physics Tutorial - Part III: Constrained Rigid Body Simulation
  6. Game Physics Series 周明倫
  7. Karush-Kuhn-Tucker (KKT)条件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

春招冲刺百题计划|堆

Java基础复习 Java数组的声明与初始化Java ArrayListJava HashMapJava String 类Java LinkedListJava Deque继承LinkedListJava SetJava 队列优先队列:第二题用到了 第一题&#xff1a;215. 数组中的第K个最大元素 可以直接使用Arrays.sort()快排&#xff0c;然后return nums…

修正版头像上传组件

修正版头像上传组件 文章说明核心源码展示运行效果展示源码下载 文章说明 在头像剪切上传一文中&#xff0c;我采用div做裁剪效果&#xff0c;感觉会有一些小问题&#xff0c;在昨天基于canvas绘制的功能中改进了一版&#xff0c;让代码变得更简洁&#xff0c;而且通用性相对高…

ChatGPT使用姿势

使用上的痛点 用的不好&#xff1a;你经常会感觉到 ChatGPT 回答的好空&#xff0c;没有太多参考价值无处去用&#xff1a;有了 GPT 之后&#xff0c;发现自己好像并没有什么好问的&#xff0c;不知道可以用 GPT 来干嘛。 如何使用AI 核心心法&#xff1a;GPT 生成的答案质量…

纯技术分享:淘宝商品详情原数据接口参数解析

item_get_app-获得淘宝app商品详情原数据 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_s…

【机器学习】使用决策树分类器预测汽车安全性的研究与分析

文章目录 一、决策树算法简介决策树的结构分类和回归树 (CART)决策树算法术语决策树算法直觉 二、属性选择度量信息增益熵 基尼指数计算分割基尼指数的步骤 三、决策树算法中的过度拟合避免过度拟合的方法 四、导入库和数据可视化探索性数据分析重命名列名查看数据集的总结信息…

WAF基础介绍

WAF 一、WAF是什么&#xff1f;WAF能够做什么 二 waf的部署三、WAF的工作原理 一、WAF是什么&#xff1f; WAF的全称是&#xff08;Web Application Firewall&#xff09;即Web应用防火墙&#xff0c;简称WAF。 国际上公认的一种说法是&#xff1a;Web应用防火墙是通过执行一…

小零食,大智慧!连锁零食店如何选择收银?收银系统源码

近几年专业的散装零食店非常的火热&#xff0c;像百草味、良品铺子、大嘴零食、来伊份等都大受欢迎。而传统超市的散装零食区则是日益冷落&#xff0c;小超市多数干脆放弃了散装。 休闲零食作为快消品的一类&#xff0c;是大家工作闲暇、生活休闲的必备食品。随着人们生活质量…

前端状态管理工具pinia:pinia是什么?相较于Vuex,pinia有什么优势,如何手动添加pinia到Vue3项目中

1.什么是pinia? Pinia是Vue的最新状态管理工具&#xff0c;是Vuex的替代品。 2.相较于Vuex,pinia有什么优势? 1.提供更加简单的API(去掉了mutation) 倘若你学习过vuex&#xff0c;你一定会发现很多很多不合理的地方,实现一个功能可能要在state定义数据&#xff0c;在muta…

【前端】零基础学会编写CSS

一、什么是CSS CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种是一种用来为结构化文档&#xff08;如 HTML 文档&#xff09;添加样式&#xff08;字体、间距和颜色等&#xff09;的计算机语言&#xff0c;能够对网页中元素位置的排版进行像素级别的精…

前端练习小项目——方向感应名片

前言&#xff1a;在学习完HTML和CSS之后&#xff0c;我们就可以开始做一些小项目了&#xff0c;本篇文章所讲的小项目为——方向感应名片 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习之前&#xff0c;先让我们看一…

卷积神经网络——LeNet——FashionMNIST

目录 一、文件结构二、model.py三、model_train.py四、model_test.py 一、文件结构 二、model.py import torch from torch import nn from torchsummary import summaryclass LeNet(nn.Module):def __init__(self):super(LeNet,self).__init__()self.c1 nn.Conv2d(in_channe…

基于SSM的校园一卡通管理系统的设计与实现

摘 要 本报告全方位、深层次地阐述了校园一卡通管理系统从构思到落地的整个设计与实现历程。此系统凭借前沿的 SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架精心打造而成&#xff0c;旨在为学校构建一个兼具高效性、便利性与智能化的一卡通管理服务平台。 该系…

liunx硬盘分区挂载笔记

NAME: 设备名称。 MAJ : 主设备号和次设备号。 RM: 只读标志&#xff08;0 表示可读写&#xff0c;1 表示只读&#xff09;。 SIZE: 设备的总大小。 RO: 只读状态&#xff08;0 表示可读写&#xff0c;1 表示只读&#xff09;。 TYPE: 设备类型&#xff08;disk 表示物理磁盘设…

C 语言结构体

由于近期项目需求,需使用到大量的指针与结构体&#xff0c;为更好的完成项目&#xff0c;故对结构体与指针的内容进行回顾&#xff0c;同时撰写本博客&#xff0c;方便后续查阅。 本博客涉及的结构体知识有&#xff1a; 1.0&#xff1a;结构体的创建和使用 2.0: typedef 关…

怎样在 C 语言中进行类型转换?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

记一次 .NET某上位视觉程序 离奇崩溃分析

一&#xff1a;背景 1. 讲故事 前段时间有位朋友找到我&#xff0c;说他们有一个崩溃的dump让我帮忙看下怎么回事&#xff0c;确实有太多的人在网上找各种故障分析最后联系到了我&#xff0c;还好我一直都是免费分析&#xff0c;不收取任何费用&#xff0c;造福社区。 话不多…

快速读出linux 内核中全局变量

查问题时发现全局变量能读出来会提高效率&#xff0c;于是考虑从怎么读出内核态的全局变量&#xff0c;脚本如下 f open("/proc/kcore", rb) f.seek(4) # skip magic assert f.read(1) b\x02 # 64 位def read_number(bytes):return int.from_bytes(bytes, little,…

每日一练:奇怪的TTL字段(python实现图片操作实战)

打开图片&#xff0c;只有四种数字&#xff1a;127&#xff0c;191&#xff0c;63&#xff0c;255 最大数字为255&#xff0c;想到进制转换 将其均转换为二进制&#xff1a; 发现只有前2位不一样 想着把每个数的前俩位提取出来&#xff0c;组成新的二进制&#xff0c;然后每…

c++ 多边形 xyz 数据 获取 中心点方法,线的中心点取中心值搞定 已解决

有需求需要对。多边形 获取中心点方法&#xff0c;绝大多数都是 puthon和java版本。立体几何学中的知识。 封装函数 point ##########::getCenterOfGravity(std::vector<point> polygon) {if (polygon.size() < 2)return point();auto Area [](point p0, point p1, p…

AI绘画Midijourney操作技巧及变现渠道喂饭式教程!

前言 盘点Midijourney&#xff08;AIGF&#xff09;热门赚米方法&#xff0c;总有一种适合你之AI绘画操作技巧及变现渠道剖析 【表情包制作】 首先我们对表情包制作进行详细的讲解&#xff1a; 当使用 Midjourney&#xff08;AIGF&#xff09; 绘画来制作表情包时&#xff…