【B-Human】之XABSL语言

这是关于XABSL的帖子, 以后不断更新我所遇到的问题, 以及解决办法, 还有我对这些语法的理解.
大家若有补充的, 直接回复帖子补充即可.

其中主要包含三部分:
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文件吧.
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值