• 文章目录

    前言 
    一、创建编译功能包 
    二、更新启动文件 
    三、启动模型 
    四、保存地图 
    五、加载地图 
    六、总结 


前言

创建地图是一件比较复杂的工作,ROS利用map_server地图服务器,借助激光雷达和机器人的里程信息来完成这项工作。本篇我们还是利用柳树车库作为默认的地图环境。

一、创建编译功能包

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

catkin_create_pkg mbot_sim_gazebo_mapping urdf xacro

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

catkin_make mbot_sim_gazebo_mapping

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

二、更新启动文件

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

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

    
    <!--机器人参数设置-->
    <arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_sim_gazebo_mapping)/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_mapping)/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>

三、启动模型

在运行launch文件之前,需要先完成与建图定位导航相关的功能包的安装,逐步执行如下代码进行安装:

sudo apt-get install ros-melodic-slam-gmapping
sudo apt-get install ros-melodic-gmapping
sudo apt-get install ros-melodic-navigation

安装完成,执行如下代码,启动模型:

roslaunch mbot_sim_gazebo_mapping robot_gazebo_mapping.launch

在rviz里面,添加RobotModel,添加LaserScan,添加Map。

然后将LaserScan的Topic设置为/scan,将Map的Topic设置为/map,将Global Options——Fixed Frame设置为base_footprint

执行如下代码,实现模型的键盘控制:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

通过键盘控制机器人的移动,完成建图过程,移动过程中可以观察到rviz中地图的变化,在这里我只移动了一小块区域,效果如下:

四、保存地图

在mbot_sim_gazebo_mapping功能包下,新建一个map文件夹,切换到该文件夹下,执行如下命令,完成地图保存:

rosrun map_server map_saver -f myMapFile

一定要注意后面那个命令是map_saver,哈哈。

该命令会创建两个文件,myMapFile.pgm文件和myMapFile.yaml文件。myMapFile.pgm文件是以.pgm为格式的地图(可输出灰色地图格式)。myMapFile.yaml文件是该地图的配置文件。
打开myMapFile.pgm文件,内容如下:

五、加载地图

要想使用机器人创建的地图,必须将其加载到map_server功能包中。执行如下命令:

rosrun map_server map_server myMapFile.yaml

可以新建一个名为robot_gazebo_mapping_loadMap.launch的启动文件,文件内容如下:

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

    <!--机器人参数设置-->
    <arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_sim_gazebo_mapping)/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="map_server" pkg="map_server" type="map_server" args="$(find mbot_sim_gazebo_mapping)/map/myMapFile.yaml" />
    
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_sim_gazebo_mapping)/config/default.rviz"/>
</launch>

运行该命令后,效果如下:

可以看到,与上面的myMapFile.pgm文件内容基本一致。至于rviz中的错误,不太明白,后续再研究。。。

六、总结

主要介绍了地图的创建、保存、加载,下一篇尝试配置导航功能包集,并在gazebo仿真环境下完成自定义机器人的自主导航。