ROS障礙層的無法清除乾淨的處理辦法

2021-07-30 14:59:58 字數 2234 閱讀 5892

使用dwa導航的時候,發現障礙層的地圖無法清除乾淨,在網上找了許久也找不到解決的辦法,最後通過檢視原始碼解決了這個問題。檢視這個鏈結的時候:時候大概發現了問題的原因。是因為當雷射雷達的資料在達到最大的距離的時候,會出現無法清除障礙物的現象。

於是自己**的時候果然出現了這個問題,當雷射雷達達到最大的距離的時候,會出現返回的雷射的資料變為最大值,這個鏈結回答後面其中也給出了一些解決方法,但是沒有根本上解決。

在rviz中也看不到等於雷射最大檢測範圍的點,應該是rviz自動處理了雷射距離等於最大範圍的資料,不顯示。我分析雷射雷達的資料是在障礙層進行了處理,於是我檢視了costmap_2d軟體包中的obstacle_laer.cpp檔案,發現下面這段**:

void obstaclelayer::laserscanvalidinfcallback(const sensor_msgs::laserscanconstptr& raw_message,

const boost::shared_ptr& buffer)

} // project the laser into a point cloud

sensor_msgs::pointcloud2 cloud;

cloud.header = message.header;

// project the scan into a point cloud

trycatch (tf::transformexception &ex)

// buffer the point cloud

buffer->lock();

buffer->buffercloud(cloud);

buffer->unlock();

}

上面那一段紅色的**處理了每乙個雷射的資料,如果是雷射的點是最大的距離,那麼將這個點設定為比最大距離小十分之一公釐。我猜想程式設計者也考慮到了這個問題,當雷射的距離等於最大的距離的時候會出現障礙物無法清除的現象,因此做這樣的處理,使得所有的雷射資料的距離小於最大距離。

那麼既然有了這樣的處理為什麼還會出現障礙物無法清除的現象呢?於是我檢視了/scan資料,我發現雷射的/scan話題,這個節點出來的資料是當障礙物的距離

大於雷射的檢測距離時,雷射的資料被自動設定為最大距離,而不是inf,因此這段程式並不起作用,因此將程式改為下面的:

void obstaclelayer::laserscanvalidinfcallback(const sensor_msgs::laserscanconstptr& raw_message,

const boost::shared_ptr& buffer)

} // project the laser into a point cloud

sensor_msgs::pointcloud2 cloud;

cloud.header = message.header;

// project the scan into a point cloud

trycatch (tf::transformexception &ex)

// buffer the point cloud

buffer->lock();

buffer->buffercloud(cloud);

buffer->unlock();

}

當雷射的資料範圍大於最大值的時候都會設定為比最大值小一點點。這樣就能保證障礙層能夠清除了。

然後重新編譯costmap_2d軟體包

catkin_make

catkin_make install

將工作空間中的instal資料夾下面lib中的costmap_2d資料夾,liblayers.so和libcostmap_2d.so檔案覆蓋/opt/ros/indigo/lib/下的對應的檔案就好了

最後在costmap_common_params.yaml檔案中新增inf_is_valid設定為true。

observation_sources: scan

scan:

data_type: laserscan

topic: /scan

marking: true

clearing: true

inf_is_valid: true

min_obstacle_height: 0.0

max_obstacle_height: 1.0

原創 電腦病毒清除不乾淨的原因

1 未及時打系統補丁或系統帳戶登陸密碼太弱,病毒會利用系統漏洞或破解弱口令不斷入侵,這樣會出現反覆感染,屢殺不止的情況。這類病毒典型代表有 愛情後門。解決辦法 打系統補丁,給系統帳戶設定足夠複雜的登陸密碼,建議是字母 數字 特殊字元,再查殺病毒。2 病毒檔案在一些特殊的資料夾中,比如系統還原功能所用...

JS 無法清除Cookie的解決方法

專案中使用sdmenu.js時,需要在登入時清除cookie,而sdmenu預設是會儲存cookie的 下面是sdmenu.js儲存cookie的方法 document.cookie sdmenu encodeuricomponent this.menu.id states.join expires...

JS 無法清除Cookie的解決方法

專案中使用sdmenu.js時,需要在登入時清除cookie,而sdmenu預設是會儲存cookie的 下面是sdmenu.js儲存cookie的方法 document.cookie sdmenu encodeuricomponent this.menu.id states.join expires...