zoukankan      html  css  js  c++  java
  • The XML 格式

    XML基本的纲要

    在第一篇教程中这个简单的树被呈现:

     <root main_tree_to_execute = "MainTree" >
         <BehaviorTree ID="MainTree">
            <Sequence name="root_sequence">
                <SaySomething   name="action_hello" message="Hello"/>
                <OpenGripper    name="open_gripper"/>
                <ApproachObject name="approach_object"/>
                <CloseGripper   name="close_gripper"/>
            </Sequence>
         </BehaviorTree>
     </root>
    

    树的第一个tag是<root>,它应当包含一个或者多个tag<BehaviorTree>.

    tag<BehaviorTree>应当有属性[ID].

    tag<root>应当包含属性[main_tree_to_execute]

    属性[main_tree_to_execute]是强制的,如果文件包含多个<BehaviorTree>的话,其他情况就是可选的;

    每一个TreeNode由一个tag来表示:

    tag的名字是一个ID,用于将TreeNode在factory中进行注册;

    属性[name]参考实例的名字,是可选的;

    Ports用属性来配置,在先前的例子中,the action SaySomething要求输入接口 message。

    就子节点的数量:

    controlNodes包含一个到N个子节点;

    DecoratorNodes和子树包含一个子节点;

    ActionNodes和ConditionNodes没有子节点;

    端口重映射和指向黑板的入口

    正如第二篇教程解释的那样,输入和输出接口可以被用于重映射使用黑板上的一个入口的名字,换句话说,是黑板上键值对的键值;

    一个黑板键值由如下句法表示:{key_name}

    例如:

    Sequence的第一个子节点输出"Hello";

    第二个子节点读和写黑板上称之为"my_message"项包含的值;

     <root main_tree_to_execute = "MainTree" >
         <BehaviorTree ID="MainTree">
            <Sequence name="root_sequence">
                <SaySomething message="Hello"/>
                <SaySomething message="{my_message}"/>
            </Sequence>
         </BehaviorTree>
     </root>
    

    紧凑型和具体型表示

    以下两种句法都有效:

     <SaySomething               name="action_hello" message="Hello World"/>
     <Action ID="SaySomething"   name="action_hello" message="Hello World"/>
    

    前者称之为紧凑型,后者称之为具体型

    由具体型句法表示的例子如下:

     <root main_tree_to_execute = "MainTree" >
         <BehaviorTree ID="MainTree">
            <Sequence name="root_sequence">
               <Action ID="SaySomething"   name="action_hello" message="Hello"/>
               <Action ID="OpenGripper"    name="open_gripper"/>
               <Action ID="ApproachObject" name="approach_object"/>
               <Action ID="CloseGripper"   name="close_gripper"/>
            </Sequence>
         </BehaviorTree>
     </root>
    

    尽管紧凑型更方便和容易写,但是其提供了太少关于TreeNode模型的信息。像Groot工具要求要么是具体型句法或者附加的信息,元素<TreeNodeModel>需要被增加;

    为了让紧凑型的版本适应于Groot,XML比如修改成如下:

     <root main_tree_to_execute = "MainTree" >
         <BehaviorTree ID="MainTree">
            <Sequence name="root_sequence">
               <SaySomething   name="action_hello" message="Hello"/>
               <OpenGripper    name="open_gripper"/>
               <ApproachObject name="approach_object"/>
               <CloseGripper   name="close_gripper"/>
            </Sequence>
        </BehaviorTree>
    
        <!-- the BT executor don't require this, but Groot does -->     
        <TreeNodeModel>
            <Action ID="SaySomething">
                <input_port name="message" type="std::string" />
            </Action>
            <Action ID="OpenGripper"/>
            <Action ID="ApproachObject"/>
            <Action ID="CloseGripper"/>      
        </TreeNodeModel>
     </root>
    

    子树

    在教程this tutorial中,可以在一个树中包含另一棵树,避免了复制和粘贴同样的树在多个位置上,从而减少了复杂性。

    想要去压缩更少的行为在行为树GraspObject中,如下

     <root main_tree_to_execute = "MainTree" >
    
         <BehaviorTree ID="MainTree">
            <Sequence>
               <Action  ID="SaySomething"  message="Hello World"/>
               <Subtree ID="GraspObject"/>
            </Sequence>
         </BehaviorTree>
    
         <BehaviorTree ID="GraspObject">
            <Sequence>
               <Action ID="OpenGripper"/>
               <Action ID="ApproachObject"/>
               <Action ID="CloseGripper"/>
            </Sequence>
         </BehaviorTree>  
     </root>
    

    注意到,上面的整棵树GraspObject的执行是在SaySomeThing之后;

    包含外部的文件

    使用如下的方式:

      <include path="relative_or_absolute_path_to_file">
    

    使用上面的例子,将两课行为树拆分在不同的文件当中:

     <!-- file maintree.xml -->
    
     <root main_tree_to_execute = "MainTree" >
    
         <include path="grasp.xml"/>
    
         <BehaviorTree ID="MainTree">
            <Sequence>
               <Action  ID="SaySomething"  message="Hello World"/>
               <Subtree ID="GraspObject"/>
            </Sequence>
         </BehaviorTree>
      </root>
    
     <!-- file grasp.xml -->
    
     <root main_tree_to_execute = "GraspObject" >
         <BehaviorTree ID="GraspObject">
            <Sequence>
               <Action ID="OpenGripper"/>
               <Action ID="ApproachObject"/>
               <Action ID="CloseGripper"/>
            </Sequence>
         </BehaviorTree>  
     </root>
    

    Note for ROS users

    If you want to find a file inside a ROS package, you can use this syntax:

    <include ros_pkg="name_package" path="path_relative_to_pkg/grasp.xml"/>

  • 相关阅读:
    1099. Build A Binary Search Tree (30)
    两个新事物
    time.h
    Nohup命令
    进程锁
    C++中虚析构函数的作用
    c++ 修改stl set中的元素
    STL迭代器辅助函数——advance
    CTreeCtrl 控件使用总结
    关于stl advance函数移动步数超过容器大小(越界)的研究
  • 原文地址:https://www.cnblogs.com/gary-guo/p/14693988.html
Copyright © 2011-2022 走看看