翻译 - AEROSTACK - TML语言

翻译 - AEROSTACK - TML语言

声明:本文是一篇翻译文章,文章来源:https://github.com/Vision4UAV/Aerostack/wiki/TML-Language

未经博主本人许可,文章禁止转载!!!

操作者可以通过使用专门为Aerostack设计的TML(task-based mission specification language)语言来指定任务的具体任务。
下面的几段描述了如何来用TML语言来写一个任务书。在文档的结尾部分提供了一个总体任务的规范文件来作为一个完整的例子。

1.总体任务

翻译标注:因Mission和Task中问均译为任务,为表示区分,本文Mission译为总体任务,Task译为任务。

总体任务是用标签<mission>和属性root_task来定义的。root_task属性表征了当总体任务开始的时候,哪一个任务树会被执行。例如:

<mission name="example task">
</mission>

任务的主体被分成两个主要的部分:(1)任务树定义和(2)事件处理程序。

2.任务树

任务规范的第一部分包括带有标签<task_tree>的一个或者多个任务树。每个任务树包含了树状组织的任务,并且可以由它的根任务的名字所确定。每个任务都是使用标签<task>和属性name来定义的。例如:

<task_tree>
  <task name= "example root task">
    <task name="example child task">
      <task name="example leaf task 1">
      </task>
    </task>
    <task name="example leaf task 2">
    </task>
  </task>
</task_tree>

任务的主体包含有标签<behavior>和属性name以明确一个可以解释的动作(例如,起飞、降落等等)。任务的主体还包括一个或多个<recurrent_behavior>标签,同时带有属性name来明确recurrent_behaviors在任务开始的时候激活和在任务结束的时候终止。例如:

<task name="track image">
  <recurrent_behavior name="SELF_LOCALIZE_BY_VISUAL_MARKERS"/>
  <behavior name="FOLLOW_IMAGE">
      <argument name="duration" value="60"/>
  </behavior>
</task>

动作是可以包含参数的。参数使用标签<argument>和可选的属性name。例如:

<task name="move to the first point">
  <behavior name="GO_TO_POINT">
      <argument name="coordinates" value="[3.0, 4.2, 1.5]"/>
  </behavior>
</task>

和动作所不同的是,一个任务可能会包含有和信念记忆( belief memory)有关的操作。这些操作有:<add><remove><consult>。每个都包含一个belief参数,用以明确增添、移除或者查询belief表达式的belief对象。查询一个表达式是用来从belief memory中获得可能后面会用到的数值,所使用的操作是+。例如:

<task name="go to pickup site">
  <task name="obtain target coordinates">
    <consult belief="position(object_1, (?X, ?Y, ?Z))" />
  </task>
  <task name="hover over object to pick up">
    <behavior name="GO_TO_POINT">
      <argument name="coordinates" value="[+X, +Y, 1.5]" />
    </behavior>
  </task>
</task>

任务可以使用层级结构的组织形式。一个复杂任务的主体(例如,使用了其他任务的任务)可能会包含在任务执行期中激活的技能。复杂任务的主体不包括动作或者对于belief的操作。取而代之的,主体包含一个或者多个简单的顺序执行的任务。例如:

<task name="move then land">
  <task name="move to the first point">
    <behavior name="GO_TO_POINT">
        <argument name="coordinates"  value="[3.0, 4.2, 1.5]"/>
    </behavior>
  </task>
  <task name="land">
    <behavior name="LAND" />
  </task>
</task>

3.事件处理程序

总体任务的第二个部分就是一系列的事件处理程序。这一部分在总体任务中以标签<event_handling>来定义:

<event_handling>
</event_handling>

每一个事件处理程序描述了当总体任务规划器等待动作完成时,如何对一特定的事件作出反应。事件用标签event和属性name加以定义。每一个事件包含了<condition><call><termination>标签。<condition>标签包含了一个belief属性,指定为真的belief表达式才能够激活事件。<call>标签包含了一个和任务树的根任务名字一致的root_task属性,当条件满足时激活任务。<termination>标签包含一个mode属性以明确当任务树执行完毕时应该做什么。终止模式可以为:REPEAT_TASKNEXT_TASKEND_MISSIONABORT_MISSION

<event_handling>

  <event name="search for image when drone_1 reaches its objective">
    <condition belief="objective(drone_1, ?X), position(drone_1, ?X)"/>
    <call root_task="search for image" />
    <termination mode="REPEAT_TASK"/>
  </event>

  <event name="low battery">
    <condition belief="battery_level(self, LOW)"/>
    <call root_task="emergency land"/>
    <termination mode="ABORT_MISSION"/>
  </event>

</event_handling>

如果相了解机器人都可以执行哪些动作,可以查阅下面的列表

总体任务文件的命名和位置

为了能够在Aerostack中使用,总体任务需要写在一个叫做mission_specification_file.xml的XML文件中。这一文件必须位于$AEROSTACK_STACK/configs/其中的一个有操作者选定的叫做drone{Id}{Id} = 0,1,2 …)的文件夹中。这是默认的名字,因为这是使用在仓库task_based_mission_planner_processlaunch路径中的 .launch 文件建立的。

检查语法错误

为了检查在总体任务定义过程中的XML文件是否有语法错误,启动总体任务规划器执行下面的命令:

> roslaunch task_based_mission_planner_process task_based_mission_planner_process.launch

如果XML文件没有任何的错误,将会显示下面的信息

File loaded without errors! Waiting to start ...

出版物

请注意,这些对应以往版本的TML出版物中,使用的是"actions"和"skills",而不是"behaviors":

完整的例子

这个例子使用TML语言对一总体任务进行了完整明确定义。

<!--==================================================
| FILE: mission_specification_file.xml
| BRIEF: A mission specification example.
| DETAILS:
|   Mission in which an object is found, picked up and
|   retrieved.
| AUTHORS:
|    Guillermo De Fermin
===================================================-->
<mission root_task="Search for object">

  <task_tree>
    <task name="Search for object">
      <task name="Initial phase">
        <recurrent_behavior name="SELF_LOCALIZE_BY_ODOMETRY" />
        <task name="Take off">
          <behavior name="TAKE_OFF"/>
        </task>
        <task name="Memorize current point">
          <consult belief="position(self, (?HOME_X, ?HOME_Y, ?HOME_Z))" />
        </task>
      </task>

      <task name="Start search">
        <recurrent_behavior name="SELF_LOCALIZE_BY_VISUAL_MARKERS" />
        <task name="Moving to point A">
          <behavior name="GO_TO_POINT">
            <argument name="relative_coordinates" value="[1, 0, 0]"/>
          </behavior>
        </task>
        <task name="Moving to point B">
          <behavior name="GO_TO_POINT">
            <argument name="relative_coordinates" value="[0, 1, 0]"/>
          </behavior>
        </task>
        <task name="Moving to point C">
          <behavior name="GO_TO_POINT">
            <argument name="relative_coordinates" value="[-1, 0, 0]"/>
          </behavior>
        </task>
        <task name="Moving to point D">
          <behavior name="GO_TO_POINT">
            <argument name="relative_coordinates" value="[0, -1, 0]"/>
          </behavior>
        </task>
      </task>

    </task>
  </task_tree>

  <task_tree>
    <task name="Retrieve object">
      <recurrent_behavior name="SELF_LOCALIZE_BY_VISUAL_MARKERS" />
      <task name="Memorize object location">
        <consult belief="position(object_1, (?OBJ_X, ?OBJ_Y, ?))" />
      </task>
      <task name="Hover above object">
        <behavior name="GO_TO_POINT">
          <argument name="coordinates" value="[+OBJ_X, +OBJ_Y, 1.2]" />
        </behavior>
      </task>
      <task name="Pick object up">
        <add belief="picked_up(object_1)" />
      </task>
      <task name="Go to starting point">
        <behavior name="GO_TO_POINT">
          <argument name="coordinates" value="[+HOME_X, +HOME_Y, +HOME_Z]" />
        </behavior>
      </task>
      <task name="Drop oject">
        <remove belief="picked_up(object_1)" />
      </task>
      <task name="Final land">
        <behavior name="LAND" />
      </task>
    </task>
  </task_tree>

  <task_tree>
    <task name="Emergency land">
      <behavior name="LAND" />
    </task>
  </task_tree>

  <event_handling>
    <event name="Object found">
      <condition belief="visible(object_1)"/>
      <call root_task="Retrieve object" />
      <termination mode="END_MISSION" />
    </event>

    <event name="Low battery">
      <condition belief="battery_level(self, LOW)"/>
      <call root_task="Emergency land"/>
      <termination mode="ABORT_MISSION"/>
    </event>
  </event_handling>
</mission>

作者水平有限,文章翻译不能做到尽善尽美,如有纰漏或者谬误,还请大家评论指正。
同时大家可以通过邮箱[email protected]联系到我本人。

猜你喜欢

转载自blog.csdn.net/qq_33547243/article/details/88359242