ROS與navigation教程——基本導航調整指南

?

說明:

  • 介紹如何調整機器人上的ROS導航包

步驟:

(1) 機器人導航需要那些準備?

在調整新機器人上的導航包時遇到的大部分問題都在本地規劃器調諧參數之外的區域。機器人的里程計,定位,傳感器以及有效運行導航的其他先決條件常常會出錯。所以,我做的第一件事是確保機器人本身正在準備好導航。這包括三個組件檢查:距離傳感器,里程計和定位。

  • 距離傳感器

如果機器人沒有從其距離傳感器(例如激光器)獲取信息,那么導航將不起作用。我將確保我可以在rviz中查看傳感器信息,它看起來相對正確,并以預期的速度進入。

  • 里程計

通常我會很難使機器人正確定位。它將不斷迷失,我會花費大量的時間調試AMCL的參數,發現真正的罪魁禍首是機器人的測距。因此,我總是運行兩個健全檢查,以確保我相信機器人的里程計。

第一個測試檢查角速度是否合理。我打開rviz,將坐標系設置為“odom”,顯示機器人提供的激光掃描,將該主題的衰減時間設置為高(類似20秒),并執行原地旋轉。然后,我看看掃描出來的邊線在隨后的旋轉中如何相互匹配。理想情況下,每次掃描將剛好落在相互的頂端,會重疊在一起,但是有些旋轉漂移是預期的,所以我只是確保掃描之間誤差,不會超過一度或兩度以上。

第二個測試檢查線速度是否合理。機器人放置在與距離墻壁幾米遠地方,然后以上面相同的方式設置rviz。接著我將驅動機器人向墻壁前進,從rviz中聚合的激光掃描看看掃描出來邊線的厚度。理想情況下,墻體應該看起來像一個掃描,但我只是確保它的厚度不超過幾厘米。如果顯示掃描邊線的分散在半米以上,但有些可能是錯誤的測距。

  • 定位

假設里程計和激光掃描儀都能合理地執行,建圖和調整AMCL通常并不會太糟糕。首先,我將運行gmapping或karto,并操縱機器人來生成地圖。然后,我將使用該地圖與AMCL,并確保機器人保持定位。如果我運行的機器人的距離不是很好,我會用AMCL的測距模型參數玩一下。對整個系統的一個很好的測試是確保激光掃描和地圖可以在rviz的“地圖”坐標系中可視化,并且激光掃描與環境地圖很好地匹配。

(2)代價地圖

  • 一旦我的機器人滿足導航的先決條件,我想確保代價地圖的設置和配置正確。

  • 如下建議可用來調整代價地圖:

    • 確保根據傳感器實際發布的速率為每個觀測源設置expected_update_rate參數。我通常在這里給出相當的容忍度,把檢查的期限提高到我期望的兩倍,但是當傳感器低于預期速率時,它很容易從導航中接收警告。

    • 為系統適當設置transform_tolerance參數。查看使用tf從“base_link”坐標系到“map”坐標系的轉換的預期延遲。我通常使用tf_monitor查看系統的延遲,并將參數保守地設置為關閉。另外,如果tf_monitor報告的延遲足夠大,我可能會隨時看看導致延遲的原因。這有時會導致我發現關于給定機器人的變換如何發布的問題。

    • 在缺乏處理能力的機器人上,我會考慮關閉map_update_rate參數。然而,在這樣做時,我考慮到這將導致傳感器數據快速進入代價地圖的延遲,這反過來會降低機器人對障礙物的反應速度。

    • 該publish_frequency參數是在rviz可視化costmap有用。然而,特別是對于大型全局地圖,該參數可能導致事情運行緩慢。在生產系統中,我考慮降低成本圖發布的速度,當我需要可視化非常大的地圖時,我確定設置速度真的很低。

    • 是否對代價地圖使用voxel_grid或costmap模型的決定在很大程度上取決于機器人具有的傳感器套件。調整代價地圖為基于3D-based代價地圖更多是涉及未知空間的考慮。如果我正在使用的機器人只有一個平面激光,我總是使用costmap模型的地圖。

    • 有時,它只能在里程坐標系中運行導航。要做到這一點,我發現最容易做的事情就是我的復制local_costmap_params.yaml文件覆蓋global_costmap_params.yaml文件并更改了地圖寬度和高度比如10米。如果需要獨立的定位性能來調整導航,這是一個簡單易行的方法

  • 我傾向于根據機器人的尺寸和處理能力選擇我使用的地圖的分辨率。在具有很多處理能力并需要適應狹窄空間的機器人,如PR2,我會使用細粒度的地圖...將分辨率設置為0.025米。對于像roomba這樣的東西,我可能會以高達0.1米的分辨率去降低計算量。

  • Rviz是驗證代價地圖正常工作的好方法。我通常從代價地圖中查看障礙物數據,并確保在操縱桿控制下驅動機器人時,它與地圖和激光掃描相一致。這是對傳感器數據以合理的方式進入代價地圖的合理檢查。如果我決定用機器人跟蹤未知的空間,主要是這些機器人正在使用voxel_grid模型的代價地圖,我一定要看看未知的空間可視化,看看未知的空間被以合理的方式清除。是否正確地從代價地圖中清除障礙物的一個很好的檢查方法是簡單地走在機器人的前面,看看它是否都成功地看到我,并清除我。
  • 當導航包僅運行costmap時,檢查系統負載是一個好主意。這意味著提高move_base節點,但不會發送目標點并查看負載。如果計算機在這個時候陷入僵局,我知道如果我想要運行規劃器的話,我需要做一些CPU參數調整。

(3) 局部規劃器

如果通過代價地圖的操作令人滿意,我將繼續調整局部規劃器參數。在具有合理加速度限制的機器人上,我通常使用dwa_local_planner,對于那些具有較低加速度限制的機器人,并且可以從每個步驟考慮到加速限制的,我將使用base_local_planner。調整dwa_local_planner比調整base_local_planner更為愉快,因為它的參數是動態可配置的。為導航包添加dynamic_reconfigure也已經在計劃中。針對規劃器的提示:

  • 對于給定的機器人最重要的是,正確設置了加速度限制參數。如果這些參數關閉,只能期望來自機器人的次優行為。如果我不知道機器人的加速度極限是什么,我會花點時間寫出一個腳本,讓電機以最大平移和旋轉速度命令運行一段時間,看看報告的里程計速度(假設里程會給出合理的估計),并從中得出加速度極限。合理設置這些參數可以節省很多時間。

  • 如果我正在使用的機器人具有低加速度限制,我確保我正在運行base_local_planner,其中dwa設置為false。將dwa設置為true后,我還將確保根據處理能力將vx_samples參數更新為8到15之間的值。這將允許在展示中生成非圓形曲線。

  • 如果我正在使用的機器人的定位并不是很好,我將確保將目標公差參數設置得比我想象的要高一些。如果機器人具有較高的最小旋轉速度以避免在目標點的振蕩,那么我也將提高旋轉公差。

  • 如果我使用低分辨率的CPU原因,我有時會提高sim_granularity參數,以節省一些周期。

  • 我實際上很少發現自己改變了path_distance_bias和goal_distance_bias(對于base_local_planner這些參數被稱為pdist_scale和gdist_scale)參數在計劃者上非常多。當我這樣做時,通常是因為我試圖限制本地規劃器自由,讓計劃的路徑與除NavFn以外的全局規劃器合作。將path_distance_bias參數增大,將使機器人更緊密地跟隨路徑,同時以快速向目標向前移動。如果這個值設置得太高,機器人將會拒絕移動,因為移動的代價大于停留在路徑上的位置。簡單來說就是讓實際移動更接近全局路徑還是本地路徑。

  • 如果我想以聰明的方式介紹代價函數,我將確保將meter_scoring參數設置為true。這使得它在代理函數中的距離以米而不是單元格,也意味著我可以調整一個地圖分辨率的代價函數,并且當我移動到他人時期望合理的行為。此外,您現在可以通過將publish_cost_grid參數設置為true來顯示本地計劃程序在rviz中生成的代價函數。(這不管怎么說,從來沒有把它放入文檔,我會很快到那個時候)。考慮到以米為單位的代價函數,我可以計算出移動1米的成本與目標平衡的成本的折衷。這傾向于給我一個如何調整東西的體面的想法。

  • 軌跡從其端點得分。這意味著將sim_time參數設置為不同的值可能對機器人的行為有很大的影響。我通常將此參數設置在1-2秒之間,其中設置更高可以導致稍微平滑的軌跡,確保乘以sim_period的最小速度小于目標的兩倍。否則,機器人將傾向于在其目標位置的范圍之外的位置旋轉,而不是朝向目標移動。

  • 精確的軌跡模擬也取決于距離測距的合理速度估計。這來自于dwa_local_planner和base_local_planner都使用這種速度估計以及機器人的加速度限制來確定規劃周期的可行速度空間。雖然來自測距的速度估計不一定是完美的,但確保其至少接近得到最佳行為是重要的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253907.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253907.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253907.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序跨行跨列多列復雜表格實現

今天來實現個跨行跨列多列表格。 如圖,這是個列數不確定,有的單元格還要跨行跨列的復雜表格。 這里暫時最多支持4列,列數再多就放不下了。 實現原理 實現原理比較簡單,通過多個嵌套的循環將數據取出。 上面的例子中,最…

Redis學習第八課:Redis高級實用特性(一)

Redis高級實用特性 注:我學習的環境是vmware7.1 ubantu10.10 redis 3.0.2 1、安全性 設置客戶端連接后進行任何其他指定前需要的密碼。因為redis速度相當快,一個外部用戶可以在一秒鐘進行很多次的密碼嘗試,這就需要設定非常強大的密碼來防止…

分布式緩存的面試題9

1、面試題 如何保證緩存與數據庫的雙寫一致性? 2、面試官心里分析 你只要用緩存,就可能會涉及到緩存與數據庫雙存儲雙寫,你只要是雙寫,就一定會有數據一致性的問題,那么你如何解決一致性問題? 3、面試題剖析…

ROS與navigation教程——概述

navigation是ROS的二維導航功能包,簡單來說,就是根據輸入的里程計等傳感器的信息流和機器人的全局位置,通過導航算法,計算得出安全可靠的機器人速度控制指令。 代碼庫:https://github.com/ros-planning/navigation 代…

Linux下c開發 之 線程通信與pthread_cond_wait()的使用

pthread_cond_wait() /************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock); pthread_cond_wait(&qready, &qlock);pthread_mutex_unlock(&qlock);/*****************************************************/The mutex passed …

ROS與navigation教程——ACML參數配置

<launch> <!--//后為wiki官網的參數說明 &#xff08;&#xff09;中為粗讀算法參數說明及理解 面臨的問題常用地圖有2種&#xff1a;1.基于特征&#xff0c;僅指明在指定位置&#xff08;地圖中包含的對象的位置&#xff09;的環境的形狀。特征表示使得調節對象的位置…

【設計模式】單例模式 Singleton Pattern

通常我們在寫程序的時候會碰到一個類只允許在整個系統中只存在一個實例&#xff08;Instance&#xff09; 的情況&#xff0c; 比如說我們想做一計數器&#xff0c;統計某些接口調用的次數&#xff0c;通常我們的數據庫連接也是只期望有一個實例。Windows系統的系統任務管理器…

修改輸入框placeholder的默認樣式

一般網頁中都用到input的placeholder屬性&#xff0c;想讓這個默認樣式和網頁保持一致&#xff0c;就需要重新設定樣式&#xff0c;百度百度&#xff1a; :-moz-placeholder { / color: #000; opacity:1; }支持/* Mozilla Firefox 4 to 18 * ::-moz-placeholder { color: #000;…

進程及線程通信總結

上文我們介紹了如何建立一個簡單的多線程程序&#xff0c;多線程之間不可避免的需要進行通信 。相比于進程間通信來說&#xff0c;線程間通信無疑是相對比較簡單的。 首先我們來看看最簡單的方法&#xff0c;那就是使用全局變量&#xff08;靜態變量也可以&#xff09;來進行通…

ROS multi-master——multimaster_fkie配置

多主站ROS配置和mutimaster_fkie ROS版本&#xff1a;kinetic 操作系統&#xff1a;Ubuntu 16.04。 multimaster_fkie&#xff1a;github 1網絡配置 1.1路由器 設置無線路由器并連接兩臺計算機/機器人。為這兩臺計算機設置靜態IP地址。相互測試ping命令和ssh。 1.2主機 …

Docker入門

1. Docker簡介: docker是一個基于LXC的高級容器引擎。簡單地說&#xff0c;docker是一個輕量級的虛擬解決方案&#xff0c;或者說它是一個超輕量級的虛擬機&#xff08;容器&#xff09;。 Docker是一個開源的引擎&#xff0c;可以輕松的為任何應用創建一個輕量級的、可移植的、…

樂器庫的混合

每臺微機一個聲卡&#xff0c;也就是一片D/A&#xff0c;驅動按波特率、采樣位數、采樣通道傳輸給D/A&#xff0c;輸出模擬音頻。播放時僅一種與硬件支持格式對應&#xff0c;其他需驅動&#xff08;有損&#xff09;變換到硬件支持格式。每個應用都可單獨播放聲音&#xff0c;…

kafka認知--(1)

文檔參考&#xff1a;http://kafka.apache.org/documentation.html 下載代碼&#xff1a; tar -xzf kafka_2.11-0.11.0.0.tgz cd kafka_2.11-0.11.0.0 啟動 bin/zookeeper-server-start.sh config/zookeeper.properties 創建topic&#xff08;主題為test&#xff0c;只有一個分…

帶頭尾指針的list的C實現

一、緣起 很早寫了一個帶頭尾指針的list&#xff0c;該list支持從尾部插入元素&#xff0c;在任意位置刪除元素&#xff0c;最近用這個list時發現一個bug&#xff0c;修正了&#xff0c;并加了幾個接口函數。貼出來&#xff0c;希望對C的初學者有用。 二、基本說明 2.1、數據結…

Gmapping——從原理到實踐

概述 在SLAM中&#xff0c;機器人位姿和地圖都是狀態變量&#xff0c;我們需要同時對這兩個狀態變量進行估計&#xff0c;即機器人獲得一張環境地圖的同時確定自己相對于該地圖的位置。我們用x表示機器人狀態&#xff0c;m表示環境地圖&#xff0c;z表示傳感器觀測情況&#xf…

關于git分支

1.關于git分支 git的“分支”乍一聽是一個特別容易讓人產生錯覺的概念&#xff0c;以為它和樹枝一樣是分叉的枝節&#xff0c;其實Git中的分支本質上是個指向commit對象的指針,每次commit&#xff0c;git都把它們串成一條時間線&#xff0c;這條時間線就是一個分支。 2.直接切換…

【機器學習經典算法源碼分析系列】-- 邏輯回歸

1.邏輯回歸&#xff08;Logistic Regression&#xff09;又常被成為“邏輯斯蒂回歸”&#xff0c;實質上是一個二元分類問題。 邏輯回歸代價函數&#xff1a; 代價函數導數&#xff1a; Matlab實現&#xff1a; 采用matlab中自帶的無約束最小化函數fminunc來代替梯度下降法&…

求特殊自然數

總時間限制: 1000ms 內存限制: 65536kB 描述一個十進制自然數,它的七進制與九進制表示都是三位數&#xff0c;且七進制與九進制的三位數碼表示順序正好相反。編程求此自然數,并輸出顯示。 輸入無。輸出三行&#xff1a;第一行是此自然數的十進制表示&#xff1b;第一行是此自然…

ROS——不同版本間ROS進行通信

在相同版本間的ROS進行通信不在贅述了&#xff0c;修改/etc/hosts文件即可。 最近項目遇到在Ubuntu16.04 與Ubuntu18.04兩個系統間進行ROS通信&#xff0c;ROS版本分別為Kinetic和Melodic。配置網絡后&#xff0c;兩邊都能夠ping通&#xff0c;但是在獲取ros數據是&#xff0c…

大數據開發實戰:數據流圖及相關數據技術

1、大數據流程圖 2、大數據各個環節主要技術 2.1、數據處理主要技術 Sqoop&#xff1a;&#xff08;發音&#xff1a;skup&#xff09;作為一款開源的離線數據傳輸工具&#xff0c;主要用于Hadoop(Hive) 與傳統數據庫&#xff08;MySql,PostgreSQL&#xff09;間的數據傳遞。它…