PDDL 持续动作:灵活的持续时间
Posted
技术标签:
【中文标题】PDDL 持续动作:灵活的持续时间【英文标题】:PDDL Durative-Action: Flexible duration 【发布时间】:2020-09-11 14:49:05 【问题描述】:我正在 PDDL2.1 中实现基于函数 (charge_level)
的充电操作。 (charge_level)
的函数值工作并更新 ~10Hz。
我想创建一个名为charge
的操作,该操作一直持续到charge_level
达到阈值。那是
(:durative-action charge
:duration ( CONTINUE UNTIL (> (charge_level) HIGH_THRES)))
:condition (and
(at start ( < (charge_level) LOW_THRES)))
:effect (and
)
))
我该如何实现呢?我试图将?duration
变量分配给charge_level
并设置:duration (> ?duration HIGH_THRES)
,但它不会成功计划。
提前致谢!
【问题讨论】:
【参考方案1】:答案取决于您的解决方案的两个方面:
您正在使用的规划器的功能 您为规划模型和执行/控制选择的抽象级别对于第一个方面:如果您的域还对其他动作中的放电效果进行建模,并且如果您的规划器支持连续效果,您可以以类似于 boil
动作的方式对动作进行建模:
(:durative-action boil-water
:parameters ()
:duration (>= ?duration 0)
:condition (and
(at start (and
(not (boiling))
))
(over all (and
(<= (water-temperature) 100)
))
)
:effect (and
(at start (and
(boiling)
))
(at end (and
(not (boiling))
))
(increase (water-temperature) (* #t 1.0))
)
)
您可以找到full example is here。
连续效应 (increase (water-temperature) (* #t 1.0))
定义了温度随时间变化的速度。这样,计划者就可以推断出该行动应该花费多长时间。这就是为什么定义持续时间时没有任何上限:duration (>= ?duration 0)
。这是假设在问题的域或目标中有另一个动作,这要求water-temperature
具有特定的数值。否则计划者没有理由将动作添加到计划中。
另一种方法是使用PDDL+ 中定义的process
(和event
)。
关于第二个方面:如果您的域确实不需要推理 charge_level
的值,您应该将其委托给您的计划执行基础架构。在实践中,作为状态推断的一部分,根据规划器外部的条件 (> (charge_level) HIGH_THRES))
评估布尔谓词 fully_charged
要简单得多。
【讨论】:
这很有道理,谢谢。我希望有更好的方法来定义反馈(increase (water-temperature) (* #t 1.0))
,因为如果这在源/传感接口的其他地方发生了变化,那么它可能会搞砸这个动作。
你当然可以用一个PDDL函数来替换1.0
。这仍然只是现实生活的规划模型。只要变化率不随时间变化,这种影响是线性的,几个规划者将能够处理它。它在计划执行期间发生变化的事实并不一定会使计划无效。
此外,如果没有其他动作在改变变化率,并且您的域中的收费率是恒定的(因此数字效应是线性的),您可以直接计算持续时间在(:duration )
声明中。以上是关于PDDL 持续动作:灵活的持续时间的主要内容,如果未能解决你的问题,请参考以下文章