gmapping 功能包与hector_slam 功能包实现 SLAM 仿真

gmapping 功能包、hector_slam 功能包实现 SLAM 仿真

一、gmapping 功能包实现SLAM仿真

  1. 进入ros环境
    在这里插入图片描述

  2. 配置gmapping相关节点

    在这里插入图片描述

<launch>
    <arg name="scan_topic" default="scan" />

    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
        <param name="odom_frame" value="odom"/>
        <param name="map_update_interval" value="5.0"/>
        <!-- Set maxUrange < actual maximum range of the Laser -->
        <param name="maxRange" value="5.0"/>
        <param name="maxUrange" value="4.5"/>
        <param name="sigma" value="0.05"/>
        <param name="kernelSize" value="1"/>
        <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="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.5"/>
        <param name="angularUpdate" value="0.436"/>
        <param name="temporalUpdate" value="-1.0"/>
        <param name="resampleThreshold" value="0.5"/>
        <param name="particles" value="80"/>
        <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>

3.运行相关mbot_laser_nav_gazebo.launch文件

roslaunch  mbot_gazebo mbot_laser_nav_gazebo.launch
<launch>

    <!-- 设置launch文件的参数 -->
    <arg name="world_name" value="$(find mbot_gazebo)/worlds/cloister.world"/>
    <arg name="paused" default="false"/>
    <arg name="use_sim_time" default="true"/>
    <arg name="gui" default="true"/>
    <arg name="headless" default="false"/>
    <arg name="debug" default="false"/>

    <!-- 运行gazebo仿真环境 -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(arg world_name)" />
        <arg name="debug" value="$(arg debug)" />
        <arg name="gui" value="$(arg gui)" />
        <arg name="paused" value="$(arg paused)"/>
        <arg name="use_sim_time" value="$(arg use_sim_time)"/>
        <arg name="headless" value="$(arg headless)"/>
    </include>

    <!-- 加载机器人模型描述参数 -->
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/gazebo/mbot_with_laser_gazebo.xacro'" /> 

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> 

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
        <param name="publish_frequency" type="double" value="50.0" />
    </node>

    <!-- 在gazebo中加载机器人模型-->
    <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
          args="-urdf -model mbot -param robot_description"/> 

</launch>

在这里插入图片描述
4. 运行gmapping_demo.launch文件,运行rviz查看机器人相关视角激光扫描图像(激光雷达)

roslaunch mbot_navigation gmapping_demo.launch

在这里插入图片描述
在这里插入图片描述

5.运行mbot_teleop.launch文件,通过键盘控制小车运动

roslaunch mbot_teleop  mbot_teleop.launch
<launch>
  <node name="mbot_teleop" pkg="mbot_teleop" type="mbot_teleop.py" output="screen">
    <param name="scale_linear" value="0.1" type="double"/>
    <param name="scale_angular" value="0.4" type="double"/>
  </node>
</launch>

在这里插入图片描述
由下图可知,小车运动后激光扫描图片也发生了变化:
在这里插入图片描述
在这里插入图片描述

6.运行命令,保存扫描地图到指定位置

rosrun map\_server map\_saver -f/home/luxiaolu/catkin\_ws/src/mbot\_navigation/maps/cloister\_gmapping

在这里插入图片描述
在这里插入图片描述
由图像可知,该图片确实为小车移动后扫描图像的图片

  1. 运行 mbot_kinect_nav_gazebo.launch 文件
roslaunch  mbot_gazebo mbot_kinect_nav_gazebo.launch
<launch>

    <!-- 设置launch文件的参数 -->
    <arg name="world_name" value="$(find mbot_gazebo)/worlds/room.world"/>
    <arg name="paused" default="false"/>
    <arg name="use_sim_time" default="true"/>
    <arg name="gui" default="true"/>
    <arg name="headless" default="false"/>
    <arg name="debug" default="false"/>

    <!-- 运行gazebo仿真环境 -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(arg world_name)" />
        <arg name="debug" value="$(arg debug)" />
        <arg name="gui" value="$(arg gui)" />
        <arg name="paused" value="$(arg paused)"/>
        <arg name="use_sim_time" value="$(arg use_sim_time)"/>
        <arg name="headless" value="$(arg headless)"/>
    </include>

    <!-- 加载机器人模型描述参数 -->
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/gazebo/mbot_with_kinect_gazebo.xacro'" /> 

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> 

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
        <param name="publish_frequency" type="double" value="50.0" />
    </node>

    <!-- 在gazebo中加载机器人模型-->
    <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
          args="-urdf -model mbot -param robot_description"/> 

    <!-- 运行depthimage_to_laserscan节点,将点云深度数转换成激光数据 -->
    <node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan" name="depthimage_to_laserscan" output="screen">
        <remap from="image" to="/kinect/depth/image_raw" />
        <remap from="camera_info" to="/kinect/depth/camera_info" />
        <remap from="scan" to="/scan" />
        <param name="output_frame_id" value="/kinect_link" />
    </node>

</launch>

在这里插入图片描述
在这里插入图片描述

二、使用hector_slam 功能包实现 SLAM 仿真

1.安装hector_slam包

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

在这里插入图片描述

2.配置hector_mapping节点

<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_footprint" />
        <param name="odom_frame" value="odom" />

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

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

</launch>

在这里插入图片描述
3. 运行 mbot_laser_nav_gazebo.launch 文件

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch

在这里插入图片描述
在这里插入图片描述
4.运行hector_demo.launch文件

roslaunch mbot_navigation hector_demo.launch

在这里插入图片描述
在这里插入图片描述

5.运行mbot_teleop.launch文件,键盘控制小车移动

roslaunch mbot_teleop mbot_teleopp.launch

在这里插入图片描述
在这里插入图片描述
6.通过命令保存扫描的地图

rosrun map\_server map\_saver -f/home/luxiaolu/catkin\_ws/src/mbot\_navigation/maps/cloister\_gmapping1

在这里插入图片描述

由截图可知,保存的图片即为机器人扫描图片

7.运行mbot_laser_nav_gazebo.launch 文件

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch

在这里插入图片描述
在这里插入图片描述

  1. 运行nav_cloister_demo.launch文件
roslaunch mbot_navigation nav_cloister_demo.launch
<launch>

    <!-- 设置地图的配置文件 -->
    <arg name="map" default="cloister_gmapping.yaml" />

    <!-- 运行地图服务器,并且加载设置的地图-->
    <node name="map_server" pkg="map_server" type="map_server" args="$(find mbot_navigation)/maps/$(arg map)"/>

    <!-- 运行move_base节点 -->
    <include file="$(find mbot_navigation)/launch/move_base.launch"/>

    <!-- 启动AMCL节点 -->
    <include file="$(find mbot_navigation)/launch/amcl.launch" />

    <!-- 对于虚拟定位,需要设置一个/odom与/map之间的静态坐标变换 -->
    <node pkg="tf" type="static_transform_publisher" name="map_odom_broadcaster" args="0 0 0 0 0 0 /map /odom 100" />

    <!-- 运行rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find mbot_navigation)/rviz/nav.rviz"/>

</launch>

在这里插入图片描述
在这里插入图片描述

9.点击选项2D Naw Goal,使小车自己运动
在这里插入图片描述
在这里插入图片描述

10.运行mbot_laser_nav_gazebo.launch 文件

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch

在这里插入图片描述
在这里插入图片描述

11.运行exploring_slam_demo.launch文件

roslaunch mbot_navigation exploring_slam_demo.launch
<launch>

    <include file="$(find mbot_navigation)/launch/gmapping.launch"/>

    <!-- 运行move_base节点 -->
    <include file="$(find mbot_navigation)/launch/move_base.launch" />

    <!-- 运行rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find mbot_navigation)/rviz/nav.rviz"/>

</launch>

在这里插入图片描述
在这里插入图片描述

12.点击选项2D Naw Goal,利用鼠标箭头指向使小车自己运动
在这里插入图片描述
在这里插入图片描述

总结

1.在运行相关launch文件时如果出现,文件不存在的问题,可以通过source devel/setup.bash命令进行文件注册,或重新输入命令解决
2. 在hector_slam过程中,会因为小车加速等原因发生打滑现象
在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值