我知道如何定义一个原子(必须参数)的外部动作,例如" sitDown"然后在执行操作方法中的Environment Java文件中手动编写它。
但是,如果我定义一个外部动作,它是否有办法接受参数? 让我们说我想定义一个可以用代理代码调用的动作:
破坏(4,7);
在我的环境类中,如何在执行操作方法中检索这些值?
答案 0 :(得分:3)
如果不使用Cartago环境,而是使用Jason Environment,则可以使用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可用here。
答案 1 :(得分:2)
是的,您可以向环境发送参数并获取反馈。
例如,在应用程序中,更改机器人LED的方法可能是这样的(这属于扩展工件的类 - 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