前言

上一篇使用的是柳树车库环境,实现完整建图工作比较复杂,所以准备新建一个简单点的环境,在此基础上实现后面的自定义机器人定位与导航。

一、新建环境

启动gazebo,按下Ctrl+B键,进入编辑器,界面如下:

编辑器由三部分组成:
(1) Palette,在这里可以选择建筑的特征和材料。
(2) 2D View,可以导入floor计划嵌入墙,窗,门和台阶。
(3) 3D View,建筑物的预览,能够设计建筑物不同部分的颜色和纹理。
下图是按照我家房子户型,进行绘制的。绘制完成,选择File-save as菜单,进行保存,效果如下:

可以看到该环境保存到了myHome目录下,主要生成了两个文件,model.config文件和model.sdf文件。

二、创建编译功能包

切换到catkin_ws/src目录下,如下:

catkin_create_pkg mbot_sim_gazebo_map urdf xacro

切换到catkin_ws目录下,编译该功能包,如下:

catkin_make mbot_sim_gazebo_map

在该功能包下创建config、include、src、launch、urdf、map文件夹,在urdf文件下创建urdf文件夹和xacro文件夹,复制meshes文件夹到该功能包下。

切换到usr/share/gazebo-9/models目录,新建mbot_sim_gazebo_navigation_model文件夹,复制myHome文件夹下面的两个文件到该文件夹下,如下:

三、新建.world文件

切换到usr/share/gazebo-9/worlds目录,新建mbot_sim_gazebo_navigation.world文件,内容如下:

<?xml version="1.0" ?>
<sdf version="1.5">
	  <world name="default">
	    <include>
	      <uri>model://ground_plane</uri>
	    </include>
	    <include>
	      <uri>model://sun</uri>
	    </include>
	    <include>
	      <uri>model://mbot_sim_gazebo_navigation_model</uri>
	    </include>
	  </world>
</sdf>

编写完该文件后,修改文件夹的权限。

四、新建world启动文件

切换到opt/ros/melodic/share/gazebo_ros/launch目录下,新建mbot_sim_gazebo_navigation_world.launch文件,文件内容如下:

<?xml version="1.0"?>
<launch>
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="worlds/mbot_sim_gazebo_navigation.world"/> 
    <arg name="paused" value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui" value="true"/>
    <arg name="headless" value="false"/>
    <arg name="debug" value="false"/>
  </include>
</launch>

五、更新启动文件

在启动文件中配置rviz和gmaping包,robot_gazebo_navigation.launch文件内容如下:

<launch>
 	<!-- 运行gazebo仿真环境 -->
    <include file="$(find gazebo_ros)/launch/mbot_sim_gazebo_navigation_world.launch">
    </include>

    <!--机器人参数设置-->
    <arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_sim_gazebo_map )/urdf/xacro/robot.xacro'" />
     
    <!--robot_description 参数名称是参数服务器预先设定好的,不能改变-->
    <param name="robot_description" command="$(arg model)" />
    
    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

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

    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_sim_gazebo_map )/config/default.rviz"/>

    <!--gmapping 包实现同步定位和地图建立-->
    <node name="slam_gmapping" pkg="gmapping" type="slam_gmapping">
	<remap from="scan" to="/scan"/>
	<param name="base_link" value="base_footprint"/>
    </node>
</launch>

六、建图

按照ROS学习(十一)篇讲解的内容,运行robot_gazebo_navigation.launch启动文件,添加RobotModel和Map后,效果如下:

可以看到,我们新建的环境比柳树车库简单很多。。。
然后使用键盘控制机器人移动,完成整个地图构建,效果如下:

可以看到,整体效果还不错,哈哈。。。

然后我们切换到map目录,使用map_server保存地图即可。