Ros—RPLIDAR A2激光雷達開箱測試與hector_mapping算法建圖測試

1、基本性能

        RPLIDAR A2 的典型旋轉頻率爲 10hz (600rpm),在典型旋轉頻率下可以實現 0.45°的角度分辨率,RPLIDAR 採用了激光三角測距技術,每秒8000 次 的高速激光測距採樣能力,可以實現在二維平面的 12 米半徑範圍內進行 360 度全方位的激光測距掃描,併產生所在空間的平面點雲地圖信息。

2、工作原理


       每次測距過程中,RPLIDAR 將發射經過調製的紅外激光信號,該激光信號在照射到目標物體後產生的反光將被RPLIDAR 的視覺採集系統接收,然後經過嵌入在 RPLIDAR 內部的 DSP 處理器實時解算,被照射到的目標物體與 RPLIDAR 的距離值以及當前的夾角信息將從通訊接口中輸出。在電機機構的驅動下,RPLIDAR 的測距核心將順時針旋轉,從而實現對周圍環境的 360 度全方位掃描測距檢測。


2.1 三角測距原理

主流的激光雷達主要是基於兩種原理的,一種是三角測距法,一種是飛行時間(TOF)法。
(1)單點三角測距


典型的三角測距原理結構如下圖:

 


        激光器Laser以一定的角度beta射出一束激光,沿激光方向距離爲d的物體反射激光。接受激光的一般是個長條的CMOS(可以看成是一個長條形的攝像頭),被物體反射的激光經過“小孔成像”被Imager(即CMOS)拍攝到。
        焦距是f,物體離平面的垂直距離是q,激光器和焦點間的距離是s,過焦點平行於激光方向的虛線,它跟Imager的交點位置一般是預先知道的(確定好beta就知道了),物體激光反射後成像在Imager上的點位置離該處的距離爲X。
從圖中很容易看出來,q, d, beta組成的三角形跟X, f組成的三角形是相似三角形,於是有:

 
又由於 

於是

 

最後得到:

 
        因爲f, s, beta都是預先可以已知的量,唯一需要測量的就是X,因此,測出X即可計算出d,即得到物體離激光器的距離。
從圖中可以看出,若d的距離變短了,則X就會變大,d變大了,X就變小,從Imager測出X只要計算出得到的光斑的中心即可獲得距離X。
(2)從單點變成激光器
         將激光器和成像器固定在一起,做成一個固定的裝置,然後旋轉,即可獲得周圍360°的掃描結果。


 
2.2 掃描數據座標系定義


2.3 數據通訊接口


         RPLIDAR A2 通訊接口採用 3.3V 電平的串口(UART)。

 
3、設備連接


(1)將RPLIDAR A2 模組的連接線與 USB 適配器進行連接。


 
(2) 將 USB 轉接器通過 Micro-USB 線纜與 樹莓派3B連接。


 
4、環境地圖構建測試


rplidar ros package ,支持設備rplidar A2/A1.


4.1 rplidar包安裝(主機和從機)


終端一次運行:

$ cd ~/ros_ws/src
$ git clone https://github.com/robopeak/rplidar_ros.git
$ cd ..
$ catkin_make


正確顯示如下:
 
在從機terminal運行:

$ roslaunch rplidar_ros view_rplidar.launch

launch 文件:

<!--
  Used for visualising rplidar in action.  
  
  It requires rplidar.launch.
 -->
<launch>
  <include file="$(find rplidar_ros)/launch/rplidar.launch" />

  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find rplidar_ros)/rviz/rplidar.rviz" />
</launch>


雷達數據:
 
可以查看話題信息:
 

4.2 使用hector_mapping算法的slam建圖
(程序git克隆在主從機)

 

$ cd ~/ros_ws/src
$ git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam
$ cd ..
$ catkin_make


 
在rplidar_ros/launch/目錄下添加hector_mapping_demo.launch文件,內容如下:

<launch>

<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
<!-- Frame names -->
<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" />

<!-- Tf use -->
<param name="use_tf_scan_transformation" value="true"/>
<param name="use_tf_pose_start_estimate" value="false"/>

<!-- Map size / start point -->
<param name="map_resolution" value="0.05"/>
<param name="map_size" value="2048"/>
<param name="map_start_x" value="0.5"/>
<param name="map_start_y" value="0.5" />
<param name="laser_z_min_value" value = "-1.0" />
<param name="laser_z_max_value" value = "1.0" />
<param name="map_multi_res_levels" value="2" />

<param name="map_pub_period" value="2" />
<param name="laser_min_dist" value="0.4" />
<param name="laser_max_dist" value="5.5" />
<param name="output_timing" value="false" />
<param name="pub_map_scanmatch_transform" value="true" />
<!--<param name="tf_map_scanmatch_transform_frame_name" value="scanmatcher_frame" />-->

<!-- Map update parameters -->
<param name="update_factor_free" value="0.4"/>
<param name="update_factor_occupied" value="0.7" />    
<param name="map_update_distance_thresh" value="0.2"/>
<param name="map_update_angle_thresh" value="0.06" />

<!-- Advertising config --> 
<param name="advertise_map_service" value="true"/>
<param name="scan_subscriber_queue_size" value="5"/>
<param name="scan_topic" value="scan"/>
</node>

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

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


然後在從機terminal輸入命令運行Hector SLAM創建地圖:

$ roslaunch rplidar_ros hector_mapping_demo.launch
$ roslaunch rplidar_ros rplidar.launch

最終顯示的教室柵格地圖:
 

5、API


發佈的主題:
scan (sensor_msgs/LaserScan)
提供的服務:
stop_motor (std_srvs/Empty) //調用該服務停止rplidar的電機
start_motor (std_srvs/Empty) //調用該服務啓動rplidar的電機
可配置的參數:
serial_port (string, default: /dev/ttyUSB0) //掛載後的串口名稱
serial_baudrate (int, default: 115200) //串口速率
frame_id (string, default: laser)  //傳感器座標系名稱
inverted (bool, default: false) //雷達是否被倒置
angle_compensate (bool, default: true) //是否需要角度優化
啓動命令:
roslaunch rplidar_ros rplidar.launch
【注】
1、由於是串口通信,所以保證掛載的節點有讀寫權限。要不設置成666或777,要不就把當前用戶加到dialout這個組中。例:
端口查看:

$ ls -l /dev |grep ttyUSB

權限:

$ sudo chmod 666 /dev/ttyUSB0

2、rosmaster均運行於主機
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章