<source : greatway9999>


一、前言

開發套件上可能受限於硬體規格,如果想要新增感測器,就要自己思考如何擴增。

由於採購的套件並未設計安裝LiDAR的位置,因此先以陽春的鐵架方式,搭建一個放置LiDAR的位置。

另外,採用的馬達未具備encoder的功能,因此SLAM演算法採用不依靠里程計資料的 Hector-SLAM。

接下來就要來分享如何讓LiDAR和Hector-SLAM演算法順利運作。


實作目標 :

  • LiDAR可以運作,收得到資料。
  • Hector-SLAM可以正常運作。
  • 本機可以接收到機器人端的資訊,成功進行SLAM建圖。


二、步驟 

本次採用的LiDAR為YDlidar X4,比起市面上動則幾十萬上下的LiDAR,YDlidar X4是比較經濟實惠的選擇。

所以要驅動YDlidar X4,就要完成和Jetson nano相關的接線與驅動安裝。另外,為了減緩Jetson nano的運算壓力,規劃Hector-SLAM的演算法在電腦上計算,因此相關套件會安裝在電腦上。

接下來讓我們開始動手。

(一)、YDlidar X4的相關設置

步驟0. 接線

<source : YDLIDAR X2/X4 user manual>


YDLidar X4內附的轉接器有2個接頭,一個是資料線,一個是電源線。基本上只要接資料線就可以運作了,但是從實作經驗來看,兩條都要接,YDLidar X4才能順利運作。

步驟1. 進入Jetson nano工作空間的 src資料夾

$ cd ~/catkin_ws/src

步驟2. 下載 ydlidar 的套件並編譯

$ git clone https://github.com/EAIBOT/ydlidar.git
$ cd ..
$ catkin_make

步驟3. 更新環境變量

$ echo 'source ~/catkin_ws/devel/setup.bash' >> ~/.bashrc
$ source ~/.bashrc

步驟4. 添加udev規則(非必須)

$ cd ~/catkin_ws/src/ydlidar/startup
$ sudo chmod +x initenv.sh
$ sudo ./initenv.sh

步驟5. 將ydlidar拔掉重插

步驟6. 使用Launch檔啟動 ydlidar

$ cd ~/catkin_ws/src/ydlidar/launch
$ roslaunch ydlidar lidar.launch   (不開Rviz)


$ roslaunch lidar_view.launch (同時啟動Rviz)

(二)、Hector-SLAM 相關設置

Hector-SLAM會安裝在電腦上,步驟如下 :

步驟1. 進到工作空間的src資料夾

$ cd ~/hector_ws/src


步驟2. 從github下載 hector slam套件包

$ git clone http://github.com/tu-darmstadt-ros-pkg/hector_slam.git


步驟3. 編譯

$ catkin_make


步驟4. 更新環境變量

$ source ~/catkin_ws/devel/setup.bash


步驟5. 修改launch檔

進入 hector_slam_launch 中的 launch 目錄中,新增 3 個launch 檔:

  • slam.launch
  • hector_mapping.launch
  • geotiff_mapper.launch

並分別在這3個Launch檔中撰寫以下內容。


slam.launch

<?xml version="1.0"?>

<launch>

    <param name="/use_sim_time" value="false"/>

      <node pkg="rviz" type="rviz" name="rviz" args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>

    <include file="$(find hector_slam_launch)/launch/hector_mapping.launch"/>

    <include file="$(find hector_slam_launch)/launch/geotiff_mapper.launch">

      <arg name="trajectory_source_frame_name" value="scanmatcher_frame"/>

    </include>

 </launch>


hector_mapping.launch

<?xml version="1.0"?>

<launch>

<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping"   output="screen">

  <param name="pub_map_odom_transform" value="true"/>

  <param name="map_frame" value="map" />

  <param name="base_frame" value="base_link" />

  <param name="odom_frame" value="base_link" />


  <!-- Map size / start point -->

    <param name="map_resolution" value="0.050"/>

    <param name="map_size" value="1048"/>

    <param name="map_start_x" value="0.5"/>

    <param name="map_start_y" value="0.5" />

    <param name="map_multi_res_levels" value="2" />


    <!-- Map update parameters -->

    <param name="update_factor_free" value="0.4"/>

    <param name="update_factor_occupied" value="0.9" />   

    <param name="map_update_distance_thresh" value="0.4"/>

    <param name="map_update_angle_thresh" value="0.06" />

    <param name="laser_z_min_value" value = "-1.0" />

    <param name="laser_z_max_value" value = "1.0" />

</node>

<node pkg="tf" type="static_transform_publisher" name="base_to_laser_broadcaster" args="0 0 0 0 0 0 /base_link /laser_frame 100" /> 

</launch>


geotiff_mapper.launch

<?xml version="1.0"?>

<launch>

<arg name="trajectory_source_frame_name" default="/base_link"/>

<arg name="trajectory_update_rate" default="4"/>

<arg name="trajectory_publish_rate" default="0.25"/>


<node pkg="hector_trajectory_server" type="hector_trajectory_server" name="hector_trajectory_server" output="screen">

<param name="target_frame_name" type="string" value="/map" />

<param name="source_frame_name" type="string" value="$(arg trajectory_source_frame_name)" />

<param name="trajectory_update_rate" type="double" value="$(arg trajectory_update_rate)" />

<param name="trajectory_publish_rate" type="double" value="$(arg trajectory_publish_rate)" />

</node>


<node pkg="hector_geotiff" type="geotiff_node" name="hector_geotiff_node" output="screen" launch-prefix="nice -n 15">

<remap from="map" to="/dynamic_map" />

<param name="map_file_path" type="string" value="$(find hector_geotiff)/maps" />

<param name="map_file_base_name" type="string" value="uprobotics" />

<param name="geotiff_save_period" type="double" value="0" />

<param name="draw_background_checkerboard" type="bool" value="true" />

<param name="draw_free_space_grid" type="bool" value="true" />

</node>

</launch>


關於 YDLidar X4,更多內容請見本篇文章


三、啟動 YDLidar X4 和 Hector-SLAM

請在SBC(Jetson Nano)端啟動 lidar

$ roslaunch ydlidar lidar.launch

此時,LiDAR應該會正常轉動。


接著在PC端起動hector slam

$ roslaunch hector_slam_launch slam.launch

RVIZ會被打開,你會看到地圖逐漸生成,再搭配機器人移動,就可以讓機器人越來越完整。


順利完成安裝後,一定迫不及待要來跑跑看,結果就如下圖所示。

看來建圖效果不太優,原因是機構待改進,因為沒有把LiDAR固定好,影響到建圖精度。

原圖如下 :

後機構經調整後,如下圖

讓Lidar被穩穩地固定住,改善Lidar轉動時產生的晃動,因此,建圖的效果明顯改進很多,就如下圖所示。

最後,如果你滿意建圖成果,請輸入以下指令將圖儲存。

rosrun map_server map_server 地圖命名.yaml

ex.$ rosrun map_server map_server mymap.yaml


如果你未安裝map_server套件,請輸入以下指令進行安裝。

$ sudo apt-get install ros-melodic-map-server


完整的 Demo 影片如下 :

---

參考資料 :

0 留言