基于Gazebo搭建移动机器人,并结合SLAM系统完成建图仿真

博客地址:https://www.cnblogs.com/zylyehuo/

gazebo小车模型创建及仿真详见之前博客

gazebo小车模型(附带仿真环境) - zylyehuo - 博客园

gazebo+rviz 仿真 - zylyehuo - 博客园

参考链接

Autolabor-ROS机器人入门课程《ROS理论与实践》

成果图

step1: 准备工作

安装必要工具包+创建工作包

  • 安装 gmapping 包(用于构建地图): sudo apt install ros-melodic-gmapping
  • 安装地图服务包(用于保存与读取地图):sudo apt install ros-melodic-map-server
  • 安装 navigation 包(用于定位以及路径规划):sudo apt install ros-melodic-navigation

创建文件夹及文件

按下图结构在 nav_demo 下依次创建

文件夹: config(也可按照步骤之后创建)、map(也可按照步骤之后创建)、launch

文件:nav01_slam.launch、nav02_map_save.launch、nav03_map_server.launch

/home/yehuo/mycar_ws/src/nav_demo/launch/nav01_slam.launch

<launch>
    <!-- 仿真环境下,将该参数设置为true  -->
    <param name="use_sim_time" value="true"/>
    <!-- gmapping  -->
    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
      <!-- 设置雷达话题  -->
      <remap from="scan" to="scan"/>

      <!-- 关键参数:坐标系 -->
      <param name="base_frame" value="base_footprint"/><!--底盘坐标系-->
      <param name="map_frame" value="map"/>
      <param name="odom_frame" value="odom"/> <!--里程计坐标系-->

      <param name="map_update_interval" value="5.0"/>
      <param name="maxUrange" value="16.0"/>
      <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.1"/>
      <param name="srt" value="0.2"/>
      <param name="str" value="0.1"/>
      <param name="stt" value="0.2"/>
      <param name="linearUpdate" value="1.0"/>
      <param name="angularUpdate" value="0.5"/>
      <param name="temporalUpdate" value="3.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"/>
      <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>

    <node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" />
    <node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" />

    <node pkg="rviz" type="rviz" name="rviz" />
    <!-- 可以保存 rviz 配置并后期直接使用-->
    <!--
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_nav_sum)/rviz/gmapping.rviz"/>
    -->
</launch>

step2: 仿真环境运行 + SLAM建图

(1)编译+启动 gazebo 仿真环境

source ./devel/setup.bash 

roslaunch mycar environment.launch

(2)启动 rviz

source ./devel/setup.bash

roslaunch nav_demo nav01_slam.launch

(3)启动键盘控制节点

rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.3 _turn:=0.5

(4)在 rviz 中显示仿真环境

(5)保存 rviz 设置

(6)通过键盘控制机器人运动

每隔 5s 更新一次地图

step3: 保存地图(在step2基础上,不要关闭之前程序)

/home/yehuo/mycar_ws/src/nav_demo/launch/nav02_map_save.launch

<launch>
    <arg name="filename" value="$(find nav_demo)/map/nav" />
    <node name="map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)" />
</launch>

在 nav_demo 下新建文件夹 map

新建终端,保存地图

source ./devel/setup.bash

roslaunch nav_demo nav02_map_save.launch

/home/yehuo/mycar_ws/src/nav_demo/map/nav.yaml 文件解释

# 1、声明地图图片资源的路径
image: /home/yehuo/mycar_ws/src/nav_demo/map/nav.pgm

# 2、地图刻度尺单位是 米/像素
resolution: 0.050000

# 3、地图的位姿(按照右手坐标系,地图右下角相对于 rviz 中原点的位姿)
# 值1:x方向上的偏移量
# 值2:y方向上的偏移量
# 值3:地图的偏航角度(单位:弧度)
origin: [-50.000000, -50.000000, 0.000000]

# 地图中的障碍物判断:
# 最终显示结果:白色是可通行区域,黑色是障碍物,蓝灰是未知区域
# 判断规则:
# 1、地图中的每个像素都有取值 [0,255]       255:白色       0:黑色
# 2、根据像素值计算一个比例:        p   = (255 - 像素值)/  255       ==>   0:白色    1:黑色
# 3、判断是否是障碍物, p > occupied_thresh        就是障碍物
#                    p < free_thresh            就无障碍物

# 4、占用阈值
occupied_thresh: 0.65

# 5、空闲阈值
free_thresh: 0.196

# 6、取反(1:黑的区域变白的,白的区域变黑的)
negate: 0

step4: 读取地图

/home/yehuo/mycar_ws/src/nav_demo/launch/nav03_map_server.launch

<launch>

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

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

</launch>

读取地图

source ./devel/setup.bash

roslaunch nav_demo nav03_map_server.launch

显示读取的地图

打开一个新的终端,启动 rviz

posted @ 2023-05-14 13:17  zylyehuo  阅读(761)  评论(0编辑  收藏  举报