使用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...