1. 程式人生 > >六. 先有雞還是先有蛋?--SLAM

六. 先有雞還是先有蛋?--SLAM

在機器人發展早期,人們已經開始研究移動機器人的定位問題。按正常思維來說,機器人想要知道自己位置,或者從A點走到B點,需要先有一張地圖,然後用演算法在地圖上先規劃出路線,然後機器人再沿著規劃出來的路線走。但問題來了,對於一個新環境,機器人就需要先構建一個地圖,但構建地圖的過程中,機器人又需要知道自己的位置,否則畫出來的圖可能跟現實差了十萬八千里(當不閉環的時候)。為了解決這個問題,研究者們提出了一個一石二鳥的方法,也就是即時定位與地圖構建(Simultaneous Localization and Mapping, SLAM)

關於SLAM的文章可以在網上搜到一大堆,在這裡只做科普性的解說,讓初學者對SLAM有個概念。

SLAM按照其架構一般可以分解成前端和後端。 前端主要做視覺相關的東西,像識別,匹配。而後端主要做圖優化,閉環。

舉個簡單的例子,假設你出國旅遊的時候被綁架了,犯人把你押到一輛車上面,但是你可以從車窗看到沿途的景物。這個時候你就得使出吃奶的勁去記住沿途到底經過了哪些建築了。一般來說,我們只會去記一些有特徵的建築或者標記,比如說麥當勞,肯德基,萬達,等等,對於沒有特徵的居民樓,我們肯定是不會浪費有限的記憶空間去記住的。而這些有特徵的標記,在SLAM中就充當landmark的角色,在機器視覺中,這些landmark可以是二維碼,也可以是一些特徵點,總之是機器人第二次看見他們的時候能夠認出來我見過這些個東西的東西都能用作landmark(這個過程其實就是匹配),系統前端做的東西大概就是這些。

當你正在手忙腳亂的記landmark的時候,犯人接到了一個電話,說綁錯人了,他要綁架的是富豪的兒子,而你明明是個窮二代。犯人一怒之下把你踹下車,然後揚長而去。然而你已經被送到了一個陌生城市,手機也被拿走了,語言也不通,你只能靠記憶走回去原來的地方。這時候後端就發揮作用了。由於車來的時候走的是高速,你無法沿路往回走,只能走旁邊的路,這時候你經過了一個麥當勞(一個landmark),但你不確定這是哪個麥當勞,因為路上經過的麥當勞實在太多了。而恰好你發現麥當勞旁邊還有一個加油站,於是你一下子就想起了自己處於哪個路段(定位加閉環)。然後你繼續往前走,發現又是麥當勞旁邊有一個加油站,這時候你猶豫了。到底哪個才是剛剛走過的位置?帶著疑問你只好繼續往前走,終於你見到的landmark越來越多,對自己的定位越來越熟悉。直到最後回到原來的位置。

用一個圖來表示的話,左邊代表閉合失敗,也就是已經走到了原來的位置,但是機器人沒認出來,以為是新的位置(由於輪子里程碑的誤差,不加後端時候走出來的圖一般就是左邊的圖),而右圖就代表閉環成功。在實際應用中,機器人一般需要閉環很多次,而每一次閉環後端都會優化路徑(推測機器人實際走過的距離,轉過的角度)。而這個建圖的過程現階段還是需要人來控制的,因為只能是人來判斷圖建的好不好。也希望後續會有好的自動建圖方法能被提出來。

想要動手或者想看看建圖過程的童鞋,本人推薦用turtlebot,通過ros和gazebo來模擬建圖。

相關推薦

. 還是?--SLAM

在機器人發展早期,人們已經開始研究移動機器人的定位問題。按正常思維來說,機器人想要知道自己位置,或者從A點走到B點,需要先有一張地圖,然後用演算法在地圖上先規劃出路線,然後機器人再沿著規劃出來的路線走。但問題來了,對於一個新環境,機器人就需要先構建一個地圖,但構建地圖的過程中

用 C# 編寫 C# 編譯器,還是

前段時間翻譯了一篇文章 微軟是如何重寫 C# 編譯器並使它開源的,文章講了微軟用 C# 重寫 C# 編譯器的坎坷路,引發了一些童鞋的思考:用 C# 編寫 C# 編譯器(Roslyn),那麼 C# 編譯器本身是由誰來編譯的?C# 語言編寫了 C# 編譯器,而 C# 語言又是由 C# 編譯器編譯的,這不就是先

【設計模式】描述還是

這裡有點疑問,書上說的是蛋繼承雞。從功能上說可能雞繼承蛋更合適,雞比蛋多了好多功能。另外這裡還缺Cock#include <iostream> using namespace std; enum TYPE

用C#寫C#編譯器,還是

前段時間翻譯的一篇文章 微軟是如何重寫C#編譯器並使它開源的,文章講了微軟用C#重寫C#編譯器的坎坷路,引發了一些童鞋的思考:用C#編寫C#編譯器(Roslyn),那麼C#編譯器本身是由誰來編譯的?C#語言編寫了C#編譯器,而C#語言又是由C#編譯器編譯的,這不就是先有雞還是

還是作業系統,還是彙編器?(對計算機本質的探討)

//當年學微機原理,追著老師問這個問題,老師很耐心,但是回答的也是很含糊,今天看到這個解釋,感覺挺有意思。 這個是以前給別人的回帖,感覺對初學者應該還有點幫助吧,於是就無恥的再貼出來了,大家包涵。 內容開始:     “這個問題很好,說明摟主是個尋根究底的人,任何求知慾強的

還是終結論

大約在2-3億年前,地球上還沒有人類,但已經有生物開始在地球上存在了,最早存在地球上的生物是海洋生物,那時地球上可能還沒有動物.就在那個時期地球上大面積的火山噴發,大量的火山岩漿流入大海,經過長時間的流入,在這個火山附近的海水產生了化學反應,在這樣的火山高頻繁發生時期大約又過了上幾千萬年時間,這時海里出現了各

還是雞蛋

我認為是先有雞。你肯定會說那這雞是哪來的?我不會說是雞蛋。說了就成了先有雞蛋了,而你又問這雞蛋是哪來的,這樣就無始無終了。 我不說是雞蛋,那我怎麼回答?回答了,那就是我的理由了。且看: 很久很久以前,那時候沒有雞,也沒有雞蛋。但有雞的祖先,但它不叫雞,我們假設叫它雞祖吧。雞祖

java對於垃圾回收機制[GC垃圾回收機制] 為什麼GC記憶體溢位呢?

java垃圾回收機制 來源於書本和工作中的總結。 記憶體洩露 如果分配出去的記憶體得不到釋放,及時回收,就會引起系統執行速度下降,甚至導致程式癱瘓,這就是記憶體洩露 GC機制 java記憶體分配和回收 都是jre後臺進行, 簡稱GC機制, JRE在

SmartCode.ETL 這不是還是的問題!

繼國慶節 SmartCode 正式版(SmartCode.Generator)釋出之後,SmartCode 迎來了新的能力 SmartCode.ETL ! SmartCode 正式版從開始釋出就從未說過自己僅僅是個程式碼生成器,這點上從我第一次宣佈SmartCode正式開源的文章就可以說明:

FF陷\"\"困局 賈200萬元FF91量…

“90後”女大學生放棄北大保送復旦!她到底有多厲害?  東北網12月6日訊(記者 姜姍姍) 在東北農業大學有這樣一個自強不息的女大學生,她放棄北大直博被保送到復旦大學藥學院。她本科期間獲得國家獎學金、國家勵志獎學金、新東方自強獎學金、第一屆全國大學生生命聯賽國家二等獎……被評為黑龍江省“三好學生”。她就是生命

物件還是函式,的問題。有關js裡內建物件Function和Object的思考

js裡建立的函式本身作為一個例項物件都是由內建物件Function作為建構函式創造出來的,所謂var f = funciton(a){b}即等同於f = new Function(a,b)。 同時js裡Object也是一個建構函式,因此他也是Function加工出來的。

問題(Class還是Object)

轉自知乎:https://www.zhihu.com/question/30301819 簡短答案:“雞・蛋”問題通常都是通過一種叫“自舉”(bootstrap)的過程來解決的。 其實“雞蛋問題”的根本矛盾就在於假定了“雞”或“蛋”的其中一個要先進入“完全可

,還是?相互引用的奇遇!

"世界上到底是先有雞後有蛋,還是先有蛋後有雞?"這是一個古老的哲學命題。 幾千年來,許多哲人都曾試圖解答這個問題,然而又都找不出令人信服的論據,所以直至今天,這個問題仍然沒有定論。 --在程式設計的世界裡,也是有著這麼一個傳說:兩個類相互引用,那到底是先引用哪個類呢? 剛

學習軟體,程式設計軟體,除了吃和死讀書。可以更多的技能。

網際網路上的資源太豐富了,只要你想學習,到處都是好東西,特別對於留學黨來說,放下手裡的微博微信王者榮耀和吃雞遊戲,多刷刷下面的這些網站吧~ 大學課程 edX — 免費學習來自全球頂尖大學(包括MIT和哈佛大學)的課程,提供付費的認證證書。 Coursera —

一個簡單程式的四種情況,暫時不會分析,放著,如大佬懇請賜教。

問題其實就是為什麼會出現這四種執行結果: 1、第二種情況為什麼會報錯? 2、第三種情況那個函式名前的星號(*)到底是什麼意思?為什麼加了星號就能返回p了? 3、第一種情況為什麼和第三種情況輸出結果完全一樣?這兩種情況的程式本質上有區別嗎? 4、第四種情況的輸出結果就完

sql指令碼建立表【如已經表,刪除,後建立】

if  exists(select * from sysobjects where  type = 'U' and name = 'tablename') drop table tablename;

本月16日SpringBoot2.2釋出,哪些變化知曉

本月(2019年10月16日)Spring Boot 2.2已經正式釋出了!在此篇文章中,將給大家介紹一下2.2版為大家帶來了哪些重要的新變化。筆者用心書寫,希望閱讀完成之後轉發關注,你的支援是我不竭的創作動力! 一、Spring bean全域性延遲初始化配置 Spring Boot 2.2引入的一項新功

java中存在垃圾回收機制,但是內存泄漏的問題,原因是

java 自己 data .so 這樣的 即使 垃圾 ref stack 答案是肯定的,但不能拿這一句回答面試官的問題。分析:JAVA是支持垃圾回收機制的,在這樣的一個背景下,內存泄露又被稱為“無意識的對象保持”。如果一個對象引用被無意識地保留下來,那麽垃圾回收器不僅不會處

為什麽IP需要硬件地址,或者說為什麽硬件地址需要IP

標識 可能 為什麽 問題解決 總結 軟件 唯一標識 地址 而且 只用MAC 雖然每個設備都有唯一的硬件地址,但不都是MAC格式。 只用MAC的話理論上是可行的,但是其中 兼容不同的硬件地址,處理起來是非常困難的。而且數據鏈路層也沒有必要處理網絡層的邏輯。 只用IP 首先你

w3周日__C++裏太多微妙到疼的細節。比如構造函數也能搞這麽多幺蛾子

ons 規則 pil ron 分享 struct 蛋疼 lin 編譯 ?問題提出 主要是在VC++ 2015裏經常提示莫名其妙的編譯錯誤。 分析一下,為什麽Java裏構造函數這個問題很簡單:   1. C++裏對象類型不止有按引用傳遞,還可能拷貝傳遞。所以有時候得提供拷