1. 程式人生 > >小豆包的學習之旅:里程計運動模型

小豆包的學習之旅:里程計運動模型

星球大戰裡面有2個非常出色的機器人一個是3PO,一個是R2。我的機器人呢就叫小豆包啦,代號FR2,不許侵犯它的署名哦。

  常見的機器人運動模型包括:速度計運動模型,里程計運動模型和慣導運動模型。概率運動模型是對機器人運動的一種概率描述。

  里程計是比較常見的一種型別。嚴格來說,里程計是一種感測器測量資訊而非控制資訊。如果將里程計視為測量資訊,貝葉斯濾波需要包含速度作為狀態變數,將增加狀態空間的維度。因此,為了減少狀態空間,通常將里程計資料視為控制訊號。

  首先是定義:

  小豆包在$t-1$時刻的位姿$x_{t-1}=(x,y,\theta)^T$,$t$時刻的位姿$x_{t}=(x',y',\theta')^T$運動控制資訊$u_{t}$,概率運動模型為$P\{x_{t}|u_{t},x_{t-1}\}$。

  其中,運動控制資訊$u_{t}=\{\overline {x}_{t-1},\overline {x}_{t}\}$。$\overline {x}_{t-1}=( \overline x, \overline y, \overline \theta)^T$,$\overline {x}_{t}=( \overline x', \overline y', \overline \theta')^T$。

  將小豆包在$(t-1,t]$時間間隔內的運動分解為三個階段:旋轉$\delta_{rot1}$,平移$\delta_{trans}$,旋轉$\delta_{rot2}$.

  轉向和平移都存在不確定性,則存在三個階段的誤差,認為三個階段的誤差相互獨立,採用高斯分佈表達這種不確定性。

  運用高斯分佈表達噪聲模型,則運動模型演算法流程如下:

 1: Algorithm motion_model_odometry $(x_{t}, u_{t}, x_{t-1})$:

 2: $\delta_{rot1} = atan2(\overline y'- \overline y, \overline x’ - \overline x) - \overline \theta$

 3: $\delta_{trans} = (\overline x - \overline x')^2 + (\overline y - \overline y')^2$

 4: $\delta_{rot2} = \overline \theta' - \overline \theta- \delta_{rot1}$ //里程計讀數,運動控制資訊$u_{t}$

 5: $\delta_{rot1} = atan2(y' - y, x' - x) - \theta$

 6: $\delta_{trans} = (x - x')^2 + (y - y')^2$

 7: $\delta_{rot2} = \theta' - \theta - \delta_{rot1}$

 8: $p1 = prob(\delta_{rot1} - \widehat {\delta}_{rot1}, α1\widehat {\delta}_{rot1}^2 + α2\widehat {\delta}_{rot1}^2 )$

 9: $p2 = prob(\delta_{trans} - \widehat {\delta}_{trans}, α3\widehat {\delta}_{trans}^2 + α4\widehat {\delta}_{rot1}^2 + α4\widehat {\delta}_{rot2}^2 )$

10: $p3 = prob(\delta_{rot2} - \widehat {\delta}_{rot2}, α1\widehat {\delta}_{rot2}^2 + α2\widehat {\delta}_{trans}^2 )$

11: return $p1 · p2 · p3 $

  採用取樣方式表達運動模型,主要運用於粒子濾波演算法中:

 1:  Algorithm Sample_motion_model_odometry $(u_{t}, x_{t-1})$:

 2:  $\delta_{rot1} = atan2(\overline y'- \overline y, \overline x’ - \overline x) - \overline \theta$

 3:  $\delta_{trans} = (\overline x - \overline x')^2 + (\overline y - \overline y')^2$ 

 4:  $\delta_{rot2} = \overline \theta' - \overline \theta- \delta_{rot1}$ //里程計讀數,運動控制資訊$u_{t}$

 5:  $\widehat {\delta}_{rot1}  =\delta_{rot1} - sample(α1\widehat {\delta}_{rot1}^2 + α2\widehat {\delta}_{rot1}^2)$

 6:  $\widehat {\delta}_{trans}=\delta_{trans}- sample(α3\widehat {\delta}_{trans}^2 + α4\widehat {\delta}_{rot1}^2 + α4\widehat {\delta}_{rot2}^2)$

 7:  $\widehat {\delta}_{rot2}  =\delta_{rot2} - sample(α1\widehat {\delta}_{rot2}^2 + α2\widehat {\delta}_{trans}^2)$ //為運動控制的變化量增加誤差項

 8:  $x'= x+\widehat {\delta}_{trans} cos(\theta+\widehat {\delta}_{rot1})$

 9:  $y'= y+\widehat {\delta}_{trans} cos(\theta+\widehat {\delta}_{rot1})$

10: $\theta'= \theta+\widehat {\delta}_{rot1}+\widehat {\delta}_{rot2}$ //加在$t-1$時刻的位姿上,計算出$t$時刻的位姿

11: return $x_{t}=(x',y',\theta')^T$

   里程計資料通過輪編碼器獲取,隨著時間的推移,誤差會不斷累積,而且角度誤差累積的更厲害。IMU對角度的誤差累積比距離累積要小。另外,機器人也可能存在機器人“綁架”之類的機械問題。這些都是運動模型的侷限性,需要對運動觀測資料進行優化校正,提高機器人的位姿精度。

  機器人“綁架”指的是機器人在運動過程中發生了滑動,機器人感測器觀測並不知道此情況的發生。

例項:

相關推薦

豆包學習里程運動模型

星球大戰裡面有2個非常出色的機器人一個是3PO,一個是R2。我的機器人呢就叫小豆包啦,代號FR2,不許侵犯它的署名哦。   常見的機器人運動模型包括:速度計運動模型,里程計運動模型和慣導運動模型。概率運動模型是對機器人運動的一種概率描述。   里程計是比較常見的一種型別。嚴格來說,里程計是一種感測

豆包學習入門篇

  人總是對未知充滿了好奇,人的一生是不斷髮現,不斷探索未知的過程。哥倫布發現新大陸,月球探索,火星探索,人類的腳步將永不停止。探索是一個充滿未知的旅程,人類根據自身的知識,藉助外部工具,利用自己的智慧,發現或者發明新的事物,這是一個非常有意思的過程。   不識廬山真面目,只緣身在此山中,如何克服認知的侷限

豆包學習機器人定位

  《概率機器人》一書用兩章介紹了幾種定位方法,一種是基於馬爾科夫決策,另外一章是柵格和蒙特卡羅方法。 1.馬爾科夫定位 2.EKF定位 3.柵格定位 4.MCL蒙特卡羅定位   這裡主要學習一下蒙特卡羅定位。機器人定位問題可以描述為:如何確定機器人在關聯的已知環境地圖中的位姿pose。拋開SLAM

豆包學習佔用概率柵格地圖和cost-map

  接下來將製圖和定位問題分別進行介紹。這兩個問題可以視為SLAM過程中兩個相互聯絡的子問題,但是也可以視為兩個單獨的問題。雖然說SLAM問題是雞和蛋的問題,但是在實際處理過程中總是有先後的。為了簡化問題,首先將兩者視為單獨的問題進行分析,在處理這兩個獨立的問題的時候需要設定一些約束。   描述機器人制圖M

豆包學習開發記錄

宣告:軟體截圖為個人所有,嚴禁用於商業目的和其他盈利行為。 雲臺控制和鐳射點雲獲取軟體 第一階段:三維點雲採集視覺化 第二階段:MoblieSim模擬資料接入,sim_lms1xx_1鐳射。Gmapping建圖實現效果圖,感覺效果一般,估計有的引數還是要調整一下。 進一步工作: (1)當前真實軌

豆包學習感測器觀測模型

  感測器觀測模型,主要針對鐳射測距感測器進行說明。 1.Beam Model 測量光束模型   鐳射測量光束模型是對鐳射測量過程的近似物理描述,鐳射測距儀沿鐳射發出的光束測量周圍物體的距離。該模型將一條沿光束進行的測量$p(z_{t}|x_{t},m)$表達為四種概率密度的混合。認為存在四種類型的測量誤

Python學習用Python製作一個打字訓練工具

一、寫在前面   說道程式設計師,你會想到什麼呢?有人認為程式設計師象徵著高薪,有人認為程式設計師都是死肥宅,還有人想到的則是996和 ICU。      別人眼中的程式設計師:飛快的敲擊鍵盤、酷炫的切換螢幕、各種看不懂的字元程式碼。   然而現實中的程式設計師呢?對於很多程式設計師來說,沒有百度和

程式學習----open-data web-view 以及 canvas、map

<open-data type="userAvatarUrl"></open-data> <open-data type="userGender" lang="zh_CN"></open-data> <view></view>

程式學習----圖片image媒體元件camera、audio、video、live-player、live-pusher

<!--pages/image/image.wxml--> <text>這是一個image元件</text> <!-- <image src='../../images/0.jpg'></image> <image src='

程式學習---表單元件 picker picker-view 實現日期 區域 聯動選擇

Page({ /** * 頁面的初始資料 */ data: { cityList: ['北京', '上海', '深圳', '廣州'], cityIndex: 1, time: '17:01', date: '2018-6-28',

程式學習----表單元件 button checkbox form input label radio slider switch textarea 獲取表單資料

<view class='input'> <input placeholder="請輸入內容1" confirm-type="done" type='text' focus="true" bindinput='doInput'/> </view> <

程式學習----基礎內容元件icon 、text 、rich-text、progress

Page({ data: { motto: 'Hello World', nodes: [{ name: 'h2', attrs: { class: 'h2_class', style: 'line-height: 60p

程式學習----覆蓋物元件

<view class='video_box'> <video id="myVideo" src="http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f02016904

程式學習----上拉重新整理例項

Page({ /** * 頁面的初始資料 */ data: { list: [], windowHeight: '400', page: 1, flag: true }, /** * 生命週期函式--監聽頁面載入 */

程式學習----slot 子元件呼叫父元件的方法、父元件呼叫子元件的方法

slot子元件 <!--pages/user/user.wxml--> <header title='{{title}}'></header> {{title}} <footer> <button>我是footer子元件裡的按鈕&l

程式學習----自定義元件toast例項

components目錄下新建資料夾toast,新建component,之後修改toast.js和toast.wxml <!--components/toast/toast.wxml--> <view class='wx_toast_container' hidden="{{!

程式學習----基礎知識

<view wx:if="{{flag}}"> <text> view 當作div text 當作span 繫結資料--{{message}} 繫結物件--{{obj.name}} 條件判斷wx:if='{{

程式學習---wxs模組自定義方法

// pages/user/user.js Page({ /** * 頁面的初始資料 */ data: { d: '1500000000000' }, goShop () { wx.navigateTo({ url:

Spring Boot學習(四)springboot 整合 fastjson

springboot 預設使用的 jackson 但是聽說某寶的fastjson 效能很好,而且平時用的習慣,所以來整合一下。 首先在pom 中匯入依賴 <dependency> <groupId>

程式學習注意事項統計

這篇文章記載在小程式的一些注意事項和遇到的bug,包括解決方案 子控制元件點選事件和父控制元件之間的傳遞 當一個view裡面包裹了了一個子view(如text控制元件),然後兩個控制元件都新增點選事件,如何讓點選text的時候父view的點選事件不觸發呢?  在點選事件t