用ROS做机器人仿真三、用navigation包仿真
第三节、用navigation包做运动规划仿真
英文地址。英文教程里先介绍了turtlebot仿真建图、存图、装载地图并仿真运动规划,然后同样的流程介绍mybot的仿真过程。我们这里不再介绍turtlebot相关部分,直接测试mybot的仿真过程。
参考教程:
1、配置导航功能包。
在进行测试之前,我们要把当前仓库切到navigation分支
aaa@qq.com:~/ROSWorkspace/src/mybot_ws$ git checkout navigation
切换到分支 'navigation'
您的分支与上游分支 'origin/navigation' 一致。
aaa@qq.com:~/ROSWorkspace/src/mybot_ws$ git branch
base
base_sensors
* navigation
一、建图Mapping
首先我们用Laser传感器把环境地图构建出来,打开一个终端
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):根据附近的障碍物进行躲避路线规划。
上一篇: 面试题汇总