规则引擎
输入数据
从概念上来说,RuleEngine 处理的是一个元组的数据流(元组包含 message, timestamp, topic, message type),当编写规则时,使用者可 以通过相应变量来访问输入数据(msg, ts, topic, msgtype)。
根据处理的文件类型,coScene agent 将会根据下列图表填充变量:
Bag file (ROS, Mcap,etc) | Log file | |
---|---|---|
msg: any | Message 数据 | 由log文件中的一行信息封装成的 Foxglove.Log |
ts: float | 时间戳 | 从单行log中解析出的时间戳 |
topic: str | Topic 名称 | log文件名 |
msgtype:str | 消息类型 | Foxglove.Log |
注:
- 时间戳为自 1970/01/01 00:00:00 经历的秒数,float 类型
- 时间戳的解析将尽力完成,相关信息见支持的时间戳格式
msg
的结构取决于输入数据的类型,比如一个 rosgraph_msgs/Log 类型的msg
,它的结构就会如定义所示,下面是一个例子:这样比如想要获取msg: {
header: {
seq: 1,
stamp: {
secs: 12345678,
nsecs: 0
},
frame_id: 'demo_frame'
},
level: 2,
name: 'demo_node',
msg: 'Hello World',
file: 'demo file',
function: 'demo function',
line: 10,
topics: ['/demo_topic'],
}msg
中的msg
字段,可以使用msg.msg
,想要获取msg
中的frame_id
字段,可以使用msg.header.frame_id
,以此类推。
Log 数据
为了方便读取日志数据,我们为以下 log 数据类型提供了额外的提取器 (log
、log_level
)
- Protobuf or JSON:
foxglove.Log
- ROS:
foxglove_msgs/Log
- ROS:
rosgraph_msgs/Log
log
: 过滤支持的消息类型,并且返回 log 内容
log == 'Error occurred!' # 当一行日志信息为 'Error occurred!'时触发
log_level
: 过滤支持的消息类型,并返回 log 的等级
用户可以使用 log_level 枚举不同的日志等级
- INFO
- WARN
- ERROR
- FATAL
log_level == LogLevel.FATAL # 每当出现 FATAL 日志时触发
运算符
==
!=
>
>=
<
<=
a and b
a or b
not a
a in b
序列匹配器
-
sustained
sustained(context, condition, duration)
当给定
condition
为真的持续时间超过duration
时,条件会被触发。 (context
是用于评估condition
的消息过滤器。)# 下面的语法会监测所有 topic 为 ‘/velocity’的消息,
# 如果其 liner.x 的值大于 20 且持续时间大于 10 s
# 该条件将会被触发
sustained(
topic == '/velocity',
msg.linear.x > 20,
10
)
-
repeated
repeated(condition, times, duration)
当给定
condition
在给定的duration
内被触发time
次时,条件会被触发。# 当日志中包含‘Error 12345 happened’,且在 60 秒内出现了 5 次,条件被触发
repeated(
'Error 12345 happened' in log,
5,
60
)