连载文章,长期更新,欢迎关注:
机器人技术的本质可以用图6-24所示的模型来表示,模型中主要包括感知、决策和交互3个部分。机器人通过搭载的传感器对环境进行感知,即传感器是机器人系统的输入端;机器人通过搭载的执行机构与环境进行交互,即执行机构是机器人系统的输出端;决策作为机器人的中枢系统连接输入端和输出端。决策由低智能的认知层和高智能的逻辑推理层构成,常见的人脸识别、语音识别、机器人定位、机器人避障等都属于低智能的认知层,而复杂的逻辑推理在机器人中还很难实现。
通过计算机中复杂的决策算法,让机器人实现完全自主化是人类一直以来的梦想。所谓完全自主化,就是在完全没有外界指令的干预下,机器人能通过传感器和执行机构与环境自动发生交互,并完成特定的任务。比如,自主与人类发生语言和情感交流,自主识别、抓取和操控物体,自主移动等。由于我们生活在一个三维空间环境中,在环境空间中移动是机器人与环境发生交互最基本的形式之一,因此自主移动也被誉为机器人自主化的“圣杯”。
自主移动实质上就是解决从地点A到地点B的问题,这个问题看似简单,实则非常复杂。考虑更一般的情况,机器人必须能在完全未知的环境下,通过探索方式去认识环境并获取自身在环境中的定位信息,在知道了自身定位点A和目标定位点B后,在考虑避开障碍的前提下沿规划路径移动。经过近几十年来的研究,形成了一套有效解决机器人自主移动的方案,即SLAM导航方案。如图6-28所示,SLAM导航方案由建图(mapping)、定位(localization)和路径规划(path planning)3大基本问题组成,这3大问题互相重叠和嵌套又组成新的问题,也就是SLAM问题、导航问题、探索问题等,这也是本书接下来的章节将要逐一讨论的问题。
本章是讨论SLAM问题的开篇,将带领大家了解SLAM问题的内在理论,即SLAM中的数学基础。
7.1 SLAM发展简史
7.1.1 数据关联、收敛和一致性
7.1.2 SLAM研究方向
7.2 SLAM中的概率理论
7.2.1 状态估计问题
7.2.2 概率运动模型
7.2.3 概率观测模型
7.2.4 概率图模型
7.3 估计理论
7.3.1 估计量的性质
7.3.2 估计量的构建
7.3.3 各估计量对比
7.4 基于贝叶斯网络的状态估计
7.4.1 贝叶斯估计
7.4.2 参数化实现
7.4.3 非参数化实现
7.5 基于因子图的状态估计
7.5.1 非线性最小二乘估计
7.5.2 直接求解方法
7.5.3 优化方法
7.5.4 各优化方法对比
7.5.5 常用优化工具
7.6 SFM、BA和SLAM比较
7.7 典型SLAM算法
7.7.1 EKF-SLAM
7.7.2 Fast-SLAM
7.7.3 Graph-SLAM
7.7.4 现今主流SLAM算法
本章首先对SLAM发展历史进行了回顾,并给出了学习动向图,帮助读者快速把握学习的整体脉络。然后讨论了SLAM中所涉及到的最基础概率理论,包括概率运动模型、概率观测模型以及将运动与观测联系在一起的概率图模型。根据概率图模型中的贝叶斯网络和因子图两类表示方法,将引出滤波方法和优化方法两大SLAM求解方法。在开始学习滤波方法和优化方法之前,还需要一些估计理论的知识,故对最大似然估计、最小二乘估计、贝叶斯估计、最小均方误差估计和最大后验估计进行了系统的讲解。然后讨论了基于贝叶斯网络表示的滤波方法实现,主要是参数滤波和非参数滤波;而基于因子图表示的最小二乘问题,有直接法和优化法两种解法,优化法是讨论的重点。在学习完前面SLAM基础理论后,本章结尾系统地讨论归纳了各种具体SLAM系统实现框架。
SLAM问题涉及到概率、图论、状态估计、滤波、优化等一系列基础理论,为了将SLAM问题的来龙去脉讲清楚,我在写作本章时花费了大量时间研究整理这些基础理论及其内在的联系,并根据SLAM讨论的需要对各种符号和概念尽量做到统一性地表述。虽然这些年SLAM研究取得了无数举世瞩目的成果,但是国内的研究状态还处于起步阶段,相关专业学习资料很少,并兼理论性和实践性的系统化归纳整理资料就更少了。为了帮助国内的广大学习者更深入地理解SLAM技术,本章对SLAM数学理论进行了系统性梳理,通过对SLAM数学理论发展演进过程的介绍,帮助广大学习者把握SLAM技术背后的本质。想要学好SLAM,需要在全局性把握理论本质的基础上,将具体的SLAM实现算法在机器人本体上用起来。单纯地学习理论知识,或单纯地跑跑SLAM实现算法,都无法达到融会贯通的效果,更不用说依据实际需求修改完善开源SLAM代码或编写自己的SLAM代码了。本章是整本书最核心的章节,涉及到的很多数学理论对于初学者来说确实难理解,但是大家要克服畏难情绪,可以在学习完整本书后,回头再来看之前一些不懂的地方。
SLAM是一个理论性和工程性都很强的课题,掌握了理论部分后,还需要结合实际项目示例真正将SLAM系统用起来。所以接下来的章节将通过讲解各种现今主流SLAM框架的应用,让大家真正将SLAM用起来,并能根据实际需求修改和完善开源SLAM代码。
Gitee下载(国内访问速度快):gitee.com/xiihoo-robot/Books_Robot_SLAM_Navigation
【1】 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只