ROS下使用激光雷达RPLIDAR-A2进行SLAM完成地图的构建

想要进行一个完整的地图建立离不开以下几个模块:
1.坐标
2.激光数据
3.绘图算法
ROS工程可以从我的GitHub上面下载:https://github.com/LJianlin/ROS-SLAM-Gmapping 下载完成后可以拷贝到自己的ROS工作空间下,进行编译,编译过程中提示缺少什么,直接apt-get下载即可。
一、坐标的获取:
笔者这里使用的是Arduino单片机作为底层电机的控制板,进行电机编码器数据的获取和电机的驱动控制。然后将获得的编码器数据发送给ROS进行里程的转换,进而获得小车在地图上的坐标。具体代码见功能包。

二、激光数据的获取:
见我的另一篇博客:https://blog.csdn.net/liujianlin01/article/details/78518694

三、绘图算法:
笔者这里使用的是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,修改完整代码如下:


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


  "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"/>

其中查看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。
输入内容:


<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>

  
  <arg name="laser_type" default="rplidar" />

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

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


    <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" />

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

  
  <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 

输入内容:


  "scan_topic"  default="scan" />
  "base_frame"  default="base_link"/>
  "odom_frame"  default="odom"/>


  "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"/>
    from="scan" to="$(arg scan_topic)"/>
  

测试:
$ roslaunch slam_gmapping dis_gmapping.launch
构建地图结束保存地图

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

生成的地图文件,可以用图像浏览器打开查看。

Rviz显示的效果:

你可能感兴趣的:(ROS,RPLIDAR)