植物资产管理系统

farmOS Leaf MCP是一个用于植物资产管理的服务器系统,支持植物分类、资产更新、图像采集和数据导出等功能,适用于农业自动化场景。

  • by azam2u
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 azam2u/farmos_leaf_mcp

使用说明

farmOS叶MCP

面向工厂的farmOS工作流的MCP服务器:

  • 摄像头捕捉+YOLO植物分类
  • 在farmOS中创建/更新工厂资产
  • 可选远程低置信度LLM审查
  • 可选地图分割->多边形几何更新
  • 捕获/上传活动日志图像
  • 检索/导出工厂资产数据
  • 清理非工厂和重复的活动日志图像

当前MCP工具

  1. get_server_info()
  2. classify_camera_and_sync_asset(camera_index=0, delay_seconds=5.0, mode="ask", asset_name_override="")
  3. capture_and_upload_asset_images(image_count=5, interval_seconds=3.0, camera_index=0, start_delay_seconds=0.0, asset_id="", force_new_log=False)
  4. apply_segmented_image_geometry_to_asset(segmented_image_path, latitude=None, longitude=None, zoom=18, asset_id="", create_new_if_missing=True, new_asset_name="", land_type="bed")
  5. collect_data_with_coordinates(latitude=None, longitude=None, mode="ask", asset_name_override="", camera_index=0, classifier_delay_seconds=5.0, collection_interval_seconds=3.0, collection_duration_seconds=15.0, mapbox_zoom=18, mapbox_width=800, mapbox_height=800, segment_server_host="", segment_server_port=0, upload_to_activity_log=False)
  6. retrieve_plant_asset_data(plant_name, mode="ask", selected_asset_id="", selected_asset_name="", selected_asset_index=0, export_dir="")
  7. cleanup_asset_activity_log_images(mode="scan", asset_id="", asset_name_contains="", cleanup_scope="both", days_back=30, non_plant_conf_threshold=25.0, duplicate_hash_distance=6, keep_policy="highest_confidence", allow_multi_asset_execute=False, hard_delete_files=False, cleanup_local_captures=False, local_capture_dir="", confirmation_text="")
  8. get_collection_job_status(job_id)
  9. list_collection_jobs(limit=20)

建筑学

  • MCP服务器: farmos_leaf_mcp.py
  • farmOS API客户端: farmOS Python包
  • 视觉模型:外部YOLO脚本(infer_image.py, live_preview.py)
  • 远程服务(ZeroMQ REQ/REP):
    • 分段服务器(send_image_for_segmentation)
    • 低置信度审核服务器(request_low_confidence_text)

需求

  • Python 3.10+
  • 摄像头可通过OpenCV访问
  • farmOS凭据+OAuth客户端
  • YOLO模型/脚本在磁盘上可用
  • 几何流可选:Mapbox令牌+远程分割服务器
  • GPS可选:NMEA串行设备(默认 /dev/ttyACM0)

安装:

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

配置

复制和编辑环境文件:

cp .env.example .env

主要变量:

  • farmOS身份验证: FARMOS_HOST, FARMOS_USER, FARMOS_PASSWORD, FARMOS_CLIENT_ID, FARMOS_CLIENT_SECRET
  • YOLO路径: LEAF_YOLO_DIR, LEAF_YOLO_MODEL_PATH, LEAF_YOLO_INFER_SCRIPT, LEAF_YOLO_LIVE_PREVIEW_SCRIPT
  • 摄像头方向: LEAF_CAMERA_ROTATION (none, clockwise, counterclockwise,或 180)
  • ZMQ远程服务器:
    • 细分: SEGMENT_SERVER_HOST, SEGMENT_SERVER_PORT
    • 低置信度法学硕士评审: LOW_CONF_SERVER_HOST, LOW_CONF_SERVER_PORT
  • Internet检查/重试: FARMOS_INTERNET_CHECK_HOST, FARMOS_INTERNET_CHECK_PORT, FARMOS_INTERNET_CHECK_TIMEOUT_SECONDS
  • 地图图像源标记: MAPBOX_TOKEN
  • 目录: LEAF_CAPTURE_DIR, MAPBOX_INPUT_DIR, SEGMENTED_DIR, LEAF_EXPORT_DIR

跑

./run_mcp.sh

此脚本:

  • 激活venv(如果存在)
  • 负载 .env (如果存在)
  • 开始 farmos_leaf_mcp.py

自动收集

在没有Roo或MCP提示的情况下连续运行整个管道:

./run_auto_collect.sh

自动运行器使用前台/后台作业架构:

  1. 读取坐标
  2. 创建并打印持久的作业ID
  3. 前景:显示YOLO标识 AUTO_CLASSIFIER_DELAY_SECONDS
  4. 前台:捕获所有定时数据图像
  5. 将作业排队并等待 AUTO_POLL_SECONDS (默认10秒)
  6. 后台:执行远程LLM审查并创建farmOS资产
  7. 背景:上传捕获的图像并并行更新分割的几何体
  8. 读取下一个坐标,并仅在至少移动后启动另一个前台作业 AUTO_MIN_MOVEMENT_METERS

使用 mode="create_new" 因此不需要实时预览确认或覆盖提示。 前台收集可以在早期工作远程完成的同时继续进行。后台工作是 串行处理并存储在 AUTO_JOB_DATABASE.停止 Ctrl+C跑步者在等待 用于退出前排队的后台作业。

当前的虚拟坐标默认值使用有限的新测试点列表。每次检查 前进到下一个点,在最后一点之后,跑步者保持位置 不会不断收集同一位置周围的重复数据:

AUTO_COORDINATE_SOURCE=dummy
AUTO_DUMMY_COORDINATES="35.021200,135.741100;35.021900,135.742400;35.022700,135.743900;35.023600,135.745400;35.024500,135.747000"
AUTO_DUMMY_MOVE_METERS_PER_CHECK=0

要模拟单个移动坐标,请删除 AUTO_DUMMY_COORDINATES 并设置 AUTO_DUMMY_LATITUDE, AUTO_DUMMY_LONGITUDE,以及 AUTO_DUMMY_MOVE_METERS_PER_CHECK. 稍后使用真正的NMEA GPS:

AUTO_COORDINATE_SOURCE=gps
GPS_DEVICE=/dev/ttyACM0

仅安全移动测试,无需更换摄像头或farmOS:

./run_auto_collect.sh --dry-run --max-checks 3 --poll-seconds 0.1

静止单坐标试验:

./run_auto_collect.sh --dry-run --max-checks 3 \
  --poll-seconds 0.1 --dummy-move-meters 0

只运行一个真正的集合:

./run_auto_collect.sh --max-runs 1

列出最近的工作:

./run_auto_collect.sh --list-jobs

检查一个作业:

./run_auto_collect.sh --status JOB_ID

工作阶段包括:

  • gps_trigger
  • foreground_data_capture
  • background_queued
  • background_asset
  • background_postprocess
  • completed, completed_with_warnings,或 failed

MCP客户端可以通过以下方式获得相同的状态 get_collection_job_status 和 list_collection_jobs.

仪表板

手动启动本地仪表板:

./run_dashboard.sh

打开 http://127.0.0.1:8765。仪表板提供:

  • farmOS、MCP工具、YOLO、相机、GPS、Mapbox、Tailscale的启动前准备, 分段、远程LLM审查和作业数据库
  • 摄像头和GPS连接状态
  • 启动、暂停/恢复和停止控件
  • 基于浏览器的YOLO预览
  • 实时收集器日志
  • 最近的异步收集作业

用户服务 farmos-collector-dashboard.service 在以下位置启动仪表板 靴子。LXDE autostart条目在桌面会话开始后打开Chromium。 可部署副本保存在 deploy/.

现场信息亭启动

对于没有键盘或鼠标的手持式现场设备,请运行一次信息亭设置:

cd /home/cvl/farmos_leaf_mcp_work/farmos_leaf_mcp
chmod +x deploy/setup_field_kiosk.sh
sudo deploy/setup_field_kiosk.sh cvl
sudo reboot

这将启用桌面自动登录 cvl保持仪表板服务启用, 并在启动后以Chromium kiosk/app模式打开UI。数据收集 仍在等待操作员按下 开始 在触摸屏上。

信息亭启动器通过以下方式避免了Chromium钥匙圈解锁提示 --password-store=basic. 安装脚本还应用了稳定的现场屏幕桌面大小:12 pt UI 字体、64像素桌面图标、48像素面板高度和130 DPI。

让仪表板 关机 按钮安全关闭Pi电源,无需 密码提示,安装一次sudoers规则:

cd /home/cvl/farmos_leaf_mcp_work/farmos_leaf_mcp
chmod +x deploy/setup_shutdown_button_sudoers.sh
sudo deploy/setup_shutdown_button_sudoers.sh cvl

使用按钮后,等待屏幕/活动停止,然后关闭 电池开关。

如果小屏幕显示器仍然作为全高清桌面启动,请强制降低启动速度 模式一次:

cd /home/cvl/farmos_leaf_mcp_work/farmos_leaf_mcp
chmod +x deploy/set_field_display_mode.sh
sudo deploy/set_field_display_mode.sh 800x480
sudo reboot

对于3.5英寸MHS显示器, 480x320 可能与面板完全匹配,但是 800x480 通常会让桌面不那么局促。

工具行为注释

classify_camera_and_sync_asset

  • 使用YOLO捕获图像并对植物标签/置信度进行分类。
  • 如果存在匹配资产:
    • mode="ask":返回提示
    • mode="overwrite":更新现有资产
    • mode="create_new":创建后缀资产
  • 若置信度低于阈值,则将图像发送到远程低置信度审查服务器,并将LLM输出存储在笔记/活动日志中。

collect_data_with_coordinates

端到端流结合资产同步+并行任务:

  1. 对工厂资产进行分类/追加销售
  2. 运行几何管道(Mapbox图像->远程分割->轮廓->WKT->更新资源几何)
  3. 捕获间隔图像,并可选择上传到活动日志

cleanup_asset_activity_log_images

  • mode="scan":仅报告候选人
  • mode="execute":执行取消链接/删除(带安全确认)
  • 重复检测仅在YOLO分类为植物的图像上使用pHash。

存储库卫生

Git中有意忽略生成的运行时输出:

  • captures/
  • mapbox_inputs/
  • received_segmented_mapbox_image/
  • plant_exports/

如果你需要样本工件,请在专用的 examples/ 目录。

安全说明

  • 不要向仓库提交真实的凭据、令牌或私有主机IP。
  • 保守秘密 .env (Git忽略了)。
  • 如果令牌在历史上被提交过,则对其进行轮换。