
1. 项目速览:让机器人在“月面工位”上自己看、自己动、自己抓
月球工业机器人面向未来月球基地、资源勘探、样本搬运和重复性工业作业等场景,尝试把 3D 视觉感知、目标识别、深度测量、串口通信、底盘运动控制和机械臂拾取 串成一条完整链路。它的核心思路并不玄学:先让 Gemini 2 看见目标,再从 RGB-D 数据里估计目标位置,随后把视觉信息发送给小车控制器,最后由电机与舵机驱动底盘和机械臂完成拾取动作。🌕
| 项目要素 | 内容 |
|---|---|
| 项目名称 | 月球工业机器人 |
| 来源 | 第四届 3D 视觉创新应用竞赛,王禹,广州市工贸技师学院 |
| 相机型号 | Gemini 2 |
| 支持设备 | Jetson Orin Nano、小车、机械臂 |
| 主要技术 | HSV 视觉识别、RGB-D 深度过滤、串口通信、GPIO 控制、LabVIEW 电机/舵机控制、ROS/URDF 仿真 |
| 项目目标 | 根据视觉识别结果控制小车与机械臂,实现目标物体拾取 |
| 源代码 | RobotV_Lunar-Industry|
2. 为什么是“月球工业机器人”:不是浪漫,是刚需 🛰️

月球环境对人类来说并不友好:真空、大温差、辐射、通信延迟、长时间重复劳动,样样都不轻松。因此,让机器人承担高重复、高风险或精细操作任务,是月球基地建设和深空探索的重要方向。
| 应用方向 | 机器人承担的任务 | 价值 |
|---|---|---|
| 月面资源勘探 | 识别、靠近并采集样本 | 降低人员风险,扩展探测范围 |
| 月球基地辅助 | 搬运、整理、摆放物资 | 提高长期驻留效率 |
| 科研实验支持 | 操作简单仪器或样品容器 | 减少航天员重复劳动 |
| 地面迁移应用 | 图书整理、快递搬运、简单分拣 | 具备教育、服务和工业演示价值 |
项目文档中特别强调,这套机器人不仅能用于太空机器人设想,也可迁移到图书馆、快递站等需要重复性搬运与整理的场景。也就是说,它表面上在“月球打工”,骨子里是在验证一套低成本、可教学、可扩展的移动抓取系统。
3. 总体方案:视觉是眼睛,串口是神经,底盘和机械臂是手脚

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

这个架构的优点是职责清晰:Jetson Orin Nano 擅长视觉计算,控制器擅长电机与舵机实时控制。两个部分通过串口连接,工程实现更直接,也方便分步调试。
4. 视觉识别:先用 HSV 找目标,再用深度信息“确认距离”

项目的视觉程序使用 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. 深度过滤:别只看中心点,要看“一片区域”的可靠深度 📏

在 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. 目标偏差判断:把视觉坐标变成控制信号

视觉程序获得目标的 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. 串口通信:视觉端和控制端之间的“悄悄话” 🔌

项目中的 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 负责电机、舵机和机械臂动作

项目文档说明:电机与舵机控制程序使用 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 让机器人先在虚拟世界走一遍

项目中还包含 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 端负责视觉,控制端负责实时动作

项目 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. 局限与优化方向:下一步让它更像真正的月面小助手 🛠️

| 当前问题 | 可能原因 | 优化方向 |
|---|---|---|
| HSV 对光照敏感 | 阈值依赖颜色和环境光 | 增加自适应阈值、颜色校正或学习型检测 |
| 目标类别有限 | 当前主要面向特定颜色目标 | 引入 YOLO、轻量分割网络或模板匹配 |
| 抓取规划较简单 | 主要根据目标偏差控制 | 引入 3D 抓取点估计和机械臂运动学规划 |
| 控制信号偏离散 | GPIO/串口指令表达能力有限 | 设计结构化数据包,传输坐标、置信度和状态码 |
| 月面环境未充分模拟 | 地形、光照、尘埃、延迟复杂 | 加入仿真地形、低光照测试和通信延迟实验 |
如果后续继续深化,可以把项目升级为“视觉伺服 + 自主导航 + 机械臂抓取规划”的完整移动操作平台。那时它就不只是会抓一个目标,而是能在更复杂的任务链里做决策。
13. 总结:它不只是小车加机械臂,而是一条完整的“看见到抓取”链路
月球工业机器人项目的核心价值,在于把 Gemini 2 RGB-D 感知、Jetson Orin Nano 视觉处理、串口通信、myRIO 实时控制、小车底盘和机械臂执行 组织成了一个闭环系统。它能从图像中识别目标,从深度图中估计距离,再把视觉结果传给控制端,最终驱动机械臂完成拾取动作。
用一句轻快但严谨的话收尾:这台机器人不是只会“看月亮”,它是真的准备在月球工位上干活了。 🌙