引言
到了本次教程的最后一章,之前我们使用了单机器人SLAM,多机器人地图融合SLAM,以及多个机器人在地图中的导航。最后一章(后面可能会有新的章节,第一系列到此为止),我们将使用explore_lite功能包,使机器人在建图的过程中,自主已经建立地图中最适合拓展的前沿,并自动边导航,边构建地图,直到整张地图构建完成。
源代码在gitee上,可以看第一篇文章。
总体launch文件
主要是融合了第二课和第三课内容,在多机slam中加入了move_base导航,再利用explore_lite进行坐标发布
<launch>
<!--SLAM算法 -->
<arg name="slam_method" default="gmapping"/>
<arg name="simulation" default="true"/>
<arg name="move_forward_only" default="false"/>
<group if="$(arg simulation)" >
<!-- 开启仿真世界 -->
<include file="$(find gazebo_tutorials)/launch/create_world.launch" />
<!-- 放置机器人 -->
<include file="$(find gazebo_tutorials)/launch/place_robot.launch">
<arg name="robot_x_pos" value="0.0"/>
<arg name="robot_y_pos" value="0.0"/>
<arg name="robot_z_pos" value="0.0"/>
<arg name="robot_yaw" value="0.0"/>
<arg name="robot_name" value="tb3_0"/>
</include>
<!-- 放置机器人 -->
<include file="$(find gazebo_tutorials)/launch/place_robot.launch">
<arg name="robot_x_pos" value="-3"/>
<arg name="robot_y_pos" value="0.0"/>
<arg name="robot_z_pos" value="0.0"/>
<arg name="robot_yaw" value="0.0"/>
<arg name="robot_name" value="tb3_1"/>
</include>
</group>
<!-- 开启SLAM -->
<include file="$(find gazebo_tutorials)/slam_methods/$(arg slam_method).launch">
<arg name="ns" value="tb3_0"/>
</include>
<include file="$(find gazebo_tutorials)/slam_methods/$(arg slam_method).launch">
<arg name="ns" value="tb3_1"/>
</include>
<!-- 启动地图融合节点并加入1号机器人地图信息 -->
<include file="$(find gazebo_tutorials)/launch/map_merging.launch">
<arg name="if_first_robot" value="True"/>
<arg name="robot_x_pos" value="0.0"/>
<arg name="robot_y_pos" value="0.0"/>
<arg name="robot_z_pos" value="0.0"/>
<arg name="robot_name" value="tb3_0"/>
</include>
<!-- 加入2号机器人地图信息 -->
<include file="$(find gazebo_tutorials)/launch/map_merging.launch">
<arg name="if_first_robot" value="False"/>
<arg name="robot_x_pos" value="-3"/>
<arg name="robot_y_pos" value="0.0"/>
<arg name="robot_z_pos" value="0.0"/>
<arg name="robot_name" value="tb3_1"/>
</include>
<!-- move_base导航-->
<include file="$(find gazebo_tutorials)/launch/move_base.launch">
<arg name="ns" value="tb3_0" />
<arg name="move_forward_only" value="$(arg move_forward_only)"/>
</include>
<include file="$(find gazebo_tutorials)/launch/move_base.launch">
<arg name="ns" value="tb3_1" />
<arg name="move_forward_only" value="$(arg move_forward_only)"/>
</include>
<!-- 自主探索 -->
<include file="$(find gazebo_tutorials)/launch/explore_costmap.launch">
<arg name="ns" value="tb3_0" />
</include>
<include file="$(find gazebo_tutorials)/launch/explore_costmap.launch">
<arg name="ns" value="tb3_1" />
</include>
<!-- rviz -->
<include file="$(find gazebo_tutorials)/launch/rviz_two_robots.launch" />
</launch>
explore_costmap.launch
这个功能包就是计算出栅格地图的边缘,然后通过某些手段计算边的权重,决定往什么方向进行拓展。这不是自带的功能包,要自己下载。
sudo apt-get install ros-melodic-explore-lite
主要是costmap_topic和costmap_updates_topic两个参数,他们接收到的地图将决定他们根据什么来进行导航。
<launch>
<arg name="ns" default="tb3_0"/>
<node pkg="explore_lite" type="explore" respawn="false" name="$(arg ns)_explore" output="screen">
<remap from="move_base_simple/goal" to="$(arg ns)/move_base_simple/goal"/>
<remap from="move_base" to="$(arg ns)/move_base"/>
<param name="robot_base_frame" value="$(arg ns)/base_footprint"/>
<param name="costmap_topic" value="$(arg ns)/map"/>
<param name="costmap_updates_topic" value="$(arg ns)/map_updates"/>
<!--指定是否发布可视化边界-->
<param name="visualize" value="true"/>
<!--计算新边界和重新考虑目标的频率(Hz)-->
<param name="planner_frequency" value="0.33"/>
<!--时间以秒为单位。当机器人在 progress_timeout 没有任何进展时,当前目标将被放弃。-->
<param name="progress_timeout" value="30.0"/>
<!--用于加权边界。这个乘法参数影响前沿权重的前沿潜在分量(到前沿的距离)。-->
<param name="potential_scale" value="3.0"/>
<!--用于加权边界。这个乘法参数影响前沿权重的前沿方向分量。此参数目前不执行任何操作,仅用于向前兼容。-->
<param name="orientation_scale" value="0.0"/>
<!--用于加权边界。这个乘法参数影响边界权重(边界大小)的边界增益分量。-->
<param name="gain_scale" value="1.0"/>
<!--变换机器人姿势时使用的变换容差。-->
<param name="transform_tolerance" value="0.3"/>
<!--将边界视为探索目标的边界的最小大小。以米为单位。-->
<param name="min_frontier_size" value="0.1"/>
</node>
</launch>
启动
最后使用命令roslaunch gazebo_tutorials two_robots_autoslam.launch
启动即可。
在rviz中可以添加MarkerArray来显示地图前沿
最后我们可以看到两台机器人自己动了起来,并且地图相互融合,但是非常笨,毕竟这个功能包是为了一个机器人准备的,我后面可能自己想办法写多台机器人的决策程序,敬请期待。