LUMI 大模型分拣机器人应用 和 Lumi视觉标定
相关的代码文件
 Read file: utilfs/handToEyeCalibration.py
 Read file: utilfs/handToEyeCalibration.py
 Read file: conf/userCmdControl.json
手动标定原理详解
**眼在手外(Eye-to-Hand)**的标定方式。其核心原理如下:
1. 标定目标
计算相机相对于机器人基座标系的变换矩阵,即找到相机坐标系到机器人基座标系的变换关系。
2. 标定工具
使用棋盘格标定板作为标定工具:
- 棋盘格尺寸:8×11个内角点
- 每个方格边长:10mm
- 通过检测棋盘格角点来建立相机坐标系与标定板坐标系的关系
3. 数据采集过程
        if findCorners(color_image,boardRowNums,boardCowNums):
程序通过以下步骤采集数据:
- 手动控制:用户按’k’键触发数据采集
- 机器人位姿记录:获取当前机器人TCP(工具中心点)的6DOF位姿 [x, y, z, rx, ry, rz]
- 图像采集:获取相机拍摄的棋盘格图像
- 角点检测:使用findCorners函数检测棋盘格角点
- 数据验证:只有成功检测到角点才保存数据
4. 标定算法原理
标定过程基于以下数学关系:
目标变换链:
机器人基座 → 机器人末端 → 相机 → 标定板
数学表达式:
T_base_target = T_base_gripper × T_gripper_camera × T_camera_target
其中:
- T_base_gripper:机器人末端到基座的变换(从机器人位姿获得)
- T_camera_target:标定板到相机的变换(从角点检测获得)
- T_gripper_camera:相机到机器人末端的变换(待求解)
5. 核心算法步骤
5.1 相机内参标定
    def calibCamera(self,images,boardWidth,boardHeight,squareSize,criteria,ShowCorners=False):objp = np.zeros((boardWidth * boardHeight, 3), np.float32)objp[:, :2] = np.mgrid[0:boardWidth, 0:boardHeight].T.reshape(-1, 2)objp = objp * squareSize  # 18.1 mm
- 建立标定板的世界坐标系
- 使用OpenCV的calibrateCamera函数计算相机内参矩阵和畸变系数
5.2 外参计算
    def get_RT_from_chessboard(self,imagePoints,objectPoints,mtx,dist,Testing=False):R_target2camera_list = []T_target2camera_list = []for i,corners in enumerate(imagePoints):_, rvec, tvec = cv2.solvePnP(objectPoints[i], corners, mtx, distCoeffs=dist)
- 对每张图像使用solvePnP计算标定板到相机的旋转和平移
5.3 手眼标定
        R_camera2base, T_camera2base = cv2.calibrateHandEye(R_gripper2base_list, T_gripper2base_list,R_target2camera_list, T_target2camera_list)
使用OpenCV的calibrateHandEye函数求解手眼变换矩阵,该函数基于以下约束:
R_gripper2base × R_camera2gripper = R_camera2base × R_target2camera
6. 标定精度评估
程序通过计算重投影误差来评估标定精度:
    def CalculateExtrinsicEyeToHandRms(self,worldPoses,RT_camera2base,R_target2camera_list,T_target2camera_list):# 计算每个位姿的RMS误差for i, (pose_calib, pose_actual) in enumerate(zip(poses, worldPoses)):xx = abs(pose_calib['X'] - pose_actual[0])yy = abs(pose_calib['Y'] - pose_actual[1])zz = abs(pose_calib['Z'] - pose_actual[2])dRms = sqrt(xx ** 2 + yy ** 2 + zz ** 2)
7. 使用流程
- 准备阶段:放置棋盘格标定板,确保相机和机器人都能看到
- 数据采集:按’k’键采集多组数据(建议15-20组),每次改变机器人位姿和标定板位置
- 开始标定:按’p’键执行标定算法
- 结果保存:标定结果保存到./conf/CalibParams.json
8. 关键优势
- 手动控制:用户可以精确控制数据采集时机
- 实时验证:每次采集都验证角点检测是否成功
- 灵活性强:可以随时调整标定板位置和机器人姿态
- 精度可控:通过RMS误差评估标定质量
这种手动标定方法虽然需要人工干预,但能够获得高质量的标定数据,特别适用于对精度要求较高的工业应用场景。
LUMI 大模型分拣机器人应用
项目简介
本项目基于视觉大模型与机器人集成,面向多站点分拣、自动标定、智能检测与抓取等场景。支持多站点任务调度、手眼标定、视觉识别与抓取、AGV联动等功能。
目录结构
- multi_station_demo.py多站点分拣主控脚本
- visualDetect_ali.py视觉识别与抓取主流程
- visualValidCalib.py标定结果验证与像素-世界坐标映射
- AutoCalibProccess.py手动手眼标定采集与计算
- utilfs/机器人与工具函数库
- conf/配置文件(机器人参数、标定参数、站点配置等)
- requirements.txt依赖环境
- JAKA_SDK_LINUX/JAKA机器人SDK(需配置环境变量)
- images/检测结果与采集图片保存目录
环境配置
-  依赖安装 pip install -r requirements.txt- 依赖主要包括:opencv-python,numpy,matplotlib,dashscope等。
 
- 依赖主要包括:
-  Orbbec相机SDK - 推荐使用 pyorbbecsdk 或本项目自带的 OrbbecSDK目录。
- 确保相机驱动和SDK已正确安装。
 
- 推荐使用 pyorbbecsdk 或本项目自带的 
-  JAKA机器人SDK - 将 JAKA_SDK_LINUX路径加入环境变量:export LD_LIBRARY_PATH=/path/to/JAKA_SDK_LINUX:$LD_LIBRARY_PATH
 
- 将 
配置文件说明
conf/userCmdControl.json
 
- cameraParams:相机对齐、同步、图片保存路径
- objects:分拣目标与放置目标名称
- operationMode:操作模式(both/grasp_only/put_only/grasp_priority)
- robotParams:机器人初始位姿、抓取/放置偏移、抬升高度等
- calibrateParams:标定板参数、机器人IP、标定图片保存路径
- genNearPointParams:像素点深度搜索参数
- systemConfig:机器人、AGV、外部轴等系统IP与端口
- stations:多站点配置(站点名、AGV标记、机器人/外部轴初始位、站点操作模式)
conf/CalibParams-lumi-hand.json
 
- 相机内参、畸变、旋转、平移矩阵(标定结果)
主要功能与脚本
1. 多站点分拣任务(multi_station_demo.py)
 
- 支持多站点自动调度,AGV移动、机器人抓取/放置、视觉检测一体化。
- 站点配置、操作模式均可在 userCmdControl.json中灵活设定。
- 运行方式:python multi_station_demo.py
2. 视觉检测与抓取(visualDetect_ali.py)
 
- 支持自动/手动两种模式,自动识别目标物体与放置点,自动完成抓取与放置动作。
- 支持命令行参数: - --auto自动执行(不等待人工确认)
- --camera-sn指定相机序列号
- --list-cameras列出所有可用相机
 
- 运行方式:python visualDetect_ali.py --auto
3. 手动手眼标定(AutoCalibProccess.py)
 
- 按 k采集一组图片与机器人位姿,按p执行标定计算,按q退出。
- 标定结果保存在 conf/CalibParams-lumi-hand.json。
4. 标定结果验证(visualValidCalib.py)
 
- 实时显示相机画面,点击像素点可输出其世界坐标,辅助验证标定精度。
典型流程
-  手眼标定 
 运行AutoCalibProccess.py,采集标定图片与位姿,生成标定参数。
-  标定验证 
 运行visualValidCalib.py,点击画面验证像素-世界坐标映射。
-  配置参数 
 编辑conf/userCmdControl.json,设定机器人、相机、站点、目标物体等参数。
-  主要分拣任务运行 
 运行multi_station_demo.py或visualDetect_ali.py,实现多站点分拣或单站点视觉抓取。
注意事项
- 需提前配置好机器人、相机、AGV等硬件网络与SDK环境。
- 标定参数需与实际相机/机器人安装位置一致。
- 运行前请确保 conf/下配置文件参数正确,且图片保存目录存在。
参考/扩展
- 阿里大模型账号注册
- dashscope_api_key获取
- Orbbec相机配置
如需更详细的接口说明、二次开发指导,请参考各脚本源码及注释。
Requirements.txt
This file is autogenerated by pip-compile with Python 3.10
by the following command:
pip-compile requirements.in
–index-url https://pypi.tuna.tsinghua.edu.cn/simple
aiohttp3.9.5
 # via dashscope
 aiosignal1.3.1
 # via aiohttp
 async-timeout4.0.3
 # via aiohttp
 attrs23.2.0
 # via aiohttp
 certifi2023.11.17
 # via requests
 charset-normalizer2.0.4
 # via requests
 contourpy1.2.1
 # via matplotlib
 cycler0.12.1
 # via matplotlib
 dashscope1.19.0
 # via -r requirements.in
 fonttools4.51.0
 # via matplotlib
 frozenlist1.4.1
 # via
 # aiohttp
 # aiosignal
 getch1.0
 # via -r requirements.in
 idna3.10
 # via
 # requests
 # yarl
 kiwisolver1.4.5
 # via matplotlib
 matplotlib3.8.4
 # via -r requirements.in
 multidict6.0.5
 # via
 # aiohttp
 # yarl
 numpy1.26.4
 # via
 # -r requirements.in
 # contourpy
 # matplotlib
 # opencv-python
 opencv-python4.9.0.80
 # via -r requirements.in
 packaging24.0
 # via matplotlib
 pillow10.3.0
 # via matplotlib
 pyparsing3.1.2
 # via matplotlib
 python-dateutil2.9.0.post0
 # via matplotlib
 requests2.31.0
 # via dashscope
 six1.16.0
 # via python-dateutil
 urllib32.2.1
 # via requests
 yarl1.9.4
 # via aiohttp
{
 “robot_ip”: “192.168.10.90”,
 “ext_base_url”: “http://192.168.10.100”,
 “agv_ip”: “192.168.10.10”,
 “agv_port”: 31001,
 “comments”: “系统配置文件,包含机器人、外部轴和AGV的连接信息”
 }
