1

我在 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),但它不会成功计划。

提前致谢!

4

1 回答 1

0

答案取决于您的解决方案的两个方面:

  • 您正在使用的规划器的功能
  • 您为计划模型和执行/控制选择的抽象级别

对于第一个方面:如果您的域还对其他动作中的放电效果进行建模,并且如果您的计划器支持连续效果,您可以以与此动作类似的方式对动作进行建模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))
    )
)

您可以在这里找到完整的示例连续效应 定义了温度随时间变化的(increase (water-temperature) (* #t 1.0))速度。这样,计划者就可以推断出该行动应该花费多长时间。这就是为什么定义持续时间时没有任何上限的原因:duration (>= ?duration 0)。这是假设在问题的域或目标中存在另一个动作,这要求water-temperature具有一定的数值​​。否则,计划者没有理由将行动添加到计划中。

另一种方法是使用PDDL+中定义的process(and ) 。event

关于第二个方面:如果您的域确实不需要推理 的值charge_level,您应该将其委托给您的计划执行基础设施。在实践中,作为状态推断的一部分,根据规划器外部的fully_charged条件评估布尔谓词要简单得多。(> (charge_level) HIGH_THRES))

于 2020-09-14T09:37:17.363 回答