19f03491e4785.png

来源:第四届 3D 视觉创新应用竞赛 / 钟明 / 广州技师工贸学校 项目名称:混合果农管理 – 混合果蔬采摘机器人 相机型号:Gemini 2 深度相机 支持设备:Jetson Orin Nano 源代码链接:https://github.com/3DCVdeveloper/RobotV_Mixed-Fruit-Farmer-Management

一句话看懂项目

“丰收伴侣”是一套面向混合果园的智能采摘机器人方案:它通过 Gemini 2 深度相机获取彩色图像与深度数据,由 Jetson Orin Nano 运行视觉识别与上位控制,再结合 NI MyRIO、LabVIEW 控制程序、电机、舵机、伸缩机械臂和全地形底盘,实现水果定位、路径移动、机械臂对准与抓取。

它真正想解决的问题并不是“让机器人摘一个果子”,而是让机器人在更复杂的果园里工作:地面不平、果树排列不完全规则、果实高度不同、品类混合、采摘动作还需要足够柔和。项目因此采用了“3D视觉 + 运动控制 + 人机双模式”的组合设计。

为什么混合果园更需要这样的机器人?

传统水果采摘强依赖人工,劳动强度高,而且对采摘时间窗口非常敏感。随着果园规模扩大,人工成本持续上升;同时,农业劳动力减少让大规模、集中化采摘越来越难靠人力完成。

更关键的是,很多现有采摘设备只适合单一水果。采苹果的机构未必适合樱桃,适合柿子的抓取方式也不一定适合柑橘。对混合种植果园来说,如果每种水果都配置一套专用设备,成本和管理复杂度都会迅速增加。

本项目的价值就在这里:

  • 适应混合场景:面向多种果蔬识别、定位和采摘需求。
  • 降低人工依赖:把重复、危险、耗时的采摘环节交给自动化设备。
  • 提升作业连续性:机器人可在设定路线中持续执行检测、移动、采摘任务。
  • 保留人工干预:复杂情况可由果农远程或现场接管电机与舵机控制。

系统全貌:不是一个机械臂,而是一套采摘闭环

项目由视觉感知、边缘计算、底盘运动、机械臂执行、人工控制与仿真验证几部分组成。

19f034fc40407.png

工作流程:从“看见果子”到“摘下果子”

项目的核心流程可以概括为 6 步:

19f0355e5f215.png

这个流程的重点是闭环。机器人不是“拍一张图,然后盲抓”,而是边看、边算、边动、边修正。对于户外果园这种高度不确定的环境,闭环控制比单次定位更可靠。

关键技术一:Gemini 2 的 RGB-D 数据,让机器人知道“果子在哪里、离我多远”

普通摄像头只能告诉机器人“果子在画面哪里”,却很难直接告诉它“果子离我多远”。采摘机器人需要的是三维目标信息:画面坐标 x/y 决定机械臂往哪边修正,深度距离 z 决定机械臂是否需要伸缩。

本项目使用 Gemini 2 深度相机,基于 Orbbec SDK 同时获取彩色流和深度流。它的技术链路可以拆成三层:

层级 输入 处理 输出
图像采集 彩色帧、深度帧 相机启动、帧同步、彩色/深度对齐 同一视角下的 RGB 图与深度图
目标检测 RGB 图 HSV 颜色筛选、轮廓提取、面积过滤 水果候选框
三维定位 候选框 + 深度图 提取有效深度点、求区域均值 [x, y, depth] 目标参数

读者可以把这段流程理解成下面的“最小版视觉管线”:

# 1. 从 Gemini 2 获取同步后的彩色帧与深度帧
frames = pipeline.wait_for_frames(100)
color_frame = frames.get_color_frame()
depth_frame = frames.get_depth_frame()

# 2. 彩色帧用于识别果实,深度帧用于计算距离
color_image = frame_to_bgr_image(color_frame)
depth_data = np.frombuffer(depth_frame.get_data(), dtype=np.uint16)
depth_data = depth_data.reshape((height, width))
depth_data = depth_data.astype(np.float32) * depth_frame.get_depth_scale()

这里最值得注意的是“区域深度均值”。真实果园里,单个像素的深度值可能因为果皮反光、枝叶遮挡、边缘噪声而不稳定。如果只取目标框中心一个像素,机械臂很容易被异常值误导。项目中对识别区域内多个有效深度点进行统计,相当于用一片区域的深度信息抵消局部噪声,这比单点测距更稳。

# 3. 在目标框内只统计“属于果实区域、且深度有效”的点
valid_depth = []
for x in range(box_left, box_right):
    for y in range(box_top, box_bottom):
        if mask[y][x] == 255 and depth_data[y][x] != 0:
            valid_depth.append(depth_data[y][x])

target_depth = sum(valid_depth) / len(valid_depth)
target_x = (box_left + box_right) / 2
target_y = (box_top + box_bottom) / 2
target = [target_x, target_y, target_depth]

这段逻辑背后的关键不是“相机能看见”,而是“机器人能把看见的结果变成可执行的空间参数”。这也是 3D 视觉相比普通 2D 摄像头更适合采摘机器人的原因。

19f035aaeacc7.png

关键技术二:HSV 视觉识别,简单但适合原型快速验证

项目视觉代码采用 HSV 颜色空间进行目标果实识别。相比直接使用 RGB,HSV 把颜色、饱和度、亮度拆分开,更适合做颜色范围筛选。成熟果实往往在某些色相和饱和度范围内更明显,程序可以先用阈值过滤出候选区域,再用轮廓面积排除小噪点。

核心处理逻辑可以概括为:

def find_fruit_in_frame(frame):
    # BGR 转 HSV,让颜色筛选更稳定
    hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 根据成熟果实颜色设置阈值范围
    lower_color = np.array([17, 165, 93])
    upper_color = np.array([34, 255, 207])
    mask = cv2.inRange(hsv_frame, lower_color, upper_color)

    # 找出候选区域,并过滤太小的噪声轮廓
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        if cv2.contourArea(contour) > 500:
            x, y, w, h = cv2.boundingRect(contour)
            return ((x, y), (x + w - 1, y + h - 1)), mask

    return None

这套方法的优势是部署轻、速度快、解释性强,适合 Jetson Orin Nano 这类边缘设备上的实时原型验证。读者也很容易调试:如果识别不准,通常可以从阈值、轮廓面积、光照条件这三个地方入手。

但它也有明确边界:当光照变化大、果实颜色接近叶片或背景、目标被遮挡时,单纯 HSV 识别会受到影响。所以更完整的演进路线可以是:

19f035fb9a661.png

关键技术三:像素偏差变成机械臂动作,靠的是“视觉伺服”思路

源码中的主程序会不断读取相机输出的 [x, y, depth] 信息,并用一个简化规则把像素偏差转成机械臂移动方向:

视觉结果 控制含义 机器人动作
目标在画面左/右 水平偏差 调整底座或机械臂横向角度
目标在画面上/下 垂直偏差 调整机械臂俯仰或升降
目标距离过远 深度偏差 伸出机械臂或靠近目标
目标回到中心 对准完成 执行夹取动作

项目中的思想接近“视觉伺服”:不用一次性求出复杂的绝对空间坐标,而是通过“目标在画面中的偏差”不断逼近,让水果逐步回到抓取中心。用伪代码表示就是:

def pixel_to_motion(pixel):
    x, y, depth = pixel
    move_x = 0
    move_y = 0
    move_z = 0

    # 画面中心附近设置一个容许区间,避免机械臂反复抖动
    if x < 650:
        move_x = 1
    elif x > 700:
        move_x = -1

    if y < 500:
        move_y = 1
    elif y > 550:
        move_y = -1

    if depth > 100:
        move_z = 2

    return [move_x, move_y, move_z, 0, 0]

这段逻辑的好处是简单直接:相机发现目标偏左,机械臂就往对应方向修正;目标太远,就增加伸缩距离。它不追求一步到位,而是反复小步修正,更适合早期原型。

while True:
    target = camera.readParam()
    motion = pixel_to_motion(target)
    arm.add(motion)

    # 当 x/y/z 偏差都进入允许范围,就可以进入抓取阶段
    if motion[0] == 0 and motion[1] == 0 and motion[2] == 0:
        arm.selectArmJoint(4, 0)  # 夹爪闭合
        break

更进一步看,项目机械臂控制代码还包含平面极坐标、侧视角度、伸缩距离等计算。也就是说,系统并非只会简单开关舵机,而是在把目标位姿转换成多个关节参数:旋转舵机负责方向,俯仰舵机负责高度角,步进电机负责伸缩距离,夹爪舵机负责开合。

输入目标坐标:[x, y, z]

平面距离:r = sqrt(x^2 + y^2)
水平角度:theta = atan(x / y)
侧向距离:reach = sqrt(r^2 + z^2)
俯仰角度:pitch = atan(z / r)

输出控制量:
底座旋转角度 + 机械臂俯仰角度 + 伸缩距离 + 夹爪开合量
19f03622d5851.png

关键技术四:Jetson Orin Nano + NI MyRIO,分工明确的软硬件协同

项目不是把所有任务都塞进一个控制器,而是采用分层控制:

  • Jetson Orin Nano 更适合作为上位机,负责视觉程序、目标判断、整体任务逻辑。
  • NI MyRIO 更适合做实时控制,承担底盘、电机、舵机、传感器读写等任务。
  • LabVIEW + FPGA/RT 提供实时 I/O、PWM、编码器、I2C、SPI、DIO 等底层能力。

这种结构的好处是:视觉算法可以在高算力平台上快速迭代,底层运动控制则交给实时性更强的控制器执行。对于机器人来说,识别慢一点可能只是错过一帧画面,但电机控制抖动、时序不稳、舵机信号异常,则可能直接影响安全和抓取质量。

可以把系统分工理解成下面这条数据链:

19f036769732e.png

项目文件中的 LabVIEW 模块覆盖了底盘控制、坐标运动、位置 PID、速度 PID、巡线、扫线、红外、超声波、陀螺仪、编码器、电机、舵机、限位等功能。这说明项目并不是只有视觉 Demo,而是包含较完整的机器人运动控制基础。

最容易理解的控制分层是:

上位机负责“想清楚”:
- 目标在哪里?
- 现在要移动、对准,还是抓取?
- 自动模式还是人工接管?

实时控制器负责“做稳定”:
- 电机按多快转?
- 舵机输出多少 PWM?
- 编码器反馈是否到位?
- 限位开关是否触发?

这种“上位智能 + 下位实时”的结构,是移动机器人和工业机器人里非常常见、也非常实用的架构。

关键技术五:全地形底盘与独立转向,提高复杂果园通过能力

果园不是实验室地面。泥土、坡地、树根、落果、窄行距都会影响机器人移动。项目方案中强调了全地形车底盘、独立轮向控制和大角度转向能力,并结合 GPS、地图数据、激光雷达实时检测来实现避障、定位和路径规划。

19f036abe11e5.png

这部分设计对应的是采摘机器人的“到达能力”。机械臂再精准,如果底盘不能稳定到达目标树位,系统就无法真正用于果园。全地形底盘解决通过性,激光雷达和路径规划解决安全移动,独立轮向控制则提高狭窄空间内的机动性。

读者可以把底盘控制看成三步:

  • 感知:激光雷达 / 超声波 / 红外 / 编码器 / 陀螺仪采集环境和姿态
  • 规划:根据目标树位、障碍物和当前姿态生成移动路径
  • 执行:底盘电机和转向舵机按照速度、角度、位置闭环运动

如果用简化伪代码表达,底盘控制闭环大致是:

while robot_is_running:
    obstacle_map = lidar.scan()
    pose = estimate_pose(gps, gyro, encoder)
    path = plan_path(pose, target_tree, obstacle_map)

    wheel_speed, wheel_angle = chassis_controller(path, pose)
    motor.set_speed(wheel_speed)
    steering_servo.set_angle(wheel_angle)

项目中提到每个轮子的朝向可独立控制,并具备较大的旋转角度,这对果园很关键:机器人不需要像普通小车一样大半径转弯,而是可以在树行之间更灵活地调整姿态,减少压坏地面、碰撞树干或反复倒车的风险。

两种操作模式:自动化效率 + 人工接管能力

本项目支持两种运行模式:

模式 适用场景 核心价值
全自动模式 常规果园、批量采摘、路线明确的作业区域 自主导航、自动检测水果、自动采摘,提高效率
人工操作模式 遮挡严重、果实位置特殊、地形复杂、调试维护 远程或现场控制电机与舵机,精细处理特殊任务

这不是“自动”和“手动”的简单切换,而是面向真实农业场景的可靠性设计。果园里总会出现自动算法暂时处理不了的情况:枝叶遮挡、果实重叠、地面陷车、路径被临时障碍物阻断。保留人工接管能力,可以显著提高系统可用性。

仿真与建模:先在虚拟果园里练,再到真实果园里跑

19f036caf1657.png

项目 README 中还介绍了 SolidWorks、URDF、USD、Isaac Sim 和 OmniGraph 的仿真流程。开发者可以先在 SolidWorks 中建立机器人模型,导出 URDF,再导入 Isaac Sim 转成 USD,用 OmniGraph 和 Articulation Controller 控制机器人关节。

仿真的意义很大:

  • 在真实机械结构完成前验证关节层级和运动方向。
  • 检查机械臂、支架、底盘之间是否存在干涉。
  • 用键盘或脚本快速测试支架收放、关节动作和运动逻辑。
  • 降低实物调试中的损坏风险。

对于一台采摘机器人,仿真不是锦上添花,而是降低试错成本的重要工具。机械臂伸缩、支架展开、底盘转向这些动作如果直接在实物上反复试,很容易出现碰撞、卡死或舵机过载。先在 Isaac Sim 中跑通逻辑,再回到实体控制,会更稳。

应用场景:从采摘到果园管理

本项目并不局限于“摘果子”一个动作,它可以进一步扩展到果园管理和科研教学:

  • 混合果园采摘:对不同果树、不同高度、不同成熟状态的果实进行识别与采摘
19f0371537dbf.png
  • 复杂地形巡检:利用底盘、激光雷达和传感器网络完成果园移动巡查
19f037776e6ba.png
  • 病虫害与生长监测:后续可通过视觉模型识别叶片状态、果实病斑和生长趋势
19f037b50628c.png
  • 农业机器人教学:覆盖 3D视觉、机械臂、底盘控制、嵌入式计算和仿真建模
19f037f4c35f5.png
  • 科研验证平台:可作为算法、传感器、抓取末端和导航策略的综合实验平台
19f0381a0c686.png

项目亮点总结

亮点 解读
3D视觉定位 Gemini 2 同时提供彩色与深度信息,让机器人获得目标位置和距离
边缘端部署 Jetson Orin Nano 可在机器人本体上完成视觉处理,减少对外部主机依赖
实时运动控制 MyRIO 与 LabVIEW 模块负责底层电机、舵机、传感器控制
机械臂伸缩结构 面向不同高度和距离的果实,提高抓取覆盖范围
全自动 + 人工模式 常规任务自动完成,特殊情况可人工接管
仿真先行 SolidWorks + URDF + Isaac Sim 支持结构和动作验证
可扩展平台 后续可扩展深度学习识别、病虫害检测、环境监测和多果种采摘策略

仍可继续优化的方向

项目已经形成了较完整的原型链路,但如果要走向更真实的果园应用,还可以继续增强:

  1. 多果种识别模型:从 HSV 阈值识别升级为目标检测或实例分割模型,适应更多果实形态和光照条件。
  1. 相机-机械臂标定:建立更精确的相机坐标、机械臂坐标、底盘坐标转换关系。
  1. 柔性末端执行器:针对不同果皮硬度和果柄结构设计更温和的夹爪或吸附机构。
  1. 成熟度判断:结合颜色、尺寸、纹理、深度和历史数据判断是否适合采摘。
  1. 路径规划闭环:将激光雷达、视觉和地图数据融合,提高复杂果园中的避障稳定性。
  1. 数据记录与管理界面:记录采摘数量、位置、时间和果实状态,形成果园数字化管理能力。

结语:真正有价值的农业机器人,必须理解“果园的复杂”

“丰收伴侣”项目的意义,不只在于把相机、机械臂和底盘组合起来,而在于它把混合果园的真实难题放进了系统设计里:水果种类不同、地形复杂、抓取距离变化、自动化不可能永远百分百可靠。

因此,它选择了 3D视觉来理解空间,选择 Jetson Orin Nano 进行边缘计算,选择 MyRIO 和 LabVIEW 处理实时控制,选择伸缩机械臂扩大作业范围,也保留人工操作模式作为复杂场景下的安全补充。

这是一台面向未来农业的原型机器人:它还可以继续进化,但已经展示出一条清晰路线 – 让采摘从单一机械动作,变成“感知、判断、移动、抓取、反馈”的智能闭环。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注