farmbot开发入门教程-识别植物
说明:
介绍使用 Plant.ID API 识别您花园中的植物
FarmBot 可以将图像上传到第三方 API 以进行进一步处理、存档、机器学习等。在本教程中,我们将演示如何使用以下简化流程将图像从 FarmBot 上传到Plant.ID API:
- FarmBot 围绕一株植物拍摄六张照片。
- FarmBot 对图像进行编码并对Plant.ID APIbase64执行 HTTP POST 。
- Plant.ID 返回一个 JSON 对象,其中包括对图像中哪种植物的猜测。
- FarmBot 解码 JSON 并格式化发送到 Web 应用程序的用户友好的 toast 通知和日志。
步骤 1:添加您的 Plant.ID 代币
在开始之前,您需要请求一个 Plant.ID API 令牌。
获得令牌后,您必须将其添加到 FarmBot 的自定义设置中。输入PLANT_ID_TOKEN设置名称(密钥)字段,然后将令牌粘贴到值字段中。然后点击按钮。
步骤 2:创建序列
导航到序列编辑器并创建新序列。添加一个名为“Plant to ID”的位置变量,并将其设置为您想要识别的植物。
Plant.ID 支持园林蔬菜以及杂草和本地植物物种。
步骤3:添加Lua代码
- 在序列中添加一个LUA命令并粘贴以下代码:
plant = variable("Plant to ID")
radius = 40
angle = (math.pi * 2) / 6
offset_x = tonumber(env("CAMERA_CALIBRATION_camera_offset_x") or "0")
offset_y = tonumber(env("CAMERA_CALIBRATION_camera_offset_y") or "0")
token = env("PLANT_ID_TOKEN")
job_name = "Identifying " .. plant.name
-- Check for token
if not token then
toast("Plant.ID token required", "error")
return
end
-- Move, then capture and encode image
function capture(num)
set_job(job_name, {
percent = (num / 6) * 75,
status = "Capturing image " .. num
})
x = plant.x - offset_x + (radius * math.cos(angle * num))
y = plant.y - offset_y + (radius * math.sin(angle * num))
z = 0
move_absolute(x, y, z)
data = take_photo_raw()
return base64.encode(data)
end
-- Capture six images
set_job(job_name)
images = {capture(1), capture(2), capture(3), capture(4), capture(5), capture(6)}
-- Send images to Plant.ID API
set_job(job_name, {
percent = 90,
status = "Talking to Plant.ID"
})
headers = {}
headers["Content-Type"] = "application/json"
headers["Api-Key"] = token
body = {
images = images,
modifiers = {"health_all", "crops_medium"},
plant_details = {"common_names"}
}
response, err = http({
url = "https://api.plant.id/v2/identify",
method = "POST",
headers = headers,
body = json.encode(body)
})
-- Parse common name from Plant.ID response
function common_name(num)
local suggestions = data["suggestions"][num]
if suggestions and suggestions["plant_details"] then
return suggestions["plant_details"]["common_names"][3] or "Unknown"
end
return "Unknown"
end
-- Parse probability from Plant.ID response
function probability(num)
local suggestion = data["suggestions"][num]
if suggestion then
return math.floor((suggestion["probability"] or 0) * 100 + 0.5)
end
return 0
end
-- Format result
function result(num)
return common_name(num) .. " (" .. probability(num) .. "%)"
end
-- Display top 3 results
if err then
toast(inspect(err), "error")
else
data = json.decode(response.body)
toast("Possible plants: " .. result(1) .. ", " .. result(2) .. ", " .. result(3))
end
complete_job(job_name)
步骤 4:运行序列
保存序列并等待它与 FarmBot 同步。然后您可以使用“运行”按钮对其进行测试,以确保其按预期运行。
请注意,Lua 代码不会将图像上传到 FarmBot API(它只会将它们上传到 Plant.ID API),因此您不会在 Web 应用程序中看到它们,也不会在以后访问它们。
如果您希望保存图像,可以在移动到下一个位置之前take_photo()向该capture()函数添加命令。这将从同一位置拍摄第二张照片并将其上传到 FarmBot API,同时对第一张图像进行编码并上传到 Plant.ID API。
一旦验证该序列有效,您就可以通过多种方式运行它:
- 通过使用序列编辑器中的RUN按钮。
- 通过引脚绑定将序列绑定到设备上的物理按钮。
- 来自父序列内。
- 按照重复的计划,通过事件。
- 通过第三方软件,使用FarmBot JS。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号