3

我知道如何定义一个原子的外部动作(必须有参数),例如“sitDown”,然后在执行动作方法的环境 Java 文件中手动对其进行编码。

但是,如果我定义了一个外部动作,有没有办法让它接受参数?假设我想定义一个可以通过这种方式在代理代码中调用的操作:

销毁(4, 7);

在我的环境类中,我将如何在执行操作方法中检索这些值?

4

2 回答 2

1

是的,您可以向环境发送参数并获得反馈。

例如,在应用程序中,更改机器人 LED 的方法可能是这样的(这属于扩展 Artifact - CArtAgO 的类):

@OPERATION 
void changeLedPin(String newState) throws Exception {
     try {
        /** put gpio HIGH */
        if (newState.equals("high")) {
            logger.info("Changing pin to HIGH!");
            ledPin.high();
        }

        /** put gpio LOW */
        if (newState.equals("low")) {
            logger.info("Changing pin to LOW!");
            ledPin.low();
        }
     } catch (Exception e) {
        e.printStackTrace();
   }
}

Jason 调用此外部操作的代理代码可能如下所示:

!start.

+!start <- 
    changeLedPin(low).

对于反馈,您可以使用 OpFeedbackParam 在 Jason 代码中发送一个变量来统一。工件方法是这样的:

@OPERATION 
void inc(OpFeedbackParam<String> value) {
    /* some code */
}

资料来源:https ://github.com/cleberjamaral/goldminers/blob/master/src/env/mining/Raspi.java https://github.com/cleberjamaral/camel-artifact/blob/master/camelJaCaMoRobot/src/env /artifacts/Counter.java

于 2018-01-19T13:06:57.780 回答
1

如果不使用 Cartago 环境,而是 Jason 环境,您可以使用 Structure 类 API 获取参数的值。例如:

class ... extends Environment {
   ...
   public boolean executeAction(String ag, Structure action) {
      NumberTerm arg0 = (NumberTerm)action.getTerm(0);
      int vl = (int)arg0.solve();
   }
   ...

Jason API 可在此处获得。

于 2018-01-22T15:42:58.747 回答