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均運行於主機