19f1d02306d9e.png

1. 项目速览:让机器人在“月面工位”上自己看、自己动、自己抓

月球工业机器人面向未来月球基地、资源勘探、样本搬运和重复性工业作业等场景,尝试把 3D 视觉感知、目标识别、深度测量、串口通信、底盘运动控制和机械臂拾取 串成一条完整链路。它的核心思路并不玄学:先让 Gemini 2 看见目标,再从 RGB-D 数据里估计目标位置,随后把视觉信息发送给小车控制器,最后由电机与舵机驱动底盘和机械臂完成拾取动作。🌕

项目要素 内容
项目名称 月球工业机器人
来源 第四届 3D 视觉创新应用竞赛,王禹,广州市工贸技师学院
相机型号 Gemini 2
支持设备 Jetson Orin Nano、小车、机械臂
主要技术 HSV 视觉识别、RGB-D 深度过滤、串口通信、GPIO 控制、LabVIEW 电机/舵机控制、ROS/URDF 仿真
项目目标 根据视觉识别结果控制小车与机械臂,实现目标物体拾取

| 源代码 | RobotV_Lunar-Industry|

2. 为什么是“月球工业机器人”:不是浪漫,是刚需 🛰️

19f1d00ecbf78.png

月球环境对人类来说并不友好:真空、大温差、辐射、通信延迟、长时间重复劳动,样样都不轻松。因此,让机器人承担高重复、高风险或精细操作任务,是月球基地建设和深空探索的重要方向。

应用方向 机器人承担的任务 价值
月面资源勘探 识别、靠近并采集样本 降低人员风险,扩展探测范围
月球基地辅助 搬运、整理、摆放物资 提高长期驻留效率
科研实验支持 操作简单仪器或样品容器 减少航天员重复劳动
地面迁移应用 图书整理、快递搬运、简单分拣 具备教育、服务和工业演示价值

项目文档中特别强调,这套机器人不仅能用于太空机器人设想,也可迁移到图书馆、快递站等需要重复性搬运与整理的场景。也就是说,它表面上在“月球打工”,骨子里是在验证一套低成本、可教学、可扩展的移动抓取系统。

3. 总体方案:视觉是眼睛,串口是神经,底盘和机械臂是手脚

19f1d040a8005.png

项目可以拆成五个功能层:

功能层 主要文件/模块 作用
RGB-D 感知层 shiyan.py、Gemini 2、Orbbec SDK 获取彩色图与深度图
目标识别层 HSV 阈值分割、轮廓检测 找到待抓取目标区域
深度估计层 有效深度过滤、区域平均深度 得到目标中心和深度信息
通信层 uart.py、串口握手协议 将视觉信息传给控制端
执行层 LabVIEW 底盘/机械臂工程 控制电机、舵机与机械臂动作

整体闭环如下:

19f1d0a0f0ac9.png

这个架构的优点是职责清晰:Jetson Orin Nano 擅长视觉计算,控制器擅长电机与舵机实时控制。两个部分通过串口连接,工程实现更直接,也方便分步调试。

4. 视觉识别:先用 HSV 找目标,再用深度信息“确认距离”

19f1d0b722386.png

项目的视觉程序使用 pyorbbecsdk 获取 Gemini 2 的彩色流和深度流,并利用 OpenCV 做 HSV 颜色识别。核心逻辑是:把 RGB 图像转换到 HSV 空间,设置目标颜色阈值,生成二值掩膜,再通过轮廓面积筛掉小噪声。

def find_apple_in_frame(frame):
    hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    lower_red = np.array([0, 250, 18])
    upper_red = np.array([0, 255, 48])

    red_mask = cv2.inRange(hsv_frame, lower_red, upper_red)
    contours, _ = cv2.findContours(
        red_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE
    )

    for contour in contours:
        area = cv2.contourArea(contour)
        if area > 500:
            x, y, w, h = cv2.boundingRect(contour)
            return ((x, y), (x + w - 1, y + h - 1)), red_mask

    return None

HSV 方法的优势是实现轻量、速度快、易于调参,适合教学、竞赛和特定颜色目标识别。但它对光照和目标颜色依赖较强,因此项目没有只停留在“框出目标”,而是进一步使用深度图过滤有效距离信息。

5. 深度过滤:别只看中心点,要看“一片区域”的可靠深度 📏

19f1d0dc5e132.png

在 RGB-D 相机中,某些像素可能没有有效深度,例如反光、边缘、遮挡或距离过近时,单点深度容易不可靠。项目文档中也指出:识别较近物体时,可能出现“识别到了区域,但区域内部分位置没有深度信息”的情况。

为此,代码在目标框内遍历二值掩膜和深度图,只统计同时满足两个条件的像素:

条件 含义
掩膜像素为 255 当前像素属于目标颜色区域
深度值不为 0 当前像素有有效深度信息

核心代码如下:

def erztqd(abeu, ejiof, shz):
    count = 0
    total_depth = 0

    x1, x2 = int(abeu[0][0]), int(abeu[1][0])
    y1, y2 = int(abeu[0][1]), int(abeu[1][1])

    for x in range(x1, x2):
        for y in range(y1, y2):
            if int(ejiof[y][x]) == 255 and int(shz[y][x]) != 0:
                count += 1
                total_depth += shz[y][x]

    depth = total_depth / count if count != 0 else 0
    center_x = (x2 - x1) / 2 + x1
    center_y = (y2 - y1) / 2 + y1

    return center_x, center_y, depth

这个处理很朴素,但非常工程化:不迷信中心点,而是在目标区域内求有效深度平均值,能降低个别无效点或噪声点对抓取位置的影响。换句话说,机器人不是“瞄一眼就抓”,而是“多看几眼再下手”。🎯

6. 目标偏差判断:把视觉坐标变成控制信号

19f1d123d44fc.png

视觉程序获得目标的 x、y、depth 后,会与预设抓取点比较,并通过 GPIO 输出方向和到位信号。这部分对应代码中的 paduansfzq()。

def paduansfzq(xyk):
    target = [300, 150, 300]
    tolerance = [20, 20, 50]

    for i in range(3):
        diff = target[i] - xyk[i]
        GPIO.output(dk[i], GPIO.HIGH if diff > 0 else GPIO.LOW)

    for i in range(3):
        diff = target[i] - xyk[i]
        GPIO.output(dk[i + 3], GPIO.HIGH if abs(diff) < tolerance[i] else GPIO.LOW)

从控制意义上看,这段逻辑将连续视觉量转换成离散控制信号:

信号类型 作用
方向信号 判断目标在预设抓取点的正向还是反向
到位信号 判断目标是否进入允许误差范围
深度信号 辅助机械臂或底盘判断前后距离

这是一种适合小型机器人竞赛和原型验证的控制方式。它没有把问题复杂化为完整的三维运动规划,而是用目标偏差驱动执行机构逐步逼近抓取位置。

7. 串口通信:视觉端和控制端之间的“悄悄话” 🔌

19f1d15804667.png

项目中的 uart.py 封装了串口读写逻辑,默认使用:

self.ser = serial.Serial(
    "/dev/ttyTHS0",
    9600,
    timeout=0.05,
    write_timeout=0.01
)

它采用简单握手:读取时先发送 >,等待对端也返回 >;写入时先发送 <,等待对端返回 < 后再发送数据。

def runRead(self):
    while True:
        self.ser.write('>'.encode())
        if self.ser.read(1) == b'>':
            break

    total = ''
    while True:
        detect = self.ser.read(1)
        if detect != b'':
            if detect != b'>':
                total += detect.decode()
                continue
            break

    return total

def runWrite(self, param):
    while True:
        self.ser.write('<'.encode())
        if self.ser.read(1) == b'<':
            break

    self.ser.write(param.encode())

这套协议不复杂,但优点是明确:有开始握手,有结束标记,读写动作不容易混在一起。对于 Jetson 与小车控制器之间的短指令传输来说,这种轻量协议足够直接,也便于现场排错。

8. 执行控制:LabVIEW 负责电机、舵机和机械臂动作

19f1d16ef30f4.png

项目文档说明:电机与舵机控制程序使用 LabVIEW 编写,控制端以 myRIO 为核心。源码目录中也能看到底盘与机械臂两套工程:

控制对象 关键文件 说明
底盘 底盘/太空机器人.lvproj 底盘控制 LabVIEW 工程入口
底盘主程序 底盘/main.vi、底盘/RT Main.vi 本机端与实时端主 VI
底盘功能 底盘/funtion/速度PID.vi、底盘/funtion/舵机.vi 速度闭环与舵机控制
机械臂 机械臂/太空机械臂.lvproj 机械臂控制 LabVIEW 工程入口
机械臂功能 机械臂/funtion/机械臂仿真.vi、机械臂/funtion/夹角.vi 机械臂仿真与关节角度计算

结合项目 PDF 中的描述,控制链路可以概括为:

视觉端输出目标偏差
        ↓
串口 / GPIO 传递控制信息
        ↓
myRIO 接收并解析信号
        ↓
底盘电机调整机器人位置
        ↓
机械臂关节与末端执行器完成拾取

这里的重点是“视觉-运动协同”。单独的视觉识别只能告诉机器人目标在哪里,单独的电机控制只能让机器人动起来;只有两者接上,机器人才能从“会看”升级成“会干活”。

9. 仿真与结构建模:URDF、RViz、Gazebo 让机器人先在虚拟世界走一遍

19f1d19ee0522.png

项目中还包含 ROS 机器人描述包 lisdaf,其中 package.xml 明确说明这是一个包含配置、3D 模型和启动文件的 URDF 描述包。它支持在 RViz 中查看机器人模型,也能在 Gazebo 中加载仿真。

<!-- lisdaf/launch/display.launch -->
<param
  name="robot_description"
  textfile="$(find lisdaf)/urdf/lisdaf.urdf" />

<node
  name="joint_state_publisher_gui"
  pkg="joint_state_publisher_gui"
  type="joint_state_publisher_gui" />

<node
  name="robot_state_publisher"
  pkg="robot_state_publisher"
  type="robot_state_publisher" />

<node
  name="rviz"
  pkg="rviz"
  type="rviz"
  args="-d $(find lisdaf)/urdf.rviz" />

Gazebo 启动文件则负责将 URDF 模型加载到仿真世界:

<!-- lisdaf/launch/gazebo.launch -->
<include file="$(find gazebo_ros)/launch/empty_world.launch" />

<node
  name="spawn_model"
  pkg="gazebo_ros"
  type="spawn_model"
  args="-file $(find lisdaf)/urdf/lisdaf.urdf -urdf -model lisdaf"
  output="screen" />

这些模型文件适合用于项目介绍中的结构展示、仿真验证和系统组成说明。尤其是 lisdaf.urdf、meshes/*.STL、*.usd,可以支撑“机器人长什么样、关节如何组织、仿真如何呈现”等内容。

10. 运行环境:Jetson 端负责视觉,控制端负责实时动作

19f1d1d90fb0a.png

项目 PDF 和环境配置文档中提到,视觉程序部署在 Jetson Orin Nano,电机与舵机由 myRIO / LabVIEW 控制体系负责。系统环境配置文档还覆盖了远程连接、SSH、VNC、基础软件安装、OpenCV、ROS2、Jetson GPIO 等内容。

环境模块 相关内容 对项目介绍的意义
Jetson Orin Nano Python、OpenCV、Orbbec SDK、Jetson.GPIO 运行视觉识别与深度处理
Gemini 2 彩色流、深度流、对齐模式 提供 RGB-D 感知数据
myRIO / LabVIEW RT Main、FPGA、PID、PWM、Encoder、UART 控制底盘电机、舵机和机械臂
ROS/URDF/Gazebo lisdaf 机器人描述包 支撑三维模型展示与仿真说明

需要注意的是,环境配置文档篇幅较长,适合在项目介绍中提炼为“部署基础”,不建议整段照搬。读者更关心的是:视觉程序跑在哪里,控制程序跑在哪里,数据如何传过去,执行机构如何响应。

11. 技术亮点:简单、直接、能闭环 ✨

技术亮点 具体体现 工程价值
RGB-D 目标识别 Gemini 2 同时获取彩色和深度数据 不只知道目标在哪,还能估计距离
HSV 轻量算法 基于颜色阈值快速分割目标 实现简单,适合 Jetson 原型验证
有效深度平均 在目标区域中过滤无效深度并求平均 提高近距离识别和抓取定位稳定性
串口通信 Jetson 与控制器通过 UART 交换指令 模块解耦,便于调试与扩展
LabVIEW 实时控制 底盘和机械臂由 myRIO 控制 适合电机、舵机、编码器等实时任务
ROS 仿真模型 URDF、RViz、Gazebo 展示机器人结构 便于结构讲解和仿真演示

从创新点看,项目最值得强调的不是用了某个“特别复杂”的算法,而是把识别、测距、通信、控制和抓取这几件事串成了闭环。对于竞赛项目和教学原型来说,这比单点算法炫技更有系统价值。

12. 局限与优化方向:下一步让它更像真正的月面小助手 🛠️

19f1d1ed8706b.png
当前问题 可能原因 优化方向
HSV 对光照敏感 阈值依赖颜色和环境光 增加自适应阈值、颜色校正或学习型检测
目标类别有限 当前主要面向特定颜色目标 引入 YOLO、轻量分割网络或模板匹配
抓取规划较简单 主要根据目标偏差控制 引入 3D 抓取点估计和机械臂运动学规划
控制信号偏离散 GPIO/串口指令表达能力有限 设计结构化数据包,传输坐标、置信度和状态码
月面环境未充分模拟 地形、光照、尘埃、延迟复杂 加入仿真地形、低光照测试和通信延迟实验

如果后续继续深化,可以把项目升级为“视觉伺服 + 自主导航 + 机械臂抓取规划”的完整移动操作平台。那时它就不只是会抓一个目标,而是能在更复杂的任务链里做决策。

13. 总结:它不只是小车加机械臂,而是一条完整的“看见到抓取”链路

月球工业机器人项目的核心价值,在于把 Gemini 2 RGB-D 感知、Jetson Orin Nano 视觉处理、串口通信、myRIO 实时控制、小车底盘和机械臂执行 组织成了一个闭环系统。它能从图像中识别目标,从深度图中估计距离,再把视觉结果传给控制端,最终驱动机械臂完成拾取动作。

用一句轻快但严谨的话收尾:这台机器人不是只会“看月亮”,它是真的准备在月球工位上干活了。 🌙

发表回复

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