在 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 文档列出的资源包括 points、point_groups、sequences、farm_events、regimens、sensor_readings、tools、fbos_config 和 firmware_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_clients、from_device、status 和 logs。[10]
这项设计远不只是传输层细节。消息代理主机名属于部署细节,已获授权的设备身份和各 topic 的职责则属于协议约定。分别对待两者,托管服务便能迁移基础设施,同时保持各项集成原样运行。故障也会显出清晰层次:机器人断开时,REST 记录仍可保持最新;实时命令得到确认后,后续实体动作仍会失败;状态流停止后,历史 API 数据仍可读取。
CeleryScript 是各层共用的语法
消息还需要一套每一层都能识别的含义。FarmBot 使用 CeleryScript,这种基于 JSON 的格式同时充当命令语言、序列化格式和 RPC 协议。一个节点包含 kind、必需的 args,有时还带有容纳更多节点的 body。用户在浏览器中以可视方式编排的序列,会变成经 API 存储的抽象语法树;经消息代理发送的一次性运动命令,也使用同一套语法。[4]
常见节点显示出这份协议的覆盖范围:move_absolute、read_pin、write_pin、take_photo、execute、wait、emergency_lock 和 sync。处理实时任务时,rpc_request 会包裹请求执行的节点,设备随后返回 rpc_ok 或 rpc_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 负责协调,固件负责执行;龙门架则真正接触园圃。开放性的价值恰好集中在这些交接点上:开发者可以检查指令在哪里改变形态,替换确实需要调整的层,并让机器其余部分继续保持清晰可懂。
来源
- FarmBot 开发者文档 v15,“High Level Overview”——组件所用语言、硬件与固件的分工、FarmBot OS 职责、云端角色和任务归属。
- FarmBot 开发者文档 v15,“REST API”——持久资源、存储与验证职责、API 规范,以及数据记录和设备控制的职责划分。
- FarmBot 开发者文档 v15,“Message Broker”——RabbitMQ 的作用、实时控制与同步、认证,以及 WebSocket、MQTT、AMQP 的分工。
- FarmBot 开发者文档 v15,“CeleryScript”——JSON 节点语法、序列抽象语法树、RPC 与数据交换职责、封装库建议和命令用法。
- FarmBot 开发者文档 v15,“FarmBot OS”——Elixir 与 Nerves 构建方式、随附固件镜像、开发依赖和 SSH 移除情况;其中关于传输协议的表述已由操作系统更新日志取代。
- FarmBot 的
Farmbot-Web-App仓库——Web UI、API 与消息代理软件包,托管服务建议,自托管的要求与风险,更新频率和 MIT 许可证。 - FarmBot Genesis v1.8 文档——当前标准版与 XL 版的工作范围、预定用途、硬件文档和开源项目背景。
- 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 架构、用时和环境限制。
- Wikimedia Commons,“FarmBot Genesis.jpg”——封面所用 FarmBot 2016 年 8 月照片的来源与出处,采用 CC BY 4.0 许可。
- FarmBot 开发者文档 v15,“Sending Commands”——从 API token 获取消息代理设置,以及文档规定的请求、响应、状态和日志 MQTT topic。
- FarmBot 开发者文档 v15,“CeleryScript Nodes”——当前节点形态、常用命令,以及
rpc_request、rpc_ok、rpc_error的响应约定。 - FarmBot OS 的
CHANGELOG.md——13.1.0 版最终移除 AMQP、仅保留 MQTT 的说明,以及后续 MQTT 客户端维护条目。 - FarmBot 开发者文档 v15,“Sidecar Hardware”——设备的只读约束,以及驱动程序、软件包与专用硬件所应采用的外部计算连接方式。