这是关于XABSL的帖子, 以后不断更新我所遇到的问题, 以及解决办法, 还有我对这些语法的理解.
大家若有补充的, 直接回复帖子补充即可.
其中主要包含三部分:
1. 语法部分.
2. 添加symbol部分.
3. 常见问题解答.
*****************************************************************************************************************************************
*****************************************************************************************************************************************
目前我们设计的状态机都是不确定状态机, 需要进行确定化, 也就是简化. 学过编译原理的同学都知道, NFA如何转化为DFA. 没学过的也没关系, 这个不难, 很快掌握.
input symbol在decision中判断条件使用, 也可以在等号赋值操作的右边使用, 即在action中的这一种情况: output symbols = input symbols.
output symbol只能在action中使用.
common decision
定义: 由多个条件构成, 这些条件一直被检测, 独立于当前状态, 当满足某个条件时, 就跳转到相应的状态执行.
从字面意思, 我们应当能猜测到, common decision就是共同决策的意思, 也就是对同一个条件进行判断, 然后跳转到相应的状态.
首先, 我们应当明确, common decision何时用? 大家可以看到, common decision主要用于写action时, 直接对某个变量赋值, 就会调用相应的option, 这样非常方便, 这样可以将不同的功能模块化.
总结: common decision可以解决对调用多个option(多个文件)并期望从被调用option返回调用option的问题. 否则, 就将全部状态放入一个option中. 或者使用下面提到的target state
if else
if else语句必须成对出现, 这点和c/c++有点差别.
注意: 若使用if else 语句,状态机必须有一个stay.
option之间的参数传递: 可以自定义参数进行传递
文档中已经描述很清楚了.
参见 B-HumanReleaseCode2011.pdf P96-P97 多参照实例理解.
option之间的调用:
注意: option之间是有优先级的. 主option的优先级比子option优先级大. 因此, 在主option中的decision满足后, 不论子option执行到什么状态, 都会跳到主option中满足的条件.
如:
option mainOption
{
state A
{
decision
{
if(state_time > 5000) /* 当本状态执行5秒后, 会立即从subOption返回, 跳转到B状态执行.*/
goto B;
else
stay;
}
action
{
subOption();
}
}
state B
action
{
do_something;
}
}
主option调用另一个option是允许的, 若此时想从另一个option返回主option文件, 不可直接调用主option来进行, 否则模拟器会报错. 目前的解决方案是 将这两个option的状态都放在主option中. 如果非要将option分别用不同的文件保存, 此时可以采用common decision的方法.
分别参考 /Debugging/official_button_interface.xabsl, /Debugging/display_obstacle.xabsl
补充: 目前比较完美的解决方案是使用target state(参见下)
target state: 强制性使得 子option 执行完毕.
主option询问子option是否执行到叶子节点(该叶子节点没有返回,并且也没有返回主option的能力), 若最后一个叶子节点执行完成, 主option则可通过action_done条件来判断跳转自己想要跳转的状态. 这样也就解决了不能从子option返回主option的问题.
另外, 设计target state, 主要还是为了保证将该状态内的action内容执行完后才跳转到其他条件. 比如, keeper在扑到过程中, 不允许再产生其他动作, 这样是为了防止机器人损坏.
因此, action_done是为了强制性执行完本状态action中的内容.
参考B-HumanReleaseCode2011.pdf P96-P97
capacity state
synchronized state
像以上两个多Agent合作机制的状态大家可以参考已经传到服务器上的文档. 其中有一篇论文写得非常详细.
*****************************************************************************************************************************************
*****************************************************************************************************************************************
在B-Human程序中, 虽然提供了大部分symbols. 但是还有一部分symbol没有, 需要我们自己转换.
主要有以下几种情况:
底层根本没有, 因此无法转化为symbol, 除非自己写底层代码.
底层有代码, 中间层已经注册过. 只需要在决策层定义一下就可以使用了.
底层有代码, 中间层没有注册, 决策层更没有定义.
底层有代码, 中间层注册过, 决策层定义过.(大部分属于这种)
底层指各个Modules中可以直接使用的representation的数据成员.
中间层指如BH2011GameSymbols的.h , .cpp文件. 将底层代码转化到决策层的数据类型.
决策层指如game_symbols.xabsl文件. 将转化过来的数据类型进行定义.
注意: 由于09年有一部分在11年是没有的,并且这些symbols移植到11年是可以直接使用的.
B-Human已经将Roles转换, behavior symbols等实现到b-script上来了. 而在Xabsl中这些内容没有release.
添加方法:
BH2011中,如何添加symbols? (参照已有的实例添加, 检查一下内容是否漏掉.)
下面以添加底层teamMateData.numOfConnectedPlayers为例, 将其转化为决策层的role.connected_players.
1. 头文件包含TeamMateData(它是一个representation), 以便引入所要转化的变量为symbols. 若已经在其他文件创建好了Symbols, 想直接引用其他Symbols, 直接包含其头文件即可, 请按照原有实例的规范进行.
2. 检查TeamMateData在BH2011BehaviorControl的头文件中是否被REQUIRES(TeamMateData).
3. 所要添加的symbol必须在symbols的构造函数中初始化构造.
并且在private中添加 const TeamMateData& teamMateData;
4. 在BH2011TeamMateDataSymbols::registerSymbols(xabsl::Engine& engine)中增加一项:
engine.registerDecimalInputSymbol("role.connected_players", this, &BH2011TeamMateDataSymbols::getConnectedPlayers);
注意加this参数和不加this参数的使用场景. 增加若要引用转化一个函数, 则需要this, 若只是数据成员, 则不需.
另外, 引用转化的类型必须与该函数类型一致,否则需通过强制类型转换;
5. 注意在update中添加你所要更新的数据; 或者你不想更新(如场地线等固定配置), 直接在init()函数中增加.
6.在BH2011BehaviorControl构造函数中增加一项:
symbols.push_back(new BH2011RoleSymbols(behaviorControlOutput.behaviorData, theRobotInfo, theBallModel, theTeamMateData));
7.最后,在Solution Explore中, 向Nao project和SimulatedNao project中 Add Existing Item. 否则会有链接错误提示.
8. 在对应的<symbol>.xabsl文件中定义你从底层转化来的symbols.
9. 最后别忘了在agents.xabsl文件中include你添加的symbols.xabsl文件.
*****************************************************************************************************************************************
*****************************************************************************************************************************************
问题1:
有时候修改了xabsl程序后, 模拟器就不能使用了, 报错提示关闭程序.
解决方案:
是程序的错误, 找找程序的原因. 看看是否语法错误. 实在不行就恢复option文件吧.
大家若有补充的, 直接回复帖子补充即可.
其中主要包含三部分:
1. 语法部分.
2. 添加symbol部分.
3. 常见问题解答.
*****************************************************************************************************************************************
语法部分
*****************************************************************************************************************************************
建议大家至少先把B-Human11年的所有源代码例子看完.
基本语法介绍参见: B-human2011releasecode .pdf P95
目前我们设计的状态机都是不确定状态机, 需要进行确定化, 也就是简化. 学过编译原理的同学都知道, NFA如何转化为DFA. 没学过的也没关系, 这个不难, 很快掌握.
input symbol在decision中判断条件使用, 也可以在等号赋值操作的右边使用, 即在action中的这一种情况: output symbols = input symbols.
output symbol只能在action中使用.
common decision
定义: 由多个条件构成, 这些条件一直被检测, 独立于当前状态, 当满足某个条件时, 就跳转到相应的状态执行.
从字面意思, 我们应当能猜测到, common decision就是共同决策的意思, 也就是对同一个条件进行判断, 然后跳转到相应的状态.
首先, 我们应当明确, common decision何时用? 大家可以看到, common decision主要用于写action时, 直接对某个变量赋值, 就会调用相应的option, 这样非常方便, 这样可以将不同的功能模块化.
通俗的说, common decision其实就是一个条件变量(common symbols), 有多个状态. 而这多个状态通常设置为死胡同状态机.( 死胡同状态机的意思就是一个状态到了他的最后一个状态, 不可能再跳转出去了. 这里的head.control_mode, 当你设置为某种头部控制模式时(如look_up), 若不改变此变量, 则机器人的头部就一直保持最后设置的控制模式(look_up).
参考例子: /Options/HeadControl/head_control.xabsl , /Options/body_control.xabsl
另外, 其实它就是一个不仅仅靠if else 来判断跳转到下一个状态的状态机类型, 他还需要依靠一个共同的条件变量来进行判断. 而这些条件变量总是被检测, 当满足时就跳到相应的状态. 参考例子: /Options/Debugging/display_obstacle.xabsl
总结: common decision可以解决对调用多个option(多个文件)并期望从被调用option返回调用option的问题. 否则, 就将全部状态放入一个option中. 或者使用下面提到的target state
if else
if else语句必须成对出现, 这点和c/c++有点差别.
if else 可以嵌套. 如:
if (…) if(...)
goto A; {
else if(...)
{ stay;
if(…) else
goto B; goto C;
else }
stay; else
} { ... }
注意: 若使用if else 语句,状态机必须有一个stay.
option之间的参数传递: 可以自定义参数进行传递
文档中已经描述很清楚了.
参见 B-HumanReleaseCode2011.pdf P96-P97 多参照实例理解.
option之间的调用:
注意: option之间是有优先级的. 主option的优先级比子option优先级大. 因此, 在主option中的decision满足后, 不论子option执行到什么状态, 都会跳到主option中满足的条件.
如:
option mainOption
{
state A
{
decision
{
if(state_time > 5000) /* 当本状态执行5秒后, 会立即从subOption返回, 跳转到B状态执行.*/
goto B;
else
stay;
}
action
{
subOption();
}
}
state B
action
{
do_something;
}
}
主option调用另一个option是允许的, 若此时想从另一个option返回主option文件, 不可直接调用主option来进行, 否则模拟器会报错. 目前的解决方案是 将这两个option的状态都放在主option中. 如果非要将option分别用不同的文件保存, 此时可以采用common decision的方法.
分别参考 /Debugging/official_button_interface.xabsl, /Debugging/display_obstacle.xabsl
补充: 目前比较完美的解决方案是使用target state(参见下)
target state: 强制性使得 子option 执行完毕.
主option询问子option是否执行到叶子节点(该叶子节点没有返回,并且也没有返回主option的能力), 若最后一个叶子节点执行完成, 主option则可通过action_done条件来判断跳转自己想要跳转的状态. 这样也就解决了不能从子option返回主option的问题.
另外, 设计target state, 主要还是为了保证将该状态内的action内容执行完后才跳转到其他条件. 比如, keeper在扑到过程中, 不允许再产生其他动作, 这样是为了防止机器人损坏.
因此, action_done是为了强制性执行完本状态action中的内容.
参考B-HumanReleaseCode2011.pdf P96-P97
capacity state
synchronized state
像以上两个多Agent合作机制的状态大家可以参考已经传到服务器上的文档. 其中有一篇论文写得非常详细.
*****************************************************************************************************************************************
添加Symbols
*****************************************************************************************************************************************
在B-Human程序中, 虽然提供了大部分symbols. 但是还有一部分symbol没有, 需要我们自己转换.
主要有以下几种情况:
底层根本没有, 因此无法转化为symbol, 除非自己写底层代码.
底层有代码, 中间层已经注册过. 只需要在决策层定义一下就可以使用了.
底层有代码, 中间层没有注册, 决策层更没有定义.
底层有代码, 中间层注册过, 决策层定义过.(大部分属于这种)
底层指各个Modules中可以直接使用的representation的数据成员.
中间层指如BH2011GameSymbols的.h , .cpp文件. 将底层代码转化到决策层的数据类型.
决策层指如game_symbols.xabsl文件. 将转化过来的数据类型进行定义.
注意: 由于09年有一部分在11年是没有的,并且这些symbols移植到11年是可以直接使用的.
B-Human已经将Roles转换, behavior symbols等实现到b-script上来了. 而在Xabsl中这些内容没有release.
添加方法:
BH2011中,如何添加symbols? (参照已有的实例添加, 检查一下内容是否漏掉.)
下面以添加底层teamMateData.numOfConnectedPlayers为例, 将其转化为决策层的role.connected_players.
1. 头文件包含TeamMateData(它是一个representation), 以便引入所要转化的变量为symbols. 若已经在其他文件创建好了Symbols, 想直接引用其他Symbols, 直接包含其头文件即可, 请按照原有实例的规范进行.
2. 检查TeamMateData在BH2011BehaviorControl的头文件中是否被REQUIRES(TeamMateData).
3. 所要添加的symbol必须在symbols的构造函数中初始化构造.
并且在private中添加 const TeamMateData& teamMateData;
4. 在BH2011TeamMateDataSymbols::registerSymbols(xabsl::Engine& engine)中增加一项:
engine.registerDecimalInputSymbol("role.connected_players", this, &BH2011TeamMateDataSymbols::getConnectedPlayers);
注意加this参数和不加this参数的使用场景. 增加若要引用转化一个函数, 则需要this, 若只是数据成员, 则不需.
另外, 引用转化的类型必须与该函数类型一致,否则需通过强制类型转换;
5. 注意在update中添加你所要更新的数据; 或者你不想更新(如场地线等固定配置), 直接在init()函数中增加.
6.在BH2011BehaviorControl构造函数中增加一项:
symbols.push_back(new BH2011RoleSymbols(behaviorControlOutput.behaviorData, theRobotInfo, theBallModel, theTeamMateData));
7.最后,在Solution Explore中, 向Nao project和SimulatedNao project中 Add Existing Item. 否则会有链接错误提示.
8. 在对应的<symbol>.xabsl文件中定义你从底层转化来的symbols.
9. 最后别忘了在agents.xabsl文件中include你添加的symbols.xabsl文件.
*****************************************************************************************************************************************
FAQ
*****************************************************************************************************************************************
问题1:
有时候修改了xabsl程序后, 模拟器就不能使用了, 报错提示关闭程序.
解决方案:
是程序的错误, 找找程序的原因. 看看是否语法错误. 实在不行就恢复option文件吧.