【ROS的Navigation导航系统】
提示:详情可参考index.ros.org网站
文章目录
- 一、ROS的导航系统简介
- 二、导航系统仿真环境准备工作与运行
- 【1】下载源代码
- 【2】建图指令(前面如果已经创建了地图可以直接使用)
- 【3】创建软件包
- 【4】参考launch代码编写nav.launch文件
- 【5】运行导航程序
- 【6】设定导航的目标地点
- 总结
一、ROS的导航系统简介
ROS导航系统架构图
global_planner全局规划器,相当于手机地图APP,它从map_server地图服务器获取全局地图数据,然后根据输入的导航目的地生成全局导航路线internal nav_msgs/Path;
local_planner负责运动控制,控制机器人底盘通信节点base_controller沿着全局导航路线进行运动;
运动过程中需要激光雷达,结合定位器amcl节点来实时给出机器人自身位置,同时还需要里程计来提升定位的可靠性;
机器人在移动过程中经常会遇到一些临时的障碍物,这些障碍物在建图的时候不存在,而在导航过程中突然出现了,因此机器人在移动过程中还需要使用激光雷达、相机等传感器来实事生成机器人周围的障碍物地图(局部地图);
当临时障碍物挡住导航路线时,local_planner会根据局部规划器里的避障算法绕开障碍物,如果无法绕开障碍物,就会激活所谓的应急机制,机器人会采取一系列应急措施尝试突破当前困境,当确认无法绕开障碍物时,会将该临时障碍物更新到全局地图里,然后请求全局规划器(global_planner)再规划一条全新的路线,从而完成导航任务;
move_base软件包里面包含了很多用于导航的功能,其中有个叫move_base的节点,它把全局规划器和局部规划器连接到了一起,同时它还维护着两个地图,分别给两个规划器使用;
move_base节点工作需要/tf、odom、/map、sensor topics这四个消息的同时输入以及导航目地点信息,它才会不断地输出速度指令给地盘节点,驱动机器人行驶去往目标点;
move_base的四组输入数据的实现:
首先运行move_base节点;
1.map_server即地图服务节点,运行该节点并将导航需要的地图文件加载进去,move_base就会自动获取这些地图数据;
2.sensor sources表示多个传感器节点,部分机器人可能安装了多个激光雷达传感器,对于仿真机器人而言,只要加载到仿真环境中,自动就会输出sensor_msgs/LaserScan、sensor_msgs/PointCloud数据到相应的话题,因此在仿真环境无需额外添加该节点;
3.odometry source里程计节点,在仿真环境中也可以由仿真机器人模型自己提供;
4.sensor transforms传感器位置的tf,这些数据在仿真环境中也是由仿真机器人自己提供的;amcl定位模块节点;
对于仿真环境,只需要将下列三个节点都运行起来,输入对应的导航目标即可开启导航功能;
move_base导航节点
map_server地图服务节点
amcl定位节点
参考资料链接:https://wiki.ros.org/move_base
二、导航系统仿真环境准备工作与运行
【1】下载源代码
前面已经安装过了wpr_simulation可以跳过这一步
cd ~/catkin_ws/src
git clone https://github.com/6-robot/wpr_simulation.git
若github超时,试试从gitee下载:
git clone https://gitee.com/s-robot/wpr_simulation.git
进入脚本文件夹,安装依赖项
cd wpr_simulation/scripts/
./install_for_noetic.sh
编译
cd ~/catkin_ws/
catkin_make
下载机器人驱动源码包(前面没有用到这个包,需要执行安装指令)
cd ~/catkin_ws/src
git clone https://github.com/6-robot/wpb_home.git
若github超时,试试从gitee下载:
git clone https://gitee.com/s-robot/wpb_home.git
进入脚本文件夹,安装依赖项
cd ~/catkin_ws/src
cd wpb_home/wpb_home_bringup/scripts/
./install_for_noetic.sh
编译
cd ~/catkin_ws/
catkin_make
等待编译完成即可
【2】建图指令(前面如果已经创建了地图可以直接使用)
启动SLAM仿真程序
roslaunch wpr_simulation wpb_gmapping.launch
使用键盘控制机器人运动
rosrun wpr_simulation keyboard_vel_ctrl
保存地图(生成map.pgm和map.yaml文件)
rosrun map_server map_saver -f map
将生成的两个文件(.pgm和.yaml文件)放到wpr_simulation的maps文件夹里
【3】创建软件包
使用launch文件启动如下三个节点:
move_base导航节点
map_server地图服务节点
amcl定位节点
进入工作空间源码目录:
cd catkin_ws/src/
创建一个新的软件包来放置launch文件(文件名称 nav_pkg):
需要添加导航需要的依赖项move_base_msgs actionlib
catkin_create_pkg nav_pkg roscpp rospy move_base_msgs actionlib
在vscode中找到nav_pkg软件包,在该目录下新建launch文件夹;
在launch文件夹中新建nav.launch文件;
【4】参考launch代码编写nav.launch文件
wpr_simulation/launch/wpb_demo_nav.launch
编写launch文件:
<launch>
<node pkg="move_base" type="move_base" name="move_base">
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />
<param name="base_global_planner" value="global_planner/GlobalPlanner" />
<param name="base_local_planner" value="wpbh_local_planner/WpbhLocalPlanner" />
</node>
<node pkg="map_server" type="map_server" name="map_server" args="$(find wpr_simulation)/maps/map.yaml"/>
<node pkg="amcl" type="amcl" name="amcl"/>
</launch>
重新编译
cd ~/catkin_ws/
catkin_make
【5】运行导航程序
运行仿真环境:
roslaunch wpr_simulation wpb_stage_robocup.launch
运行前面编写好的launch文件
roslaunch nav_pkg nav.launch
如果不想手动编写nav.launch文件,可以运行下列参考launch文件:
roslaunch wpr_simulation wpb_demo_nav.launch
启动rviz
rosrun rviz rviz
Add-Map,选择地图话题;
Add-RobotModel;
【6】设定导航的目标地点
显示机器人的导航路线:
Add-Path,话题选择/move_base/GlobalPlanner/plan,此外Line Style设置为Billboards方便观察机器人导航路线;
可以使用rviz来完成:
工具栏2D Nav Goal按钮即发送导航目标点的按钮,点击该按钮,在地图上长按左键,出现的箭头即目标航点的朝向;
保存上述rviz配置,文件存放在nav_pkg=>rviz子目录下(没有该目录就新建),文件名称nav.rviz:
File=>Save Config As
修改前文中的nav.launch文件
<launch>
<node pkg="move_base" type="move_base" name="move_base">
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />
<param name="base_global_planner" value="global_planner/GlobalPlanner" />
<param name="base_local_planner" value="wpbh_local_planner/WpbhLocalPlanner" />
</node>
<node pkg="map_server" type="map_server" name="map_server" args="$(find wpr_simulation)/maps/map.yaml"/>
<node pkg="amcl" type="amcl" name="amcl"/>
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find wpr_simulation)/rviz/nav.rviz"/>
</launch>
总结
简单介绍了ROS的导航功能,并且实现了ROS仿真机器人的导航功能。