SLAM    发布于 2018-02-02   242人围观   0条评论

参考资料

https://segmentfault.com/a/1190000000514987

http://blog.sina.com.cn/s/blog_7445c2940102whjq.html

http://blog.csdn.net/xiahouzuoxin/article/details/39582483

 

前言

 

下面按照如下顺序介绍卡尔曼滤波器:

1.问题的提出:介绍卡尔曼滤波提出的原因以及针对的问题。

2.核心思想:一句话表述卡尔曼滤波本质。

3.应用场景:卡尔曼滤波器应用方向、基础和前提。

4.实现方法:经典的五个公式。

5.定性分析:从单变量入手分析卡尔曼滤波器,定性的了解核心思想。


1.解决问题

       在对一个问题的线性估计(预测)中,估计(预测)出的结果会存在一定噪声(是个值得思考的问题),那么如何消除这个噪声呢?(可以看出,卡尔曼是为了消除噪声,这就是叫滤波器的原因吧。)那么很自然的我们可以想到用观测(直接测量估计量)来消除误差。但是,很不幸的是,观测的数据也会存在噪声(任何的测量都有误差)。下面问题归结表述为,已知估计值和测量值,以及估计和测量的误差,那么如何得到较为真实的数值?​借用xiahouzuoxin的图,可以更加直观的看到估计和测量噪声存在的原因。​

:线性估计,就是根据当前状态和已有知识,推算出未来状态。举个例来说,已知当前小车速度和加速度,求取下一时刻速度。

2.核心思想

       假设测量和估计的噪声都是符合高斯分布的白噪声。那么一个可行的办法是,将两个噪声的概率密度相乘,得到一个新的概率密度来近似表达真值。

:两个高斯分布概率密度相乘后还是高斯分布。

3.应用场景

3.1.观测系统以及估计系统均为线性离散系统

    观测系统以及估计系统均为线性离散系统,公式表述如下:

    (1)为估计方程,(2)为测量方程

:(1)式中x(n)为系统状态向量,u(n)是驱动输入向量,w(n)为估计噪声,A,B为常系数矩阵,其实就是状态空间中的状态方程。​(2)式中z(n)为观测(测量)结果,H(n)为观测矢量,v(n)为观测噪声。

 

3.2估计噪声和观测噪声均为符合高斯分布的白噪声

    所谓的白噪声就是时域上分布为钟形线,频域上分布为一条直线的噪声信号。

 

3.3两个符合高斯分布的概率密度相乘后可以融合为一个新的高斯分布

    这一点也就是卡尔曼滤

查看更多
发布于 2017-11-12   208人围观   0条评论

2016 年是虚拟现实(Virtual Reality)的元年。许多虚拟现实的消费产品将要诞生,众多的顶级软件企业同样争先恐后地支持虚拟现实设备。这项新的设备媒介同时驱动了浏览器开发商对Web进行虚拟现实的支持。WebVR的发展正集中于不可思议的视觉体验以及创建在线虚拟现实环境的工具 之上。

VR_images

Mozilla VR团队正致力于在浏览器中支持在线创作及显示VR内容,并于本周获得重大突破。通过与Google Chrome团队Brandon Jones的密切合作,Mozilla团队发布了WebVR API 1.0版本。

近期的VR技术发展以及来自社区的反馈,促使我们改进API以适应开发者的需求。

包括以下一些改进:

  • 对于特定VR设备的渲染与显示。
  • 在WebVR页面链接之间遍历的能力。

  • 一个可以枚举VR输入的输入处理设备,包括 六自由度动作控制器(6DoF)

  • 既适用于坐姿体验,也适用于站姿体验。

  • 适配桌面及移动应用。

我们很高兴能够分享对于API在以上一些方面的改进。值得注意的是,上面仅仅列举出了一小部分的改进。对于全部的改进详情,可参考API全稿或参考Brandon的博客

本文主要讨论的是本版本API的基本使用方式,这需要读者能够理解一些复杂的概念,例如数学中的矩阵。此外,您也可以通过阅读A-Frame或者WebVR boilerplate*以快速入门WebVR。

在我们着手WebVR之前,我们应该特别鸣谢* Chris Van Wiemeersch (Mozilla), Kearwood “Kip” Gilbert (Mozilla), Brandon Jones (Google), 以及 Justin Rogers (Microsoft) *等人对此作出的突出贡献。

如何开始实施WebVR

我们计划在上半年于* Firefox Nightly上做基于1.0 APIs的稳定版实现。您可以通过Bugzilla查看全部详情,或者通过iswebvrready.org*查询更新状态。

想要从现在开始吗?目前,开发者可以通过使用Brandon Jone的实验版Chromium来做一些验证性的实验。

* three.js

查看更多
我的翻译    发布于 2017-11-12   197人围观   0条评论

关于译文,本文英文题目为Microservices - Please Don't,在此我联想到多年前的一本书叫做《千万别学英语》,其本意是千万别这样学英语,本文的目的亦是如此,因而这里我将题目翻译为千万别用微服务,实则是想建议读者,千万别这样使用微服务。在此声明,避免误解~。

本文改编自2015年12月份我在波士顿Golang大会上的一个简短演讲。

一时间,仿佛全世界都在痴迷于讨论微服务(microservice)。无数的新闻扑面而来,都在吹捧着诉说微服务模式如何拯救了他们的工程架构。你甚至可能曾在这样的公司工作过,他们大肆宣传这种轻量神奇的微小服务,并极力宣传他们是如何使用微服务解决旧系统的冗余,难以维护等诟病的。

当然,就理想目标而言,没有什么比现在的技术更先进,更靠谱的了。理想的美便在于这几个月以来,我们始终在为接近完美而不断地努力着。

我将阐述一些关于微服务的主要误区和坑点,并借助于一些像上述那样,将庞大的遗留系统按照微服务的理念进行拆分的企业作为我的论据。当然,我并不是想用此文来说明微服务是不好的,而是想通过我的叙述,能够让大家在决定使用这种模式之前提出一些问题,多一些思考,再决定是否向这种模式迁移,是否能够真正的适合你们自己的项目。

到底什么是“微服务”?

目前真的没有对于微服务到底由什么组成或者不包含什么的一个完美的定义,但是已经有少数微服务的支持者,编撰处理一套比较合理的说明。

再强调一下,微服务不是一个复杂的整体。在实践过程中,微服务真正被赋予的意义在于,其仅仅能够处理尽可能有限的域空间,以便其能够尽可能做最少的事情,在整个应用栈中达到预期的服务目标。举一个具体的例子,如果你有一个需要“登录服务”的银行,在这里不想要做的是"获得用户的交易记录"这项需求。你需要将这一需求移交给“交易服务”一类的进行处理(记住,命名是一件值得商榷的事情,并不是轻而易举的)。

此外,当人们讨论微服务的时候总是在潜意识里认为服务之间是通过远程交互的。因为它们是独立的进程,而且经常运行在远离其他服务的地方,所以使用REST,或者RPC协议一类的远程协议进行通信变得十分自然。

一开始,这看起来着实很简单,我们好像只需要把像RES

查看更多
众成翻译 我的翻译    发布于 2017-11-12   202人围观   0条评论

关于译文,本译文的原文由于取材于网络,出现了代码缺失,及不正确文字的现象,导致翻译过程一度陷入困境。特在此更正原文地址,以便参考。查看原文


我们非常荣幸地宣布, 首款WebVR补丁 ,已经登陆到Servo引擎。

如果你已经迫不及待地想要开始尝试,你可以下载兼容HTC Vive试验版Servo binary 。打开你的VR设备,运行 servo.exe --resources-path resources webvr\room-scale.html

目前版本支持WebVR 1.2 规范,使得API可以像WebWorkers一样,不必运行在主线程,而是运行在一个上下文当中。

我们一直致力于优化VR的渲染方式,以获得更高的FPS以及少于20ms的延迟,以避免产生眩晕。如图所示是整体架构的介绍:WebVR Architecture in Servo


Rust-WebVR 库

Rust WebVR是一个弱耦合库,提供了WebVR标准实现,以及与供应商特定的SDK集成(OpenVR, Oculus …)。使其与自身组件解耦带来了以下好处:

  • 快速的开发-编译-测试周期。 在完整的浏览器中,编译时间快于开发及测试时间。

  • 贡献代码变得更加容易 。因为开发者无需纠结于复杂的浏览器代码。

  • 适用于各种第三方项目: 使用原生RustRoom scale demo

这套库的API既希望能够简单使用WebVR API,同时还要能够满足Rust的设计模式。VR服务特征提供了使用像OpenVR以及Oculus SDK等这样的原生SDK的方法。API提供了诸如初始化,关闭,事件轮询以及VR设备发现等操作:

  1. pub trait VRService: Send {
  2. fn initialize(&mut self) -> Result<(), String>;
  3. fn fetch_devices(&mut self) -> Result<Vec<VRDevicePtr>, String>;
  4. fn is_available(&self) -> bool;
  5. fn poll_events(&self) -> Vec<VRDisplayEvent>;
  6. }

VR设备特征提供

查看更多
专家系统 Hprose QT    发布于 2017-08-22   125人围观   0条评论



背景说明

        最近一些日子接到项目,需要做QT和CLIPS专家系统的整合,但是经过数日编译整合,发现CLIPS和QT中都有SLOTS这个关键字,导致不能完全编译,整合过程受阻。于是想借助于PyCLIPS来实现,前端继续采用QT,两部分使用Hprose来做中间件,拟测试该模式的性能,本文将随着项目进展持续更新。

环境说明

  • Python环境:Python 2.5.3 32位
  • QT5: MinGW编译器 (5.5.1)
  • 测试系统:win10 1703

 

Boost编译环境说明

         参考编译指令如下:

bjam stage --toolset=gcc --without-graph --without-graph_parallel --without-math --without-mpi --without-python --without-serialization --without-wave --stagedir="H:\boost" link=static runtime-link=shared runtime-link=static threading=multi debug release

 

     这里提供一套已经编译好的Boost库,以免去编译的劳苦

      下载地址   密码:nr7z

举例说明:

    使用F:/BUAA305/boost_1_56/bin/该路径存放编译出的include和lib文件,最后整体的.pro文件如下表所示

INCLUDEPATH += F:/BUAA305/boost_1_56/bin/include

LIBS += \
    F:/BUAA305/boost_1_56/bin/lib/libboost_atomic-mgw49-mt-1_56.a \
    F:/BUAA305/boost_1_56/bin/lib/libboost_chrono-mgw49-mt-1_56.a \
    F:/BUAA305/boost_1_56/bin/lib/libboost_container-mgw49-mt-1_56.a \
    F:/BUAA305/boost_1_56/bin/lib/libb
查看更多
Android    发布于 2017-05-24   165人围观   0条评论

现在Dagger2在项目里用的越来越多了,最近花了些时间学习了一下Dagger2,这篇文章主要帮助理解Dagger2的注入实现过程,如有错误,还请指正!

什么是Dagger2

Dagger2是Dagger的升级版,是一个依赖注入框架,现在由Google接手维护。 恩,这里有个关键字依赖注入,因此我们得先知道什么是依赖注入,才能更好的理解Dagger2。

依赖注入是面向对象编程的一种设

查看更多
scala    发布于 2017-05-24   122人围观   0条评论

概述


case类在模式匹配和actor中经常使用到,当一个类被定义成为case类后,Scala会自动帮你创建一个伴生对象并帮你实现了一系列方法且带来了不少好处,如下:

1.实现了apply方法,意味着你不需要使用new关键字就能创建该类对象

scala> case class People(name:String,age:Int)
defined class People

scala> val p = People("mobin",22) //省略了new关键字
p: People = People(mobin,22)

2.实现了unapply方法,可以通过模式匹配来获取类属性,是Scala中抽取器的实现和模式匹配的关键方法。

scala> p match { case People(x,y) => println(x,y) }
(mobin,22)

 

3.实现了类构造参数的getter方法(构造参数默认被声明为val),但是当你构造参数是声明为var类型的,它将帮你实现setter和getter方法(不建议将构造参数声明为var)

构造参数为val的情况(默认):

scala> p.name
res0: String = mobin

scala> p.name = "mobin1" //报错,因为构造参数被声明为val所以并没有帮你实现setter方法
<console>:10: error: reassignment to val
p.name = "mobin1"

构造参数为var的情况:

scala> case class People(var name:String) //参数被声明为var
defined class People

scala> val p = People("mobin")
p: People = People(mobin)

scala> p.name = "mobin2"
p.name: String = mobin2

scala> p.name
res1: String = mobin2 //修改成功,并没有报错

4.还默认帮你实现了toString,equals,copy和hashCode等方法

 

详述


我们再通过反编译来看看当你定义一个case类时编译器是怎么做的:
同样定义一个简单的case类:
Person.scala

case class Pe
查看更多
发布于 2017-04-14   201人围观   0条评论

一、为什么不用Linear Regression的Cost Function来衡量Logistic Regression的θ向量

       回顾一下,线性回归的Cost Function为
       我们使用Cost函数来简化上述公式:
    
       那么通过上一篇文章,我们知道,在Logistic Regression中,我们的假设函数是sigm
查看更多