AI Planning 简介

原链接: https://community.bwbot.org/topic/494

什么是AI planning我们从一个例子入手。假设现在我们在一个两层的大楼里面有一个扫地机器人。机器人需要能够在两层打扫。两层楼之间移动可以坐电梯也可以做楼梯。那么我们如何实现让机器人同时打扫两层的功能呢?
每一层的打扫都很容易实现,坐电梯的过程也很容易实现。问题在如如何让机器人理解到想要从一层到二层需要坐电梯。当然你可以通过写程序让机器人在打扫完成一层之后,再坐电梯去打扫另外一层。但是假如电梯现在没电了,需要走楼梯才能到另外一层,那你有要重新写一个程序。整个的动作规划写的非常死。

这个就是AI Planning需要解决的问题。就是从一个初始状态,如何经过一系列操作到一个终止状态的问题。对于上面的扫地问题。就是如何从两层楼都很脏的状态到达两层楼都干净的状态。我们人当然可以很轻松的知道,打扫完成一层后,坐电梯或者走楼梯到达另外一层接着打扫。机器人也要自己能够做这种规划。这种规划就是AI Planning。

那么如何解决AI Planning的问题呢?

上面的说明其实已经比较清楚了。首先定义好初始状态和结束状态,然后再定义这两个状态之间的所有可能操作。这样就定义个一个解算问题。实际上已经是单纯的数学解算了。通过解算得到应该进行的动作。
AI Planning已经是一个非常成熟的问题了。在学术界有一套专门的语言用来定义AI Planning问题,这种语言叫做PDDL(Planning Domain Definition Language)即规划区域定义语言.

下面是一个扫地机器人的例子。有两个房间机器人需要把两个房间全部打扫干净。

首先定义定义环境和机器人能够进行的操作。我们知道机器人可以打扫,充电和移动。

(define (domain state)          //domain 命名,怎么喜欢怎么来
    (:predicates (room ?r)        //谓词,这里应该包括该文件中出现的所有的谓词逻辑,不然会error:Undefined,这里判断是不是room
                (robot ?rob)       //这里则是判断一个抽象对象rob是不是robot
                (at-robot ?r)          //判断robot是不是在room r中
                (dirty ?r)        //判断room r是不是脏的
                (clean ?r)        //判断room r是不是干净的
                (fullPower ?rob))    //判断机器人robot是不是有电
    (:action sweep             //扫地动作
        :parameters(?robot ?r)      //设置参数
        :precondition           //前提条件(前件)
            (and              //and的意思是以下括号内的都必须为真
                (robot ?robot)      //这个对象robot是robot为真
                (room ?r)         //这个对象r是room为真
                (dirty ?r)        //这个r是dirty的
                (at-robot ?r)      //而且robot在r中刚好为真
                (fullPower ?robot)   //机器人有电
            )
        :effect               //满足以上条件,执行扫地动作,效果为如下
            (and                    
                (clean ?r)        //r已经干净了
                (not  
                    (dirty ?r)      //r不脏
                )
                (not
                    (fullPower ?robot) //机器人没电,默认为扫一个房间即耗尽电量
                )
            )
    )

    (:action charging            //充电动作
        :parameters(?robot ?r)           //两个参数为robot跟r,就近充电
        :precondition 
            (and   
                (robot ?robot)        
                (room ?r) 
                (at-robot ?r)
                (clean ?r)
                (not
                    (fullPower ?robot)
                )
            )
        :effect 
            (and 
                (fullPower ?robot)    //充满电,可进行下一动作
            )
    )

    (:action move               //移动动作
        :parameters (?from ?to)      //从from移动到to
        :precondition 
            (and 
                (dirty ?to)          //移动的前提:to还是脏的,from已经扫干净了,而且robot在扫干净的房间里,想移动到脏的房间
                (clean ?from)
                (room ?from) 
                (room ?to) 
                (at-robot ?from)
            )
        :effect 
            (and 
                (at-robot ?to)       //效果:到达脏的房间,离开干净的房间
                (not 
                    (at-robot ?from)
                )
            )
    )
)

然后定义问题,我们需要从两个房子都脏的状态到达两个房子都干净的状态。

(define (problem solve)
    (:domain state)
    (:objects 
        rooma roomb robot     //设置对象,这个例子比较简单,只有三个对象,房间a房间b还有机器人
    )
    (:init               //初始化起始状态,有两个房间,都是脏的,机器人在房间a并且满电,注意此处不用(room ?rooma)
        (room rooma)
        (room roomb) 
        (robot robot)
        (dirty rooma)
        (dirty roomb)
        (at-robot rooma)
        (fullPower robot)
    )
    (:goal                        //设定这个规划问题最终要达到的目标状态,两个房间是干净的,并且机器人仍旧是满电待命的
        (and
            (clean rooma)
            (clean roomb)
            (fullPower robot)
        )
    )
)

然后把这个问题交给AI Planning解算程序就能够得到把两个房间都打扫干净机器人应该进行的操作了。

这个过程和一般的扫地机器人过程有什么不同呢?区别在于整个动作是机器人自己规划的,机器人理解了整个打扫过程。比如说自动充电,并不是因为电量低而去充电。是由于打扫屋子的时候需要有电,所有在打扫前如过没有电的话需要去充电。

这样我们在制作机器人的时候就可以着重于实现机器人的每个细节操作。而整体的规划部分交由机器人自己去完成。

AI Planning 在 ROS中的实现

ROS中有AI Planning 的实现叫做 ROS Plan
其结构图如下

0_1530326614569_rosplan_demo_system.png

可以看到整个结构已经非常完善了。knowledge base 就是机器人的知识,也就是我们的机器人能够进行的操作。通过这个解算器我们的机器人就可以自己规划动作了。

猜你喜欢

转载自blog.csdn.net/bluewhalerobot/article/details/81011472
今日推荐