Lesson 10: 导航-基于激光雷达数据构造地图

构建地图是SLAM的基础,定位和路径规划都要基于一定的地图才能实现,本节我们将基于激光雷达,采用gmapping和hector slam两个包分别来构建地图

1.激光雷达

激光雷达具有测量精度高的显著特点,是测量距离非常好的选择,但同时他也具有功耗高,成本高等缺点,目前普遍使用的2D的激光雷达,智能测量一个平面内周围的距离,而3D激光雷达的成本居高不下,目前还不能被广泛推广。2D激光雷达只能测量一个平面的问题,也影响其使用的场景,如果用作导航,只适合应用在一些相对简单规则的环境中。

在Diego机器人中,我们使用思岚A2雷达,该雷达的特性如下:

•360度全方位扫描,10赫兹自适应扫描频率,每秒4000次激光测距
•0.15~6米的测距范围
•角度分辨率 0.9°
•测距分辨率<1%

Rplidar采用USB接口与主机连接,同时具备供电和数据传输的功能,所以安装起来还是很方便的,只需要插在主机的USB接口上即可

1.1. 激光雷达ROS驱动包的安装

执行如下命令

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

执行完成后在src目录下增加一个rplidar_ros的目录,就是rplidar的ROS包

 

 

 

 

 

安装完驱动后,这时候把rplidar插到usb口上,会出现一个新串口设备

ls /dev

2.使用hector slam构建地图

2.1安装hector slam

sudo apt-get install ros-kinetic-hector-slam

2.2编写hector slam启动launch文件

下面代码是写好的hector启动launch文件,这里需要注意的一点需要在launch文件中编写一个static tf类型base_frame_2_laser坐标,建立底盘与激光雷达坐标系的映射。

<?xml version="1.0"?>

<launch>
  <arg name="tf_map_scanmatch_transform_frame_name" default="/odom_laser"/>
  <arg name="pub_map_odom_transform" value="true"/> 
  <arg name="map_frame" value="map"/> 
  <arg name="base_frame" value="base_link"/> 
  <arg name="odom_frame" value="odom"/>
  <arg name="scan_subscriber_queue_size" default="5"/>
  <arg name="scan_topic" default="scan"/>
  <arg name="map_size" default="1024"/>

  <master auto="start"/>

  <include file="$(find rplidar_ros)/launch/rplidar.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> 

  <node pkg="tf" type="static_transform_publisher" name="base_frame_2_laser" args="-0.025 0.02 0.095 0 0 0 /$(arg base_frame) /laser 100"/>  

  <node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">   
  <!-- Frame names -->
  <param name="map_frame" value="$(arg map_frame)" />
  <param name="base_frame" value="$(arg base_frame)" />
  <param name="odom_frame" value="$(arg odom_frame)" />   
   <!-- Tf use -->
  <param name="use_tf_scan_transformation" value="true"/>
  <param name="use_tf_pose_start_estimate" value="false"/>
  <param name="pub_map_odom_transform" value="$(arg pub_map_odom_transform)"/> 
  <!-- Map size / start point -->
  <param name="map_resolution" value="0.050"/>
  <param name="map_size" value="$(arg map_size)"/>
  <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.7" />   
  <param name="map_update_distance_thresh" value="0.2"/>
  <param name="map_update_angle_thresh" value="0.9" />
  <param name="laser_z_min_value" value = "-1.0" />
  <param name="laser_z_max_value" value = "1.0" />  
  <param name="laser_max_dist" value = "5.8" />
  <param name="laser_min_dist" value = "0.15" /> 
  <!-- Advertising config -->
  <param name="advertise_map_service" value="true"/>
  <param name="scan_subscriber_queue_size" value="$(arg scan_subscriber_queue_size)"/>
  <param name="scan_topic" value="$(arg scan_topic)"/>
  <param name="tf_map_scanmatch_transform_frame_name" value="$(arg tf_map_scanmatch_transform_frame_name)" />
  </node>

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

</launch>

2.3 启动hector slam

现在就可以执行如下代码,来启动激光雷达

roslaunch diego_nav diego_run_hector_rplidar.launch
 这时我们可以通过键盘控制diego#在房间内运动,启动rviz就可以绘制出相应的地图,在不同终端中执行如下命令
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
rosrun rviz rviz

3.使用gmapping绘制地图

3.1安装ros 导航包

sudo apt-get install ros-kinetic-navigation

执行完后将安装gmapping,acml,move_base

3.2编写gmapping包启动launch文件

<launch>
<master auto="start"/>

<include file="$(find rplidar_ros)/launch/rplidar.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>

<node pkg="tf" type="static_transform_publisher" name="base_frame_2_laser_link" args="-0.025 0.02 0.095 0 0 0 /base_link /laser 50"/>

<!-- gmapping node -->
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping">
<param name="base_frame" value="base_link"/>
<param name="odom_frame" value="odom"/>
<param name="maxUrange" value="6.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="50"/>
<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="30"/>
<!--
<param name="xmin" value="-50.0"/>
<param name="ymin" value="-50.0"/>
<param name="xmax" value="50.0"/>
<param name="ymax" value="50.0"/>
make the starting size small for the benefit of the Android client's memory...
-->
<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"/>
</node>
</launch>

3.3 启动gmapping

现在就可以执行如下代码,来启动激光雷达

roslaunch diego_nav diego_run_gmapping_rplidar.launch
 这时我们可以通过键盘控制diego#在房间内运动,启动rviz就可以绘制出相应的地图,在不同终端中执行如下命令
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
rosrun rviz rviz

4.生成地图文件

无论使用hector还是gmapping动态创建地图的时候,我们可以通过命令生成地图文件

4.1.创建maps文件夹

地图文件需要赋予其777的权限,既可以让map_server在此文件夹中生成地图文件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.2.生成地图文件

打开终端cd进入maps目录,并执行地图生成命令

cd ~/catkin_ws/src/diego_nav/maps/

rosrun map_server map_saver -f rplidar_gmapping

发表评论

Scroll to top
%d 博主赞过: