用北陽鐳射雷達ust-10lx跑slam_karto
用北陽鐳射雷達ust-10lx跑slam_karto
引言
在我的之前一篇博文中,講述瞭如何用資料集,去哪找資料集,怎麼轉化資料集,並講述了怎麼跑karto。這篇文件主要介紹下用北陽鐳射雷達跑資料集的經驗。
0.當前配置
- Ubuntu 16.04
- ROS Kinetic
- Opencv 3.4.1
- Ceres-solver
- gcc version 5.4.0 20160609 (g++)
- *Eigen3
- *G2O
- 北陽鐳射雷達ust-10lx
1.前提你得有一個雷達
哈哈,不充錢怎麼做研究。
2.怎麼獲取雷達資料
這裡主要參考了這篇博文,原來時CSDN部落格的,現在找不到了。。。
-
首先下載相關節點包
$ sudo apt-get install ros-kinetic-urg-node
-
改ip地址。
之前看博文介紹修改/etc/network/interfaces
,我試了幾次,不太行,讓後就摸索出一條簡單粗暴的方式。- 點選
ubuntu
坐上角的網路連結。 - 最下邊編輯連結。
- 選擇一個乙太網連結,如:有線連結1.
- 編輯。
IPV4設定
,方法改為手動
。點選增加
,地址:192.168.0.20,子網掩碼:255.255.255.0,閘道器:192.168.0.1
;- 儲存,OK.
這裡解釋下,北陽雷達預設採用192.168.0.10
進行資料傳送,所以你要把自己的網路連結改為別的地址,防止衝突。
- 點選
-
確認地址可以
ping
通,ping 192.168.0.10
。 -
執行
urg_node
獲取資料。roscore
rosrun urg_node urg_node _ip_address:=192.168.0.10
這裡注意,是_ip_address
不是ip_address
,一個是私有,一個時公有引數。
當你看到一堆資料,那麼恭喜你執行成功了。
3.有個機器人平臺
沒有也沒關係,可以暫時建一個一幀的影象,但是要建場景的地圖,需要機器人底盤提供的tf
才能計算位姿,才能談得上建圖。
4.修改karto_slam.launch
可以看到,下面的launch
檔案,我增加了urg_node,
,裡面另外一點需要關注的是base_frame
和<node name="tf" ... />
中的base_footprint laser
。
- 其中
base_frame
是機器人底盤的frame_id
,可以通過rostopic echo /tf
確認是base_link
還是base_footprint
。 laser
是雷達釋出的/scan
話題的LaserScan
資料型別的frame_id
,可以通過rostopic echo /scan
確認,當然,先通過rqt_graph
確定urg_node
釋出的是/scan
話題。
<launch>
<include file="$(find kobuki_node)/launch/minimal.launch"/>
<node pkg="urg_node" type="urg_node" name="urg_node">
<param name="ip_address" value="192.168.0.10"/>
</node>
<node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen">
<param name="map_update_interval" value="5"/>
<param name="map_frame" value="map"/>
<param name="odom_frame" value="odom"/>
<param name="base_frame" value="base_footprint"/>
<param name="throttle_scans" value="1"/>
<param name="resolution" value="0.025"/>
<param name="delta" value="0.05"/>
<param name="transform_publish_period" value="0.05"/>
</node>
<node pkg="tf" type="static_transform_publisher" name="laser_base" args="0.13 0 0 0 0 0 base_footprint laser 50"/>
<node pkg="rviz" type="rviz" name="rviz" required="true"/>
</launch>
還有非常重要的一點
slam_karto裡面可以支援不同型別的雷達,但是對ust-10lx支援不是很好,他是270°,1081個鐳射束,所以你需要把open_karto也下載下來,把karto.h中的static LaserRangeFinder* CreateLaserRangeFinder(LaserRangeFinderType type, const Name& rName)
中的一個型別修改能處理自己的雷達資料型別。
如:
case LaserRangeFinder_Hokuyo_UTM_30LX:
{
pLrf = new LaserRangeFinder((rName.GetName() != "") ? rName : Name("Hokuyo UTM-30LX"));
// Sensing range is 30 meters
pLrf->m_pMinimumRange->SetValue(0.1);
pLrf->m_pMaximumRange->SetValue(30.0);
// 270 degree range, 40 Hz
pLrf->m_pMinimumAngle->SetValue(math::DegreesToRadians(-135)); //270
pLrf->m_pMaximumAngle->SetValue(math::DegreesToRadians(135)); //270
// 0.25 degree angular resolution
pLrf->m_pAngularResolution->SetValue(math::DegreesToRadians(0.25));
pLrf->m_NumberOfRangeReadings = 1081; //1081配合自己的雷達
}
break;
然後還要修改slame_karto中的slam_karto.cpp
中的SlamKarto::getLaser(const sensor_msgs::LaserScan::ConstPtr& scan)
函式中的這一步
karto::LaserRangeFinder* laser =
karto::LaserRangeFinder::CreateLaserRangeFinder(karto::LaserRangeFinder_Hokuyo_UTM_30LX, karto::Name(name));
看到沒,把laserRangeFinder_Hokuyo_UTM_30LX
修改為你在open_karto
中改的那個case
哦,終於大功搞成!!
5.然後執行就可以了
我在launch檔案中加了rviz,執行應該就直接可以看到建圖效果了。隨便放一個效果圖吧。
6.遇到的問題
- rviz中map錯誤,顯示不出來。(可能與你的frame有關,可以
rosrun rqt_tf_tree rqt_tf_tree
看下是不是完整的tf_tree。不完整,你就需要認真檢查下你的base_frame,odom_frame,map_frame,laser之中有沒有錯誤的了。)
我遇到的就這個的問題,在ROS官網上也提問請教了外國朋友,回答的很耐心,總之,學會諮詢別人解決問題吧,也歡迎評論問我,可能回答不會很及時,請見諒。
7.後記
前段時間一直在弄視覺的東西,雷達沒怎麼動,又很忙,沒時間更新總結,也需要反思下。發現還是能給少數人提供些幫助的,就記下來當總結了。
這篇博文憑記憶總結的,可能水了點,不是很詳細,額,就這樣吧,改是不可能改了,這輩子是不可能改了!!!