在 FarmBot 的浏览器界面点击 WATER,指令不会径直送到阀门。它会依次穿过用户界面、持久化 API、实时消息代理、共享命令语言、嵌入式操作系统、微控制器固件,最终抵达一个实体引脚。每一层保存着不同层面的实情:API 记住园圃原定的作业,消息代理传送当下要执行的任务,设备让工作持续推进,固件则把意图变成电流和运动。[1][2][3]

这套分工本身就是项目的核心。人们很容易把 FarmBot 看成一台在高架种植床里播种、浇水的三轴机器人,它更有意思的开源贡献,却是一套从园圃规划一直延伸到电机脉冲、各层均可检查的技术栈。层间接点解释了许多问题:浏览器关闭后,序列为何仍能继续;紧急停止为何不能等待 HTTP 轮询;研究人员为何可以添加新相机而不重写电机控制;自行运行源码的难度为何仍远高于阅读源码。

沿着一条指令逐层向下追踪,再顺着返回状态逐层向上查看,系统的局限也随之显现:开放性让每一层都可供检查和修改,云服务、校准、天气与机械问题依然存在。

图片背景:封面是 2016 年拍摄的真实照片,画面中,一台早期 FarmBot Genesis 架设在已经种植作物的床上。当前硬件已有变化,这幅景象仍保留了整套技术栈最根本的约束:抽象命令的终点,是一台与活体植物共享空间的运动机器。[9]

种植床就是坐标系

FarmBot 从一项力度很强的物理简化开始。轨道沿种植床界定 X 轴,龙门架提供 Y 向行程,竖直工具头提供 Z 向行程。移动机器人需要在整片田地里确定自身位置,FarmBot 则在一个已知的笛卡尔空间内工作。当前 Genesis 文档列出两种机型:标准版为 1.5 米 × 3 米,XL 版为 3 米 × 6 米,覆盖面积分别是 4.5 平方米和 18 平方米,标示的植株最大高度为 0.5 米。[7]

这套几何关系远不只是外部包装。机器与园圃共享同一个坐标模型,Web App 因而可以把植株、杂草、工具槽位或普通位置表示成一个点。浇水操作可以写成一个位置加一项外设动作;播种流程可以组合取种工具、拾取位置、目标坐标与深度。龙门架把纷乱的园圃约束成可处理的工作面,同时保留这个工作面原有的杂乱。

代价随即显现。固定框架带来可重复的定位,轨道也会移位,皮带会松弛,叶片会伸进运行路线,作物还会长过 Z 轴净空。防雨外壳消除不了泥土、风、水压、工具对位和种子差异。软件能够把一项操作准确排进日程,实体结果依旧受生物过程与概率左右。

Web App 存储作业意图,电机脉冲留给下层

在技术栈顶端,Web App 把三项功能放在一起:浏览器界面、REST API 和实时消息代理。[1] 用户在界面中布置植株、编排序列、安排事件、读取日志并点动机器;API 则在下方保存这些操作的持久记录。

资源名称清楚显示了两者的区别。当前 API 文档列出的资源包括 pointspoint_groupssequencesfarm_eventsregimenssensor_readingstoolsfbos_configfirmware_config 等。它们描述园圃、计划任务、观测结果与设置。一个 farm_event 可以指定执行序列或方案的时间,一个 sequence 可以保存可重复使用的命令树。即使设备离线,API 依然可以验证并保留这些记录。[2]

项目文档对职责划分写得格外明确:REST API 通常不负责控制设备。它存储、验证和授权数据,并向外提供状态;实时控制交由消息代理和命令层处理。[2] 这项分工防止缓慢的数据库请求链路侵入电机控制循环,也给集成开发留下了一条清晰规则:附加组件若要读取持久的园圃数据,就使用 HTTP;若要发出或观察即时动作,就使用实时通道。

RabbitMQ 承担实时通信

FarmBot 的消息代理是一项经过专门配置的 RabbitMQ 服务。HTTP 很适合回应请求,但设备若要获知用户已按下紧急停止键,反复轮询服务器并不合适。消息代理会保持已认证的连接,让浏览器、API worker、FarmBot OS 与第三方客户端能够随事件发生交换命令、状态和资源更新。[3]

公开的传输指南存在一处很能说明问题的版本错位。v15 的消息代理页面把 WebSocket 分配给浏览器客户端,把 MQTT 分配给非浏览器集成,并把 AMQP 分配给 FarmBot OS。[3] 然而,操作系统更新日志记载,13.1.0 版完成了 AMQP 的移除,MQTT 成为唯一传输协议;后续条目也继续记录 MQTT 客户端的行为。[12] 因此,当前集成应把 MQTT 视为设备传输协议;关于 AMQP 的那句话属于过时文档,已经不再代表受支持的架构接点。

开发者经 MQTT 发送命令时,会从 API token 取得消息代理主机名和设备身份,避免把服务器地址写死。随后,文档规定的 topic 族在设备专属路径下区分传入 RPC、设备响应、状态与供人阅读的日志:from_clientsfrom_devicestatuslogs。[10]

这项设计远不只是传输层细节。消息代理主机名属于部署细节,已获授权的设备身份和各 topic 的职责则属于协议约定。分别对待两者,托管服务便能迁移基础设施,同时保持各项集成原样运行。故障也会显出清晰层次:机器人断开时,REST 记录仍可保持最新;实时命令得到确认后,后续实体动作仍会失败;状态流停止后,历史 API 数据仍可读取。

CeleryScript 是各层共用的语法

消息还需要一套每一层都能识别的含义。FarmBot 使用 CeleryScript,这种基于 JSON 的格式同时充当命令语言、序列化格式和 RPC 协议。一个节点包含 kind、必需的 args,有时还带有容纳更多节点的 body。用户在浏览器中以可视方式编排的序列,会变成经 API 存储的抽象语法树;经消息代理发送的一次性运动命令,也使用同一套语法。[4]

常见节点显示出这份协议的覆盖范围:move_absoluteread_pinwrite_pintake_photoexecutewaitemergency_locksync。处理实时任务时,rpc_request 会包裹请求执行的节点,设备随后返回 rpc_okrpc_error。请求标签让客户端能够在许多命令共用一条持久连接时,将响应逐一对应回请求。[11]

这种设计以牺牲人工书写的便利换取统一性。FarmBot 自己的文档建议,大多数集成采用 FarmBotJS 或 FarmBotPy 等封装库,避免手写 CeleryScript。[4] 这条开源分界很合理:完整语料仍可检查,也不受编程语言限制;普通开发者则借助更安全的库工作。若一项集成依赖文档以外的节点形态或内部 AMQP 行为,它就已经离开受支持的接点,进入项目内部机件。

FarmBot OS 负责持续运转,固件负责即时动作

树莓派运行 FarmBot OS。它以 Elixir 编写,并用 Nerves 构建成嵌入式镜像;它接收排程和远程调用,报告传感器数据与日志,执行设备端安全策略,还会完成那些必须以低延迟运行或需要跨越网络中断的操作。[1][5] 云端保留长期作业意图,设备则持有足够的同步状态,让计划中的浇水序列脱离打开的浏览器标签页仍能持续执行。

FarmBot OS 的定位有别于通用树莓派发行版。v15 文档称 SSH 访问已经移除,sidecar 指南写得更明确:文件系统只读,用户无法安装任意驱动程序、Python 软件包或内核模块;负载较重的扩展应放在另一台计算机上,并经文档规定的软件或硬件通道连接。[5][13] 控制器由此被划定为一台专用设备,不能当作园圃里无人管理的服务器。

再往下,是运行在 Arduino 级微控制器上的 C++ 固件。它的职责经过刻意收窄:驱动步进电机,读取编码器和传感器,切换引脚与外设,并返回结果。FarmBot OS 把固件作为独立编译的 .hex 镜像一并提供。[1][5] 这层划分让数据库逻辑和网络客户端远离对时序敏感的硬件,也把复杂排程留在内存预算更充裕的上层。

这套分层还规定了排查顺序。若计划事件缺失,就检查 API 状态和同步;若 RPC 始终未到达,就检查消息代理连接与授权;若 FarmBot OS 接受移动命令后,坐标或外设表现异常,就检查固件设置、校准、布线与机械部件。“机器人坏了”由此拆成一组范围更窄的问题。

开源之上,托管服务依然存在

所有这些组件都可阅读、修改和构建,各自带来的运维负担却并不相等。Web App 仓库包含浏览器客户端、Rails API、面向数据库的服务,以及容器化的 MQTT 服务器。FarmBot 为设备所有者提供托管实例,并明确表示普通套件用户可以直接使用该服务,不用亲自运行整套技术栈。[6]

项目对自托管的警告严厉得令人清醒。独立运营服务器会耗费数百小时,项目方假定操作者拥有约 3 至 5 年的 Ruby、SQL 和 Linux 管理经验;自托管还会引入安全或数据丢失风险,也得不到基础产品支持。项目同时指出,main 分支大约每 2 至 4 周变化一次,独立运营者需要自行承担更新工作。[6]

这些要求恰好把开源主张界定得更准确。源码可得带来可审计性、研究入口、提交补丁的通道,以及离开供应商服务的退路;至于 Rails、PostgreSQL、RabbitMQ、对象存储、密钥、备份、监控与升级,仍是一整套持续运维工作,距离一键式设备很远。学校或小型实验室可以在使用托管服务的同时修改序列和硬件。受监管的部署则会为了数据保管权接受服务器负担。两者对应不同的采用决策。

研究价值显现在层间接点

2025 年一篇独立发表于 MethodsX 的论文,展示了这套技术栈能做什么,也标出仍待面对的问题。研究人员从 FarmBot Genesis v1.6 出发,在 Z 轴附近安装 Intel RealSense D405 立体相机,又添加一台 Raspberry Pi 5 sidecar,因为标准控制器不适合处理相机负担更重的点云任务。sidecar 与 FarmBot 控制器经 UART 通信,开放代码随后协调六个视角的重复图像采集。[8]

最终成果没有演变为整个机器人的新分支。龙门架提供可重复的坐标和排程,sidecar 则负责立体采集与重建。研究人员报告,从六个视角记录一株植物约需 45 秒。他们也记录了现实限制:光线变化会给点云增加噪声,风会让叶片在各视角之间移动,高大作物会干扰龙门架,完整的机载重建还需要更多算力。[8]

这个案例有力说明了为何应把 FarmBot 视为一个生态系统。一项实用扩展找到了距离最近的稳定接点——实体安装、UART、预定位置和开放软件——同时让电机固件继续专注于原有职责,没有把它变成视觉计算机。这也戳破了全自动化的想象。可扩展平台能够让实验反复重现,却无法消除阳光、风、植株运动或处理时间的影响。

先选层级,再选方案

对于家庭种植者或课堂,合理的组合通常是官方设备镜像加托管 Web App。开放代码的价值落在可检查的基础设施和社区改进通道上,日常运行仍可交给托管端,不要求用户亲自运维每项服务。

对于软件集成,持久资源从 REST API 入手,实时任务则使用 MQTT 或 WebSocket。除非项目确实需要原始 CeleryScript,优先选用 FarmBotJS 或 FarmBotPy。断线情况需要明确测试:有意识地排队或拒绝命令,区分消息代理确认与运动完成,并决定界面如何显示陈旧状态。

对于研究仪器,龙门架与 sidecar 的接点正是吸引力所在。人员预算里既要有理解实验的人,也要有能够处理嵌入式、电气和机械故障的人,这两项职责可以由同一位研究人员兼任。还要校准坐标、划定安全行程、以成熟高度的植株测试,并随结果数据保存确切的硬件、FarmBot OS、固件、序列和附加组件版本。

对于自托管部署,最低可信标准远高于“仓库已经启动”。它包括经过测试的备份、已经恢复验证的 API 资源、消息代理认证、版本监控、密钥轮换、对象存储恢复,以及一套纳入真实设备的升级演练。若团队承担不了这些例行工作,采用托管控制,同时在设备端开放扩展,会更如实地反映其运维能力。

FarmBot 生态系统得以运转,正因为它没有让单个组件包办所有职责。浏览器负责描述,API 负责记忆;RabbitMQ 负责传送,CeleryScript 负责命名;FarmBot OS 负责协调,固件负责执行;龙门架则真正接触园圃。开放性的价值恰好集中在这些交接点上:开发者可以检查指令在哪里改变形态,替换确实需要调整的层,并让机器其余部分继续保持清晰可懂。

来源

  1. FarmBot 开发者文档 v15,“High Level Overview”——组件所用语言、硬件与固件的分工、FarmBot OS 职责、云端角色和任务归属。
  2. FarmBot 开发者文档 v15,“REST API”——持久资源、存储与验证职责、API 规范,以及数据记录和设备控制的职责划分。
  3. FarmBot 开发者文档 v15,“Message Broker”——RabbitMQ 的作用、实时控制与同步、认证,以及 WebSocket、MQTT、AMQP 的分工。
  4. FarmBot 开发者文档 v15,“CeleryScript”——JSON 节点语法、序列抽象语法树、RPC 与数据交换职责、封装库建议和命令用法。
  5. FarmBot 开发者文档 v15,“FarmBot OS”——Elixir 与 Nerves 构建方式、随附固件镜像、开发依赖和 SSH 移除情况;其中关于传输协议的表述已由操作系统更新日志取代。
  6. FarmBot 的 Farmbot-Web-App 仓库——Web UI、API 与消息代理软件包,托管服务建议,自托管的要求与风险,更新频率和 MIT 许可证。
  7. FarmBot Genesis v1.8 文档——当前标准版与 XL 版的工作范围、预定用途、硬件文档和开源项目背景。
  8. Frederik Hennecke、Jonas Bömer 与 René H. J. Heim,《Modification of an automated precision farming robot for high temporal resolution measurement of leaf angle dynamics using stereo vision》,MethodsX 14(2025)——独立 FarmBot 研究部署、sidecar 架构、用时和环境限制。
  9. Wikimedia Commons,“FarmBot Genesis.jpg”——封面所用 FarmBot 2016 年 8 月照片的来源与出处,采用 CC BY 4.0 许可。
  10. FarmBot 开发者文档 v15,“Sending Commands”——从 API token 获取消息代理设置,以及文档规定的请求、响应、状态和日志 MQTT topic。
  11. FarmBot 开发者文档 v15,“CeleryScript Nodes”——当前节点形态、常用命令,以及 rpc_requestrpc_okrpc_error 的响应约定。
  12. FarmBot OS 的 CHANGELOG.md——13.1.0 版最终移除 AMQP、仅保留 MQTT 的说明,以及后续 MQTT 客户端维护条目。
  13. FarmBot 开发者文档 v15,“Sidecar Hardware”——设备的只读约束,以及驱动程序、软件包与专用硬件所应采用的外部计算连接方式。