用ROS做机器人仿真三、用navigation包仿真

第三节、用navigation包做运动规划仿真

英文地址。英文教程里先介绍了turtlebot仿真建图、存图、装载地图并仿真运动规划,然后同样的流程介绍mybot的仿真过程。我们这里不再介绍turtlebot相关部分,直接测试mybot的仿真过程。

参考教程:

1、配置导航功能包。

2、用turtlebot例程建图。

3、一个turtlebot教程社区。

4、amcl的使用和介绍。

在进行测试之前,我们要把当前仓库切到navigation分支

fc@fc-msi:~/ROSWorkspace/src/mybot_ws$ git checkout navigation 
切换到分支 'navigation'
您的分支与上游分支 'origin/navigation' 一致。
fc@fc-msi:~/ROSWorkspace/src/mybot_ws$ git branch
  base
  base_sensors
* navigation

一、建图Mapping

首先我们用Laser传感器把环境地图构建出来,打开一个终端

扫描二维码关注公众号,回复: 2257270 查看本文章
roslaunch mybot_gazebo mybot_world.launch

在另一个终端中开始构建地图

roslaunch mybot_navigation gmapping_demo.launch

gmapping包是一种SLAM建图包,采用粒子滤波方法构建未知环境的二维地图。

手动控制建图过程,初级教程里跟玩机器人小龟一样,上下左右前进后退转弯,建图需要一段时间

roslaunch mybot_navigation mybot_teleop.launch

在rviz中查看建图效果并做调整

roslaunch mybot_description mybot_rviz_gmapping.launch

二、保存地图

rosrun map_server map_saver -f /path/to/your/workspace/maps/test_map

三、装载地图

打开gazebo仿真环境

roslaunch mybot_gazebo mybot_world.launch

用amcl包开始导航定位,amcl是机器人二维环境下的概率定位系统,采用自适应的蒙特卡洛方法,针对已有地图系统采用粒子滤波器跟踪机器人的姿态。

roslaunch mybot_navigation amcl_demo.launch

在rviz中观察定位导航效果

roslaunch mybot_description mybot_rviz_amcl.launch

当你看到测试结果后,来重点剖析下这个amcl_demo.launch文件,

<launch>
  <master auto="start"/>

  <!-- Map server -->
  <arg name="map_file" default="$(find mybot_navigation)/maps/test_map.yaml"/>
  <node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" />

  <!-- Place map frame at odometry frame -->
  <node pkg="tf" type="static_transform_publisher" name="map_odom_broadcaster"
      args="0 0 0 0 0 0 map odom 100"/>

  <!-- Localization -->
  <node pkg="amcl" type="amcl" name="amcl" output="screen">
    <remap from="scan" to="mybot/laser/scan"/>
    <param name="odom_frame_id" value="odom"/>
    <param name="odom_model_type" value="diff-corrected"/>
    <param name="base_frame_id" value="chassis"/>
    <param name="update_min_d" value="0.5"/>
    <param name="update_min_a" value="1.0"/>
  </node>
  <!--include file="$(find amcl)/examples/amcl_omni.launch"/-->



  <!-- Move base -->
  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <rosparam file="$(find mybot_navigation)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find mybot_navigation)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find mybot_navigation)/config/local_costmap_params.yaml" command="load" />
    <rosparam file="$(find mybot_navigation)/config/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find mybot_navigation)/config/base_local_planner_params.yaml" command="load" />
    
    <remap from="cmd_vel" to="cmd_vel"/>
    <remap from="odom" to="odom"/>
    <remap from="scan" to="mybot/laser/scan"/>
    <param name="move_base/DWAPlannerROS/yaw_goal_tolerance" value="1.0"/>
    <param name="move_base/DWAPlannerROS/xy_goal_tolerance" value="1.0"/>



  </node>


</launch>

第一步是创建一个map_server节点加载我们制作好的地图。

第二步创建一个map_odom_broadcaster节点,将地图的坐标系和机器人里程计坐标系的变换关系确定,这里的参数意思就是两个坐标系完全一样。

第三步是创建一个amcl节点,具体的配置如图,scan参数为gazebo中发布的laser/scan,接收激光雷达数据;里程计坐标系为小车里程计坐标系,基础坐标系为小车的chessis.

第四步是最关键的move_base节点,关于move_base的这些yaml配置文件应当去参考Navigation工具包配置

最后终端键入rqt_graph命令查看此时所有的Topics和Nodes之间的关系图

gazebo_gui节点暂时不理会,我们看到,有一个gazebo节点,它接收move_base节点发出的cmd_vel话题驱动小车运动,同时它发布/mybot/klaser/scan话题和/odom话题、tf话题供amcl节点使用;

amcl节点综合激光点云数据和tf数据作出姿态估计和结算,并更新tf话题,更新后的tf话题被送到move_base节点;

move_base节点根据/mybot/laser/scan话题、tf话题、odom话题和加载的map话题,还有用户指定的2d Navigation Goal,然后做global_plan和local_plan,并将结果通过action_topics回传给move_base节点。move_base提供了ROS导航的配置、运行、交互接口,它主要包括两个部分:
      (1) 全局路径规划(global planner):根据给定的目标位置进行总体路径的规划;
      (2) 本地实时规划(local planner):根据附近的障碍物进行躲避路线规划。

猜你喜欢

转载自blog.csdn.net/fang_chuan/article/details/81115318