Rosbag机器人开发2: 设计调试器

设计时序算子

classDiagram class Operator { +Operator(params) +MatchResult match(context, bag, frames, fields) } class MatchResult { +bool is_match +dict details } Operator --> MatchResult

故障诊断规则链

graph TD subgraph "故障诊断链" Node1["诊断节点 1"] Node2["诊断节点 2"] Node3["诊断节点 3"] end Node1 -- topic, fields, algo --> Node2 Node2 -- topic, fields, algo --> Node3 Node1 -- action(return/continue), info(match_result), update --> Node2 Node2 -- action(return/continue), info(match_result), update --> Node3

这里的技巧在于

  • topic@fields表达式,topic指定路径/x/y/z,而fields使用jmespath用来灵活地定位树结构数据的数据位置
  • algo算子表达式,algo@XXDetector(threshold=0.2,percent=0.7),这样的直接Python 构造函数表示

引擎内部安全地解析和运行表达式

调试器执行流程

sequenceDiagram participant Debugger participant ROSBag participant Node1 participant Node2 participant Node3 Debugger->>ROSBag: 读取所有 topic 的 frames Debugger->>Node1: 执行 match(context, frames, fields) alt 匹配成功 Node1->>Debugger: 返回 match_result Debugger->>Node1: 执行 action Node1->>Debugger: 更新 frames 范围 else 匹配失败 Node1->>Debugger: 执行 action 反操作 end Debugger->>Node2: 处理 Node1 过滤后的 frames alt Node2 匹配成功 Node2->>Debugger: 执行 action 并更新 frames else Node2->>Debugger: 执行 action 反操作 end Debugger->>Node3: 处理 Node2 过滤后的 frames alt Node3 匹配成功 Node3->>Debugger: 执行 action 并更新 frames else Node3->>Debugger: 执行 action 反操作 end

文字描述

步骤一,设计针对rosbag时序数据的算子,算子的构造函数指定各种超参数,算子的match方法支持传入context ,bag,frames,fields,返回MatchResult。

步骤二,设计故障诊断链配置,由一组链式诊断节点组成,每个节点配置topic,fields,algo,action(return/continue),info(match_result),update

步骤三,调试器加载rosbag数据,加载故障诊断链配置,先批量获取所有topic的frames,然后链式执行调试节点的match,每次执行如果匹配就执行action,不匹配就执行action的反操作,主要是决定继续还是结束。每个节点结束还要根据update过滤frames的范围和topic,每个节点只处理自己的topic,每个节点会限制后续节点处理的frames时间范围。

posted @ 2025-03-29 10:46  ffl  阅读(59)  评论(0)    收藏  举报