每件东西都应该有一个 URL:RFID 如何成为具身智能的物体词典
具身智能需要识别个体,不只是分类。RFID 填补视觉盲区,从「读号码」升级为「物体状态 API」。
二十多年前,互联网完成了一次跃迁:每台电脑都有了 IP 地址,每个网页都有了 URL。这次跃迁催生了搜索引擎、社交媒体、云计算——所有我们称之为「互联网经济」的东西,都建立在「每台电脑可寻址」这个前提上。
物理世界还没有完成这次跃迁。
你家里的杯子、钥匙、遥控器,工厂里的零件、工具、半成品,仓库里的每一件商品——它们都没有 URL。它们是物理世界的「暗物质」:存在,但不可寻址、不可查询、不可被程序直接操作。
RFID 有机会改变这件事。但前提是,我们不再把它当成「自动条码」来用。
一、物品互联网的缺失层
互联网的基础设施是 TCP/IP + DNS + HTTP。TCP/IP 让每台电脑可寻址,DNS 让人类可读,HTTP 让每台电脑可交互。这三层加起来,才有所谓的「互联网」。
物理世界对应这三层是什么?
<pre><code class="lang-yaml"># 物品互联网的三层架构(类比互联网) physical_internet: addressing_layer: internet_equivalent: "IP Address" physical_equivalent: "EPC (Electronic Product Code)" description: "每件物品的唯一身份标识" current_status: "已有标准(GS1 EPC),但覆盖率极低" gap: "绝大多数物品没有 EPC,即使有也不联网" naming_layer: internet_equivalent: "DNS / URL" physical_equivalent: "物品 URI(如 https://thing.example.com/epc:xxx)" description: "让人和程序都能查询物品状态的接口" current_status: "EPC/ONS 曾尝试,已废弃" gap: "没有统一的物品命名和解析体系" interaction_layer: internet_equivalent: "HTTP / REST API" physical_equivalent: "物品状态 API(GET /status, POST /action)" description: "程序可以直接调用物品状态,而不只是读原始数据" current_status: "不存在" gap: "RFID 读取流是原始数据,不是结构化 API"</code></pre>
二十年前,GS1 推过 EPC/ONS(Object Naming Service),试图建立物品互联网的基础。但那时候标签太贵、读写器太贵、网络太慢,全链路成本太高,这件事没跑通。
现在成本结构变了。UHF 标签几毛钱一个,读写器几百到几千块,网络无处不在。但「物品互联网」这件事还是没人做——因为大家都在用 RFID 做「自动条码」,没想过它能做更多。
二、机器人有视觉无身份
具身智能正在找「结构化 ground truth」。机器人能看见世界,但它看见的是像素,不是语义。
视觉能告诉机器人「这是一个杯子」,但分不清「这是张三的杯子还是李四的」。在家庭场景里,这意味着机器人不知道该把杯子放回谁的房间;在工厂场景里,这意味着机器人不知道该把零件装进哪个盒子。
视觉的盲区,恰好是 RFID 的长项。
<pre><code class="lang-yaml"># 视觉 vs RFID 的能力边界 comparison: vision: strengths: - "识别品类(杯子、瓶子、工具)" - "定位(物体在图像中的位置)" - "姿态估计(物体的朝向)" - "无需标签,通用性强" limitations: - "无法区分同类物品(两个一样的杯子)" - "无法读取被遮挡的标签" - "依赖光照条件" - "需要大量训练数据" rfid: strengths: - "唯一身份识别(每个杯子都有独立ID)" - "可穿透非金属材质读取" - "不依赖光照" - "可同时读取多个标签" limitations: - "无法识别品类(只能读ID)" - "无法定位精确位置" - "无法估计姿态" - "需要预先贴标签"</code></pre>
RFID 不告诉机器人「这是什么」,但告诉机器人「这是哪个」。这两个问题看起来相似,实际上完全不同。
「这是什么」是分类问题,视觉擅长。「这是哪个」是身份问题,只有 RFID 能回答。
三、从读号码到物体词典
传统 RFID 的用法:读到一个 EPC 号码,查数据库,返回商品信息。这是「自动条码」的用法——只是把条码换成了射频。
但如果我们换一个思路:每个 RFID 标签不只是一个号码,而是一个「物体 API」的入口呢?
<pre><code class="lang-python"># 物体词典服务:每个 EPC 都是一个可查询的状态 from dataclasses import dataclass from typing import Optional, Dict, Any from datetime import datetime @dataclass class ObjectState: epc: str # EPC 唯一标识 category: str # 品类(杯子、工具、零件) owner: Optional[str] # 所有者 location: Optional[str] # 当前位置 status: str # 状态(在库、使用中、移动中) last_seen: datetime # 最后读取时间 metadata: Dict[str, Any] # 扩展属性 class ObjectDictionary: """物体词典:把 RFID 读取流转化为结构化状态 API""" def __init__(self): self.objects: Dict[str, ObjectState] = {} def on_tag_read(self, epc: str, antenna: int, rssi: int): """RFID 读取回调:更新物体状态""" if epc not in self.objects: # 新物体:从主数据加载 self.objects[epc] = self._load_from_master(epc) obj = self.objects[epc] obj.last_seen = datetime.now() obj.location = self._antenna_to_location(antenna) obj.status = self._infer_status(rssi) def get_status(self, epc: str) -> Optional[ObjectState]: """GET /objects/{epc}/status""" return self.objects.get(epc) def query_by_owner(self, owner: str) -> list: """GET /objects?owner=xxx""" return [o for o in self.objects.values() if o.owner == owner] def query_by_location(self, location: str) -> list: """GET /objects?location=xxx""" return [o for o in self.objects.values() if o.location == location]</code></pre>
这个服务的核心变化:RFID 不再只是「读号码」,而是「查询物体状态」。每个 EPC 都变成了一个可寻址的资源,有 REST API,有结构化数据,有业务语义。
这就是物体词典:把物理世界的物品,变成程序可以直接查询和操作的结构化数据。
四、具身智能的物体接入层
回到具身智能的场景。机器人在房间里,看见桌上有三个杯子。视觉告诉它:「三个圆柱形容器,高度约10cm,颜色分别是白色、蓝色、白色。」
但机器人需要知道:白色杯子是张三的,蓝色杯子是李四的。现在它不知道该把杯子放回哪个房间。
如果每个杯子底部都有 RFID 标签,机器人只需要: 1. 读取三个 EPC 2. 调用物体词典 API:GET /objects/{epc1}/status, GET /objects/{epc2}/status, GET /objects/{epc3}/status 3. 返回:epc1 → 张三房间,epc2 → 李四房间,epc3 → 张三房间 4. 机器人知道该把每个杯子放回哪里
视觉提供「是什么」,RFID 提供「是哪个」。两者结合,机器人才真正理解物理世界。
这就是物体词典对具身智能的价值:它填补了视觉的盲区,让机器人从「看见世界」升级到「理解世界」。
五、从数据采集到状态服务
传统 RFID 系统的架构: 读写器 → 中间件 → 数据库 → 业务系统 数据流是单向的:从物理世界到数字世界。业务系统只能查询历史数据,不能实时感知物理世界。
物体词典的架构: 读写器 → 物体词典服务 ← REST API ← 业务系统/机器人 数据流是双向的:业务系统可以实时查询物体状态,也可以下发指令(比如「监控这个物品,当它移动时通知我」)。
这个变化的意义:RFID 不再只是「数据采集工具」,而是「物体状态服务」。它从后台走到前台,从被动记录变成主动服务。
对具身智能来说,这意味着机器人有了一个标准化的接口来查询物理世界。不需要自己处理 RFID 原始数据,不需要自己建数据库,只需要调用 API。
六、技术栈参考
搭建一个最小的物体词典服务,需要这些组件: <pre><code class="lang-yaml"># 物体词典技术栈 stack: rfid_hardware: reader: "KLMB100/200 或任何支持 TCP 协议的 UHF 读写器" tags: "UHF EPC Gen2 标签(Inlay: Impinj Monza 或 NXP UCODE)" protocol: "TCP/IP,端口 60000(默认)" backend: language: "Python 3.10+" framework: "FastAPI(轻量、异步、自动文档)" database: "PostgreSQL(主数据)+ Redis(实时状态缓存)" orm: "SQLAlchemy" api_design: rest_endpoints: - "GET /objects/{epc}/status - 查询单个物体状态" - "GET /objects?owner=xxx - 按所有者查询" - "GET /objects?location=xxx - 按位置查询" - "POST /objects - 注册新物体" - "PATCH /objects/{epc} - 更新物体属性" websocket: - "WS /objects/subscribe - 订阅物体状态变化" integration: robot_interface: "ROS 2 / Python SDK" wms_interface: "REST API 或 MQTT" monitoring: "Prometheus + Grafana"</code></pre>
这个技术栈的核心:FastAPI 提供 REST API,PostgreSQL 存储主数据,Redis 缓存实时状态。读写器通过 TCP 连接,读取的数据实时更新到 Redis,同时持久化到 PostgreSQL。
七、下一步
物品互联网不是新概念,但现在是第一次有可能真正实现它。标签便宜了,网络无处不在,具身智能需要结构化的物理世界数据。
RFID 有机会成为这个基础设施——但前提是,我们不再把它当成「自动条码」来用,而是把它升级成「物体词典」。
也许下一篇,我们写写怎么用 Python 搭一个最小的物体词典服务。