我知道如何定义一个原子的外部动作(必须有参数),例如“sitDown”,然后在执行动作方法的环境 Java 文件中手动对其进行编码。
但是,如果我定义了一个外部动作,有没有办法让它接受参数?假设我想定义一个可以通过这种方式在代理代码中调用的操作:
销毁(4, 7);
在我的环境类中,我将如何在执行操作方法中检索这些值?
我知道如何定义一个原子的外部动作(必须有参数),例如“sitDown”,然后在执行动作方法的环境 Java 文件中手动对其进行编码。
但是,如果我定义了一个外部动作,有没有办法让它接受参数?假设我想定义一个可以通过这种方式在代理代码中调用的操作:
销毁(4, 7);
在我的环境类中,我将如何在执行操作方法中检索这些值?
是的,您可以向环境发送参数并获得反馈。
例如,在应用程序中,更改机器人 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
如果不使用 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 可在此处获得。