1. 程式人生 > >用北陽鐳射雷達ust-10lx跑slam_karto

用北陽鐳射雷達ust-10lx跑slam_karto

用北陽鐳射雷達ust-10lx跑slam_karto

引言

在我的之前一篇博文中,講述瞭如何用資料集,去哪找資料集,怎麼轉化資料集,並講述了怎麼跑karto。這篇文件主要介紹下用北陽鐳射雷達跑資料集的經驗。

0.當前配置

  1. Ubuntu 16.04
  2. ROS Kinetic
  3. Opencv 3.4.1
  4. Ceres-solver
  5. gcc version 5.4.0 20160609 (g++)
  6. *Eigen3
  7. *G2O
  8. 北陽鐳射雷達ust-10lx

1.前提你得有一個雷達

哈哈,不充錢怎麼做研究。

2.怎麼獲取雷達資料

這裡主要參考了這篇博文,原來時CSDN部落格的,現在找不到了。。。

  1. 首先下載相關節點包

    $ sudo apt-get install ros-kinetic-urg-node

  2. 改ip地址。
    之前看博文介紹修改/etc/network/interfaces,我試了幾次,不太行,讓後就摸索出一條簡單粗暴的方式。

    1. 點選ubuntu坐上角的網路連結。
    2. 最下邊編輯連結。
    3. 選擇一個乙太網連結,如:有線連結1.
    4. 編輯。
    5. IPV4設定,方法改為手動。點選增加地址:192.168.0.20,子網掩碼:255.255.255.0,閘道器:192.168.0.1
    6. 儲存,OK.
      這裡解釋下,北陽雷達預設採用192.168.0.10進行資料傳送,所以你要把自己的網路連結改為別的地址,防止衝突。
  3. 確認地址可以ping通,ping 192.168.0.10

  4. 執行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.後記

前段時間一直在弄視覺的東西,雷達沒怎麼動,又很忙,沒時間更新總結,也需要反思下。發現還是能給少數人提供些幫助的,就記下來當總結了。
這篇博文憑記憶總結的,可能水了點,不是很詳細,額,就這樣吧,改是不可能改了,這輩子是不可能改了!!!