大家好,欢迎大家关注我的知乎专栏慢慢悠悠小马车


DecoratorNode基类

BehaviorTree.CPP中内建的装饰节点如下,都继承自 BehaviorTree.CPP\include\behaviortree_cpp_v3\decorator_node.h 中的DecoratorNode类。很明显,该类只有1个子节点。ROS中也定义了一些方便使用的ControlNodes和DecoratorNodes,可以导入使用。

class DecoratorNode : public TreeNode {protected:TreeNode* child_node_;... ...
}

BlackboardPreconditionNode

细分为3个节点:BlackboardCheckInt、BlackboardCheckDouble、BlackboardCheckString。顾名思义,该节点是检查blackboard的某个port的值是否符合预期的。

包含3个InputPort,当value_A和value_B的值相等时,执行子节点。否则,不执行子节点,并返回return_on_mismatch设定的值。

static PortsList providedPorts() {return {InputPort("value_A"),InputPort("value_B"),InputPort<NodeStatus>("return_on_mismatch") };
}

源代码中使用==来判断2个变量的值,对于double类型不妥。

template <typename T>
inline NodeStatus BlackboardPreconditionNode<T>::tick() {T value_A;T value_B;NodeStatus default_return_status = NodeStatus::FAILURE;setStatus(NodeStatus::RUNNING);if (getInput("value_A", value_A) && getInput("value_B", value_B) &&value_B == value_A) {return child_node_->executeTick();}if (child()->status() == NodeStatus::RUNNING) {haltChild();}getInput("return_on_mismatch", default_return_status);return default_return_status;
}

示例:

<BlackboardCheckInt value_A="{the_answer}"value_B="42"return_on_mismatch="FAILURE" />

DelayNode

延时delay_msec毫秒后,执行子节点,并返回子节点的执行结果。延时期间,返回RUNNING。

static PortsList providedPorts() {return {InputPort<unsigned>("delay_msec", "Tick the child after a few milliseconds")};
}

示例:

<Delay delay_msec="5000"><KeepYourBreath/>
</Delay>

ForceFailureNode

如果子节点执行后返回RUNNING,该节点返回RUNNING;否则,该节点返回FAILURE,即强制返回失败状态。

ForceSuccessNode与ForceFailureNode大同小异。

InverterNode

如果子节点执行后返回RUNNING,该节点返回RUNNING;

如果子节点执行后返回SUCCESS,该节点返回FAILURE;

如果子节点执行后返回FAILURE,该节点返回SUCCESS;

即对子节点的执行结果取反。

KeepRunningUntilFailureNode

如果子节点执行后返回RUNNING或SUCCESS,下次tick()继续执行子节点,直到子节点返回FAILURE。

RepeatNode

重复执行子节点NUM_CYCLES 次,若每次都返回 SUCCESS,该节点返回SUCCESS;

若子节点某次返回FAILURE,该节点不再重复执行子节点,立即返回FAILURE;

若子节点返回RUNNING,该节点也返回RUNNING。

static PortsList providedPorts() {return { InputPort<int>(NUM_CYCLES,"Repeat a succesful child up to N times. ""Use -1 to create an infinite loop.") };
}

示例:

<Repeat num_cycles="3"><ClapYourHandsOnce/>
</Repeat>

RetryNode

如果子节点执行后返回RUNNING,该节点返回RUNNING;

如果子节点执行后返回SUCCESS,该节点返回SUCCESS,不再执行;

如果子节点执行后返回FAILURE,该节点再次尝试执行子节点,直到尝试了num_attempts次;

static PortsList providedPorts() {return { InputPort<int>(NUM_ATTEMPTS,"Execute again a failing child up to N times. ""Use -1 to create an infinite loop.") };
}

示例:

<RetryUntilSuccesful num_attempts="3"><OpenDoor/>
</RetryUntilSuccesful>

SubtreeNode

用来封装一个subtree,这样会有一个独立的blackboard,__shared_blackboard port的默认值是false,因此开发者要自行重映射端口。但tick()函数中并没有使用__shared_blackboard port,而是在 BehaviorTree.CPP\src\xml_parsing.cpp中使用的,这点要注意,SubtreePlusNode的__autoremap port也是如此。

static PortsList providedPorts() {return { InputPort<bool>("__shared_blackboard", false,"If false (default) the subtree has its own blackboard and you""need to do port remapping to connect it to the parent") };
}

SubtreePlusNode

控制重映射的强化版SubtreeNode。当__autoremap port为true时,会自动重映射名称相同的port。结合代码示例会更容易理解。(我没有实践过这个node,仅供参考。)

static PortsList providedPorts() {return { InputPort<bool>("__autoremap", false,"If true, all the ports with the same name will be remapped") };
}

示例:

<root main_tree_to_execute = "MainTree" ><BehaviorTree ID="MainTree"><Sequence><SetBlackboard value="Hello" output_key="myParam" /><SubTreePlus ID="Talk" param="{myParam}" /><SubTreePlus ID="Talk" param="World" /><SetBlackboard value="Auto remapped" output_key="param" /><SubTreePlus ID="Talk" __autoremap="1"  /></Sequence></BehaviorTree><BehaviorTree ID="Talk"><SaySomething message="{param}" /></BehaviorTree>
</root>

上面有3种重映射的实现方式。第1、2种是最常见的。

第1种将Subtree的blackboard的param entry映射到Parent tree的blackboard的myParam entry,将其值设置为字符串"Hello"。

第2种将Subtree的blackboard的param entry的值直接设置为字符串"World"。

第3种在Parent tree的blackboard中增加了param entry,没有指定映射到subtree的哪个port。但由于设定__autoremap=true,该entry会自动映射到subtree的blackboard的param entry。SaySomething节点会在其message port中获取到值为字符串“Auto remapped”。

TimeoutNode

在设置的msec 毫秒内,返回子节点执行的状态。若子节点返回FAILURE或SUCCESS,不再执行。如果超时,终止子节点执行,并返回FAILURE。类中使用了TimerQueue作为计时器,可以定时多个任务,比较有趣。

static PortsList providedPorts() {return { InputPort<unsigned>("msec", "After a certain amount of time, ""halt() the child if it is still running.") };
}

示例:

<Timeout msec="5000"><KeepYourBreath/>
</Timeout>

BT5:DecoratorNodes源码解析相关推荐

  1. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  2. 谷歌BERT预训练源码解析(三):训练过程

    目录 前言 源码解析 主函数 自定义模型 遮蔽词预测 下一句预测 规范化数据集 前言 本部分介绍BERT训练过程,BERT模型训练过程是在自己的TPU上进行的,这部分我没做过研究所以不做深入探讨.BE ...

  3. 谷歌BERT预训练源码解析(一):训练数据生成

    目录 预训练源码结构简介 输入输出 源码解析 参数 主函数 创建训练实例 下一句预测&实例生成 随机遮蔽 输出 结果一览 预训练源码结构简介 关于BERT,简单来说,它是一个基于Transfo ...

  4. Gin源码解析和例子——中间件(middleware)

    在<Gin源码解析和例子--路由>一文中,我们已经初识中间件.本文将继续探讨这个技术.(转载请指明出于breaksoftware的csdn博客) Gin的中间件,本质是一个匿名回调函数.这 ...

  5. Colly源码解析——结合例子分析底层实现

    通过<Colly源码解析--框架>分析,我们可以知道Colly执行的主要流程.本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现.(转载请指明出于break ...

  6. libev源码解析——定时器监视器和组织形式

    我们先看下定时器监视器的数据结构.(转载请指明出于breaksoftware的csdn博客) /* invoked after a specific time, repeatable (based o ...

  7. libev源码解析——定时器原理

    本文将回答<libev源码解析--I/O模型>中抛出的两个问题.(转载请指明出于breaksoftware的csdn博客) 对于问题1:为什么backend_poll函数需要指定超时?我们 ...

  8. libev源码解析——I/O模型

    在<libev源码解析--总览>一文中,我们介绍过,libev是一个基于事件的循环库.本文将介绍其和事件及循环之间的关系.(转载请指明出于breaksoftware的csdn博客) 目前i ...

  9. libev源码解析——调度策略

    在<libev源码解析--监视器(watcher)结构和组织形式>中介绍过,监视器分为[2,-2]区间5个等级的优先级.等级为2的监视器最高优,然后依次递减.不区分监视器类型和关联的文件描 ...

最新文章

  1. python爬虫教程书-Python 爬虫:把廖雪峰教程转换成 PDF 电子书
  2. 2017年9月11日
  3. jQuery之防止冒泡事件
  4. loadrunner- winsock 函数总结
  5. 清华博士教你如何用推荐算法技术「找到女朋友」
  6. CVPR 2022 3月3日论文速递(19 篇打包下载)涵盖网络架构设计、姿态估计、三维视觉、动作检测、语义分割等方向
  7. u-boot移植第一弹——制作可用的BL1
  8. 利用Java进行MySql数据库的导入和导出
  9. Java Virtual Machine
  10. python中什么是按位取反_Python学习中的“按位取反”笔记总结
  11. Java远程通讯技术及原理分析
  12. Android官方开发文档Training系列课程中文版:管理Activity的生命周期之停止和重启Activity
  13. cocos2dx 2.2.1 android,cocos2dx(2.1.2) 配置android模拟器(虚拟化加速)
  14. 面试题 04.04. 检查平衡性
  15. Flex 3快速入门: 构建高级用户界面 添加拖放支持
  16. UOJ #117. 欧拉回路
  17. MySQL 脱敏函数
  18. Excel函数公式大全—IF家族函数
  19. 计算机网络 上 物理层和数据链路层
  20. 针孔相机模型公式推导

热门文章

  1. 基于Spring AOP的统一响应体的实现(注解版)
  2. 边缘计算(Edge computing)
  3. Asp.Net Ajax Control Toolkit 服务器端控件
  4. 从Oracle到MySQL,余额宝云实践分享 20131111(转)
  5. 一年300多万吨垃圾变宝贝 起到循环再利用
  6. keep 虚拟路线修改器_Keep 动感单车体验:每天在家就能消耗 250 千卡,你离瘦不远了...
  7. 计算机网络形成及发展,1计算机网络形成和发展历程
  8. android web_适用于Android的最佳Web浏览器
  9. python提供的数字类型分为_python3数字类型分为-女性时尚流行美容健康娱乐mv-ida网...
  10. 星厨齐聚,演绎致美奢厨:2022米兰家具展中的ASKO×NORM展厅