1.Q、P、R关系
P的迭代为P=QTPQ;R为观测的协方差;
状态延时高,说明收敛速度慢。
估计参数P越大,收敛的越快。
测量误差R越小,收敛的越快。
调整这两个参数即可,从状态更新上说,测量误差越小,估计参数误差越大,说明我们越相信测量值,自然收敛的快。缺点就是会让系统变化过快,如果测量值更加不准,则精度会下降,系统不够稳定。
2.K与Q、R关系
k~Q/(R+Q)
P0/(Q+R),收敛的快慢程度。
总结下自己之前整理过的关于卡拉曼滤波器的相关资料
主要包括滤波器的发散问题、Kalman1D滤波器...
滤波的发散问题
定义:当滤波的实际误差远远超过滤波误差的允许范围,甚至于趋向无穷大,使得滤波器推动作用,这种现象叫做滤波的发散。
产生发散现象主要有以下两个原因:
解决方法:克服由于模型不准确或模型变化所引起的滤波发散问题,可用衰减记忆滤波和限定记忆滤波等方法。当滤波模型不准确时,滤波值中的旧数据比重太大,新数据的比重太小,这是引起发散的重要原因。因此逐渐减小旧数据的权,相对地增加新数据的权,或者截去旧数据,只保留在观测时刻以前的有限个较新的数据,这是克服滤波发散的一个有效方法,根据前一观点设计的滤波器这是克服滤波发散的一个有效方法,根据前一观点设计的滤波器叫做衰减记忆滤波器,根据后一观点设计的滤波器叫做限定记忆滤波器。这两种滤波器都是次最优滤波器。
举例:在许多实际问题中,系统噪声方差阵和测量噪声方差阵事先都是不知道的。有时,状态转移矩阵或测量矩阵也不能确切知道。在系统运行过程中,模型还可能不断变化,具体地说,Q,R,A,H不断变化。这些都会引起滤波发散。自适应滤波是在利用测量数据进行滤波的同时,不断地对未知的或不确切知道的系统模型参数和噪声统计特性进行估计或修正,以便改进滤波。因此自适应滤波也是克服滤波发散的重要方法。
由于计算机的舍入误差,使得估计误差协方差P的计算值失去非负定性,甚至失去对称性,因而导致K的计算失真,造成滤波发散现象。平方根滤波方法可用来克服由于计算机舍入误差所引起的滤波发散。
利用Kalman1D 处理信号数据总结
其中可调参数有:P(0)协方差矩阵的初始值;
R 测量噪声
Q 过程噪声
此外需要给出一个估计值的初始值.
在卡尔曼滤波器实际实现时,测量噪声R一般可以观测得到,是滤波器的已知条件。观测测量噪声协方差R可以通过离线试验获取。
而过程激励噪声协方差Q值比较难以确定,因为我们无法直接观测到过程状态。有时候可以通过Q的手动选择,人为的为过程“注入”一个足够的不确定因素,来产生一个可以接受的结果。
整个滤波公式中:
P(0)是需要确定的初始值;X(i)是系统需要处理的数据;x是kalman滤波处理的数据;Y是系统预测值;
P(k+1)=A*P(K)*A’+Q;
K=P(k+1)./(P(k+1)+R);
测量更新:
Y=x+K(X(i)-x);
P=(1-K)*P(k+1);
过程噪声Q对于滤波效果的影响:
Q为对模型的信任度,Q越大,滤波后的曲线跟测量曲线跟的越紧密,滤波后噪声越大;
Q>1 时,滤波效果差;值越大,效果越差;
Q值越小,滤波效果越明显,太小滤波后效果趋于一条直线;
选取Q=0.0001;
P(0)协方差矩阵对于滤波效果的影响
P(0)决定初始增益的大小,影响初始时刻的收敛效果;在整体参数选取合适的时候,初始时刻滤波收敛效果影响不明显。
测量噪声R对滤波效果的影响
R>0:决定稳态噪声,小了初始增益大,但是稳态容易引入噪声;R越大对噪声越不敏感,即滤波后的数据跳动越小,但R越大, kalman滤波输出收敛的越慢。
随着R值越大,R=50时,滤波收敛效果越明显;R=100;收敛效果特别快;并且滤波效果也趋于一条直线;
整个滤波过程都有延迟,具体影响看不出;需要分析;
Kalman调试本质上是追求系统的收敛和卡尔曼滤波本身收敛过程的平衡点。数学上很难从理论上追求最优解;
Q表示对模型的信任程度,R表示对量测的信任程度,卡尔曼滤波是在模型和量测之间进行均衡。
Kalman1D与低通滤波器比较
Q值不能过小,否则跟踪收敛效果不好;在Q=0.0001时,发生改变是,收敛效果差;Q=0.001,稍微得到改善(图参考另篇文章);
dt采样时间对滤波器效果的影响比较明显,即传感器连续两次采样的时间间隔,这个Dt(积分时间)必须要非常精确,如Dt=2ms 5ms 10ms等,此处没有用到,无法观察;
P0是初始化最优角度估计的协方差(初始化最优角度估计可设为零),它是一个初值。
Q是预测值的协方差,
R是测量值的协方差。对Q和R的设定只需记住,Q/(Q+R)的值就是卡尔曼增益的收敛值,比如其值为0.2,那么卡尔曼增益会向0.2收敛(对于0.2的含义解释一下,比如预测角度值是5度,角度测量值是10度,那么最优化角度为:5+0.2*(10-5)=6。从这里可以看出,卡尔曼增益越大,说明测量值越可靠。
最优化角度越接近测量值;卡尔曼增益越小,说明预测值越可靠,最优化角度越接近预测值)。
P0/(Q+R)反映收敛的快慢程度,该值设定越小,收敛越快,该值越大,收敛越慢。因为卡尔曼增益收敛总的来说是很快的,所以该值设定大一点或小一点都没什么关系。
理论上卡尔曼滤波对状态的估计是这样一个过程。
卡尔曼滤波估计的状态减去状态真实值是一个误差状态。
滤波器增益是对这个误差状态的系统方程进行配根,目标是使得根位于虚轴的左半部分,这样系统就是稳定收敛且趋于零的。
但是,系统收敛只是最低要求,我们同时要求系统的收敛速度。卡尔曼滤波增益的收敛过程就是黎卡提方程动态收敛的过程。黎卡提方程只要系统可观则动态收敛,且方差正定。
滤波器稳态后,滤波增益稳定,这时收敛的也慢了。
一开始,方差设置大了,滤波器处于动态变化状态,系统配根大,因此收敛快。
对于动态响应要求高的系统,不能使用稳态增益。
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称