飞控中的IIR二阶滤波器

2023-05-16

之前我们讲过一阶滤波器,思路就是把一个连续的滤波器形式,通过离散化的方式,转换成差分方程。

同事拿着我的文章,对照着代码里的二阶滤波,表示完全看不懂,我说不可能,二阶不过是一阶的升级版,思路应是一样的,他说不信你看。

我一看,WTF,这系数怎么来的?经验公式?

这迭代怎么这种形式?没见过呀!

行吧,说明之前咱理解的不到位,那就从头开始讲起吧。

从模拟滤波器开始

我们从书上,百度,查到的滤波器公式,通常是用传递函数表达的,这是s域下的表达形式,是连续的,这种我们称之为模拟滤波器。

以巴特沃斯低通滤波器为例:
H a n ( s ) = d 0 a 0 + a 1 s + a 2 s 2 + ⋯ + a N s N H_{a n}(s)=\frac{d_{0}}{a_{0}+a_{1} s+a_{2} s^{2}+\cdots+a_N s^N} Han(s)=a0+a1s+a2s2++aNsNd0
对应的归一化参数表如下(如果期望直流( Ω = 0 \Omega=0 Ω=0)增益为1,则d0=a0)

意思是如果你按照表格里的参数,带入滤波器公式中,就能得到对于阶数的归一化滤波器,即截止频率为1弧度( 1 / 2 π 1/2\pi 1/2πhz)的滤波器。

例如我想得到一个截止频率为 1 / 2 π 1/2\pi 1/2πhz的二阶巴特沃斯滤波器,就把n=2的系数带入方程,可得
H ( s ) = 1 s 2 + 1.414 s + 1 H(s) = \frac{1}{s^2+1.414s+1} H(s)=s2+1.414s+11
有了这个归一化滤波器,我们可以很容易的得到任意截止频率的滤波器,只需要另 s − > s w a s->\frac{s}{w_a} s>was就可以的带一个截止频率为wa弧度的滤波器。
1 s w a 2 + 1.414 s w a + 1 \frac{1}{\frac{s}{w_a}^2+1.414\frac{s}{w_a}+1} was2+1.414was+11

模拟与数字的关系

上面举例的模拟滤波器传递函数,目的是用来设计滤波电路,针对的是连续时间的模拟信号,组成元器件是电阻,电容,电感。

而数字滤波器实现方法是把滤波器所要完成的运算编成程序并让计算机执行,也就是采用在代码的形式。它面对的是离散时间的数字信号,是把输入序列通过一定的运算变换成输出序列。

有没有办法能把连续的模拟滤波器变成离散的数字滤波器?

显然是有的,而且有很多种,其中最常使用的一种叫做双线性变换
s = 2 T s 1 − z − 1 1 + z − 1 = 2 f s 1 − z − 1 1 + z − 1 s=\frac{2}{T_s}\frac{1-z^{-1}}{1+z^{-1}} =2f_s\frac{1-z^{-1}}{1+z^{-1}} s=Ts21+z11z1=2fs1+z11z1
把这个公式带入传递函数就可以得到一个z域的差分方程了。

但是如果我们直接使用双线性变换进行离散化之后,会发现转换前的模拟滤波器和转换后的数字滤波器的幅频响应曲线并不一样。

可以看到数字滤波器曲线DF,远比模拟滤波器AF衰减的要快,也就是说如果模拟截止频率是10hz,那数字滤波器衰减更快,截止频率可以只9hz。

这是为什么呢?这是因为双线性变换中,数字截止角频率 ω d \omega_d ωd 和模拟截止角频率 ω a \omega_a ωa 的关系是非线性的。

所以在变换的时候我们需要找到s域与z域变换时频率变化的对应关系。

对于s域来说,在模拟截止频率为 f a f_a fa 时有:
s = j w a = j ∗ 2 π ∗ f a s = jw_a = j*2\pi * f_a s=jwa=j2πfa
对于z域来说,在数字截止频率为fd的情况下, z = e s T z=e^{sT} z=esT 其中 s = j w d , w d = 2 π f d , T = 1 / f s s=jw_d,w_d=2\pi f_d,T=1/f_s s=jwd,wd=2πfd,T=1/fs,则有:
z = e s T = e j 2 π f d f s z = e^{sT} = e^{j 2 \pi \frac{f_{d}}{f_{s}}} z=esT=ej2πfsfd
把这个截止频率为 f d f_d fd 的带入双线性变换公式可以得到:
s = 2 f s 1 − z − 1 1 + z − 1 = 2 f s 1 − e − j 2 π f d f s 1 + e − j 2 π f d f s = 2 f s e j 2 π f d f s − 1 e j 2 π f d f s + 1 = j 2 f s tan ⁡ ( π f d f s ) s=2f_s\frac{1-z^{-1}}{1+z^{-1}}=2 f_{s} \frac{1-e^{-j 2 \pi \frac{f_{d}}{f_{s}}}}{1+e^{-j 2 \pi \frac{f_{d}}{f_{s}}}}=2 f_{s} \frac{e^{j 2 \pi \frac{f_{d}}{f_{s}}}-1}{e^{j 2 \pi \frac{f_{d}}{f_{s}}}+1}=j 2 f_{s} \tan \left(\frac{\pi f_{d}}{f_{s}}\right) s=2fs1+z11z1=2fs1+ej2πfsfd1ej2πfsfd=2fsej2πfsfd+1ej2πfsfd1=j2fstan(fsπfd)

所以
j 2 π f a = j 2 f s tan ⁡ ( π f d f s ) j 2 \pi f_{a}=j 2 f_{s} \tan \left(\frac{\pi f_{d}}{f_{s}}\right) j2πfa=j2fstan(fsπfd)
可以得到模拟截止频率与数字截止频率的关系
f a = f s π tan ⁡ ( π f d f s ) f_a = \frac{f_s}{\pi}\tan(\frac{\pi f_d}{f_s}) fa=πfstan(fsπfd)

(补充证明过程根据欧拉公式)
e i x = cos ⁡ x + i sin ⁡ x e^{i x}=\cos x+i \sin x eix=cosx+isinx

e j A − e − j A e j A + e − j A = cos ⁡ ( A ) + j sin ⁡ ( A ) − ( cos ⁡ ( − A ) + j sin ⁡ ( − A ) ) cos ⁡ ( A ) + j sin ⁡ ( A ) + ( cos ⁡ ( − A ) + j sin ⁡ ( − A ) ) = j tan ⁡ ( A ) \frac{\mathrm{e}^{jA}-\mathrm{e}^{-jA}}{\mathrm{e}^{jA}+\mathrm{e}^{-jA}} = \frac{\cos(A)+j\sin(A)-(\cos(-A)+j\sin(-A))}{\cos(A)+j\sin(A)+(\cos(-A)+j\sin(-A))} = j\tan(A) ejA+ejAejAejA=cos(A)+jsin(A)+(cos(A)+jsin(A))cos(A)+jsin(A)(cos(A)+jsin(A))=jtan(A)

e j w − 1 e j w + 1 = e j w / 2 e j ω / 2 ( e j ω / 2 − e − j ω / 2 ) ( e j ω / 2 + e − j ω / 2 ) = j tan ⁡ ( ω 2 ) \frac{e^{jw}-1}{e^{jw}+1} = \frac{\mathrm{e}^{jw / 2}}{\mathrm{e}^{\mathrm{j} \omega / 2}} \frac{\left(\mathrm{e}^{\mathrm{j} \omega / 2}-\mathrm{e}^{-\mathrm{j} \omega / 2}\right)}{\left(\mathrm{e}^{\mathrm{j}\omega / 2}+\mathrm{e}^{-\mathrm{j} \omega / 2}\right)}=j\tan(\frac{\omega}{2}) ejw+1ejw1=ejω/2ejw/2(ejω/2+ejω/2)(ejω/2ejω/2)=jtan(2ω)

设计数字滤波器

有了离散方式和频率对应关系,就可以来设计我们需要的数字滤波器了。

设计数字滤波器分几步?

  1. 根据我们想要的数字滤波频率得到我们想要的模拟滤波器频率

  2. 根据期望的模拟截止频率,将滤波器去归一化。

  3. 进行双线性变换

  4. 写成代码

如果我期望的数字滤波器截止频率为fd,对应的模拟滤波器截止角频率为:
w a = 2 π f a = 2 f s tan ⁡ ( π f d f s ) w_a = 2\pi f_a = 2f_s\tan(\frac{\pi f_d}{f_s}) wa=2πfa=2fstan(fsπfd)
去归一化只需要将模拟滤波器传递函数中的s进行如下替换即可
s − > s w a s->\frac{s}{w_a} s>was
最后使用双线性变换离散化,把公式带入
s = 2 f s 1 − z − 1 1 + z − 1 s=2f_s\frac{1-z^{-1}}{1+z^{-1}} s=2fs1+z11z1
所以最终的变换方式就是
s − > s w a = 2 f s 1 − z − 1 1 + z − 1 2 f s tan ⁡ ( π f d f s ) = 1 − z − 1 1 + z − 1 tan ⁡ ( π f d f s ) s->\frac{s}{w_a} = \frac{2f_s\frac{1-z^{-1}}{1+z^{-1}}}{2f_s\tan(\frac{\pi f_d}{f_s}) } = \frac{\frac{1-z^{-1}}{1+z^{-1}}}{\tan(\frac{\pi f_d}{f_s}) } s>was=2fstan(fsπfd)2fs1+z11z1=tan(fsπfd)1+z11z1

ok,看起来有一点点复杂,没关系,举个例子

还是以我们的归一化二阶巴特沃斯低通滤波器公式
H ( s ) = 1 s 2 + 1.414 s + 1 H(s) = \frac{1}{s^2+1.414s+1} H(s)=s2+1.414s+11
带入完整的变换可得
H ( z ) = 1 ( 1 − z − 1 1 + z − 1 tan ⁡ ( π f d f s ) ) 2 + 1.414 ( 1 − z − 1 1 + z − 1 tan ⁡ ( π f d f s ) ) ) + 1 = ( tan ⁡ ( π f d f s ) ) 2 ( 1 − z − 1 1 + z − 1 ) 2 + 1.414 ( 1 − z − 1 1 + z − 1 ) ∗ ( tan ⁡ ( π f d f s ) ) + ( tan ⁡ ( π f d f s ) ) 2 H(z) = \frac{1}{{(\frac{ \frac{1-z^{-1}}{1+z^{-1}} } {\tan(\frac{\pi f_d}{f_s}) })}^2+1.414(\frac{ \frac{1-z^{-1}}{1+z^{-1}} } {\tan(\frac{\pi f_d}{f_s}) }))+1} = \frac{ (\tan(\frac{\pi f_d}{f_s}))^2 } {(\frac{1-z^{-1}}{1+z^{-1}})^2 + 1.414(\frac{1-z^{-1}}{1+z^{-1}})*(\tan(\frac{\pi f_d}{f_s})) + (\tan(\frac{\pi f_d}{f_s}))^2} H(z)=(tan(fsπfd)1+z11z1)2+1.414(tan(fsπfd)1+z11z1))+11=(1+z11z1)2+1.414(1+z11z1)(tan(fsπfd))+(tan(fsπfd))2(tan(fsπfd))2
为了避免过于复杂我们把常数 tan ⁡ ( π f d f s ) \tan(\frac{\pi f_d}{f_s}) tan(fsπfd)重新命名为 Ω n e w \Omega_{new} Ωnew
H ( z ) = Y ( z ) X ( z ) = ( 1 + z − 1 ) 2 Ω n e w 2 ( 1 − z − 1 ) 2 + 1.414 Ω n e w ( 1 − z − 1 ) ( 1 + z − 1 ) + Ω n e w 2 ( 1 + z − 1 ) 2 H(z)=\frac{Y(z)}{X(z)}=\frac{\left(1+z^{-1}\right)^{2} \Omega_{new}^{2}}{\left(1-z^{-1}\right)^{2}+1.414 \Omega_{new}\left(1-z^{-1}\right)\left(1+z^{-1}\right)+\Omega_{new}^{2}\left(1+z^{-1}\right)^{2}} H(z)=X(z)Y(z)=(1z1)2+1.414Ωnew(1z1)(1+z1)+Ωnew2(1+z1)2(1+z1)2Ωnew2

H ( z ) = Y ( z ) X ( z ) = Ω n e w 2 + 2 Ω n e w 2 z − 1 + Ω n e w 2 z − 2 1 − 2 z − 1 + z − 2 + 1.414 Ω n e w − 1.414 Ω n e w z − 2 + Ω n e w 2 + 2 Ω n e w 2 z − 1 + Ω n e w 2 z − 2 H(z)=\frac{Y(z)}{X(z)}=\frac{\Omega_{new}^{2}+2 \Omega_{new}^{2} z^{-1}+\Omega_{new}^{2} z^{-2}}{1-2 z^{-1}+z^{-2}+1.414 \Omega_{new}-1.414 \Omega_{new} z^{-2}+\Omega_{new}^{2}+2 \Omega_{new}^{2} z^{-1}+\Omega_{new}^{2} z^{-2}} H(z)=X(z)Y(z)=12z1+z2+1.414Ωnew1.414Ωnewz2+Ωnew2+2Ωnew2z1+Ωnew2z2Ωnew2+2Ωnew2z1+Ωnew2z2

H ( z ) = Y ( z ) X ( z ) = Ω n e w 2 + 2 Ω n e w 2 z − 1 + Ω n e w 2 z − 2 ( 1 + 1.414 Ω n e w + Ω n e w 2 ) + ( 2 Ω n e w 2 − 2 ) z − 1 + ( 1 − 1.414 Ω n e w + Ω n e w 2 ) z − 2 H(z)=\frac{Y(z)}{X(z)}=\frac{\Omega_{new}^{2}+2 \Omega_{new}^{2} z^{-1}+\Omega_{new}^{2} z^{-2}}{\left(1+1.414 \Omega_{new}+\Omega_{new}^{2}\right)+\left(2 \Omega_{new}^{2}-2\right) z^{-1}+\left(1-1.414 \Omega_{new}+\Omega_{new}^{2}\right)z^{-2}} H(z)=X(z)Y(z)=(1+1.414Ωnew+Ωnew2)+(2Ωnew22)z1+(11.414Ωnew+Ωnew2)z2Ωnew2+2Ωnew2z1+Ωnew2z2

到这里我们的化简就全部结束了,什么还是好复杂?那我再重新给他们起个名字吧

B 0 = Ω n e w 2 B0=\Omega_{new}^{2} B0=Ωnew2, B 1 = 2 Ω n e w 2 B1=2\Omega_{new}^{2} B1=2Ωnew2, B 2 = Ω n e w 2 B2=\Omega_{new}^{2} B2=Ωnew2,

c = 1 + 1.414 Ω n e w + Ω n e w 2 c=1+1.414\Omega_{new}+\Omega_{new}^{2} c=1+1.414Ωnew+Ωnew2, A 1 = 2 Ω n e w 2 − 2 A1=2\Omega_{new}^{2}-2 A1=2Ωnew22, A 2 = 1 − 1.414 Ω n e w + Ω n e w 2 A2=1-1.414\Omega_{new}+\Omega_{new}^{2} A2=11.414Ωnew+Ωnew2
H ( z ) = Y ( z ) X ( z ) = B 0 + B 1 z − 1 + B 2 z − 2 c + A 1 z − 1 + A 2 z − 2 H(z)=\frac{Y(z)}{X(z)}=\frac{B_0+B_1 z^{-1}+B_2 z^{-2}}{ c+A_1 z^{-1}+A_2z^{-2}} H(z)=X(z)Y(z)=c+A1z1+A2z2B0+B1z1+B2z2

Y ( z ) ( c + A 1 z − 1 + A 2 z − 2 ) = X ( z ) ( B 0 + B 1 z − 1 + B 2 z − 2 ) Y(z)( c+A_1 z^{-1}+A_2z^{-2}) = X(z)(B_0+B_1 z^{-1}+B_2 z^{-2}) Y(z)(c+A1z1+A2z2)=X(z)(B0+B1z1+B2z2)

Y ( z ) = B 0 c X ( z ) + B 1 c X ( z ) z − 1 + B 2 c X ( z ) z − 2 − A 1 c Y ( z ) z − 1 − A 2 c Y ( z ) z − 2 Y(z) = \frac{B_0}{c}X(z)+\frac{B_1}{c} X(z)z^{-1}+\frac{B_2}{c} X(z)z^{-2} - \frac{A_1}{c} Y(z)z^{-1} - \frac{A_2}{c}Y(z)z^{-2} Y(z)=cB0X(z)+cB1X(z)z1+cB2X(z)z2cA1Y(z)z1cA2Y(z)z2

Y ( z ) = B 0 c X ( z ) + B 1 c X ( z − 1 ) + B 2 c X ( z − 2 ) − A 1 c Y ( z − 1 ) − A 2 c Y ( z − 2 ) Y(z) = \frac{B_0}{c}X(z)+\frac{B_1}{c} X(z-1)+\frac{B_2}{c} X(z-2)- \frac{A_1}{c} Y(z-1) - \frac{A_2}{c}Y(z-2) Y(z)=cB0X(z)+cB1X(z1)+cB2X(z2)cA1Y(z1)cA2Y(z2)

再改写一下
Y ( z ) = b 0 X ( z ) + b 1 X ( z − 1 ) + b 2 X ( z − 2 ) − a 1 Y ( z − 1 ) − a 2 Y ( z − 2 ) Y(z) = b0X(z)+b1 X(z-1)+b2 X(z-2)-a1Y(z-1)-a2Y(z-2) Y(z)=b0X(z)+b1X(z1)+b2X(z2)a1Y(z1)a2Y(z2)
有没稍微熟悉一点?这不就是书上的公式吗?

根据我们之前的推导,这个差分方程的系数只跟数字截止频率 f d f_d fd,和采样频率 f s f_s fs 有关。

Ω n e w = tan ⁡ ( π f d f s ) \Omega_{new}=\tan(\frac{\pi f_d}{f_s}) Ωnew=tan(fsπfd)

c = 1 + 1.414 Ω n e w + Ω n e w 2 c=1+1.414\Omega_{new}+\Omega_{new}^{2} c=1+1.414Ωnew+Ωnew2

b 0 = B 0 / c = Ω n e w 2 / c b0=B0/c=\Omega_{new}^{2}/c b0=B0/c=Ωnew2/c, b 1 = B 1 / c = 2 Ω n e w 2 / c b1=B1/c=2\Omega_{new}^{2}/c b1=B1/c=2Ωnew2/c, b 2 = B 2 / c = Ω n e w 2 / c b2=B2/c=\Omega_{new}^{2}/c b2=B2/c=Ωnew2/c,

a 1 = A 1 = ( 2 Ω n e w 2 − 2 ) / c a1=A1=(2\Omega_{new}^{2}-2)/c a1=A1=(2Ωnew22)/c, A 2 = ( 1 − 1.414 Ω n e w + Ω n e w 2 ) / c A2=(1-1.414\Omega_{new}+\Omega_{new}^{2})/c A2=(11.414Ωnew+Ωnew2)/c

看看APM和PX4怎么用程序怎么计算这些些系数呢?(跟我们的推导一模一样)

系数有了那这样的差分方程怎么写成代码呢?转换成差分方程后,下标n就代表当前值,下标n-1代表这个数是上个周期的值,n-2代表这个数延时了两周期。

所以方程写在代码里就是:

这种形式有个名称叫做直接I型,我们可以将它化成框图形式

从框图中可以直观的看见使用了4个z^-1(延时模块),从代码里也可以看见,我们需要保存4个过去的值(x(n-2),x(n-1),y(n-2),y(n-1)),

一个二阶滤波器需要4个延时模块我们能不能化简一下呢?

我们观察上图的直接I型滤波器,可以看成是两个较小系统串联而成的系统,那么,我们将其调整一下位置,得到就像下图一样的一个新的系统。

仔细观察其实我们可以共用延时模块

这样我们只需要使用两个延时模块就行,写成代码如下

这样我们在代码里只需要保存两个数据就行了,在看看源码,是不是一模一样?

到这里我们才算完成了一个滤波器设计,完整的称呼应该叫做 二阶巴特沃斯低通滤波器使用双线性变换法的IIR数字滤波器实现。

什么是IIR?什么是巴特沃斯?

IIR 是一种实现滤波器的方法,对数字滤波器,从实现方法上有IIR和FIR滤波器之分,他们分别对应的是不同的滤波器结构

IIR实现的最终效果就是我们刚才设计的过程对应的通用转移函数结构如下
H ( z ) = ∑ r = 0 M b r z r 1 + ∑ k = 1 N a k z − k H(z)=\frac{\sum_{r=0}^{M} b_{r} z^{r}}{1+\sum_{k=1}^{N} a_{k} z^{-k}} H(z)=1+k=1Nakzkr=0Mbrzr
如果使用FIR的方式实现,对应的转移函数形式如下
H ( z ) = ∑ n = 0 N − 1 h ( n ) z − n H(z)=\sum_{n=0}^{N-1} h(n) z^{-n} H(z)=n=0N1h(n)zn

FIR滤波器可以对给定的率特性直接进行设计,而IIR滤波器目前最通用的方法是利用已经很成熟的模拟滤波器的设计方法来进行设计。

所以IIR可以利用不同的模拟滤波器来设计,

而模拟滤波器又有Butterworth滤波器、Chebyshev(I型、Il型)滤波器、椭圆滤波器等不同的设计方法,

对应不同的幅度平方函数,以巴特沃斯滤波器为例:


使用这种函数需要进行一些零极点配置,才能得到我们想要的传递函数,好在模拟滤波器设计非常成熟,有各种表格,我们查表就能直接得到对应的滤波器传递函数。

而双线性变换是离散化的一种方法,通过这种方式离散可以直接得到IIR的结构。

谁能想到一个二阶滤波器而已,不过十几行代码,里面有这么多数字信号处理的知识呢?OK,今天就讲这么多,我是zing,我们下期再见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

飞控中的IIR二阶滤波器 的相关文章

  • 找文心一言问了几个嵌入式软件开发的问题

    百度终于通知我可以试用文心一言了 xff0c 试验了一番 xff0c 总体满意 xff0c 记录几个文心一言回答的问题 我是一个嵌入式软件开发者 xff0c 你能帮我做什么工作以提高我的开发效率 作为一个嵌入式软件开发者 xff0c 以下是
  • JavaScript常用数组属性和方法

    本文给出了js xff08 JavaScript xff09 数组 xff08 Array xff09 操作所涉及到的所有常用内置函数说明及用法 xff0c 希望对大家有所帮助 数组的属性和方法 属性length属性 xff1a 方法1 把
  • FreeRTOS三种数据结构区别(StreamBuffer,MessageBuffer,Queue)

    转载自博客 xff1a https blog zh123 top p 61 308 Queue队列是最基本的数据结构 xff0c 在FreeRTOS v10 0后提供了另外两种高级数据结构为Streambuffer和MessageBuffe
  • MySQL知识点(详细)

    结构化查询语言SQL 结构化查询语言SQL xff08 Structured Query Language xff09 xff1a 是在关系数据库上执行数据操作 xff0c 检索及维护所使用的标准语言 xff0c 可以用来查询数据 定义数据
  • linux驱动系列学习之Framebuffer子系统(三)

    一 Framebuffer子系统简介 Framebuffer xff08 帧缓冲 xff09 时Linux系统位显示设备提供的一个接口 属于偏底层的显示接口 它将显示缓冲区抽象 xff0c 屏蔽图像硬件的底层差异 xff0c 允许上层应用程
  • Linux系统通过远程终端修改分辨率

    最近的工作是测试服务器的板载GPU xff0c 由于一切处于开发阶段 xff08 没有USB驱动 xff0c 无法通过键鼠操作 xff09 xff0c 切换桌面分辨率成了一项难题 用谷歌 用百度 xff0c 总算找到了一个在远程终端修改分辨
  • ubuntu安装WPS字体缺失的解决办法

    作者最近新安装的ubuntu系统 xff0c 所以缺少了很多的办公软件 xff0c 之前安装了WPS xff0c 但是Linux系统的wps缺少了windows的字库 xff0c 因此使用起来不太方便 xff0c 所以作者就整理了这样的一份
  • Qt实现串口通信(C++实现串口通信小助手)---串口收发及串口数据解码、串口通信模拟器。

    Qt实现串口通信示例 前言 xff1a 以下串口通信示例 xff0c 参考了现有网上前辈们的资源 xff0c 最后结合部分个人的思想 xff0c 所以下述博客会将实现的原理及代码的案例进行公开 这里我们先上效果图 xff1a 一 串口通信简
  • vins-mobile代码解析3:drawAR

    AR功能主要流程是 xff1a 先检测平面 xff0c 然后计算AR物体 xff08 box xff09 的各个顶点3d位置 xff0c 然后写程序把每个顶点投影到相平面 xff0c 用cv的多边形填充功能来绘制到照片上面 先求一个相机朝向
  • Error:ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol

    MySQL 8 0 33 安装完成 xff0c 使用时候报错 xff1a Error xff1a ER NOT SUPPORTED AUTH MODE Client does not support authentication proto
  • 卡尔曼滤波器和优化的本质理解

    非线性最小二乘优化中 xff0c 最重要的是那个雅克比矩阵 每一行对应一个观察两 xff0c 里面的值代表要减少这个观察量的误差 xff0c 其他被优化的量需要做的改变 而每一列就是这个观察量需要怎么变才能减少不同的观察量 对于一个优化量
  • G2o,GTSAM,Ceres,Tensorflow优化器的方法比较

    首先是一些背景知识 xff1a 最速梯度下降法 xff08 GD xff09 和牛顿法可以用来优化所有种类的函数 牛顿高斯和基于牛顿高斯的LM法只能用来优化非线性最小二乘 SGD是最速梯度下降法的改进 xff0c 也就是每次迭代随即选取一些
  • MSCKF算法研究

    目的 xff1a 找一个能把imu和视觉融合起来的算法 细节 xff1a 网上搜索了下 xff0c 17年初的时候基本VIO算法就是MSCKF最完备 github上面有一个非官方的实现 xff0c 就下下来研究 但是跑kitti的数据都效果
  • SLAM中全局优化初值设置的经验谈

    情况分析 xff1a 有两段轨迹 xff0c 段内的重投影误差很小 xff0c 但是两段轨迹的相对位置有点错位 我们找到了这两段轨迹overlap的一些共视关系 这个时候如果我们直接把两段轨迹放一起做BA xff0c 其实是不能减少这两段轨
  • 视觉建图融合gps的合并工具测试

    描述 xff1a 把两个bag的数据分别计算自己的轨迹后 xff0c 和gps做刚体对齐找两个轨迹的共視关系通过两个轨迹的点云匹配后得到两个轨迹的相似变换 xff0c 把第二个轨迹变换到第一个轨迹的坐标系下加入gps边的pose graph
  • Android.mk for your own module

    这里我们向Android中添加自己的模块 xff0c 只涉及到 so a elf source的编译 xff0c 以及如何将prebuilt file添加进工程 对于APK以及jar的source暂时没有仔细研究 xff0c 要添加进去的话
  • 基于 Distcc 的android分布式编译环境的搭建

    关于Ditscc分布式编译环境的搭建 xff0c 网上也有不少文章 xff0c 但是基本上都过时了 所以看了很多文章 xff0c 走了不少弯路 xff0c 最后总算梳理清楚了一条正确的环境搭建的步骤 xff0c 而且可以实现zeroconf
  • opencv 删除二值化图像中面积较小的连通域

    对于上图的二值化图像 xff0c 要去除左下角和右上角的噪点 xff0c 方法 xff1a 使用opencv去掉黑色面积较小的连通域 代码 CvSeq contour 61 NULL double minarea 61 100 0 doub
  • c++中冒号(:)和双冒号(::)的用法

    转载于 xff1a http fengqing888 blog 163 com blog static 3301141620100623933512 1 冒号 xff08 xff09 用法 xff08 1 xff09 表示机构内位域的定义

随机推荐

  • linux下c语言写的简单的贪吃蛇

    基本算是第一次在linux下写程序 xff0c 果然各种不习惯 用的是emacs xff0c 都说是IDE中的神器 xff0c 但是我还没用习惯 xff0c gdb调试也不怎么熟悉 xff0c linux下的c程序设计也只是看了个皮毛 xf
  • 树莓派无需显示屏的VNC Viewer方式的远程连接

    一 配置wifi连接 方法非常简单 xff0c 首先在SD卡的根目录下添加一个名为 wpa supplicant conf的文件 xff0c 然后在该文件内添加以下的内容 xff1a ctrl interface 61 DIR 61 var
  • 由三点确定一个圆(圆心,半径)

    参考论文 一种改进的随机圆检测算法 光电工程 数据结构 圆信息 struct CircleInfo CvPoint circlecentre 圆心 double raduis 半径 点信息 struct CvPoint int x int
  • Qt Creator+MinGW+OpenCV2.3.1 开发环境搭建(windows 7 系统)

    折腾了一个下午 43 晚上 xff0c 总算弄好了 xff0c 下面说下步骤 1 必备软件 xff1a Qt SDK for Open Source C 43 43 development on Windows xff1a http qt
  • void fun() const{}; const void fun(){}; 和void const fun(){}; 的区别?

    const void fun 和void const fun 两个相同 如果采用 34 按址传递方式 34 的函数返回值加const 修饰 xff0c 那么函数返回值 xff08 即地址 xff09 的内容不能被修改 xff0c 该返回值只
  • strcpy()、memcpy()、memmove()、memset()的实现

    strcpy memcpy memmove memset 的实现 strcpy 字符串拷贝 char strcpy char strDest const char strSrc assert strDest 61 NULL amp amp
  • 多重继承的构造函数和析构函数的执行顺序(包含虚基类)

    下面示例就是说明多重继承析构函数和构造函数的执行顺序 xff1a span class token macro property span class token directive hash span span class token d
  • 阿里云服务器 配置frp实现Ubuntu台式机电脑内网穿透

    起因 实验室一台Ubuntu20 04的台式机电脑 xff0c 我想用我的Win10笔记本远程连接它 xff0c 用它的高性能 xff0c 在Ubuntu的环境下来跑代码 xff0c 这样比较方便 编程环境即可具有便携 性能 两者兼得 xf
  • 【论文阅读笔记】GAN Memory with No Forgetting

    Hello大家好 xff0c 今天带大家来看Nips2020的最新文章 GAN Memory with No Forgetting 关于Nips2020所有关于终生学习的文章可见传送门 总览 本文是杜克大学 xff08 Duke Unive
  • 【论文阅读笔记】NeurIPS2020文章列表Part2

    Online Multitask Learning with Long Term MemoryFewer is More A Deep Graph Metric Learning Perspective Using Fewer Proxie
  • Macbook用Terminal启动Matlab

    最近更新到了Mac OS Big Sur xff0c 发现Matlab开启后直接无响应 xff0c 因此只能通过Terminal打开 xff0c 打开方式是在Terminal中输入如下代码直接敲回车就行啦 xff08 其中Matlab版本要
  • 对比学习学习笔记

    对比学习学习笔记 A Simple Framework for Contrastive Learning of Visual Representations Ting Chen Simon Kornblith Mohammad Norouz
  • Ubuntu18版本安装ROS

    最近不小心把虚拟机里的ROS弄坏了 xff0c 导致Linux都无法使用 也忘了快照导致所以软件重新安装 xff0c 在这里给大家分享一下ubuntu18版本如何安装ros以及我安装中出现的问题如何进行解决 注 xff1a 不同的ubunt
  • ER图

    1 某商业集团的销售管理系统 数据库中有三个实体集 xff0c 一是 商店 实体集 xff0c 属性有商店编号 商店名 地址等 xff1b 二是 商品 实体集 xff0c 属性有商品号 商品名 规格 单价等 xff1b 三是 职工 实体集
  • Tensorflow:EEG上CNN的一次实验

    一次失败的CNN实现 前言简介数据CNN网络 模型调整减少过拟合的尝试与全连接网络比较与SVM网络比较模型运用到其他分类标准结果分析代码CNN网络代码交叉验证代码FC网络代码SVM网络代码 前言 这是一次较为 失败 的分类器尝试 xff0c
  • MySql Error Code: 1046. No database selected Select

    初学者在建立表时容易遇到这样的报错 xff1a Error Code 1046 No database selected Select the default DB to be used by double clicking its nam
  • R语言自用笔记:复数

    复数在R语言中标示为z 61 x 43 iy 在R中虚数单位为i xff0c 如果是定值可以直接赋值 z1 61 1i print z1 1 0 43 1i z2 61 2 5i print z2 1 0 43 2 5i z3 61 1 4
  • [飞控]如何学习无人机-入门篇

    学什么 我把无人机分成3个大模块 操作 目的 xff1a 组装无人机 xff0c 享受驾驶无人机的乐趣 抱歉我给不了太多建议 xff0c 因为我从没有以此为目进行过学习 xff0c 但是我知道这一部分的知识关键词是 航模 xff0c 有非常
  • 说透互补滤波(1) - 线性互补滤波器从原理到实现

    为什么开源代码看不懂 xff1f 说起互补滤波 xff0c 之前非常的流行 xff0c 在那个算力不够的年代 xff0c 这种短小精干的融合算法 xff0c 风靡一时 原理也非常简单 xff1a 我有两路信号 xff0c 一个带有高频噪声
  • 飞控中的IIR二阶滤波器

    之前我们讲过一阶滤波器 xff0c 思路就是把一个连续的滤波器形式 xff0c 通过离散化的方式 xff0c 转换成差分方程 同事拿着我的文章 xff0c 对照着代码里的二阶滤波 xff0c 表示完全看不懂 xff0c 我说不可能 xff0