py_trees源码分析(一)
@ 晚风 · Wednesday, Apr 17, 2024 · 1 分钟阅读 · 更新于 4月 17, 2024

py_trees源码分析之基础行为

版本信息

Python: 3.9

py_trees: 2.2.3

本文的代码与示例绝大部分来自github,只分析了部分重要的代码,包含基础行为模块、通用行为模块、通用模块、组合节点模块、装饰节点模块、黑板模块,且较简单的模块用表格汇总。

基础行为(Behaviour)

自定义方法

setup

行为树在tick之前调用,用来检查中间件或者设备是否可用(建议重写)

initialise

  • 初始化/重置/清除变量
  • 启动定时器
  • 检查变量是否有效

Update -> Status

注意,子类必须实现该方法,因为这是行为树主要的工作函数,每一次Tick都会通过Update进行状态更新、数据存储等,它决定当前分支的走向,返回当前分支的状态(成功?失败?运行中?无效)

私有方法

绑定黑板

参数

  • name:客户端黑板标识符(非必填,则为uuid)
  • namespace:用于黑板操作键/变量名操作的前缀

作用

实例化黑板

公有方法

tick_once

作用

在忽略tick返回结果的情况下进行迭代,那么tick返回的结果是什么呢?迭代器

tick -> typing.Iterator[Behaviour]

作用

核心方法,使用生成器,在行为树进行迭代,推动事件发展

注意最后使用yield self,在这里self指当前的Behavior对象

代码

def tick(self) -> typing.Iterator[Behaviour]:
    self.logger.debug("%s.tick()" % (self.__class__.__name__))
    // 如果当前是非运行状态,则先进行初始化
    if self.status != common.Status.RUNNING:
        self.initialise()
    # don't set self.status yet, terminate() may need to check what the current state is first
    // 进行核心update方法,获取更新完的状态
    new_status = self.update()
    if new_status not in list(common.Status):
        self.logger.error(
            "A behaviour returned an invalid status, setting to INVALID [%s][%s]"
            % (new_status, self.name)
        )
        new_status = common.Status.INVALID
   	// 如果状态不是运行中(不管成功/失败),都将停止行为树,并返回状态
    if new_status != common.Status.RUNNING:
        self.stop(new_status)
    // 更新状态
    self.status = new_status
    yield self

方法列表

方法名 参数 作用 返回
iterate direct_descendants:直译为直系后代,如果为True则仅获取当前节点的子节点,False则获取当前节点的所有后代节点 获取子节点 typing.Iterator[Behaviour]
visit visitor:访问类 用于调用访问类的run方法,相当于一个代理,集成到Behavior类中统一调用
stop New_status: 状态 以新状态终止该分支,调用terminate方法和tick方法
has_parent_with_name name: 匹配名称 查找名称为name的节点 Bool(是否找到)
has_parent_with_instance_type instance_type: 实例类型 查找与目标实例匹配的节点 Bool(是否找到)
tip 如果节点状态非无效,则返回本身 typing.Optional[Behaviour]

关于我

❤️

姓名: lwz


性别: 男


年龄: 29


星座: 摩羯座


职业: python工程师


爱好: 秋、ps5、运动


主要的技术栈是:

  • python
  • 自动驾驶仿真验证

学习网站: leetcode


公司: 国科础石


– 2025 年 2 月 25 日更新

我的一些开源项目

等等?项目呢?不会没有吧??

其他

如果你喜欢我的开源项目或者它们可以给你带来帮助,可以赏一杯咖啡 ☕ 给我。~

It is better to attach some information or leave a message so that I can record the donation 📝, thank you very much 🙏.

社交链接