前言
创建地图是一件比较复杂的工作,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仿真环境下完成自定义机器人的自主导航。
评论(0)
您还未登录,请登录后发表或查看评论