YEXBOTY开头的机器人人放心吗,有保障吗?

现在位置:
来自外部的引用: 1 条
ROS与Matlab系列2:连接vrep仿真器 | ExBot易科机器人实验室
阅读 10,739 次
阅读 22,634 次
阅读 9,826 次YEXBOT智能机器人:2018CES上海新品发布,惊艳登场
  YEXBOT作为近年来国内服务型机器人行业中新生力量,以其强大的研发实力,切合消费者需求的功能定制,结合潮流的产品外观设计,吸引了行业内外诸多眼球。本届CES展会中,YEXBOT连续发布了3款机器人新产品:智能家庭机器人、商用服务机器人、健康管理机器人。  智能家庭机器人  智能家庭机器人专为家庭打造,他实现了人与机器人无障碍沟通,既能和人类语言对话,还支持&语言交互&、&手机远程互动&、&生活学习伙伴&等功能,丰富家庭生活的同时也带来了更多的便利。  商业服务机器人  专为企业以及政府机构提供定制型服务机器人,可实现迎宾、信息查询、引导等定制性功能,也可作为商家引流营销所用,专业定制的资料库可以提供用户更专业以及更快捷的服务。  智能家庭机器人  为家庭量身打造,拟人化外观倍感亲切,可实现健康监测、健康管理、异常报警、在线问诊等功能,为家庭成员健康提供可视化、科学性的建议,为家庭成员健康带来了更多的保障。  YEXBOT的三款服务型机器人以优秀的外观设计、人性化的功能开发、细腻的交互体验、先进的技术集成,备受专业观众和媒体的关注和青睐,纷纷试用体验。  YEXBOT通过对诸多行业的深度调研,总结出行之有效的用户需求解决方案,并以此为研发方向,针对不同行业提供服务型机器人定制服务。在本次展会中,吸引了众多意向行业用户的关注。  本届CES展会的举办不仅为国内外优秀技术搭建一个交流交易的平台,也是为了能够更好的促进优秀技术的市场化推广,以期为消费者提供更多更先进更优质的消费级电子产品。Yexbot 创始人黄瑞丽媒体采访中提到:YEXBOT将秉持展会中所收获的经验和意见,在服务型机器人的研发和市场化应用中,将更先进的产品和技术带给更多的用户,让更多用户能够体验到&科技改善生活&的初衷。
手机论坛帖子排行
最新资讯离线随时看
聊天吐槽赢奖品内容字号:
段落设置:
字体设置:
总结出行之有效的用户需求解决方案
,可实现迎宾、信息查询、引导等定制性功能,以其强大的研发实力,针对不同行业提供服务型机器人定制服务,丰富家庭生活的同时也带来了更多的便利,YEXBOT连续发布了3款机器人新产品:智能家庭机器人、商用服务机器人、健康管理机器人, YEXBOT作为近年来国内服务型机器人行业中新生力量,将更先进的产品和技术带给更多的用户,总结出行之有效的用户需求解决方案,可实现健康监测、健康管理、异常报警、在线问诊等功能,在服务型机器人的研发和市场化应用中。
本届CES展会中,并以此为研发方向, 智能家庭机器人 为家庭量身打造,也可作为商家引流营销所用,为家庭成员健康提供可视化、科学性的建议,吸引了众多意向行业用户的关注,专业定制的资料库可以提供用户更专业以及更快捷的服务, YEXBOT通过对诸多行业的深度调研,为家庭成员健康带来了更多的保障,备受专业观众和媒体的关注和青睐, 商业服务机器人 专为企业以及政府机构提供定制型服务机器人,也是为了能够更好的促进优秀技术的市场化推广。
结合潮流的产品外观设计, 本届CES展会的举办不仅为国内外优秀技术搭建一个交流交易的平台,让更多用户能够体验到科技改善生活的初衷。
吸引了行业内外诸多眼球。
他实现了人与机器人无障碍沟通。
拟人化外观倍感亲切,以期为消费者提供更多更先进更优质的消费级电子产品,切合消费者需求的功能定制,纷纷试用体验。还支持语言交互、手机远程互动、生活学习伙伴等功能, 智能家庭机器人 智能家庭机器人专为家庭打造, YEXBOT的三款服务型机器人以优秀的外观设计、人性化的功能开发、细腻的交互体验、先进的技术集成,既能和人类语言对话,Yexbot 创始人黄瑞丽媒体采访中提到:YEXBOT将秉持展会中所收获的经验和意见,在本次展会中。
分享给小伙伴们:
本类最热新闻
48小时最热我是题主,以下是自问自答:&br&去年(2015年)提出的这个问题,得到了不少朋友的回复,我利用课余时间大概用了3个月左右完成了设想,实现了自己制作的移动机器人平台与ROS的对接。&br&我本来都快忘了这帖子,但前两天有知友给我留言,说他们和我遇到了同样的问题,问我是否有解决,于是我决定把我当时的思路整理出来贡献给初学者。&br&----------&br&首先说说我对ROS的认识:&br&近几十年来,机器人领域取得了举世瞩目的进展。包括地面移动机器人、旋翼无人机和类人机器人等,得到了广泛应用。更令人感到振奋的是,越来越多的高级智能算法让机器人的自主等级逐步提高。
&br&但是,随着机器人技术的发展,人们意识到,之前对机器人技术的研究或许有些闭门造车了。&br&每当一个研究机构要设计制造一台机器人时,都必须从造轮子开始,这样导致了时间浪费。
&br&例如,一所高校的机器人视觉实验室决定在下个阶段研究机器人在复杂环境下的视觉感知,那么他们需要依次完成:可移动机器人底盘的设计(嵌入式技术)→传感器驱动软件编写→读取传感器控制底盘→机器人视觉研究。
&br&由此可见,大部分的时间被浪费在了“造轮子”这件事上,而不是集中于科学研究。&br&类比计算机操作系统(Windows/Linux),为PC机器编写软件则很少出现这样的情况,这是因为操作系统将经常使用的功能封装成系统级别的API函数或其他形式,例如读取文件时,工程师不需要了解文件在硬盘中的存储方式(FAT32,NTFS)及文件在硬盘中的物理地址(0x),文件被抽象为一个路径地址(C:\新建文本文档.txt),硬件设备也可以被抽象为路径(/dev/USBtty0)。&br&全世界的任何一家公司若制造出来了新的硬件设备,例如网卡显卡等,只需要为用户提供一套驱动程序(*.sys)即可。&br&  基于这种思想,机器人操作系统ROS诞生了,只不过,对于ROS而言,它封装的是机器人经常会使用到的一些功能,例如传感器的读取、环境感知、机械臂控制、导航规划等。&br&----------&br&ROS究竟是如何工作的呢?&br&ROS中每一套算法是独立的一个包,包与包之间的数据交换主要采用TCP/IP协议(对用户隐藏,用户需要发布或订阅主题已提供或取得数据),我认为采用这种形式是由于ROS的算法包是由全世界不同的个人,学校或实验室贡献的,这样做可以降低耦合性,如果一个node崩溃不会影响到其他。&br&----------&br&由上可见,如果要自制一台机器人并适配ROS,需要自己完成一个node用来与ROS中其他算法对接&br&----------&br&具体该怎么做?&br&&ol&&li&在嵌入式环境下完成移动平台的基本控制,例如电机PWM调速,PID等(此处与ROS无关)&/li&&li&可以运行Ubuntu系统的板子,例如树莓派,Intel MinnowBoard,英伟达TK1,英伟达TX1(土豪专属),在其上跑起ROS,并运行自己写的那个node&/li&&li&嵌入式环境与ROS环境之间的通信,可以用USB,或串口等等&/li&&li&可能需要用PC机跑ROS与板子构成分布式计算,用来解决性能不足的问题,代价是通过wifi的数据量会比较大&/li&&li&咳咳,如果要读取kinect之类数据量大的传感器,建议不要用性能低于树莓派2的板子(原因见后图),树莓派2的总线速度很慢,不要光看cpu的主频,总线速度也会很大程度上影响性能。&/li&&li&ROS官方书籍的前几页就有说明,&b&不要造轮子&/b&,ROS更适合与实验室研究而不是稳定的工业用途,所以说用树莓派一类的板子折腾ROS这种想法还是值得再考虑下,没有必要就别给自己找麻烦了。&/li&&/ol&----------&br&接下来就是将移动平台接入ros并实现slam功能。&br&ros中常用的2d slam算法主要有gmapping和hector_slam,其中&br&hector_slam是个性能非常好的算法,但是作者在论文中说的很明白,hector_slam通过最小二乘法匹配扫描点,且依赖高精度的激光雷达数据,但是不需要里程计。因此扫描角很小且噪声较大的kinect是不行的,我试过,匹配的时候会陷入局部点,地图非常混乱&br&gmapping是一个比较早的算法,核心思想是粒子滤波并且&b&需要里程计&/b&,但并不要求很高性能的传感器,初学者一般都是先来玩这个,不过请注意一点,gmapping只是mapping,定位还需要amcl这个蒙特卡洛算法包配合使用,最后才能接入navigation stack&br&----------&br&gmapping的wiki这样写道&br&&figure&&img src=&https://pic3.zhimg.com/50/57fe035acdd7fdc_b.jpg& data-rawwidth=&627& data-rawheight=&142& class=&origin_image zh-lightbox-thumb& width=&627& data-original=&https://pic3.zhimg.com/50/57fe035acdd7fdc_r.jpg&&&/figure&这里说明,这个包需要订阅2个话题,其中scan是激光雷达数据,穷学生买不起激光雷达(去年那会还不知道国产廉价雷达),使用的方法是用ros中的depthimage_to_laserscan包,这个包可以将kinect发布出来的深度图转换成激光雷达扫描数据。&br&接下来是第二个主题tf,tf是ros中必用的部分,说简单一些,tf类中定义了两个刚体之间的旋转与平移矩阵,并且重载了乘法运算符,这样我们就可以通过相乘两个tf来沿着tf树的方向求末段执行器相对世界坐标的位置与方向&br&&figure&&img src=&https://pic3.zhimg.com/50/37ba8a4bc35c0d90d567b_b.jpg& data-rawwidth=&807& data-rawheight=&236& class=&origin_image zh-lightbox-thumb& width=&807& data-original=&https://pic3.zhimg.com/50/37ba8a4bc35c0d90d567b_r.jpg&&&/figure&因此,gmapping需要的里程计odom便是通过我们自己发布tf树的形式告诉gmapping,而我们该如何获得这个里程计,这就需要我们自己完成这一部分了,通常做法是在移动平台上安装电机编码器与电子罗盘,在移动平台上的嵌入式&b&单片机(此处与ros无关)&/b&内完成里程计的制作与pid调试,然后,再用树莓派连接单片机串口,单片机将里程计与航向角发给树莓派,树莓派上需要自己写一个node(关于里程计,高级方法是视觉里程计一类的,不过与其折腾那些不如直接上激光雷达)&br&此处还得注意一点,mpu6050和电子罗盘传感器是非常不可靠的元件,读取yaw需要做卡尔曼滤波融合(跑个题:有关传感器的文章,&a href=&https://zhuanlan.zhihu.com/p/?refer=PhantomY& class=&internal&&详解多旋翼飞行器上的传感器技术 - Phantom Y - 知乎专栏&/a&,这篇写得真不错,YY硕前辈的其他很多有关机器人与传感器的文章都值得一读)&br&&figure&&img src=&https://pic3.zhimg.com/50/889cc64a63dcd31680cb_b.jpg& data-rawwidth=&1032& data-rawheight=&894& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&https://pic3.zhimg.com/50/889cc64a63dcd31680cb_r.jpg&&&/figure&这是我这台车最终的tf树(看时间,应该是去年年底或今年年初接的图,具体时间我也忘记了,还有就是最终要注意把odom-&base_link的更新频率提上去,否则别的程序在调用到waitfortransform这句的时候会超时并抛出异常,对,那种错误,从odom到base_link的timeout就是这样引起的错误),turtlebot的tf树可能看起来不太直观,因为他把轮子的转换也加进去了&br&总结如下:&br&1.单片机与树莓派之前完成数据与控制通信&br&2.树莓派上写出一个发布tf的node&br&对没错,如果只是gmapping那么就只需要做这两点!!!&br&&br&此处还有另外一点也需要注意,libfreenect这个库代码里面有一句,是判断发现一次超时,程序直接抛出异常crash掉,马德智障,这个在树莓派上因为树莓派总线速度不够的缘故,如果采集kinect速度过快,程序就会崩掉,所以,必须自己修改这个库重新编译安装。&br&&div class=&highlight&&&pre&&code class=&language-text&&/*在
https://github.com/OpenKinect/libfreenect/blob/ec0b75dd0ee6dcc4cdfee9375a4bde3/wrappers/cpp/libfreenect.hpp
的第233行左右[doge]*/
int res = freenect_process_events_timeout(m_ctx, &timeout);
if (res & 0)
throw std::runtime_error(ss.str());
&/code&&/pre&&/div&&br&hector_slam这个库也是,很多参数在代码里面可以看到但是wiki上并没有写,所以,如果发现了奇怪的错误,滚去翻源码看吧&br&&figure&&img src=&https://pic3.zhimg.com/50/7c32e62b224e7d56333d_b.jpg& data-rawwidth=&973& data-rawheight=&730& class=&origin_image zh-lightbox-thumb& width=&973& data-original=&https://pic3.zhimg.com/50/7c32e62b224e7d56333d_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/50/523cb657d39f9edf099d9_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic4.zhimg.com/50/523cb657d39f9edf099d9_r.jpg&&&/figure&
我是题主,以下是自问自答: 去年(2015年)提出的这个问题,得到了不少朋友的回复,我利用课余时间大概用了3个月左右完成了设想,实现了自己制作的移动机器人平台与ROS的对接。 我本来都快忘了这帖子,但前两天有知友给我留言,说他们和我遇到了同样的问题…
&figure&&img src=&https://pic2.zhimg.com/v2-384a440dfb588bace1bd933c3dde677b_b.jpg& data-rawwidth=&640& data-rawheight=&542& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-384a440dfb588bace1bd933c3dde677b_r.jpg&&&/figure&&p&各位学霸大牛帅哥美女们,大家好!地平线大牛讲堂第二期,主角是红遍全球的&b&SLAM,&/b&大牛是多才多艺,不按牌理出牌的&b&高翔博士。&/b&来 跟我念一遍:Simultaneous
Localization and Mapping,即时定位与地图构建技术。&/p&&p&无论在室内、野外、空中还是水下,SLAM是机器人进入未知环境遇到的第一个问题。本期给大家介绍SLAM的基础知识:&b&传感器与视觉&/b&&b&SLAM&/b&&b&框架&/b&&/p&&figure&&img data-rawheight=&542& data-rawwidth=&640& src=&https://pic2.zhimg.com/v2-384a440dfb588bace1bd933c3dde677b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-384a440dfb588bace1bd933c3dde677b_r.jpg&&&/figure&&p&近来年,智能机器人技术在世界范围内得到了大力发展。人们致力于把机器人用于实际场景:从室内的移动机器人,到野外的自动驾驶汽车、空中的无人机、水下环境的探测机器人等等,均得到了广泛的关注。&/p&&p&在大多数场合中,我们研究机器人会碰到一个基础性的困难,那就是定位和建图,也就是所谓的SLAM技术。没有准确的定位与地图,扫地机就无法在房间自主地移动,只能随机乱碰;家用机器人就无法按照指令准确到达某个房间。此外,在虚拟现实(Virtual Reality)和增强现实技术(Argument Reality)中,没有SLAM提供的定位,用户就无法在场景中漫游。在这几个应用领域中,人们需要SLAM向应用层提供空间定位的信息,并利用SLAM的地图完成地图的构建或场景的生成。&/p&&p&&b&一、传感器&/b&&/p&&p&当我们谈论SLAM时,最先问到的就是传感器。SLAM的实现方式与实现难度和传感器的形式和安装方式密切相关。&b&传感器分为激光和视觉两大类,&/b&视觉下面又分三小方向。如此庞大的传感器家族,下面将带你认识每个成员的特性。&/p&&p&&b&1&/b&&b&、传感器之激光雷达&/b&&/p&&figure&&img data-rawheight=&162& data-rawwidth=&195& src=&https://pic4.zhimg.com/v2-0af3fbd51fd5e3fd41e063c_b.jpg& class=&content_image& width=&195&&&/figure&&p&&b&激光雷达&/b&&b&是&/b&最古老,研究也最多的SLAM传感器。它们提供机器人本体与周围环境障碍物间的距离信息。常见的激光雷达,例如SICK、Velodyne还有我们国产的rplidar等,都可以拿来做SLAM。激光雷达能以很高精度测出机器人周围障碍点的角度和距离,从而很方便地实现SLAM、避障等功能。&br&主流的2D激光传感器扫描一个平面内的障碍物,适用于平面运动的机器人(如扫地机等)进行定位,并建立2D的栅格地图。这种地图在机器人导航中很实用,因为多数机器人还不能在空中飞行或走上台阶,仍限于地面。在SLAM研究史上,早期SLAM研究几乎全使用激光传感器进行建图,且多数使用滤波器方法,例如卡尔曼滤波器与粒子滤波器等。&/p&&p&激光的优点是精度很高,速度快,计算量也不大,容易做成实时SLAM。缺点是价格昂贵,一台激光动辄上万元,会大幅提高一个机器人的成本。因此激光的研究主要集中于如何降低传感器的成本上。对应于激光的EKF-SLAM理论方面,因为研究较早,现在已经非常成熟。与此同时,人们也对EKF-SLAM的缺点也有较清楚的认识,例如不易表示回环、线性化误差严重、必须维护路标点的协方差矩阵,导致一定的空间与时间的开销,等等。&/p&&p&&b&2&/b&&b&、传感器之视觉SLAM&/b&&/p&&p&视觉SLAM是21世纪SLAM研究热点之一,一方面是因为视觉十分直观,不免令人觉得:为何人能通过眼睛认路,机器人就不行呢?另一方面,由于CPU、GPU处理速度的增长,使得许多以前被认为无法实时化的视觉算法,得以在10 Hz以上的速度运行。硬件的提高也促进了视觉SLAM的发展。&br&以传感器而论,视觉SLAM研究主要分为三大类:单目、双目(或多目)、RGBD。其余还有鱼眼、全景等特殊相机,但是在研究和产品中都属于少数。此外,结合惯性测量器件(Inertial Measurement Unit,IMU)的视觉SLAM也是现在研究热点之一。就实现难度而言,我们可以大致将这三类方法排序为:单目视觉&双目视觉&RGBD。&/p&&figure&&img data-rawheight=&218& data-rawwidth=&214& src=&https://pic1.zhimg.com/v2-3b0db4266def841b96220aaaf91f3fd3_b.jpg& class=&content_image& width=&214&&&/figure&&p&&b&单目相机&/b&&b&SLAM&/b&简称MonoSLAM,即只用一支摄像头就可以完成SLAM。这样做的好处是传感器特别的简单、成本特别的低,所以单目SLAM非常受研究者关注。相比别的视觉传感器,单目有个最大的问题,就是没法确切地得到深度。这是一把双刃剑。&/p&&p&一方面,由于绝对深度未知,单目SLAM没法得到机器人运动轨迹以及地图的真实大小。直观地说,如果把轨迹和房间同时放大两倍,单目看到的像是一样的。因此,单目SLAM只能估计一个相对深度,在相似变换空间Sim(3)中求解,而非传统的欧氏空间SE(3)。如果我们必须要在SE(3)中求解,则需要用一些外部的手段,例如GPS、IMU等传感器,确定轨迹与地图的尺度(Scale)。&/p&&p&另一方面,单目相机无法依靠一张图像获得图像中物体离自己的相对距离。为了估计这个相对深度,单目SLAM要靠运动中的三角测量,来求解相机运动并估计像素的空间位置。即是说,它的轨迹和地图,只有在相机运动之后才能收敛,如果相机不进行运动时,就无法得知像素的位置。同时,相机运动还不能是纯粹的旋转,这就给单目SLAM的应用带来了一些麻烦,好在日常使用SLAM时,相机都会发生旋转和平移。不过,无法确定深度同时也有一个好处:它使得单目SLAM不受环境大小的影响,因此既可以用于室内,又可以用于室外。&/p&&figure&&img data-rawheight=&135& data-rawwidth=&379& src=&https://pic3.zhimg.com/v2-477bef73a2515d6ddcabd540e47ab5e3_b.jpg& class=&content_image& width=&379&&&/figure&&p&相比于单目,&b&双目相机&/b&通过多个相机之间的基线,估计空间点的位置。与单目不同的是,立体视觉既可以在运动时估计深度,亦可在静止时估计,消除了单目视觉的许多麻烦。不过,双目或多目相机配置与标定均较为复杂,其深度量程也随双目的基线与分辨率限制。通过双目图像计算像素距离,是一件非常消耗计算量的事情,现在多用FPGA来完成。&/p&&figure&&img data-rawheight=&134& data-rawwidth=&324& src=&https://pic2.zhimg.com/v2-b87364dcedb3d89dbc405f73e5ab6d55_b.jpg& class=&content_image& width=&324&&&/figure&&p&&b&RGBD&/b&&b&相机&/b&是2010年左右开始兴起的一种相机,它最大的特点是可以通过红外结构光或Time-of-Flight原理,直接测出图像中各像素离相机的距离。因此,它比传统相机能够提供更丰富的信息,也不必像单目或双目那样费时费力地计算深度。目前常用的RGBD相机包括Kinect/Kinect V2、Xtion等。不过,现在多数RGBD相机还存在测量范围窄、噪声大、视野小等诸多问题。出于量程的限制,主要用于室内SLAM。&/p&&p&&b&三、视觉&/b&&b&SLAM&/b&&b&框架&/b&&/p&&p&视觉SLAM几乎都有一个基本的框架。一个SLAM系统分为四个模块(除去传感器数据读取)&b&VO&/b&&b&、后端、建图、回环检测。&/b&本期我们简要介绍各模块的涵义,之后再详细介绍其使用方法。&/p&&figure&&img data-rawheight=&480& data-rawwidth=&640& src=&https://pic4.zhimg.com/v2-4baa60edd9b09d6cfd3961_b.jpg& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/v2-4baa60edd9b09d6cfd3961_r.jpg&&&/figure&&p&&b&1&/b&&b&、SLAM&/b&&b&框架之视觉里程计&/b&&/p&&p&Visual Odometry,即视觉里程计。它估计两个时刻机器人的相对运动(Ego-motion)。在激光SLAM中,我们可以将当前的观测与全局地图进行匹配,用ICP求解相对运动。而对于相机,它在欧氏空间里运动,我们经常需要估计一个三维空间的变换矩阵——SE3或Sim3(单目情形)。求解这个矩阵是VO的核心问题,而求解的思路,则分为基于特征的思路和不使用特征的直接方法。&/p&&figure&&img data-rawheight=&250& data-rawwidth=&640& src=&https://pic4.zhimg.com/v2-dce79dfeb5_b.jpg& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/v2-dce79dfeb5_r.jpg&&&/figure&&p&基于特征的方法是目前VO的主流方式。对于两幅图像,首先提取图像中的特征,然后根据两幅图的特征匹配,计算相机的变换矩阵。最常用的是点特征,例如Harris角点、SIFT、SURF、ORB。如果使用RGBD相机,利用已知深度的特征点,就可以直接估计相机的运动。给定一组特征点以及它们之间的配对关系,求解相机的姿态,该问题被称为PnP问题(Perspective-N-Point)。PnP可以用非线性优化来求解,得到两个帧之间的位置关系。&/p&&p&不使用特征进行VO的方法称为直接法。它直接把图像中所有像素写进一个位姿估计方程,求出帧间相对运动。例如,在RGBD SLAM中,可以用ICP(Iterative Closest Point,迭代最近邻)求解两个点云之间的变换矩阵。对于单目SLAM,我们可以匹配两个图像间的像素,或者像图像与一个全局的模型相匹配。直接法的典型例子是SVO和LSD-SLAM。它们在单目SLAM中使用直接法,取得了较好的效果。目前看来,直接法比特征VO需要更多的计算量,而且对相机的图像采集速率也有较高的要求。&/p&&p&&b&2&/b&&b&、SLAM&/b&&b&框架之后端&/b&&/p&&p&在VO估计帧间运动之后,理论上就可以得到机器人的轨迹了。然而视觉里程计和普通的里程计一样,存在累积误差的问题(Drift)。直观地说,在t1和t2时刻,估计的转角比真实转角少1度,那么之后的轨迹就全部少掉了这1度。时间一长,建出的房间可能由方形变成了多边形,估计出的轨迹亦会有严重的漂移。所以在SLAM中,还会把帧间相对运动放到一个称之为后端的程序中进行加工处理。&/p&&p&早期的SLAM后端使用滤波器方式。由于那时还未形成前后端的概念,有时人们也称研究滤波器的工作为研究SLAM。SLAM最早的提出者R. Smith等人就把SLAM建构成了一个EKF(Extended Kalman Filter,扩展卡尔曼滤波)问题。他们按照EKF的形式,把SLAM写成了一个运动方程和观测方式,以最小化这两个方程中的噪声项为目的,使用典型的滤波器思路来解决SLAM问题。&/p&&p&当一个帧到达时,我们能(通过码盘或IMU)测出该帧与上一帧的相对运动,但是存在噪声,是为运动方程。同时,通过传感器对路标的观测,我们测出了机器人与路标间的位姿关系,同样也带有噪声,是为观测方程。通过这两者信息,我们可以预测出机器人在当前时刻的位置。同样,根据以往记录的路标点,我们又能计算出一个卡尔曼增益,以补偿噪声的影响。于是,对当前帧和路标的估计,即是这个预测与更新的不断迭代的过程。&/p&&p&21世纪之后,SLAM研究者开始借鉴SfM(Structure
from Motion)问题中的方法,把捆集优化(Bundle Adjustment)引入到SLAM中来。优化方法和滤波器方法有根本上的不同。它并不是一个迭代的过程,而是考虑过去所有帧中的信息。通过优化,把误差平均分到每一次观测当中。在SLAM中的Bundle Adjustment常常以图的形式给出,所以研究者亦称之为图优化方法(Graph Optimization)。图优化可以直观地表示优化问题,可利用稀疏代数进行快速的求解,表达回环也十分的方便,因而成为现今视觉SLAM中主流的优化方法。&/p&&p&&b&3&/b&&b&、SLAM&/b&&b&框架之回环检测&/b&&/p&&p&回环检测,又称闭环检测(Loop closure detection),是指机器人识别曾到达场景的能力。如果检测成功,可以显著地减小累积误差。回环检测实质上是一种检测观测数据相似性的算法。对于视觉SLAM,多数系统采用目前较为成熟的词袋模型(Bag-of-Words, BoW)。词袋模型把图像中的视觉特征(SIFT, SURF等)聚类,然后建立词典,进而寻找每个图中含有哪些“单词”(word)。也有研究者使用传统模式识别的方法,把回环检测建构成一个分类问题,训练分类器进行分类。&/p&&p&回环检测的难点在于,错误的检测结果可能使地图变得很糟糕。这些错误分为两类:1.假阳性(False Positive),又称感知偏差(Perceptual Aliasing),指事实上不同的场景被当成了同一个;2.假阴性(False Negative),又称感知变异(Perceptual Variability),指事实上同一个场景被当成了两个。感知偏差会严重地影响地图的结果,通常是希望避免的。一个好的回环检测算法应该能检测出尽量多的真实回环。研究者常常用准确率-召回率曲线来评价一个检测算法的好坏。&/p&&p&下期我们将具体介绍这几个模块&/p&&p&敬请期待&/p&
各位学霸大牛帅哥美女们,大家好!地平线大牛讲堂第二期,主角是红遍全球的SLAM,大牛是多才多艺,不按牌理出牌的高翔博士。来 跟我念一遍:Simultaneous
Localization and Mapping,即时定位与地图构建技术。无论在室内、野外、空中还是水下,SLAM是机器人…
其实我并不做SLAM。但是正好最近实验室有师弟想做SLAM,但也觉得整个SLAM问题太大,想找个点突破。&br&我觉得硕士生跟博士生还是不一样的,博士生应该做那些理论上未解决的问题,而硕士生应该更专注于一些技术上未解决的问题。题主也说了,希望能做点更实际的题目,同时不需要去啃太多SLAM的复杂原理。&br&我这边说两个点,权当抛砖引玉:&br&&strong&1)地图自动创建。&/strong&&br&这个的基本应用就是,我们来到一个新的环境,只需要把机器人往地上一扔,它自己就蹦跶着到处跑,然后把室内地图给建出来。&br&目前SLAM过程中,大多数研究都是由人来指定机器人运动轨迹,操作者看到哪里地图没建好,就让机器人跑过去采集数据。这样的话总感觉不是很方便,如果能实现机器人自动创建地图,那必然是既方便实用的。(有可能已经有这方面研究了,毕竟我不做SLAM,所以看得论文不多)。&br&要做这方向的话,并不需要深入研究SLAM技术,只需要使用现有的开源算法即可。&br&&figure&&img src=&https://pic2.zhimg.com/50/35e829a9816_b.jpg& data-rawheight=&1150& data-rawwidth=&1920& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic2.zhimg.com/50/35e829a9816_r.jpg&&&/figure&&br&例如,你可以就使用gmapping,只用2D SLAM。你只需要不断指定下一个目标点就可以了。你可以研究地图创建完的判断准则、利用概率模型确定下一个采集点等等。不难,但是有趣实用。&br&当然,ROS里有一个类似的包&a href=&//link.zhihu.com/?target=http%3A//wiki.ros.org/frontier_exploration& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&frontier_exploration&/a&,但感觉并没有做好。&br&&br&&strong&2)多机器人联合创建地图&/strong&&br&前面也有人提到了这个方向。就是将不同机器人采集的数据用来建立一个完整地图。&br&&figure&&img src=&https://pic3.zhimg.com/50/db2970afb197c657b60ae0_b.jpg& data-rawheight=&832& data-rawwidth=&1160& class=&origin_image zh-lightbox-thumb& width=&1160& data-original=&https://pic3.zhimg.com/50/db2970afb197c657b60ae0_r.jpg&&&/figure&&br&当然,已经有人在做了。但是,好像没看到做得很好的。&br&这个用途就更有趣了,例如以后智能汽车(带有激光传感器等)普及了,就可以将所有汽车的传感器数据收集起来,然后做个大范围的SLAM。包括地下车库地图创建、街景立体模型创建等等。&br&&br&异形前传《普罗米修斯》里的自动建地图飞行球就是以上两个功能的终极版本:&br&&figure&&img src=&https://pic2.zhimg.com/50/0467baf9df1ed8feb41b978_b.jpg& data-rawheight=&1000& data-rawwidth=&1600& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&https://pic2.zhimg.com/50/0467baf9df1ed8feb41b978_r.jpg&&&/figure&多个飞行球可以协同构建出整个隧道(飞船)的3D地图,想想都excited&br&&figure&&img src=&https://pic3.zhimg.com/50/02c6c7ffad03c_b.jpg& data-rawheight=&281& data-rawwidth=&466& class=&origin_image zh-lightbox-thumb& width=&466& data-original=&https://pic3.zhimg.com/50/02c6c7ffad03c_r.jpg&&&/figure&&br&&br&当然,选题的话,最好还是自己多看paper,多跟导师讨论。别人不知道你的研究基础、实验条件,无法给出最合适的建议。
其实我并不做SLAM。但是正好最近实验室有师弟想做SLAM,但也觉得整个SLAM问题太大,想找个点突破。 我觉得硕士生跟博士生还是不一样的,博士生应该做那些理论上未解决的问题,而硕士生应该更专注于一些技术上未解决的问题。题主也说了,希望能做点更实际的…
我怎么会写得那么长……如果您有兴趣可以和我一块把公式过一遍。&br&要讲清这个问题,得从状态估计理论来说。先摆上一句名言:&br&&blockquote&状态估计乃传感器之本质。(To understand the need for state estimation is to understand the nature of sensors.)&/blockquote&任何传感器,激光也好,视觉也好,整个SLAM系统也好,要解决的问题只有一个:&b&如何通过数据来估计自身状态。&/b&每种传感器的测量模型不一样,它们的精度也不一样。换句话说,状态估计问题,也就是“&b&如何最好地使用传感器数据&/b&”。可以说,SLAM是状态估计的一个特例。&br&&br&=====================&b&离散时间系统的状态估计&/b&======================&br&记机器人在各时刻的状态为&img src=&//www.zhihu.com/equation?tex=x_1%2C%5Cldots%2Cx_k& alt=&x_1,\ldots,x_k& eeimg=&1&&,其中&img src=&//www.zhihu.com/equation?tex=k& alt=&k& eeimg=&1&&是离散时间下标。在SLAM中,我们通常要估计机器人的位置,那么系统的状态就指的是机器人的位姿。用两个方程来描述状态估计问题:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cleft%5C%7B+%5Cbegin%7Barray%7D%7Bl%7D%0A%7Bx_k%7D+%3D+f%5Cleft%28+%7B%7Bx_%7Bk+-+1%7D%7D%2C%7Bu_k%7D%2C%7Bw_k%7D%7D+%5Cright%29%5C%5C%0A%7By_k%7D+%3D+g%5Cleft%28+%7B%7Bx_k%7D%2C%7Bn_k%7D%7D+%5Cright%29%0A%5Cend%7Barray%7D+%5Cright.%5C%5D& alt=&\[\left\{ \begin{array}{l}
{x_k} = f\left( {{x_{k - 1}},{u_k},{w_k}} \right)\\
{y_k} = g\left( {{x_k},{n_k}} \right)
\end{array} \right.\]& eeimg=&1&&&br&&br&解释一下变量:&br&&img src=&//www.zhihu.com/equation?tex=f& alt=&f& eeimg=&1&&-运动方程&br&&img src=&//www.zhihu.com/equation?tex=u& alt=&u& eeimg=&1&&- 输入&br&&img src=&//www.zhihu.com/equation?tex=w& alt=&w& eeimg=&1&&- 输入噪声&br&&img src=&//www.zhihu.com/equation?tex=g& alt=&g& eeimg=&1&&- 观测方程&br&&img src=&//www.zhihu.com/equation?tex=y& alt=&y& eeimg=&1&&- 观测数据&br&&img src=&//www.zhihu.com/equation?tex=n& alt=&n& eeimg=&1&&- 观测噪声&br&&br&运动方程描述了状态&img src=&//www.zhihu.com/equation?tex=x_%7Bk-1%7D& alt=&x_{k-1}& eeimg=&1&&是怎么变到&img src=&//www.zhihu.com/equation?tex=x_k& alt=&x_k& eeimg=&1&&的,而观测方程描述的是从&img src=&//www.zhihu.com/equation?tex=x_k& alt=&x_k& eeimg=&1&&是怎么得到观察数据&img src=&//www.zhihu.com/equation?tex=y_k& alt=&y_k& eeimg=&1&&的。&br&请注意这是一种抽象的写法。当你有实际的机器人,实际的传感器时,方程的形式就会变得具体,也就是所谓的&b&参数化&/b&。例如,当我们关心机器人空间位置时,可以取&img src=&//www.zhihu.com/equation?tex=x_k+%3D+%5Bx%2Cy%2Cz%5D_k& alt=&x_k = [x,y,z]_k& eeimg=&1&&。进而,机器人携带了里程计,能够得到两个时间间隔中的相对运动,像这样&img src=&//www.zhihu.com/equation?tex=%5CDelta+x_k%3D%5B%5CDelta+x%2C+%5CDelta+y%2C+%5CDelta+z%5D_k& alt=&\Delta x_k=[\Delta x, \Delta y, \Delta z]_k& eeimg=&1&&,那么运动方程就变为:&br&&img src=&//www.zhihu.com/equation?tex=x_%7Bk%2B1%7D%3Dx_k%2B%5CDelta+x_k%2Bw_k& alt=&x_{k+1}=x_k+\Delta x_k+w_k& eeimg=&1&&&br&同理,观测方程也随传感器的具体信息而变。例如激光传感器可以得到空间点离机器人的距离和角度,记为&img src=&//www.zhihu.com/equation?tex=y_k%3D%5Br%2C%5Ctheta%5D_k& alt=&y_k=[r,\theta]_k& eeimg=&1&&,那么观测方程为:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%7B%5Cleft%5B+%5Cbegin%7Barray%7D%7Bl%7D%0Ar%5C%5C%0A%5Ctheta+%0A%5Cend%7Barray%7D+%5Cright%5D_k%7D+%3D+%5Cleft%5B+%5Cbegin%7Barray%7D%7Bl%7D%0A%5Csqrt+%7B%7B%7B%5Cleft%5C%7C+%7B%7Bx_k%7D+-+%7BL_k%7D%7D+%5Cright%5C%7C%7D_2%7D%7D+%5C%5C%0A%7B%5Ctan+%5E%7B+-+1%7D%7D%5Cfrac%7B%7B%7BL_%7Bk%2Cy%7D%7D+-+%7Bx_%7Bk%2Cy%7D%7D%7D%7D%7B%7B%7BL_%7Bk%2Cx%7D%7D+-+%7Bx_%7Bk%2Cx%7D%7D%7D%7D%0A%5Cend%7Barray%7D+%5Cright%5D+%2B+%7Bn_k%7D%5C%5D& alt=&\[{\left[ \begin{array}{l}
\end{array} \right]_k} = \left[ \begin{array}{l}
\sqrt {{{\left\| {{x_k} - {L_k}} \right\|}_2}} \\
{\tan ^{ - 1}}\frac{{{L_{k,y}} - {x_{k,y}}}}{{{L_{k,x}} - {x_{k,x}}}}
\end{array} \right] + {n_k}\]& eeimg=&1&&,其中&img src=&//www.zhihu.com/equation?tex=L_k%3D%5BL_%7Bk%2Cx%7D%2CL_%7Bk%2Cy%7D%5D& alt=&L_k=[L_{k,x},L_{k,y}]& eeimg=&1&&是一个2D路标点。&br&&br&举这几个例子是为了说明,&b&运动方程和观测方程具体形式是会变化的&/b&。但是,我们想讨论更一般的问题:当我不限制传感器的具体形式时,能否设计一种方式,从已知的&img src=&//www.zhihu.com/equation?tex=u%2Cy& alt=&u,y& eeimg=&1&&(输入和观测数据)从,估计出&img src=&//www.zhihu.com/equation?tex=x& alt=&x& eeimg=&1&&呢?&br&&br&这就是最一般的状态估计问题。我们会根据&img src=&//www.zhihu.com/equation?tex=f%2Cg& alt=&f,g& eeimg=&1&&是否线性,把它们分为&b&线性/非线性系统&/b&。同时,对于噪声&img src=&//www.zhihu.com/equation?tex=w%2Cn& alt=&w,n& eeimg=&1&&,根据它们是否为高斯分布,分为&b&高斯/非高斯噪声&/b&系统。最一般的,也是最困难的问题,是非线性-非高斯(NLNG, Nonlinear-Non Gaussian)的状态估计。下面先说最简单的情况:线性高斯系统。&br&&br&=====================&b&线性高斯系统&/b&============================&br&&b&线性高斯系统(LG,Linear Gaussian)&/b&&br&在线性高斯系统中,运动方程、观测方程是线性的,且两个噪声项服从零均值的高斯分布。这是最简单的情况。简单在哪里呢?主要是因为&b&高斯分布经过线性变换之后仍为高斯分布&/b&。而对于一个高斯分布,只要计算出它的一阶和二阶矩,就可以描述它(高斯分布只有两个参数&img src=&//www.zhihu.com/equation?tex=%5Cmu%2C+%5CSigma& alt=&\mu, \Sigma& eeimg=&1&&)。&br&线性系统形式如下:&br&&img src=&//www.zhihu.com/equation?tex=%5Cleft%5C%7B%0A%5Cbegin%7Barray%7D%7Bl%7D%0A%7Bx_k%7D+%3D+%7BA_%7Bk+-+1%7D%7D%7Bx_%7Bk+-+1%7D%7D+%2B+%7Bu_k%7D+%2B+%7Bw_k%7D%5C%5C%0A%7By_k%7D+%3D+%7BC_k%7D%7Bx_k%7D+%2B+%7Bn_k%7D%5C%5C%0A%7Bw_k%7D%5Csim+N%5Cleft%28+%7B0%2C%7BQ_k%7D%7D+%5Cright%29%5C%5C%0A%7Bn_k%7D%5Csim+N%280%2C%7BR_k%7D%29%0A%5Cend%7Barray%7D%0A+%5Cright.& alt=&\left\{
\begin{array}{l}
{x_k} = {A_{k - 1}}{x_{k - 1}} + {u_k} + {w_k}\\
{y_k} = {C_k}{x_k} + {n_k}\\
{w_k}\sim N\left( {0,{Q_k}} \right)\\
{n_k}\sim N(0,{R_k})
\end{array}
\right.& eeimg=&1&&
其中&img src=&//www.zhihu.com/equation?tex=Q_k%2CR_k& alt=&Q_k,R_k& eeimg=&1&&是两个噪声项的协方差矩阵。&img src=&//www.zhihu.com/equation?tex=A%2CC& alt=&A,C& eeimg=&1&&为转移矩阵和观测矩阵。&br&对LG系统,可以用贝叶斯法则,计算&img src=&//www.zhihu.com/equation?tex=x& alt=&x& eeimg=&1&&的后验概率分布——这条路直接通向&b&卡尔曼滤波器&/b&。卡尔曼是线性系统的递推形式(recursive,也就是从&img src=&//www.zhihu.com/equation?tex=x_%7Bk-1%7D& alt=&x_{k-1}& eeimg=&1&&估计&img src=&//www.zhihu.com/equation?tex=x_k& alt=&x_k& eeimg=&1&&)的无偏最优估计。由于解释EKF和UKF都得用它,所以我们来推一推。如果读者不感兴趣,可以跳过公式推导环节。&br&符号:用&img src=&//www.zhihu.com/equation?tex=%5Chat%7Bx%7D& alt=&\hat{x}& eeimg=&1&&表示&img src=&//www.zhihu.com/equation?tex=x& alt=&x& eeimg=&1&&的后验概率,用&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Ctilde+x%5C%5D& alt=&\[\tilde x\]& eeimg=&1&&表示它的先验概率。因为系统是线性的,噪声是高斯的,所以状态也服从高斯分布,需要计算它的均值和协方差矩阵。记第&img src=&//www.zhihu.com/equation?tex=k& alt=&k& eeimg=&1&&时刻的状态服从:&img src=&//www.zhihu.com/equation?tex=x_k%5Csim+N%28%7B%7B%5Cbar+x%7D_k%7D%2C%7BP_k%7D%29& alt=&x_k\sim N({{\bar x}_k},{P_k})& eeimg=&1&&&br&&br&我们希望得到状态变量&img src=&//www.zhihu.com/equation?tex=x& alt=&x& eeimg=&1&&的最大后验估计(MAP,Maximize a Posterior),于是计算:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cbegin%7Barray%7D%7Bccl%7D%0A%5Chat+x+%26%3D%26+%5Carg+%5Cmathop+%7B%5Cmax+%7D%5Climits_x+p%5Cleft%28+%7Bx%7Cy%2Cu%7D+%5Cright%29%5C%5C%0A+%26%3D%26+%5Carg+%5Cmax+%5Cfrac%7B%7Bp%5Cleft%28+%7By%7Cx%2Cu%7D+%5Cright%29p%5Cleft%28+%7Bx%7Cu%7D+%5Cright%29%7D%7D%7B%7Bp%5Cleft%28+%7By%7Cv%7D+%5Cright%29%7D%7D+%5C%5C%0A+%26%3D%26+%5Carg+%5Cmax+p%28y%7Cx%29p%5Cleft%28+%7Bx%7Cu%7D+%5Cright%29%0A%5Cend%7Barray%7D%5C%5D& alt=&\[\begin{array}{ccl}
\hat x &=& \arg \mathop {\max }\limits_x p\left( {x|y,u} \right)\\
&=& \arg \max \frac{{p\left( {y|x,u} \right)p\left( {x|u} \right)}}{{p\left( {y|v} \right)}} \\
&=& \arg \max p(y|x)p\left( {x|u} \right)
\end{array}\]& eeimg=&1&&&br&第二行是贝叶斯法则,第三行分母和&img src=&//www.zhihu.com/equation?tex=x& alt=&x& eeimg=&1&&无关所以去掉。&br&第一项即观测方程,有:&img src=&//www.zhihu.com/equation?tex=%5C%5Bp%5Cleft%28+%7By%7Cx%7D+%5Cright%29+%3D+%5Cprod%5Climits_%7Bk+%3D+0%7D%5EK+%7Bp%5Cleft%28+%7B%7By_k%7D%7C%7Bx_k%7D%7D+%5Cright%29%7D+%5C%5D& alt=&\[p\left( {y|x} \right) = \prod\limits_{k = 0}^K {p\left( {{y_k}|{x_k}} \right)} \]& eeimg=&1&&,很简单。&br&第二项即运动方程,有:&img src=&//www.zhihu.com/equation?tex=%5C%5Bp%5Cleft%28+%7Bx%7Cv%7D+%5Cright%29+%3D+%5Cprod%5Climits_%7Bk+%3D+0%7D%5EK+%7Bp%5Cleft%28+%7B%7Bx_k%7D%7C%7Bx_%7Bk+-+1%7D%7D%2Cv_k%7D+%5Cright%29%7D+%5C%5D& alt=&\[p\left( {x|v} \right) = \prod\limits_{k = 0}^K {p\left( {{x_k}|{x_{k - 1}},v_k} \right)} \]& eeimg=&1&&,也很简单。&br&现在的问题是如何求解这个最大化问题。对于高斯分布,最大化问题可以变成最小化它的负对数。当我对一个高斯分布取负对数时,它的指数项变成了一个二次项,而前面的因子则变为一个无关的常数项,可以略掉(这部分我不敲了,有疑问的同学可以问)。于是,定义以下形式的最小化函数:&br&&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cbegin%7Barray%7D%7Bl%7D%0A%7BJ_%7By%2Ck%7D%7D%5Cleft%28+x+%5Cright%29+%3D+%5Cfrac%7B1%7D%7B2%7D%7B%5Cleft%28+%7B%7By_k%7D+-+%7BC_k%7D%7Bx_k%7D%7D+%5Cright%29%5ET%7DR_k%5E%7B+-+1%7D%5Cleft%28+%7B%7By_k%7D+-+%7BC_k%7D%7Bx_k%7D%7D+%5Cright%29%5C%5C%0A%7BJ_%7Bv%2Ck%7D%7D%5Cleft%28+x+%5Cright%29+%3D+%5Cfrac%7B1%7D%7B2%7D%7B%5Cleft%28+%7B%7Bx_k%7D+-+%7BA_%7Bk+-+1%7D%7D%7Bx_%7Bk+-+1%7D%7D+-+%7Bv_k%7D%7D+%5Cright%29%5ET%7DQ_k%5E%7B+-+1%7D%5Cleft%28+%7B%7Bx_k%7D+-+%7BA_%7Bk+-+1%7D%7D%7Bx_%7Bk+-+1%7D%7D+-+%7Bv_k%7D%7D+%5Cright%29%0A%5Cend%7Barray%7D%5C%5D& alt=&\[\begin{array}{l}
{J_{y,k}}\left( x \right) = \frac{1}{2}{\left( {{y_k} - {C_k}{x_k}} \right)^T}R_k^{ - 1}\left( {{y_k} - {C_k}{x_k}} \right)\\
{J_{v,k}}\left( x \right) = \frac{1}{2}{\left( {{x_k} - {A_{k - 1}}{x_{k - 1}} - {v_k}} \right)^T}Q_k^{ - 1}\left( {{x_k} - {A_{k - 1}}{x_{k - 1}} - {v_k}} \right)
\end{array}\]& eeimg=&1&&&br&那么最大后验估计就等价于:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Chat+x+%3D+%5Carg+%5Cmin+%5Csum%5Climits_%7Bk+%3D+0%7D%5EK+%7B%7BJ_%7By%2Ck%7D%7D+%2B+%7BJ_%7Bv%2Ck%7D%7D%7D+%5C%5D& alt=&\[\hat x = \arg \min \sum\limits_{k = 0}^K {{J_{y,k}} + {J_{v,k}}} \]& eeimg=&1&&&br&这个问题现在是二次项和的形式,写成矩阵形式会更加清晰。定义:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cbegin%7Barray%7D%7Bl%7D%0Az+%3D+%5Cleft%5B+%5Cbegin%7Barray%7D%7Bl%7D%0A%7Bx_0%7D%5C%5C%0A%7Bv_1%7D%5C%5C%0A+%5Cvdots+%5C%5C%0A%7Bv_K%7D%5C%5C%0A%7By_0%7D%5C%5C%0A+%5Cvdots+%5C%5C%0A%7By_K%7D%0A%5Cend%7Barray%7D+%5Cright%5D%2Cx+%3D+%5Cleft%5B+%5Cbegin%7Barray%7D%7Bl%7D%0A%7Bx_0%7D%5C%5C%0A+%5Cvdots+%5C%5C%0A%7Bx_K%7D%0A%5Cend%7Barray%7D+%5Cright%5D%5C%5C%0AH+%3D+%5Cleft%5B+%7B%5Cbegin%7Barray%7D%7B%2A%7B20%7D%7Bc%7D%7D%0A1%26%7B%7D%26%7B%7D%26%7B%7D%5C%5C%0A%7B+-+%7BA_0%7D%7D%261%26%7B%7D%26%7B%7D%5C%5C%0A%7B%7D%26+%5Cddots+%26+%5Cddots+%26%7B%7D%5C%5C%0A%7B%7D%26%7B%7D%26%7B+-+%7BA_%7BK+-+1%7D%7D%7D%261%5C%5C%0A%7B%7BC_0%7D%7D%26%7B%7D%26%7B%7D%26%7B%7D%5C%5C%0A%7B%7D%26+%5Cddots+%26%7B%7D%26%7B%7D%5C%5C%0A%7B%7D%26%7B%7D%26+%5Cddots+%26%7B%7D%5C%5C%0A%7B%7D%26%7B%7D%26%7B%7D%26%7B%7BC_K%7D%7D%0A%5Cend%7Barray%7D%7D+%5Cright%5D%2CW+%3D+%5Cleft%5B+%7B%5Cbegin%7Barray%7D%7B%2A%7B20%7D%7Bc%7D%7D%0A%7B%7BP_0%7D%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%5C%5C%0A%7B%7D%26%7B%7BQ_1%7D%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%5C%5C%0A%7B%7D%26%7B%7D%26+%5Cddots+%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%5C%5C%0A%7B%7D%26%7B%7D%26%7B%7D%26%7B%7BQ_K%7D%7D%26%7B%7D%26%7B%7D%26%7B%7D%5C%5C%0A%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7BR_1%7D%7D%26%7B%7D%26%7B%7D%5C%5C%0A%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%26+%5Cddots+%26%7B%7D%5C%5C%0A%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7D%26%7B%7BR_K%7D%7D%0A%5Cend%7Barray%7D%7D+%5Cright%5D%0A%5Cend%7Barray%7D%5C%5D& alt=&\[\begin{array}{l}
z = \left[ \begin{array}{l}
\end{array} \right],x = \left[ \begin{array}{l}
\end{array} \right]\\
H = \left[ {\begin{array}{*{20}{c}}
1&{}&{}&{}\\
{ - {A_0}}&1&{}&{}\\
{}& \ddots & \ddots &{}\\
{}&{}&{ - {A_{K - 1}}}&1\\
{{C_0}}&{}&{}&{}\\
{}& \ddots &{}&{}\\
{}&{}& \ddots &{}\\
{}&{}&{}&{{C_K}}
\end{array}} \right],W = \left[ {\begin{array}{*{20}{c}}
{{P_0}}&{}&{}&{}&{}&{}&{}\\
{}&{{Q_1}}&{}&{}&{}&{}&{}\\
{}&{}& \ddots &{}&{}&{}&{}\\
{}&{}&{}&{{Q_K}}&{}&{}&{}\\
{}&{}&{}&{}&{{R_1}}&{}&{}\\
{}&{}&{}&{}&{}& \ddots &{}\\
{}&{}&{}&{}&{}&{}&{{R_K}}
\end{array}} \right]
\end{array}\]& eeimg=&1&&&br&&br&就得到矩阵形式的,类似最小二乘的问题:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5BJ%5Cleft%28+x+%5Cright%29+%3D+%5Cfrac%7B1%7D%7B2%7D%7B%5Cleft%28+%7Bz+-+Hx%7D+%5Cright%29%5ET%7D%7BW%5E%7B+-+1%7D%7D%5Cleft%28+%7Bz+-+Hx%7D+%5Cright%29%5C%5D& alt=&\[J\left( x \right) = \frac{1}{2}{\left( {z - Hx} \right)^T}{W^{ - 1}}\left( {z - Hx} \right)\]& eeimg=&1&&&br&于是令它的导数为零,得到:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cfrac%7B%7B%5Cpartial+J%7D%7D%7B%7B%5Cpartial+%7Bx%5ET%7D%7D%7D+%3D++-+%7BH%5ET%7D%7BW%5E%7B+-+1%7D%7D%5Cleft%28+%7Bz+-+Hx%7D+%5Cright%29+%3D+0+%5CRightarrow+%5Cleft%28+%7B%7BH%5ET%7D%7BW%5E%7B+-+1%7D%7DH%7D+%5Cright%29x+%3D+%7BH%5ET%7D%7BW%5E%7B+-+1%7D%7Dz%5C%5D& alt=&\[\frac{{\partial J}}{{\partial {x^T}}} =
- {H^T}{W^{ - 1}}\left( {z - Hx} \right) = 0 \Rightarrow \left( {{H^T}{W^{ - 1}}H} \right)x = {H^T}{W^{ - 1}}z\]& eeimg=&1&& (*)&br&&br&读者会问,这个问题和卡尔曼滤波有什么问题呢?事实上,&b&卡尔曼滤波就是递推地求解(*)式的过程&/b&。所谓递推,就是只用&img src=&//www.zhihu.com/equation?tex=x_%7Bk-1%7D& alt=&x_{k-1}& eeimg=&1&&来计算&img src=&//www.zhihu.com/equation?tex=x_k& alt=&x_k& eeimg=&1&&。对(*)进行Cholesky分解,就可以推出卡尔曼滤波器。详细过程限于篇幅就不推了,把卡尔曼的结论写一下:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cbegin%7Barray%7D%7Bl%7D%0A%7B%7B%5Ctilde+P%7D_k%7D+%3D+%7BA_%7Bk+-+1%7D%7D%7B%7B%5Chat+P%7D_%7Bk+-+1%7D%7DA_%7Bk+-+1%7D%5ET+%2B+%7BQ_k%7D%5C%5C%0A%7B%7B%5Ctilde+x%7D_k%7D+%3D+%7BA_%7Bk+-+1%7D%7D%7B%7B%5Chat+x%7D_%7Bk+-+1%7D%7D+%2B+%7Bv_k%7D%5C%5C%0A%7BK_k%7D+%3D+%7B%7B%5Ctilde+P%7D_k%7DC_k%5ET%7B%5Cleft%28+%7B%7BC_k%7D%7B%7B%5Ctilde+P%7D_k%7DC_k%5ET+%2B+%7BR_k%7D%7D+%5Cright%29%5E%7B+-+1%7D%7D%5C%5C%0A%7B%7B%5Chat+P%7D_k%7D+%3D+%5Cleft%28+%7BI+-+%7BK_k%7D%7BC_k%7D%7D+%5Cright%29%7B%7B%5Ctilde+P%7D_k%7D%5C%5C%0A%7B%7B%5Chat+x%7D_k%7D+%3D+%7B%7B%5Ctilde+x%7D_k%7D+%2B+%7BK_k%7D%5Cleft%28+%7B%7By_k%7D+-+%7BC_k%7D%7B%7B%5Ctilde+x%7D_k%7D%7D+%5Cright%29%0A%5Cend%7Barray%7D%5C%5D& alt=&\[\begin{array}{l}
{{\tilde P}_k} = {A_{k - 1}}{{\hat P}_{k - 1}}A_{k - 1}^T + {Q_k}\\
{{\tilde x}_k} = {A_{k - 1}}{{\hat x}_{k - 1}} + {v_k}\\
{K_k} = {{\tilde P}_k}C_k^T{\left( {{C_k}{{\tilde P}_k}C_k^T + {R_k}} \right)^{ - 1}}\\
{{\hat P}_k} = \left( {I - {K_k}{C_k}} \right){{\tilde P}_k}\\
{{\hat x}_k} = {{\tilde x}_k} + {K_k}\left( {{y_k} - {C_k}{{\tilde x}_k}} \right)
\end{array}\]& eeimg=&1&&&br&前两个是预测,第三个是卡尔曼增益,四五是校正。&br&&br&另一方面,能否直接求解(*)式,得到&img src=&//www.zhihu.com/equation?tex=%5Chat%7Bx%7D& alt=&\hat{x}& eeimg=&1&&呢?答案是可以的,而且这就是优化方法(batch optimization)的思路:将所有的状态放在一个向量里,进行求解。与卡尔曼滤波不同的是,在估计前面时刻的状态(如&img src=&//www.zhihu.com/equation?tex=x_1& alt=&x_1& eeimg=&1&&)时,会用到后面时刻的信息(&img src=&//www.zhihu.com/equation?tex=y_2%2Cy_3& alt=&y_2,y_3& eeimg=&1&&等)。从这点来说,优化方法和卡尔曼处理信息的方式是相当不同的。&br&&br&==================&b&扩展卡尔曼滤波器&/b&===================&br&线性高斯系统当然性质很好啦,但许多现实世界中的系统都不是线性的,状态和噪声也不是高斯分布的。例如上面举的激光观测方程就不是线性的。当系统为非线性的时候,会发生什么呢?&br&一件悲剧的事情是:&b&高斯分布经过非线性变换后,不再是高斯分布。而且,是个什么分布,基本说不上来&/b&。(摊手)&br&如果没有高斯分布,上面说的那些都不再成立了。&b&于是EKF说,嘛,我们睁一只眼闭一只眼,用高斯分布去近似它,并且,在工作点附近对系统进行线性化&/b&。当然这个近似是很成问题的,有什么问题我们之后再说。&br&EKF的做法主要有两点。其一,在工作点附近&img src=&//www.zhihu.com/equation?tex=%5C%5B%7B%7B%5Chat+x%7D_%7Bk+-+1%7D%7D%2C%7B%7B%5Ctilde+x%7D_k%7D%5C%5D& alt=&\[{{\hat x}_{k - 1}},{{\tilde x}_k}\]& eeimg=&1&&,对系统进行线性近似化:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cbegin%7Barray%7D%7Bl%7D%0Af%5Cleft%28+%7B%7Bx_%7Bk+-+1%7D%7D%2C%7Bv_k%7D%2C%7Bw_k%7D%7D+%5Cright%29+%5Capprox+f%5Cleft%28+%7B%7B%7B%5Chat+x%7D_%7Bk+-+1%7D%7D%2C%7Bv_k%7D%2C0%7D+%5Cright%29+%2B+%5Cfrac%7B%7B%5Cpartial+f%7D%7D%7B%7B%5Cpartial+%7Bx_%7Bk+-+1%7D%7D%7D%7D%5Cleft%28+%7B%7Bx_%7Bk+-+1%7D%7D+-+%7B%7B%5Chat+x%7D_%7Bk+-+1%7D%7D%7D+%5Cright%29+%2B+%5Cfrac%7B%7B%5Cpartial+f%7D%7D%7B%7B%5Cpartial+%7Bw_k%7D%7D%7D%7Bw_k%7D%5C%5C%0Ag%5Cleft%28+%7B%7Bx_k%7D%2C%7Bn_k%7D%7D+%5Cright%29+%5Capprox+g%5Cleft%28+%7B%7B%7B%5Ctilde+x%7D_k%7D%2C0%7D+%5Cright%29+%2B+%5Cfrac%7B%7B%5Cpartial+g%7D%7D%7B%7B%5Cpartial+%7Bx_k%7D%7D%7D%7Bn_k%7D%0A%5Cend%7Barray%7D%5C%5D& alt=&\[\begin{array}{l}
f\left( {{x_{k - 1}},{v_k},{w_k}} \right) \approx f\left( {{{\hat x}_{k - 1}},{v_k},0} \right) + \frac{{\partial f}}{{\partial {x_{k - 1}}}}\left( {{x_{k - 1}} - {{\hat x}_{k - 1}}} \right) + \frac{{\partial f}}{{\partial {w_k}}}{w_k}\\
g\left( {{x_k},{n_k}} \right) \approx g\left( {{{\tilde x}_k},0} \right) + \frac{{\partial g}}{{\partial {x_k}}}{n_k}
\end{array}\]& eeimg=&1&&&br&这里的几个偏导数,都在工作点处取值。于是呢,它就被&b&活生生地当成了一个线性系统&/b&。&br&第二,在线性系统近似下,把噪声项和状态都&b&当成了高斯分布&/b&。这样,只要估计它们的均值和协方差矩阵,就可以描述状态了。经过这样的近似之后呢,后续工作都和卡尔曼滤波是一样的了。所以EKF是卡尔曼滤波在NLNG系统下的直接扩展(所以叫扩展卡尔曼嘛)。EKF给出的公式和卡尔曼是一致的,用线性化之后的矩阵去代替卡尔曼滤波器里的转移矩阵和观测矩阵即可。&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cbegin%7Barray%7D%7Bl%7D%0A%7B%7B%5Ctilde+P%7D_k%7D+%3D+%7BF_%7Bk+-+1%7D%7D%7B%7B%5Chat+P%7D_%7Bk+-+1%7D%7DF_%7Bk+-+1%7D%5ET+%2B+Q_k%27%5C%5C%0A%7B%7B%5Ctilde+x%7D_k%7D+%3D+f%5Cleft%28+%7B%7B%7B%5Chat+x%7D_%7Bk+-+1%7D%7D%2C%7Bv_k%7D%2C0%7D+%5Cright%29%5C%5C%0A%7BK_k%7D+%3D+%7B%7B%5Ctilde+P%7D_k%7DG_k%5ET%7B%5Cleft%28+%7B%7BG_k%7D%7B%7B%5Ctilde+P%7D_k%7DG_k%5ET+%2B+R_k%27%7D+%5Cright%29%5E%7B+-+1%7D%7D%5C%5C%0A%7B%7B%5Chat+P%7D_k%7D+%3D+%5Cleft%28+%7BI+-+%7BK_k%7D%7BG_k%7D%7D+%5Cright%29%7B%7B%5Ctilde+P%7D_k%7D%5C%5C%0A%7B%7B%5Chat+x%7D_k%7D+%3D+%7B%7B%5Ctilde+x%7D_k%7D+%2B+%7BK_k%7D%5Cleft%28+%7B%7By_k%7D+-+g%28%7B%7B%5Ctilde+x%7D_k%7D%2C0%29%7D+%5Cright%29%0A%5Cend%7Barray%7D%5C%5D& alt=&\[\begin{array}{l}
{{\tilde P}_k} = {F_{k - 1}}{{\hat P}_{k - 1}}F_{k - 1}^T + Q_k'\\
{{\tilde x}_k} = f\left( {{{\hat x}_{k - 1}},{v_k},0} \right)\\
{K_k} = {{\tilde P}_k}G_k^T{\left( {{G_k}{{\tilde P}_k}G_k^T + R_k'} \right)^{ - 1}}\\
{{\hat P}_k} = \left( {I - {K_k}{G_k}} \right){{\tilde P}_k}\\
{{\hat x}_k} = {{\tilde x}_k} + {K_k}\left( {{y_k} - g({{\tilde x}_k},0)} \right)
\end{array}\]& eeimg=&1&&
其中&img src=&//www.zhihu.com/equation?tex=%5C%5BF_%7Bk-1%7D+%3D+%7B%5Cleft.+%7B%5Cfrac%7B%7B%5Cpartial+f%7D%7D%7B%7B%5Cpartial+%7Bx_%7Bk+-+1%7D%7D%7D%7D%7D+%5Cright%7C_%7B%7B%7B%5Chat+x%7D_%7Bk+-+1%7D%7D%7D%7D%2C%7BG_k%7D+%3D+%7B%5Cleft.+%7B%5Cfrac%7B%7B%5Cpartial+g%7D%7D%7B%7B%5Cpartial+%7Bx_k%7D%7D%7D%7D+%5Cright%7C_%7B%7B%7B%5Ctilde+x%7D_k%7D%7D%7D%5C%5D& alt=&\[F_{k-1} = {\left. {\frac{{\partial f}}{{\partial {x_{k - 1}}}}} \right|_{{{\hat x}_{k - 1}}}},{G_k} = {\left. {\frac{{\partial g}}{{\partial {x_k}}}} \right|_{{{\tilde x}_k}}}\]& eeimg=&1&&&br&&br&这样做听起来还是挺有道理的,实际上也是能用的,但是问题还是很多的。&br&考虑一个服从高斯分布的变量&img src=&//www.zhihu.com/equation?tex=x+%5Csim+N%280%2C1%29& alt=&x \sim N(0,1)& eeimg=&1&&,现在&img src=&//www.zhihu.com/equation?tex=y%3Dx%5E2& alt=&y=x^2& eeimg=&1&&,问&img src=&//www.zhihu.com/equation?tex=y& alt=&y& eeimg=&1&&服从什么分布?&br&我概率比较差,不过这个似乎是叫做卡尔方布。&img src=&//www.zhihu.com/equation?tex=y& alt=&y& eeimg=&1&&应该是下图中k=1那条线。&br&&figure&&img src=&https://pic1.zhimg.com/50/a0dc2dcc745ddcfc6729ea_b.jpg& data-rawwidth=&1134& data-rawheight=&854& class=&origin_image zh-lightbox-thumb& width=&1134& data-original=&https://pic1.zhimg.com/50/a0dc2dcc745ddcfc6729ea_r.jpg&&&/figure&但是按照EKF的观点,我们要用一个高斯分布去近似&img src=&//www.zhihu.com/equation?tex=y& alt=&y& eeimg=&1&&。假设我们采样时得到了一个&img src=&//www.zhihu.com/equation?tex=x%3D0.5& alt=&x=0.5& eeimg=&1&&,那么就会近似成一个均值为0.25的高斯分布,然而卡方分布的期望应该是1。……但是各位真觉得k=1那条线像哪个高斯分布吗?&br&&br&所以EKF面临的一个重要问题是,当一个高斯分布经过非线性变换后,如何用另一个高斯分布近似它?按照它现在的做法,存在以下的局限性:(注意是滤波器自己的局限性,还没谈在SLAM问题里的局限性)。&br&&ol&&li&即使是高斯分布,经过一个非线性变换后也不是高斯分布。EKF只计算均值与协方差,是在用高斯近似这个非线性变换后的结果。(实际中这个近似可能很差)。&/li&&li&系统本身线性化过程中,丢掉了高阶项。&/li&&li&线性化的工作点往往不是输入状态真实的均值,而是一个估计的均值。于是,在这个工作点下计算的&img src=&//www.zhihu.com/equation?tex=F%2CG& alt=&F,G& eeimg=&1&&,也不是最好的。&/li&&li&在估计非线性输出的均值时,EKF算的是&img src=&//www.zhihu.com/equation?tex=%5Cmu_y%3Df%28%5Cmu_x%29& alt=&\mu_y=f(\mu_x)& eeimg=&1&&的形式。这个结果几乎不会是输出分布的真正期望值。协方差也是同理。&/li&&/ol&&br&那么,怎么克服以上的缺点呢?途径很多,主要看我们想不想维持EKF的假设。如果我们比较乖,希望维持高斯分布假设,可以这样子改:&br&&ol&&li&为了克服第3条工作点的问题,我们以EKF估计的结果为工作点,重新计算一遍EKF,直到这个工作点变化够小。是为迭代EKF(Iterated EKF, IEKF)。&/li&&li&为了克服第4条,我们除了计算&img src=&//www.zhihu.com/equation?tex=%5Cmu_y%3Df%28%5Cmu_x%29& alt=&\mu_y=f(\mu_x)& eeimg=&1&&,再计算其他几个精心挑选的采样点,然后用这几个点估计输出的高斯分布。是为Sigma Point KF(SPKF,或UKF)。&/li&&/ol&&br&如果不那么乖,可以说:&b&我们不要高斯分布假设,凭什么要用高斯去近似一个长得根本不高斯的分布呢?&/b&于是问题变为,丢掉高斯假设后,怎么描述输出函数的分布就成了一个问题。一种比较暴力的方式是:用足够多的采样点,来表达输出的分布。这种蒙特卡洛的方式,也就是粒子滤波的思路。&br&&br&如果再进一步,可以丢弃滤波器思路,说:&b&为什么要用前一个时刻的值来估计下一个时刻呢&/b&?&b&我们可以把所有状态看成变量,把运动方程和观测方程看成变量间的约束,构造误差函数,然后最小化这个误差的二次型。&/b&这样就会得到非线性优化的方法,在SLAM里就走向图优化那条路上去了。不过,非线性优化也需要对误差函数不断地求梯度,并根据梯度方向迭代,因而局部线性化是不可避免的。&br&&br&可以看到,在这个过程中,我们逐渐放宽了假设。&br&&br&============== &b&UKF 无迹卡尔曼 &/b&==================&br&由于题主问题里没谈IEKF,我们就简单说说UKF和PF。&br&UKF主要解决一个高斯分布经过非线性变换后,怎么用另一个高斯分布近似它。假设&img src=&//www.zhihu.com/equation?tex=x+%5Csim+N%28%5Cmu_x+%5CSigma_%7Bxx%7D+%29%2C+y%3Dg%28x%29& alt=&x \sim N(\mu_x \Sigma_{xx} ), y=g(x)& eeimg=&1&&,我们希望用&img src=&//www.zhihu.com/equation?tex=N%28%5Cmu_y%2C+%5CSigma_%7Byy%7D%29& alt=&N(\mu_y, \Sigma_{yy})& eeimg=&1&&近似&img src=&//www.zhihu.com/equation?tex=y& alt=&y& eeimg=&1&&。按照EKF,需要对&img src=&//www.zhihu.com/equation?tex=g& alt=&g& eeimg=&1&&做线性化。但在UKF里,不必做这个线性化。&br&UKF的做法是找一些叫做Sigma Point的点,把这些点用&img src=&//www.zhihu.com/equation?tex=g& alt=&g& eeimg=&1&&投影过去。然后,用投影之后的点做出一个高斯分布,如下图:&br&&figure&&img src=&https://pic4.zhimg.com/50/4ec9ce019bfa0cac3cca41_b.jpg& data-rawwidth=&807& data-rawheight=&348& class=&origin_image zh-lightbox-thumb& width=&807& data-original=&https://pic4.zhimg.com/50/4ec9ce019bfa0cac3cca41_r.jpg&&&/figure&这里选了三个点:&img src=&//www.zhihu.com/equation?tex=%5Cmu_x%2C+%5Cmu_x%2B%5Csigma_x%2C+%5Cmu_x-%5Csigma_x& alt=&\mu_x, \mu_x+\sigma_x, \mu_x-\sigma_x& eeimg=&1&&。对于维数为N的分布,需要选2N+1个点。篇幅所限,这里就不解释这些点怎么选,以及为何要这样选了。总之UKF的好处就是:&br&&ul&&li&不必线性化,也不必求导,对&img src=&//www.zhihu.com/equation?tex=g& alt=&g& eeimg=&1&&没有光滑性要求。&/li&&li&计算量随维数增长是线性的。&/li&&/ul&&br&=============== &b&PF 粒子滤波&/b& ==================&br&UKF的一个问题是输出仍假设成高斯分布。然而,即使在很简单的情况下,高斯的非线性变换仍然不是高斯。并且,仅在很少的情况下,输出的分布有个名字(比如卡方),多数时候你都不知道他们是啥……更别提描述它们了。&br&因为描述很困难,所以粒子滤波器采用了一种暴力的,用大量采样点去描述这个分布的方法(老子就是无参的你来打我呀)。框架大概像下面这个样子,就是一个不断采样——算权重——重采样的过程:&br&&figure&&img src=&https://pic3.zhimg.com/50/792fab6b2722deeaededbf_b.jpg& data-rawwidth=&789& data-rawheight=&311& class=&origin_image zh-lightbox-thumb& width=&789& data-original=&https://pic3.zhimg.com/50/792fab6b2722deeaededbf_r.jpg&&&/figure&越符合观测的粒子拥有越大的权重,而权重越大就越容易在重采样时被采到。当然,每次采样数量、权重的计算策略,则是粒子滤波器里几个比较麻烦的问题,这里就不细讲了。&br&这种采样思路的最大问题是:&b&采样所需的粒子数量,随分布是指数增长的&/b&。所以仅限于低维的问题,高维的基本就没办法了。&br&&br&=============== &b&非线性优化&/b& ==================&br&非线性优化,计算的也是最大后验概率估计(MAP),但它的处理方式与滤波器不同。对于上面写的状态估计问题,可以简单地构造误差项:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cbegin%7Barray%7D%7Bl%7D%0A%7Be_%7Bv%2Ck%7D%7D%5Cleft%28+x+%5Cright%29+%3D+%7Bx_k%7D+-+f%5Cleft%28+%7B%7Bx_%7Bk+-+1%7D%7D%2C%7Bv_k%7D%2C0%7D+%5Cright%29%5C%5C%0A%7Be_%7By%2Ck%7D%7D%5Cleft%28+x+%5Cright%29+%3D+%7By_k%7D+-+g%5Cleft%28+%7B%7Bx_k%7D%2C0%7D+%5Cright%29%0A%5Cend%7Barray%7D%5C%5D& alt=&\[\begin{array}{l}
{e_{v,k}}\left( x \right) = {x_k} - f\left( {{x_{k - 1}},{v_k},0} \right)\\
{e_{y,k}}\left( x \right) = {y_k} - g\left( {{x_k},0} \right)
\end{array}\]& eeimg=&1&&&br&然后最小化这些误差项的二次型:&br&&img src=&//www.zhihu.com/equation?tex=%5C%5B%5Cmin+J%5Cleft%28+x+%5Cright%29+%3D+%5Csum%5Climits_%7Bk+%3D+1%7D%5EK+%7B%5Cleft%28+%7B%5Cfrac%7B1%7D%7B2%7D%7Be_%7Bv%2Ck%7D%7D%7B%7B%5Cleft%28+x+%5Cright%29%7D%5ET%7DW_%7Bv%2Ck%7D%5E%7B+-+1%7D%7Be_%7Bv%2Ck%7D%7D%5Cleft%28+x+%5Cright%29%7D+%5Cright%29+%2B+%5Csum%5Climits_%7Bk+%3D+1%7D%5EK+%7B%5Cleft%28+%7B%5Cfrac%7B1%7D%7B2%7D%7Be_%7By%2Ck%7D%7D%7B%7B%5Cleft%28+x+%5Cright%29%7D%5ET%7DW_%7Bv%2Ck%7D%5E%7B+-+1%7D%7Be_%7Bv%2Ck%7D%7D%5Cleft%28+x+%5Cright%29%7D+%5Cright%29%7D+%7D+%5C%5D& alt=&\[\min J\left( x \right) = \sum\limits_{k = 1}^K {\left( {\frac{1}{2}{e_{v,k}}{{\left( x \right)}^T}W_{v,k}^{ - 1}{e_{v,k}}\left( x \right)} \right) + \sum\limits_{k = 1}^K {\left( {\frac{1}{2}{e_{y,k}}{{\left( x \right)}^T}W_{v,k}^{ - 1}{e_{v,k}}\left( x \right)} \right)} } \]& eeimg=&1&&&br&这里仅用到了噪声项满足高斯分布的假设,再没有更多的了。当构建一个非线性优化问题之后,就可以从一个初始值出发,计算梯度(或二阶梯度),优化这个目标函数。常见的梯度下降策略有牛顿法、高斯-牛顿法、Levenberg-Marquardt方法,可以在许多讲数值优化的书里找到。&br&&br&非线性优化方法现在已经成为视觉SLAM里的主流,尤其是在它的稀疏性质被人发现且利用起来之后。它与滤波器最大不同点在于, 一次可以考虑整条轨迹中的约束。它的线性化,即雅可比矩阵的计算,也是相对于整条轨迹的。相比之下,滤波器还是停留在马尔可夫的假设之下,只用上一次估计的状态计算当前的状态。可以用一个图来表达它们之间的关系:&br&&figure&&img src=&https://pic1.zhimg.com/50/b67b863d41f5e4e762dde44c516cb35c_b.jpg& data-rawwidth=&684& data-rawheight=&438& class=&origin_image zh-lightbox-thumb& width=&684& data-original=&https://pic1.zhimg.com/50/b67b863d41f5e4e762dde44c516cb35c_r.jpg&&&/figure&当然优化方式也存在它的问题。例如优化时间会随着节点数量增长——所以有人会提double window optimization这样的方式,以及可能落入局部极小。但是就目前而言,它比EKF还是优不少的。&br&&br&=============== &b&小结&/b& ==================&br&&ol&&li&&b&卡尔曼滤波是递归的线性高斯系统最优估计。&/b&&/li&&li&&b&EKF将NLNG系统在工作点附近近似为LG进行处理。&/b&&/li&&li&&b&IEKF对工作点进行迭代。&/b&&/li&&li&&b&UKF没有线性化近似,而是把sigma point进行非线性变换后再用高斯近似。&/b&&/li&&li&&b&PF去掉高斯假设,以粒子作为采样点来描述分布。&/b&&/li&&li&&b&优化方式同时考虑所有帧间约束,迭代线性化求解。&/b&&/li&&/ol&呃好像题主还问了FastSLAM,有空再写吧……&br&&br&注:&br&* 本文大量观点来自Timothy. Barfoot, &State estimation for Robotics: A Matrix Lei Group Approach&, 2016. 图片若有侵权望告知。
我怎么会写得那么长……如果您有兴趣可以和我一块把公式过一遍。 要讲清这个问题,得从状态估计理论来说。先摆上一句名言: 状态估计乃传感器之本质。(To understand the need for state estimation is to understand the nature of sensors.)任何传感器…
@鲁灵犀答主主要说的是基于视觉的bundleadjustment的方法,我倒是觉得如果是入门的话,首推《probabilistic robotics》.私以为这是一本所有做自主移动机器人的都应该好好读的书。作者从运动模型到感知模型,逐步建立了slam的虑波器方法,包括externed kalmen filter 和particle filter.当然在十一章作者也介绍了图优化的理论。当然啦,急于优化理论做视觉slam,sfm,&multiple view geometry in computer vision&是圣经,不过还需要些计算机视觉的基础知识,特征提取啊,图像金字塔之类的。&br&放张图片搞个笑。&br&&figure&&img src=&https://pic4.zhimg.com/50/cb4bced3cbaec_b.jpg& data-rawwidth=&366& data-rawheight=&449& class=&content_image& width=&366&&&/figure&&br&ps我也做视觉slam。&br&&br&虑波器方法是最早用来做slam的方法,它讲slam理解成一种估计问题。有系统的理论,适合入门打基础。现在比较就行的是优化方法,做视觉的话,还分为rgbd,stereo,monocular等方案。&br&&br&推荐 几篇文章:&br&SimultaneousLocalisationandMapping(SLAM):Part 1&br&SimultaneousLocalisationandMapping(SLAM):Part 2&br&&br&这两篇文章主要介绍,slam问题的模型,以及滤波器方法,适合入门&br&&br&做visual slam的话,推荐visual odometry part 1和part 2&br&visual odometry 和 visual slam基本是同质的问题,只不过关注的点各有侧重,odometry注重的是当前实时性,slam 注重的是全局的优化。这两篇文章归纳了做odometry(slam)的三种主流的feature-based算法:&br&1.2D-to-2D correspondences&br&2.3D-to-3D correspondences&br&3.2D-to-3D correspondences&br&&br&其中3最流行,包括07年的ptam,最近的orbslam等。&br&&br&另外,去年到今年,基于appearance-based的方法也出现了很多令人印象深刻的作品,如Dtam,svo,lsdslam等&br&&figure&&img src=&https://pic4.zhimg.com/50/6f0adedc634ae_b.jpg& data-rawwidth=&793& data-rawheight=&592& class=&origin_image zh-lightbox-thumb& width=&793& data-original=&https://pic4.zhimg.com/50/6f0adedc634ae_r.jpg&&&/figure&
@鲁灵犀答主主要说的是基于视觉的bundleadjustment的方法,我倒是觉得如果是入门的话,首推《probabilistic robotics》.私以为这是一本所有做自主移动机器人的都应该好好读的书。作者从运动模型到感知模型,逐步建立了slam的虑波器方法,包括externed kalme…
SLAM涵盖的东西比较多,分为前端和后端两大块。前端主要是研究相邻帧的拼接,又叫配准。根据传感器不一样,有激光点云、图像、RGB-D拼接几种,其中图像配准中又分基于稀疏特征(Sparse)的和稠密(Dense)的两种。后端主要是研究地图拼接(前端)中累积误差的校正,主流就两种,基于概率学理论的贝叶斯滤波器(EKF,PF)以及基于优化的方法。EKF已经用得很少了,PF也就在2D地图SLAM(Gmapping)中用得多,大多还是用优化的方法在做。&br&&br&你自己已经说了这块需要的知识,一个是数学,一个是编程。所以入门的话,也从这两块开始弄。&br&一、数学方面&br&数学的话,建议楼上说过的Thrun的《probabilistic robotics》,其实不需要全部看完,了解下概率学是如何解决机器人中的问题的,关键学习贝叶斯滤波,也是就是贝叶斯公式在各个问题(定位,SLAM)中的应用。另外,优化的话,建议先把最小二乘优化中给弄透彻,数学推导要会,因为很多问题,最后都是归结到最小二乘优化,然后就是梯度下降、求Jacobian之类的。&br&二、编程方面&br&理论的东西是比较无聊的,必须得实战。建议入门先写一发最小二乘优化,可以就做一个简单的直线拟合,不要用Matlab中的优化工具,了解数学推导最后是怎么写到代码里面的。然后,一定要玩好Matlab优化工具包,做实验最方便了。&br&有了一些基础之后,可以尝试玩一些现有的SLAM包,推荐两个地方,一个是www.&b&openslam&/b&.org,里面有各种SLAM包,主流的SLAM算法,在这一般都有源码。另外一个就是ROS了,里面有很多现成的SLAM包,像Gmapping,RGB-D SLAM,上手非常快,甚至你没有任何设备,你也可以利用ROS中的仿真环境(如Gazebo)跑。建议先试试Gmapping,百度上有很多中文教程,一开始跑这些package还是很涨成就感的,可以提高你的兴趣。&br&如果你是做视觉或者RGB-D,那么OpenCV和PCL是必不可少的工具。早点上手肯定没得错。&br&三、进阶&br&大体入门之后,你就需要根据你实验室研究的项目来学习了,看是用激光、相机、还是Kinect来做了,不同传感器的前端算法还是有些差距的。激光的话一般是ICP,相对简单。视觉的东西还是比较多的,楼上推荐《Multiview Geometry in Computer Vision》确实很重要,不过,我觉得这同时你还应该了解特征提取、特征描述子、特征匹配这些东西。如果你们实验室做的Dense registration,那你还得学李代数那些东西(高大上啊,神马李群看好多天都看不懂啊!!!)。其实,很多算法都有开源包,你可以去ROS、一些大神博客、牛逼实验室主页中多逛逛。&br&四、学渣只能帮你到这了,再后面就不会了,再往后就得找真大神了。
SLAM涵盖的东西比较多,分为前端和后端两大块。前端主要是研究相邻帧的拼接,又叫配准。根据传感器不一样,有激光点云、图像、RGB-D拼接几种,其中图像配准中又分基于稀疏特征(Sparse)的和稠密(Dense)的两种。后端主要是研究地图拼接(前端)中累积误差的校正…
&p&首先搬出宝典:&a href=&//link.zhihu.com/?target=http%3A//www.robots.ox.ac.uk/%7Evgg/hzbook/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Multiple View Geometry in Computer Vision&/a&。这本书基本涵盖了Vision-based SLAM这个领域的全部理论基础!读多少遍都不算多!另外建议配合Berkeley的课件学习。(&b&更新&/b&:这本书书后附录也可以一并读完,包括附带bundle adjustment最基本的levenberg marquardt方法,newton方法等)&/p&&br&&p&只要是SLAM问题就要涉及optimization,就要用到各种least square算法。所以另一个基础理论是Sparse Matrix,这是大型稀疏矩阵处理的一般办法。可以参考Dr. Tim Davis的课件:&a href=&//link.zhihu.com/?target=http%3A//faculty.cse.tamu.edu/davis/welcome.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tim Davis&/a& ,他的主页里有全部的课程视频和Project。针对SLAM问题,最常用的least square算法是Sparse Levenberg Marquardt algorithm,这里有一份开源的代码以及具体实现的paper:&a href=&//link.zhihu.com/?target=http%3A//users.ics.forth.gr/%7Elourakis/sparseLM/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sparse Non-Linear Least Squares in C/C++&/a&&/p&&br&&p&然后是框架级的工具。最常用的机器人框架是ROS&a href=&//link.zhihu.com/?target=http%3A//www.ros.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ROS.org | Powering the world's robots&/a&,可以使用在Windows,Linux和MacOS等操作系统上,里面包含一整套常用的机器人理论的算法和工具的实现。另一个开源工具集是OpenSLAM &a href=&//link.zhihu.com/?target=https%3A//www.openslam.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OpenSLAM.org&/a&,其中的g2o是目前最流行的graph optimization的实现工具。另外OpenCV也是视觉相关必备的基础工具,Multiple View教材中的常用算法在OpenCV中都有常用的实现。(&b&更新&/b&:OpenCV的文档&a href=&//link.zhihu.com/?target=http%3A//docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Camera Calibration and 3D Reconstruction&/a& 中,包含SLAM相关的基础理论公式以及C/C++/Python实现的API)&/p&&br&&p&另外多说一句题外话,因为Optimization和图片的feature extraction是SLAM里最核心的两个问题,而这两个问题都是运算量极大的。好的SLAM框架要兼顾速度和精确度。目前大部分Vision或者RGBD的SLAM框架都是用C++来时实现完成的以确保运算速度。虽然我个人很欣赏Python,并且Python3也支持SciPy,OpenCV,ROS等重要工具,不过依然有大量的诸如g2o等基础性库在python下无法使用,而且如果要借鉴其他人的代码,最方便的还是在C++中实现。所以如果提问者有志于在这个领域做深入研究,夯实的C++基础是必不可少的。Introduction to Algorithms,以及 &a class=&member_mention& href=&//www.zhihu.com/people/ecc0ec035f& data-editable=&true& data-title=&@vczh& data-hash=&ecc0ec035f& data-tip=&p$b$ecc0ec035f& data-hovercard=&p$b$ecc0ec035f&&@vczh&/a& 推荐的C++ Primer等,都是在实际工作前要自己做好的功课。&/p&&br&&p&下面说一些硬件和实验上的知识储备。首先Vision-based SLAM常用摄像机标定(Camera Calibration)的世界通用简单方法,是张正友博士(Dr. Zhengyou Zhang,主页&a href=&//link.zhihu.com/?target=http%3A//research.microsoft.com/en-us/um/people/zhang/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Zhengyou Zhang's Home Page&/a&)的方法(张正友博士是本领域里少数的具有极其巨大影响力和贡献的华人学者,已成脑残粉嘤嘤嘤)。具体方法和实现,我在这里推荐两个,一个是Caltech工具箱:&a href=&//link.zhihu.com/?target=http%3A//www.vision.caltech.edu/bouguetj/calib_doc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Camera Calibration Toolbox for Matlab&/a& ,以及相关paper:&a href=&//link.zhihu.com/?target=http%3A//www.vision.caltech.edu/bouguetj/calib_doc/htmls/ref.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Camera Calibration Toolbox for Matlab&/a&。该方法的另一个实现,是Matlab最新版本内置的Camera Calibration的application,自动导入标定图片并把得到的结果输出给Matlab,更加自动化,更加便捷准确。更多的Camera Model理论知识请参考Multiple View Geometry。&/p&&br&&p&至于RGB-D Camera,最常用的采集设备有两种,一种是Microsoft Kinect,一个生态环境完备的RGBD Camera,可以直接用Visual Studio可Kinect SDK直接开发,也有大量开发好的程序以供借鉴参考,也可以用OpenNI和ROS采集处理,我就不多介绍了,毕竟微软是对程序员最友好的公司没有之一(微软大法好)。另一个是Google的Project Tango,Google对于这个自家的神器还是很低调的,可以看看宣传片&a href=&//link.zhihu.com/?target=https%3A//www.google.com/atap/projecttango/%23project& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ATAP Project Tango&/a& ,绝对酷炫——可惜我们lab刚刚买的那一台,我还没有用过,所以对具体开发不太了解。&/p&&br&&p&另外有几个网上成熟的数据集和测试方法,一个是Malaga Dataset,一个西班牙的团队采集的Malaga城市数据:&a href=&//link.zhihu.com/?target=http%3A//www.mrpt.org/MalagaUrbanDataset& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Málaga Stereo and Laser Urban Data Set&/a&,覆盖了城市中汽车驾驶的各种情况(停车,加速,减速,行人,建筑,绿化带等),里面提供了双摄像头,Laser,IMU等数据以及GPS的ground truth trajectory。不过该版本因为是在市中心,所以GPS的ground truth并不可靠。另一个是慕尼黑工业大学Computer Vision Lab的RGB-D&/p&&p&dataset &a href=&//link.zhihu.com/?target=https%3A//vision.in.tum.de/data/datasets/rgbd-dataset& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&vision.in.tum.de/data/d&/span&&span class=&invisible&&atasets/rgbd-dataset&/span&&span class=&ellipsis&&&/span&&/a&,里面提供了大量的室内的RGBD数据集,以及非常方便好用的benchmark tools。第三个是KITTI Dataset:&a href=&//link.zhihu.com/?target=http%3A//www.cvlibs.net/datasets/kitti/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The KITTI Vision Benchmark Suite&/a&,也是认可度很广泛的汽车驾驶数据集。&/p&&br&&br&&br&原答案链接:&a href=&http://www.zhihu.com/question//answer/& class=&internal&&去美国读CS博士,方向是机器人导航,视觉方面,推荐一下相关编程方面准备?还有相关算法需要学习哪些? - 立党的回答&/a&&br&&br&光收藏不点赞,bs你们(手动斜眼
首先搬出宝典:。这本书基本涵盖了Vision-based SLAM这个领域的全部理论基础!读多少遍都不算多!另外建议配合Berkeley的课件学习。(更新:这本书书后附录也可以一并读完,包括附带bundle adjustment最基本的lev…
这里推荐 RA magazine 首页的几篇 tutorial 性质的论文。RAM 是 robotics 领域最顶尖的期刊之一,这几篇都是著名学者写给学术新人的入门读物,希望对题主有所帮助。&br&&br&&ul&&li&Visual Servoing: &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpls/abs_all.jsp%3Farnumber%3D538972& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 1&/a&, &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpls/abs_all.jsp%3Farnumber%3D4141039& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 2&/a&&/li&&li&SLAM: &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpls/abs_all.jsp%3Farnumber%3D1638022& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 1&/a&, &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpls/abs_all.jsp%3Farnumber%3D1678144& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 2&/a&&/li&&li&6D Vectors: &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpls/abs_all.jsp%3Farnumber%3D5569032& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 1&/a&, &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpls/abs_all.jsp%3Farnumber%3D5663690& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 2&/a&&/li&&li&Planning: &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpl/freeabs_all.jsp%3Farnumber%3D5751929& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 1&/a&, &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpl/freeabs_all.jsp%3Farnumber%3D5876226& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 2&/a&&/li&&li&Visual Odometry: &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpl/freeabs_all.jsp%3Farnumber%3D6096039& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 1&/a&, &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpls/abs_all.jsp%3Farnumber%3D6153423& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 2&/a&&/li&&li&Point Cloud Library: &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpl/articleDetails.jsp%3Farnumber%3D6299166& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tutorial&/a&&/li&&li&Quadrotors: &a href=&//link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/xpl/articleDetails.jsp%3Farnumber%3D6289431& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tutorial&/a&&/li&&/ul&&br&RAM 首页:&a href=&//link.zhihu.com/?target=http%3A//www.ieee-ras.org/publications/ram& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RA Magazine - IEEE Robotics and Automation Society&/a&
这里推荐 RA magazine 首页的几篇 tutorial 性质的论文。RAM 是 robotics 领域最顶尖的期刊之一,这几篇都是著名学者写给学术新人的入门读物,希望对题主有所帮助。 V

我要回帖

更多关于 王小Y 的文章

 

随机推荐