23ROS 与实时接入

如果把 ROS 从机器人上拆掉,让每个驱动自己往磁盘写文件,功能上会少什么。 这一页从这个问题出发,把中间件真正提供的东西数一遍,再看实时接入要暴露什么。

两条正交的轴 五件事 图不在录制者视野里

一、先分清两条轴

运行时(内存里怎么传)      录制格式(磁盘上怎么存)
  ROS 1                        rosbag
  ROS 2(DDS)                 rosbag2
  Apollo Cyber RT              Cyber Record
  自研                         MCAP

这两件事是正交的。ROS 这一列和 MCAP 这一列是同一个层次的东西吗?不是。 ROS 管数据在内存里怎么从 A 到 B,MCAP 管数据在磁盘上怎么摆放。

一个常见的混淆

ROS 对应的是 Cyber RT 那一列,MCAP 对应的是 Cyber Record 那一列。

而"运行时没有格式"这句话是对的:运行时里只有消息对象和话题名, 格式是落盘才出现的东西。

命名也对得上

运行时里的说法MCAP 里的说法指向的东西
topicchannel同一条数据流
Cyber RT 也叫 channelchannel同上

二、拆掉 ROS 会少什么

假设每个传感器驱动自己往磁盘写文件,下游各自读。功能上会少五样东西, 而且这五样都对应一种静默的失败。

① 发现与连接

有中间件:订阅者声明"我要 /camera/front/image",自动连上发布者
没有:  你得在配置文件里写死"去读哪个文件",而且新增一路传感器要改所有人的配置

少了它,系统从"插上就通"退化成"每加一个设备改一遍配置"。 而配置写错的时候,它不会报错,只是那条数据静默地空着。

② 类型与序列化

话题名之外还要说清这个字节流怎么解。PointCloud2 和 LaserScan 的字节布局完全不同,而且同一种消息还有版本差异。

少了它,每个驱动自己定一套,下游要写 N 套解码器。 更麻烦的是版本漂移:字段加了一个,旧的解码器不会报错,只是读错位置。

③ 时间

中间件提供的是统一的时间基准:每一条消息带采集时刻, 而且所有设备用同一个时钟。这一件事在"各自写文件"的方案里直接消失。

而这一条恰好是最致命的

没有统一时钟,你无法对齐激光和相机,也无法知道两帧之间隔了多久。

而跨帧推演、速度估计、多传感器融合,全都依赖时间差。时间一乱,全错,而且不报错。

④ 生命周期与存活

谁在发布、谁掉线了、进程还在不在。中间件能看到这张"图", 各自写文件的方案看不到:文件写了一半,你分不出是"这段路只有这么多数据"还是"驱动崩了"。

⑤ 监控与健康

发布频率、丢帧率、连接状态。这些都是在运行时才有的量,落盘之后就不存在了。

三、为什么这五件事只能由一层框架提供

因为它们都要求"全局视角",而单个程序天然只有局部视角。

能力为什么各程序自己解决不了
发现与连接要判断"有没有人在发",就得有人知道全集
类型与序列化要大家说同一种话,就得有一份公共字典
时间要统一时钟,就得有一个所有进程都认的源
生命周期要知道谁活着,就得有一个所有进程都注册进去的地方
监控要统计全局频率,就得看得到全部流量

四、但中间件不提供什么

一个很关键的边界

中间件提供的是数据流,不是图结构。

"现在有哪些话题、谁连谁、频率多少"这件事,在中间件里是元信息, 它不是一个话题,所以不在录制者的视野里。

于是"能不能把当时的图也录下来"这个问题,答案是不能,而且不是因为它太大, 是因为它不在录制器的视野内。录制器本身就是一个订阅者,它只看得到自己订的那些流。

唯一的解法

把不是流的东西变成流。

这也是为什么 TF 要拆成 /tf 和 /tf_static 两个话题: 它本来是个图,做成话题才能被录下来。

同理,桥接程序要把连接图暴露成一个可订阅的接口,这个图才进得了播放器的视野。

五、实时接入要暴露什么

接实时数据流,除了数据本身,还要暴露三样东西:

暴露什么为什么
通道清单不暴露,用户只能猜哪个话题叫什么
采集时刻用接收时刻替代采集时刻,等于丢掉真实时间
连接图把元信息做成流,否则它录不下来,也监控不到
实时侧还有一个只有实时才有的问题

丢帧。网络跟不上、磁盘写不过来、CPU 打满,都会丢。

而它丢了之后,录下来的文件看起来是连续的。这个问题在前面的"实时与离线"那页讲过, 根因在采集端的缓冲。

六、这一页带走什么

中间件提供的五件事,每一件都对应一种静默失败。少了任何一件, 系统不是报错,是"看起来在跑,但数据不对"。

而它不提供的,是图结构。图不是流,所以录不下来。唯一解法是把图变成流。

← 上一页:规模与性能 ·  下一页:跨端统一架构 →
京ICP备19013239号