仿真机器人导航
概述
概念
在ROS机器人导航(Navigation)有多个功能包组合实现,ROS中又称之为导航功能包集,关于导航模块,官方介绍如下:
一个二维导航堆栈,它接受来自里程计、传感器流和目标姿态的信息,并输出发送到移动底盘的安全速度命令
更通俗的讲,导航其实就是机器人自主从A点移动到B点的过程。
作用
秉着"不重复发明轮子"的原则,ROS 中导航相关的功能包集为机器人导航提供了一套通用的实现,开发者不再需要关注于导航算法、硬件交互... 等偏复杂、偏底层的实现,这些实现都由更专业的研发人员管理、迭代和维护,开发者可以更专注于上层功能,而对于导航功能的调用,只需要根据自身机器人相关参数合理设置各模块的配置文件即可,当然,如果有必要,也可以基于现有的功能包二次开发实现一些定制化需求,这样可以大大提高研发效率,缩短产品落地时间。总而言之,对于一般开发者而言,ROS 的导航功能包集优势如下:
- 安全: 由专业团队开发和维护
- 功能: 功能更稳定且全面
- 高效: 解放开发者,让开发者更专注于上层功能实现
导航模块简介
机器人是如何实现导航的呢?或换言之,机器人是如何从 A 点移动到 B 点呢?ROS 官方为了提供了一张导航功能包集的图示,该图中囊括了 ROS 导航的一些关键技术:
导航模块具有五个基本要素,与现实生活的例子一一对应:
序号 | 生活场景 | 应用 |
---|---|---|
1 | 游乐园概览图 | 定位 + 路径规划 |
2 | 确定自己在游乐园的位置 | 确定在地图上的位置 |
3 | 路径规划,找到要玩的娱乐设施 | 全局路径规划 + 局部路径规划 |
4 | 决定走路还是骑车 | 控制速度和方向 |
5 | 环境感知 | 感知周围的环境,避障 |
总结下来,设计的关键技术有如下五点: |
- 全局地图
- 自身定位
- 路径规划
- 运动控制
- 环境感知
1. 全局地图
2. 自身定位
3. 路径规划
4. 运动控制
5. 环境感知
导航实现
准备工作
请先安装相关的ROS功能包:
- 安装 gmapping 包(用于构建地图):
$sudo apt install ros-<ROS版本>-gmapping
- 安装地图服务包(用于保存与读取地图):
$ sudo apt install ros-<ROS版本>-map-server
- 安装 navigation 包(用于定位以及路径规划):
sudo apt install ros-<ROS版本>-navigation
新建功能包,并导入依赖: gmapping map_server amcl move_base
SLAM建图
SLAM算法有多种,当前我们选用gmapping。
gmapping简介
gmapping 是ROS开源社区中较为常用且比较成熟的SLAM算法之一,gmapping可以根据移动机器人里程计数据和激光雷达数据来绘制二维的栅格地图,对应的,gmapping对硬件也有一定的要求:
- 该移动机器人可以发布里程计消息
- 机器人需要发布雷达消息(该消息可以通过水平固定安装的雷达发布,或者也可以将深度相机消息转换成雷达消息)
关于里程计与雷达数据,仿真环境中可以正常获取的,不再赘述,栅格地图如案例所示。
gmapping的使用
-
编写slam.launch文件
launch文件编写可以参考github 的演示 launch文件 -
编写 gazebo.launch文件
文件启动一个机器人模型
<launch>
<!-- urdf -->
<param name="robot_description" command="$(find urdf02_gazebo)/urdf/car.urdf.xacro"/>
<!-- 启动gazebo -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find demo_nav)/worlds/box_house.world"/>
</include>
<!-- 在gazebo中显示机器人模型 -->
<node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model car -param robot_description"/>
</launch>
- 执行
先执行 gazebo.launch ,启动gazebo仿真环境
在启动地图绘制的slam.launch文件
$ source ./devel/setup.bash
$ roslaunch demo_nav slam.launch
启动键盘键盘控制节点,用于控制机器人运动建图
# 如果之前没有下载过
$ sudo apt install ros-noetic-teleop-twist-keyboard
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
控制机器人走一遍地图。
地图服务
map_server简介
map_server功能包中提供了两个节点: map_saver 和 map_server,前者用于将栅格地图保存到磁盘,后者读取磁盘的栅格地图并以服务的方式提供出去。
地图保存
<launch>
<arg name="filename" value="$(find demo_nav)/map/nav" />
<node name="map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)" />
</launch>
机器人走一遍地图之后,运行这个launch文件即可。
会生成两个文件: