1. 程式人生 > >小豆包的學習之旅:機器人定位

小豆包的學習之旅:機器人定位

  《概率機器人》一書用兩章介紹了幾種定位方法,一種是基於馬爾科夫決策,另外一章是柵格和蒙特卡羅方法。

1.馬爾科夫定位

2.EKF定位

3.柵格定位

4.MCL蒙特卡羅定位

  這裡主要學習一下蒙特卡羅定位。機器人定位問題可以描述為:如何確定機器人在關聯的已知環境地圖中的位姿pose。拋開SLAM,定位問題可以單獨討論,目前的室內定位技術研究也很火熱。

  地圖表達的是全域性座標系,地圖獨立於機器人的位姿而存在。定位問題也可以描述為確定機器人區域性座標系統全域性座標系中對應關係的過程,即確定機器人的位姿$x_{t}=(x,y,\theta)^T$。

機器人定位的必要性

  有人會說,定位是不需要地圖資訊的。機器人知道初始位置,知道左右輪的速度,就可以算出在一段時間內左右輪分別走了多少距離,進而算出機器人的轉角和位移,以便更新位置資訊。但是顯然,這種方法存在很大的問題。首先,速度是感測器獲得的,然而感測器是有精度限制的,這就意味著誤差的存在,對時間積分求距離誤差就更大了;另外,機器人也可能存在打滑之類的機械問題。(文獻1是一篇很好的文章,介紹的很詳細,主要介紹的內容來源於開放課程:

機器人學:估計和學習

  結合地圖來對機器人進行定位能有效減小誤差。

  matlab程式碼:

function myPose = particleLocalization(ranges, angles, map, param)

% occupancy value of unexplored pixels
unknown = mode(reshape(map, size(map,1)*size(map,2), 1));

N = size(ranges, 2); % number of poses to calculate
myPose = zeros(3, N); % initialize return value

resol = param.resol; % map resolution
origin = param.origin; % origin in pixel

sig = [0.08, 0, 0; 0, 0.08, 0; 0, 0, 0.08]; % noise for particle movement

myPose(:,1) = param.init_pose; % init position

M = 200; % number of particles

P = repmat(myPose(:,1), [1, M]);

thr = ceil(3.5/5*size(angles,1)); % set the score threshold as 70%

for j = 2:N
    maxscore = 0;
    while maxscore < thr
        Q=P+(randn(size(P,2),3)*sig)'; % particles movement
        score = zeros(size(Q,2), 1); % scores
        for k = 1:size(Q,2) % calculate score for each particle
            occ_x = ceil( (ranges(:,j) .* cos(angles+Q(3,k)) + Q(1,k) )  * resol + origin(1) );
            occ_y = ceil( (-ranges(:,j) .* sin(angles+Q(3,k)) + Q(2,k) ) * resol + origin(2) );
            ids = occ_x > 0 & occ_x <= size(map,2) & occ_y > 0 & occ_y <= size(map,1);
            score(k) = size( map( map (sub2ind(size(map), occ_y(ids), occ_x(ids)) ) > unknown ), 1);
        end
        [maxscore, index] = max(score); % select particle with maximum score
    end
    myPose(:,j) = Q(:,index); % set pose(j) as the optimal particle

    Q = Q(:,score >= thr); % select particles with high score
    P = repmat(Q, 1, ceil(M/size(Q,2)) ); % regenerate particles
end

end

參考文獻:

相關推薦

豆包學習機器人定位

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

豆包學習里程計運動模型

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

豆包學習入門篇

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

豆包學習佔用概率柵格地圖和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