贝耶斯++
开源贝叶斯过滤类
迈克尔·史蒂文斯
贝叶斯滤波是一种概率数据融合技术。这种技术将一个系统的简明数学公式与对该系统的观察相结合。概率用来表示系统的状态,似然函数用来表示它们之间的关系。在这种形式下,可以应用贝叶斯推理,并进一步推导相关概率。看到了吗维基百科关于概率论,贝叶斯定理,贝叶斯推理.
为离散的系统贝叶斯公式的结果是自然迭代的数据融合解决方案。为动态系统有一类解,离散的过滤器,将系统的观测输出与系统的动态模型相结合。安估计员用系统的每次观测值计算系统状态的估计值。线性估计器如卡尔曼滤波器是常用的。
Bayes++是一个C++类的开源库。这些类代表并实现了离散系统贝叶斯滤波的各种数值算法。类提供经过测试和一致的数值方法,类层次结构明确表示各种过滤算法和系统模型类型。
简单的例子
这是一个非常简单的例子;对于那些以前从未使用过
贝叶斯过滤类的人来说。如果你想知道使用Bayes++有多简单,那么查看
来源.
这个例子展示了如何创建两个类。第一种是预测模型,第二种是观测模型。在这个例子中,它们代表一个只有一个状态变量和恒定模型噪声的简单线性问题。滤波器将预测和观察的结果融合在一起。
见贝叶斯过滤类对于使用的类的描述以及Bayes++提供的所有三个示例。
编写示例
弗斯特下载提取贝耶斯++以及促进图书馆。促进用于提供
编译器独立性,以及一个通用的生成系统。使用两个Boost header
库:乌布拉斯对于线性代数,以及随机对于PV和QuadCalib示例。Boost头文件可以放置在Bayes++的任何位置,但是如果遵循以下结构,则很容易实现:
- …源目录
- 贝耶斯++
- 贝叶斯滤波器
- 光伏
- 四校准
- 简单
- 试验
- 提升1?55?0
- 促进
- 等
使用Boost构建系统版本2是编译示例的最佳方法。使用b2(Boost-jam)一步就可以构建Bayes++的程序。下载的Boost副本中的文档说明了如何获取并安装最新版本的Boost构建系统。为了一切工作执行b2使用所需的工具集,以及安装Boost的位置。
要构建Bayes++和GCC示例,只需执行以下命令:(Bayes++应该是当前目录)
b2 toolset=gcc link=static cxflags=-Wno unused local typedefs-sBOOST_ROOT=“../boost_1_55_0”
对于Visual C++执行:
b2 toolset=msvc link=static-sBOOST_ROOT=“../boost_1_55_0”
通过创建一个build\u build.jam版归档源目录(或更高)或
通过将其设置为环境变量。
已编译示例和库的位置
这三个示例的可执行文件将放在名为目标. 的调试和发布版本的静态库贝叶斯滤波器库被放置在目标/BayesFilter. 这个目标目录及其子目录将自动创建。
Visual C++解决方案
对于visualc++2008等,也可以使用Bayes++.sln解决方案和活动配置uBLAS调试. 编译器选项
必须设置为促进可以找到include文件。也就是说包含路径必须包含Boost的基目录。在这种情况下,当地促进目录。在VC7.1中,您应该通过选择工具/选项/项目/VC++目录选项。
Visual C++7.0要求使用Boost版本1\u 32\u 0。Visual C++7.1(或更高版本)需要Boost版本1\u 33_0(或更高版本)。I
许可
所有的Bayes++源代码文件都有版权,许可条件如下。版权声明是麻省理工学院的许可证。这决不限制您希望使用我们的源代码进行的任何商业用途。只要您尊重版权和许可证条件,迈克尔·史蒂文斯和澳大利亚野战机器人中心很乐意让您以任何方式使用它。
Bayes++贝叶斯过滤库
版权所有(c)200320042052006201120122014迈克尔·史蒂文斯,版权所有(c)2002
迈克尔·史蒂文斯和澳大利亚野战机器人中心
特此免费授予任何人
获得本软件和相关文档文件
副本(“软件”)无限制地使用本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售
软件副本的权利,并允许向其提供软件的人员提供软件,但须符合以下条件:
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按“原样”提供,不作任何形式的明示或暗示担保,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权所有人均不对因本软件或本软件的使用或其他交易引起的、与之相关的任何索赔、损害赔偿或其他责任负责,无论是在合同诉讼、侵权诉讼或其他方面。
SLAM:同步定位和映射
SLAM是贝叶斯滤波中最有趣的问题之一。它的结构意味着如果不使用随机方法,就不能正确求解。这是因为映射状态依赖于其他映射状态和本地化状态。这种依赖性也使问题变得复杂,因此对于大量的状态,一种简单的方法(如表示所有的相关性)是不可行的。
Bayes++已经被用来实现各种简单的和更高级的SLAM解决方案。尤其是全面实施了
FastSLAM。这项技术在论文“FastSLAM:同步定位和映射问题的因子解决方案”中进行了描述,M.Montemerlo,S.Thrun S,D.Koller,B.Wegbreit,《2002年美国人工智能协会全国会议论文集》。
FastSLAM的Bayes++实现和一个非常简单的Kalman
(全相关)SLAM实现是最新的一个部分下载.
Scilab、Matlab、MuPAD
这些数学工具对于可视化过滤结果特别有用。然而,它们都相当慢,而且很容易用它们的编程语言生成实现非常差的过滤器。幸运的是,所有这些工具都提供了外部程序的扩展机制。示例接口代码在Bayes++GIT存储库中提供对于Matlab。
便携性
Bayes++只使用ISO标准的C++。源代码使用
适度高级的C++结构。它只限制直接使用C++模板系统。然而,使用的Boost库(尤其是uBLAS)广泛使用了模板技术。
Boost还包括许多解决编译器缺陷的方法。
因此Bayes++只需稍加修改就可以与Boost支持的任何现代C++编译器配合使用。
Bayes++测试使用:通用条款4.x,和VisualC++2008版
gcc3.x和gcc4.x的更高版本也应该轻松地运行Bayes++,但是gcc3.3.0与uBLAS不兼容,并且使用-O2优化生成错误的代码。
VisualC++7.1通常需要使用
/Zm选项,以便编译复杂的头文件。
放行标准
使用上面列出的编译器和Boost版本通过以下测试验证了这个版本。
构建系统:与Boost构建版本2兼容。
成功完成默认库和示例的构建。
成功完成
SLAM系统的构建。
测试示例:simpleExample、PV、QuadCalib
编译调试和发布版本(使用boostbuildversion2):—没有错误,也没有警告。
执行输出:-与预期的参考结果相同。
数值试验:rtheta-距离角观测器。
非线性距离角观测器测试。观察者在二维状态空间中运动。运动预测是用一个带有加性噪声的线性模型进行的。这两种状态在
模型和加性噪声中都是耦合的。观察固定目标的射程和角度。放置目标,以便观察到不连续的角度。
状态和观测都有附加的非观测(单数)状态。模型尺寸、耦合参数和
模型类型可因附加试验而变化。所有方案都在模型的5次迭代中进行了测试。用1000个样本对SIR方案进行了测试。
因为不同的数值实现结果在不同的方案之间并不相同。因此,测试要求:
回归测试:-从以前的版本中更改了任何方案的输出。
一致性测试:比较
方案对的输出结果,以产生数值上相似的结果。
SLAM测试:testFastSLAM
一致性测试:将FastSLAM结果与1000000个样本进行Kalman SLAM比较。状态和协方差的偏差预计约为千分之一。
常见问题解答
问题在Bayes++常见问题解答中回答
翻译
本文翻译成塞尔维亚-克罗地亚语乔瓦娜·米卢蒂诺维奇的语言极客教育.A罗马尼亚语翻译本页提供科学博客
Bayes++2017的新增功能3-1
用提升1.63.0和合同通用条款-5.4.
Boost'random'改变了'正态分布'的定义,改变了测试的随机输入。
“rtheta”示例需要带有gcc的quadmath库。
Bayes++2014.5-1的新增功能
用提升1.55.0和合同通用条款-4.8.
记录b2
要求链接=静态
编译示例时的选项。
建议使用cxflags=-Wno未使用的本地typedef
对于GCC工具集,为了避免gcc4.8中的大量警告文本。
Bayes++2012.5-1的新增功能
将以前命名为“addative”的所有类重命名为“additive”。
用提升1.49.0.
清除源中的注释。
Bayes++2010.8-1的新增功能
清理文档和生成文件,使构建更容易。
Bayes++2003.8-5的新增功能
支持和要求增强1_33_0.
编译器支持
Bayes++编译和测试的编译器列表已经更新。
Bayes++2003.8-4的新增功能
新的文档和支持增强1?2?0.
现在使用最大似然(有偏)估计的定义来计算样本协方差。这个估计值只需除以样本数的1/n,而不是1/(n-1)。看到了吗维基百科中的样本统计数据.
编译器支持
Bayes++编译和测试的编译器列表已经更新。
Bayes++2003.8-3
修正了Boost构建(版本1)的文档和支持。
SLAM已经从当前的开发版本进行了更新。
编译器支持
GCC 3.4要求类别名修复uBLAS(Boost_1_31_0或更早版本)。
2003年8月8日
全新助力支撑
Bayes++在这两种情况下都进行了测试升压-1.30.2和提升1?31?0.
Jens Mauer一直在努力增强::随机作为未来C++标准库的一部分被接受。为此,它的接口有了很大的变化。新的图书馆现在是Boost_1_31
0的一部分。Bayes++示例使用了
boost::random。所以事情顺利地迁移了,我添加了一个新的
“test/random.hpp”头,它隐藏了接口的更改。
非常优秀的Boost Build系统版本2最近进步很大。Bayes++是用标准的Boost
构建系统构建的。Bayes++拥有所有必要的“Jamfiles.v2”来构建Boost构建系统。
方案扩展
UD
u格式观测函数的数值能力得到了扩展。现在可以使用奇异(零方差)协方差矩阵。
Unscented_方案有额外的函数init_XX()和
update_XX(),以允许访问未标记的状态表示。
数值修正
错误先生的kalman_方案协方差计算已修复。这个错误也影响了快速加曼猛击实施。对于小尺寸,这个误差是显著的。
贝耶斯++2003-5
“noalias”作业
为了提高效率,避免创建临时矩阵和向量副本非常重要。除非另有说明,否则乌布拉斯确定是否在赋值操作的左右两边指定了相同的矩阵或向量变量。如果
这样的变量确实出现,则称为别名. 由于
赋值涉及多个元素,因此别名的存在要求赋值在修改
别名变量之前首先计算一个临时结果。
乌布拉斯的默认行为是创建这样一个临时的。如果
已知分配没有别名,则应避免这样做。
以前,这样的优化分配是用。分配()成员函数。为了提高代码的可读性,我添加了一个新的赋值语法。如果赋值右边的表达式中没有
变量赋值给(左值)的别名,则使用:
noalias(左值)=表达式;
这种新语法是实验性的,但可能是未来的一部分乌布拉斯释放。目前,该实现在支持的编译器上引入了一个较小的开销。这包括GCC 3.2。
贝耶斯++2003-3
过滤器已命名_过滤器,方案命名为_方案
抽象过滤器和数字方案以前都有以
结尾的名称_过滤器. 为了使事情更简单,我们对命名进行了更改,以明确区分两级层次结构。
过滤器位于层次结构的底部。方案总是从多个过滤器中的一个导出。过滤器表示抽象概念,如状态表示和模型接口的统计。Schemes是一个过滤器的具体实现,所有的数字细节和接口都已完成。
作为这一变化的一部分,国家代表性的统计数据已被统计虚拟基类. 此更改旨在
允许多个方案组合在一起(使用多重继承)
并共享它们的表示形式。如果您选择从scheme类派生,则更改会增加一些工作量。派生类的构造函数必须直接调用虚拟基类的构造函数。
增加协方差相交方案
最后CI该算法已在Bayes++中实现为一个方案。与传统的基于协方差的方法(如Kalman滤波器)相比,CI提供了一种较弱但更健壮的融合。它估计状态及其协方差的上限。
实际上只包括与CI
has相关的矩阵代数。CI
u filter scheme提供了一个虚拟函数,用户必须定义要使用的实际优化算法。
增加了重采样基础设施的重要性
的灵活性先生过滤器有了很大的改进。新班级重采样器已添加。
无论何时先生过滤器需要重新采样它所使用的和
Importance_重采样器参数。因此,通过改变这个参数,可以使用不同的再取样器。
提供两个实现。这个标准重采样器以及系统重采样器. 有关这些方法的进一步讨论,请参阅参考出版物。
盖比矩阵
矩阵界面得到了进一步的改进。这些改进需要boost_1_30
0的uBLAS。在这个版本中,对使用uBLAS有实验支持盖皮矩阵和
向量(稀疏、压缩、坐标)。
实验支持使所有Bayes++都使用选定的uBLAS存储类型。检查松柏水电站对于需要的宏
启用此功能。使用的算法是Bayes++正在升级到
在稀疏类型下性能更好。
不再支持mult_SPD产品。它们被替换为prod
SPD接口。
版权
版权所有(c)2003、2004、2005迈克尔·史蒂文斯。本文档是Bayes++库的一部分-请参阅“许可”部分以了解版权许可证的详细信息。