通过前面的基础学习,本章进入最为激动的机器人自主导航的学习。在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命。本章将围绕机器人SLAM建图、导航避障、巡航、监控等内容展开。本章内容:
- 在机器人上使用传感器
- google-cartographer机器人SLAM建图
- ros-navigation机器人自主避障导航
- 多目标点导航及任务调度
- 机器人巡航与现场监控
4.多目标点导航及任务调度
通过前面的学习,我们已经可以通过点击地图的方式来命令机器人运动到目标点。其实,ros-navigation导航框架就是为我们提供了一个最基本的机器人自动导航接口,即单点导航。然而,在实际的机器人应用中,机器人往往要完成复杂的任务,这些复杂的任务都是由一个个基本的任务组合而成的。一般的,机器人通过状态机的形式将一个个基本任务组合在一起来进行复杂任务的调度实现。
4.1.状态机
这里我们只讨论有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态。当其获得一个输入条件时,将从当前状态转换到另一个状态,或者仍然保持在当前状态。任何一个FSM都可以用状态转换图来描述,图中的节点表示FSM中的一个状态,有向加权边表示输入条件时状态的变化。如图49,以一个上班族的生活场景来举例说明状态机的状态转换图。矩形框表示FSM中的一个状态,有向边表示在输入条件下的状态转换过程。
(图49)有限状态机FSM举例
4.2.多目标点巡航
机器人多目标点巡航,特别是按特定巡逻路径进行巡航是很实用的功能。这里将利用前面学到的ros-navigation单点导航、状态机、状态机任务调度的知识。我们来编写一个应用功能包实现机器人多目标点巡航。 到这里,我们慢慢清楚了miiboo机器人编程的框架思路,我们将传感器相关的底层驱动包放在~/catkin_ws/工作空间统一管理,将基于google-cartographer的SLAM建图程序包放在~/catkin_ws_carto/工作空间统一管理,将基于ros-navigation的导航程序包放在~/catkin_ws_nav/工作空间统一管理,将高层应用功能包放在~/catkin_ws_apps/工作空间统一管理。miiboo机器人编程的框架思路,如图50。
(图50)miiboo机器人编程的框架思路
这里将建立一个叫catkin_ws_apps的ROS工作空间,专门用于放置日后开发的各种应用层功能包。关于创建ROS工作空间的操作,请参考前面相应部分内容,这里就不做讲解。在~/catkin_ws_apps/src/中建立一个叫patrol的功能包,建好后的patrol功能包文件结构,如图51。
(图51)patrol功能包文件结构
关于功能包的文件结构,大家已经很熟悉了,就不啰嗦了。这里重点讲解一下patrol_fsm.py这个文件,文件内容如图52。
(图52)patrol_fsm.py文件内容
这里采用python来编写多目标点巡航的逻辑,python开发ROS节点的优点是简洁高效。代码中waypoints数组里面存放的是要巡航的各个目标点,大家可以根据自己的需要进行相应的替换和增减;with patrol代码块里面实现状态机的构建;最后调用状态机的执行函数,状态机就开始工作了,也就是开始执行巡航了。 启动多目标点巡航分为3步:启动机器人上所有传感器、启动导航所需各个节点、启动多目标点巡航节点。 首先,启动机器人上所有传感器,打开终端,通过下面的命令直接启动就行了。
source ~/catkin_ws/devel/setup.bash
roslaunch miiboo_bringup miiboo_all_sensor.launch
然后,启动导航所需各个节点,打开终端,通过下面的命令直接启动就行了。
source ~/catkin_ws_nav/devel/setup.bash
roslaunch miiboo_nav miiboo_nav.launch
最后,启动多目标点巡航节点,打开终端,通过下面的命令直接启动就行了。
source ~/catkin_ws_apps/devel/setup.bash
roslaunch patrol patrol.launch
4.3.复杂多任务机器人未来展望
机器人可以进行自动导航、人机对话、用机械臂抓取物体、物体识别等。将这些任务结合起来,利用机器人强大的大脑推理机制能完成更为复杂和智能化的任务。如果说基于状态机的复杂任务调度是1.0版本的智能,那么基于大脑推理机制的复杂任务调度将是2.0版本的智能。 我的设想是利用强化学习神经网络作为大脑推理机制的实现实体,如图53。自动导航、人机对话、用机械臂抓取物体、物体识别等任务组合的整体作为机器人与外界环境交互的动作空间,动作空间的的状态分为两种形态:执行结果、执行策略。执行结果作为强化学习神经网络的输入,而执行策略作为强化学习神经网络的输出。我们不断通过各种复杂的实际场景的粒子来训练机器人,让机器人能在复杂场景下能做正确的事情。比如说,当机器人收到主人“我渴了”的语音信息后,自动导航到桌子边,然后识别桌上的可乐,并用机械臂抓取,最后递给主人,并提醒主人“你的可乐来了”。
(图53)强化学习神经网络作为大脑推理机制
哈哈!这样的想法很炫酷,不过以目前的技术实现难度还比较大,所以作为未来展望分享给大家。希望和大家一起努力,在不远的将来能实现这个梦想。