1. 程式人生 > >ROS下使用鐳射雷達RPLIDAR-A2進行SLAM完成地圖的構建

ROS下使用鐳射雷達RPLIDAR-A2進行SLAM完成地圖的構建

想要進行一個完整的地圖建立離不開以下幾個模組:
1.座標
2.鐳射資料
3.繪圖演算法
ROS工程可以從我的GitHub上面下載:https://github.com/LJianlin/ROS-SLAM-Gmapping 下載完成後可以拷貝到自己的ROS工作空間下,進行編譯,編譯過程中提示缺少什麼,直接apt-get下載即可。
一、座標的獲取:
筆者這裡使用的是Arduino微控制器作為底層電機的控制板,進行電機編碼器資料的獲取和電機的驅動控制。然後將獲得的編碼器資料傳送給ROS進行里程的轉換,進而獲得小車在地圖上的座標。具體程式碼見功能包。

三、繪圖演算法:
筆者這裡使用的是Gmapping演算法,在ROS下已經有封裝好的包可以直接使用。但是要設定一系列的引數,這也是構建地圖最麻煩的地方。

1.建立鐳射雷達(Rplidar)的串列埠別名
確認idVendor和idProduct,ID後面的部分idVendor:idProduct

$ lsusb
Bus 001 Device 006: ID 10c4:ea60

新建 /etc/udev/rules.d/rplidar.rules檔案,內容如下:(別名為rplidar,實際名稱為:/dev/rplidar)

KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout",  SYMLINK+="rplidar"

增加當前使用者對串列埠的預設訪問許可權並使UDEV配置生效:(重啟電腦使串列埠的預設訪問許可權生效)

$ sudo usermod -a -G dialout 使用者名稱
$ sudo service udev reload
$ sudo service udev restart

2.製作雷達驅動啟動檔案

複製下載的雷達驅動包裡的rplidar.launch到rplidar_laser.launch,並增加TF定義

$ roscd turtlebot_navigation
$ mkdir -p laser/driver
$ sudo cp ~/catkin_ws/src/rplidar_ros/launch
/rplidar.launch laser/driver/rplidar_laser.launch

開啟rplidar_laser.launch,修改完整程式碼如下:

<launch>
  <node name="rplidarNode"          pkg="rplidar_ros"  type="rplidarNode" output="screen">
  <param name="serial_port"         type="string" value="/dev/ttyUSB0"/>  
  <param name="serial_baudrate"     type="int"    value="115200"/>
  <param name="frame_id"            type="string" value="laser"/>
  <param name="inverted"            type="bool"   value="false"/>
  <param name="angle_compensate"    type="bool"   value="true"/>
  </node>


  <node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.0 0.18 0 0.0 0.0 base_link laser 100"/>
</launch>

其中檢視frame_id是否指定為laser,檢視serial_port是否指定正確埠,增加TF,修改為args=”0.0 0.0 0.18 0 0.0 0.0 為自己雷達的實際安裝位置。假設底盤的中心點為0,雷達放在機器人托盤中心位置,X為0,高度為18CM,Z為0.18m,TF的單位使用米,測量單位是CM
3.增加dis_gmapping.launch檔案,用於啟動gmapping。
輸入內容:

<?xml version="1.0"?>
<launch>

<!-- arduino.launch-->
 <node name="arduino" pkg="ros_arduino_python" type="arduino_node.py" output="screen">
      <rosparam file="$(find ros_arduino_python)/config/my_arduino_params.yaml" command="load" />
   </node>
<!-- rplidar_gmapping.launch-->
  <!-- Define laser type-->
  <arg name="laser_type" default="rplidar" />

  <!-- laser driver -->
  <include file="$(find slam_gampping)/laser/$(arg laser_type)_laser.launch" />

  <!-- Gmapping -->
  <arg name="custom_gmapping_launch_file" default="$(find slam_gampping)/launch/$(arg laser_type)_gmapping.launch.xml"/>
  <include file="$(arg custom_gmapping_launch_file)"/>
  <!-- Move base -->
  <include file="$(find slam_gampping)/launch/move_base.launch.xml"/>

<!-- diaplay.launch-->
    <arg name="model" default="$(find robot1_description)/urdf/robot1.urdf" />
    <arg name="gui" default="False" />
    <param name="robot_description" textfile="$(arg model)" />
    <param name="use_gui" value="$(arg gui)"/>
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.rviz" />

  <!-- joy_node.py-->
  <node name="joystick" pkg="joy" type="joy_node" >
       <param name="deadzone" value="0.0" />
    </node>

  <!-- cmd_control.py-->
  <node name="cmd_control" pkg="cmd_control" type="cmdtest.py" >
    </node>

</launch>

4.下載turtlebot_navigation功能包,apt-get直接下載
增加rplidar_gmapping.launch.xml檔案,執行gmapping建圖

$ roscd  turtlebot_navigation
$ touch  launch/includes/gmapping/rplidar_gmapping.launch.xml 
$ rosed  launch/includes/gmapping/rplidar_gmapping.launch.xml 

輸入內容:

<launch>
  <arg name="scan_topic"  default="scan" />
  <arg name="base_frame"  default="base_link"/>
  <arg name="odom_frame"  default="odom"/>


  <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
    <param name="base_frame" value="$(arg base_frame)"/>
    <param name="odom_frame" value="$(arg odom_frame)"/>
    <param name="map_update_interval" value="0.01"/>
    <param name="maxUrange" value="4.0"/>
    <param name="maxRange" value="5.0"/>
    <param name="sigma" value="0.05"/>
    <param name="kernelSize" value="3"/>
    <param name="lstep" value="0.05"/>
    <param name="astep" value="0.05"/>
    <param name="iterations" value="5"/>
    <param name="lsigma" value="0.075"/>
    <param name="ogain" value="3.0"/>
    <param name="lskip" value="0"/>
    <param name="minimumScore" value="30"/>
    <param name="srr" value="0.01"/>
    <param name="srt" value="0.02"/>
    <param name="str" value="0.01"/>
    <param name="stt" value="0.02"/>
    <param name="linearUpdate" value="0.05"/>
    <param name="angularUpdate" value="0.0436"/>
    <param name="temporalUpdate" value="-1.0"/>
    <param name="resampleThreshold" value="0.5"/>
    <param name="particles" value="8"/>

    <param name="xmin" value="-1.0"/>
    <param name="ymin" value="-1.0"/>
    <param name="xmax" value="1.0"/>
    <param name="ymax" value="1.0"/>

    <param name="delta" value="0.05"/>
    <param name="llsamplerange" value="0.01"/>
    <param name="llsamplestep" value="0.01"/>
    <param name="lasamplerange" value="0.005"/>
    <param name="lasamplestep" value="0.005"/>
    <remap from="scan" to="$(arg scan_topic)"/>
  </node>
</launch>

測試:
$ roslaunch slam_gmapping dis_gmapping.launch
構建地圖結束儲存地圖

$ mkdir -p ~/map
$ rosrun map_server map_saver -f ~/map/rplidar_gmapping

生成的地圖檔案,可以用影象瀏覽器開啟檢視。

Rviz顯示的效果:
這裡寫圖片描述