Skip to content

l2ktech/PAROL6-Python-API-Gemini-Vision-Public

 
 

Repository files navigation

PAROL6 智能机械臂控制系统 - 中文使用说明

📋 项目概述

这是一个基于 Gemini Vision AI 的 PAROL6 机械臂智能控制系统,能够通过自然语言和视觉识别实现机器人的自动化操作。该系统将传统的 GUI 控制方式转变为可编程的研究级平台,支持视觉引导操作和自然语言控制。

核心特性

  • 自然语言控制:支持文本和语音输入
  • 视觉识别:集成 Intel RealSense D435I 深度相机
  • AI 驱动:使用 Google Gemini 2.5 Flash 视觉模型
  • 精确控制:毫米级定位精度
  • 远程操作:UDP 客户端-服务器架构
  • 安全保护:多层安全检查和急停监控

🔧 系统架构

三层架构设计

┌─────────────────────────────────────────────────────────────┐ │ 用户交互层 (顶层) │ │ - 自然语言输入(文本/语音) │ │ - Gemini AI 理解和规划 │ └─────────────────────┬───────────────────────────────────────┘ │ ┌─────────────────────▼───────────────────────────────────────┐ │ 视觉处理层 (中层) │ │ - RealSense 深度相机 │ │ - 物体检测和3D定位 │ │ - 手眼标定 │ └─────────────────────┬───────────────────────────────────────┘ │ ┌─────────────────────▼───────────────────────────────────────┐ │ 机器人控制层 (底层) │ │ - UDP 服务器(headless_commander.py) │ │ - 运动学计算和轨迹规划 │ │ - 串口通信和实时控制 (100Hz) │ └─────────────────────────────────────────────────────────────┘ 

文件结构

PAROL6-Python-API-Gemini-Vision-Public/ ├── Headless/ │ ├── headless_commander.py # 机器人控制服务器 │ ├── robot_api.py # 客户端 API(30+ 控制函数) │ ├── smooth_motion.py # 平滑轨迹生成 │ ├── PAROL6_ROBOT.py # 机器人参数配置 │ ├── Gemini/ │ │ ├── gemini.py # Gemini AI 控制器 │ │ ├── robot_vision_tools.py # 视觉工具函数 │ │ ├── bounding_box_model.py # 物体检测模型 │ │ └── supplementary_functions.py # 辅助功能 │ └── Vision/ │ ├── vision_controller.py # 视觉处理控制器 │ ├── calibrate_hand_eye.py # 手眼标定 │ └── validate_calibration.py # 标定验证 ├── README.md # 英文项目说明 ├── API-Specific-README.md # API 详细文档 └── 中文使用说明.md # 本文档 

📥 输入与输出

输入

输入类型 说明 示例
自然语言命令 文本或语音描述任务 "请抓取红色的方块并放到蓝色盒子里"
视觉数据 RealSense D435I 深度相机 RGB-D 图像流(640×480 @ 30fps)
API 调用 Python 函数直接控制 move_robot_joints([90, -45, 90, 0, 45, 180])
关节角度 6个关节的角度值(度) [0, -90, 180, 0, 0, 180]
笛卡尔坐标 位置和姿态 (mm 和度) [250, 0, 200, 180, 0, 90]

输出

输出类型 说明 精度
关节运动 6轴协调运动 ±0.1°
笛卡尔运动 直线/曲线路径 ±1mm
夹爪控制 开合和力控制 0-255 级位置
状态反馈 位置、速度、IO状态 实时更新
视觉信息 物体3D位置和方向 毫米级精度
语音/文本反馈 AI 响应和状态报告 自然语言

🎯 主要功能

1. 基础运动控制

  • 关节运动 (move_robot_joints): 控制6个关节到指定角度
  • 位置运动 (move_robot_pose): 移动到笛卡尔坐标位置
  • 笛卡尔直线 (move_robot_cartesian): 保证直线路径运动
  • 点动控制 (jog_robot_joint, jog_cartesian): 手动微调位置

2. 高级平滑运动

  • 圆形轨迹 (smooth_circle): 在指定平面画圆
  • 圆弧运动 (smooth_arc_center, smooth_arc_parametric): 精确圆弧路径
  • 样条曲线 (smooth_spline): 通过多个路点的平滑曲线
  • 螺旋运动 (smooth_helix): 螺旋式运动路径
  • 混合运动 (smooth_blend): 多段运动平滑衔接

3. 视觉引导操作

  • 物体检测: 使用 Gemini Vision AI 识别物体
  • 3D 定位: 深度相机获取物体空间坐标
  • 智能抓取: 自动规划抓取姿态和路径
  • 精确放置: 视觉引导的放置操作
  • 手眼标定: ChArUco 标定板标定系统

4. 夹爪控制

  • 电动夹爪: 位置、速度、力控制 (0-255)
  • 气动夹爪: 开/合控制(数字输出端口)
  • 物体检测: 夹爪状态反馈

5. 自然语言控制

  • 文本模式: 逐步文本命令控制
  • 语音模式: 按住空格键语音输入
  • 自主模式: AI 自动分解复杂任务
  • 组合功能: 多步骤操作自动执行

🚀 快速开始

安装依赖

服务器端(连接机器人的电脑)

# 核心依赖 pip3 install roboticstoolbox-python==1.0.3 pip3 install numpy==1.23.4 pip3 install scipy==1.11.4 pip3 install spatialmath # 串口和计时 pip3 install pyserial pip3 install oclock pip3 install keyboard # 视觉处理 pip3 install pyrealsense2 pip3 install opencv-python # Gemini AI pip3 install google-genai pip3 install python-dotenv # 音频处理(可选,用于语音输入) pip3 install pyaudio

客户端(任意电脑)

# 仅需要标准库,如果需要姿态矩阵功能: pip3 install numpy==1.23.4 pip3 install spatialmath

配置 API 密钥

在项目根目录创建 .env 文件:

GEMINI_API_KEY=你的_Gemini_API_密钥

获取 API 密钥: https://makersuite.google.com/app/apikey


📖 使用方法

方式一:自然语言控制(推荐)

1. 启动机器人控制服务器

cd Headless python headless_commander.py

等待提示:✓ Robot readyListening for commands on port 5001

2. 启动 Gemini AI 控制器

文本模式(推荐新手):

cd Headless/Gemini python gemini.py --mode text

自主模式(复杂任务):

python gemini.py --mode autonomous

语音输入模式:

python gemini.py --mode text --input audio

3. 发送命令示例

文本模式下的命令示例:

你: 请向前移动 50mm AI: [执行移动并确认] 你: 抓取红色的方块 AI: [检测物体 → 规划路径 → 抓取] 你: 把它放到蓝色盒子里 AI: [移动到目标 → 放置 → 松开] 

自主模式下的复杂任务:

你: 清理桌面上所有的红色物体,把它们放到绿色容器里 AI: [自动执行] 1. 扫描检测所有红色物体 2. 逐个抓取 3. 放置到容器 4. 返回检测更多物体 5. 完成并报告 

方式二:Python API 编程

创建控制脚本 my_control.py:

from Headless.robot_api import * # 1. 机器人回零 home_robot() # 2. 移动到指定关节角度(5.5秒完成) move_robot_joints([90, -45, 90, 0, 45, 180], duration=5.5) # 3. 移动到笛卡尔坐标(位置:x,y,z 姿态:Rx,Ry,Rz) move_robot_pose([250, 0, 200, 180, 0, 90], speed_percentage=50) # 4. 直线运动到目标点 move_robot_cartesian([200, -50, 180, 180, 0, 135], duration=4.0) # 5. 画圆(中心点,半径,平面,时间) smooth_circle(center=[200, 0, 200], radius=50, plane='XY', duration=5.0) # 6. 控制夹爪 control_electric_gripper(action='open') control_electric_gripper(action='move', position=200, speed=150) # 7. 查询状态 pose = get_robot_pose() print(f"当前位置: {pose}") angles = get_robot_joint_angles() print(f"当前关节角度: {angles}") # 8. 执行轨迹 trajectory = [ [200, 0, 200, 0, 0, 0], [250, 50, 200, 0, 0, 45], [200, 100, 200, 0, 0, 90] ] execute_trajectory(trajectory, timing_mode='duration', timing_value=10.0, motion_type='spline')

运行:

python my_control.py

方式三:视觉引导抓取

使用视觉工具进行智能抓取:

from Headless.Gemini.robot_vision_tools import RobotVisionTools from Headless.Vision.vision_controller import VisionController # 初始化视觉系统 vision = VisionController() vision.start() robot_vision = RobotVisionTools(vision) # 智能抓取流程 result = robot_vision.pick_object( object_description="红色的立方体", approach_style="vertical" # 垂直抓取 ) if result['success']: # 放置到指定位置 robot_vision.place_at_position( target_position=[300, 100, 50], # 目标位置 approach_height=50 # 接近高度 )

🔍 详细 API 说明

基础运动命令

1. 关节运动

move_robot_joints( joint_angles=[90, -45, 90, 0, 45, 180], # 6个关节角度(度) duration=5.0, # 运动时间(秒) # 或者使用速度控制: # speed_percentage=75, # 速度百分比 (0-100) wait_for_ack=True, # 等待完成确认 timeout=10.0 # 超时时间 )

2. 笛卡尔位置运动

move_robot_pose( pose=[250, 0, 200, 180, 0, 90], # [x, y, z, Rx, Ry, Rz] speed_percentage=50, # 速度百分比 wait_for_ack=True )

3. 直线运动(保证路径)

move_robot_cartesian( pose=[200, -50, 180, 180, 0, 135], duration=4.0 )

4. 点动控制

# 单关节点动 jog_robot_joint( joint_index=0, # 关节索引 (0-5正向, 6-11负向) speed_percentage=40, duration=2.0 # 时间 # 或者:distance_deg=15 # 角度 ) # 多关节同时点动 jog_multiple_joints( joints=[0, 3, 5], # 关节列表 speeds=[70, 40, 60], # 对应速度 duration=1.2 ) # 笛卡尔点动 jog_cartesian( frame='TRF', # 'TRF'工具坐标系 或 'WRF'世界坐标系 axis='Z+', # 'X+', 'X-', 'Y+', 'Y-', 'Z+', 'Z-' speed_percentage=50, duration=1.5 )

高级平滑运动

1. 圆形轨迹

smooth_circle( center=[200, 0, 200], # 圆心坐标 (mm) radius=50, # 半径 (mm) plane='XY', # 平面: 'XY', 'XZ', 'YZ' duration=5.0, clockwise=False # 顺时针/逆时针 )

2. 圆弧运动(中心点定义)

smooth_arc_center( end_pose=[250, 50, 200, 0, 0, 90], # 终点姿态 center=[200, 0, 200], # 圆弧中心 duration=3.0 )

3. 圆弧运动(参数定义)

smooth_arc_parametric( end_pose=[250, 50, 200, 0, 0, 90], radius=50, # 半径 (mm) arc_angle=90, # 圆弧角度 (度) duration=3.0 )

4. 样条曲线

waypoints = [ [200, 0, 100, 0, 0, 0], [250, 50, 150, 0, 15, 45], [200, 100, 200, 0, 30, 90] ] smooth_spline(waypoints, duration=8.0)

5. 螺旋运动

smooth_helix( center=[200, 0, 150], # 螺旋中心 radius=30, # 半径 pitch=20, # 螺距(每圈高度) height=100, # 总高度 duration=10.0 )

6. 混合运动(多段衔接)

segments = [ {'type': 'LINE', 'end': [250, 0, 200, 0, 0, 0], 'duration': 2.0}, {'type': 'CIRCLE', 'center': [250, 0, 200], 'radius': 50, 'plane': 'XY', 'duration': 4.0}, {'type': 'LINE', 'end': [200, 0, 200, 0, 0, 0], 'duration': 2.0} ] smooth_blend(segments, blend_time=0.5, duration=10.0)

夹爪控制

电动夹爪

# 校准夹爪 control_electric_gripper(action='calibrate') # 移动到指定位置 control_electric_gripper( action='move', position=200, # 位置 (0-255) speed=150, # 速度 (0-255) current=500 # 最大电流 (100-1000 mA) ) # 查询夹爪状态 status = get_electric_gripper_status(verbose=True) # 返回: [ID, Position, Speed, Current, StatusByte, ObjectDetected]

气动夹爪

# 打开夹爪 control_pneumatic_gripper(action='open', port=1) # 关闭夹爪 control_pneumatic_gripper(action='close', port=1)

查询命令

# 获取当前位置姿态 pose = get_robot_pose() # 返回 [x, y, z, Rx, Ry, Rz] # 获取当前关节角度 angles = get_robot_joint_angles() # 返回 6个角度值 # 获取关节速度 speeds = get_robot_joint_speeds() # 步/秒 # 获取 IO 状态 io_status = get_robot_io(verbose=True) # 返回: [IN1, IN2, OUT1, OUT2, ESTOP] # 检查是否停止 is_stopped = is_robot_stopped(threshold_speed=2.0) # 检查急停状态 estop = is_estop_pressed() # 获取完整状态 status = get_robot_status() # 包含: pose, angles, speeds, IO, gripper, stopped, estop

辅助功能

# 延时 delay_robot(2.5) # 延时 2.5 秒 # 停止运动 stop_robot_movement() # 立即停止并清空命令队列 # 回零 home_robot() # 等待停止 wait_for_robot_stopped(timeout=10.0, poll_rate=0.1) # 带重试的安全移动 safe_move_with_retry( move_robot_joints, [90, -45, 90, 0, 45, 180], duration=5.0, max_retries=3, retry_delay=1.0 )

🎓 实际应用示例

示例 1: 简单的抓放任务

from Headless.robot_api import * # 1. 初始化 home_robot() # 2. 移动到观察位置 move_robot_joints([0, -90, 180, 0, -45, 180], duration=3.0) # 3. 打开夹爪 control_electric_gripper(action='open') # 4. 移动到抓取位置 move_robot_cartesian([200, 0, 100, 180, 0, 0], duration=2.0) # 5. 关闭夹爪抓取 control_electric_gripper(action='move', position=200, speed=100, current=500) delay_robot(1.0) # 6. 抬起 move_robot_cartesian([200, 0, 200, 180, 0, 0], duration=2.0) # 7. 移动到放置位置 move_robot_cartesian([300, 100, 200, 180, 0, 0], duration=3.0) # 8. 下降 move_robot_cartesian([300, 100, 110, 180, 0, 0], duration=2.0) # 9. 松开 control_electric_gripper(action='open') # 10. 返回安全位置 home_robot()

示例 2: 使用视觉引导抓取

from Headless.Gemini.robot_vision_tools import RobotVisionTools from Headless.Vision.vision_controller import VisionController # 初始化 vision = VisionController() vision.start() robot_vision = RobotVisionTools(vision) # 执行抓取序列 objects_to_pick = ["红色方块", "蓝色圆柱", "绿色三角形"] for obj_name in objects_to_pick: # 检测并抓取 result = robot_vision.pick_object( object_description=obj_name, approach_style="vertical" ) if result['success']: print(f"成功抓取 {obj_name}") # 放置到分类区域 robot_vision.place_at_position( target_position=[300, 150, 50], approach_height=50 ) print(f"{obj_name} 已放置") else: print(f"抓取 {obj_name} 失败: {result['message']}") vision.stop()

示例 3: 绘制图案

from Headless.robot_api import * # 绘制正方形 def draw_square(center, size, height, duration): half_size = size / 2 corners = [ [center[0] + half_size, center[1] + half_size, height, 0, 0, 0], [center[0] - half_size, center[1] + half_size, height, 0, 0, 0], [center[0] - half_size, center[1] - half_size, height, 0, 0, 0], [center[0] + half_size, center[1] - half_size, height, 0, 0, 0], [center[0] + half_size, center[1] + half_size, height, 0, 0, 0] ] execute_trajectory(corners, timing_mode='duration', timing_value=duration, motion_type='linear') # 绘制圆形 def draw_circle(center, radius, height, duration): smooth_circle(center=[center[0], center[1], height], radius=radius, plane='XY', duration=duration) # 执行 home_robot() draw_square(center=[200, 0], size=80, height=150, duration=8.0) delay_robot(1.0) draw_circle(center=[200, 0], radius=40, height=150, duration=5.0)

示例 4: 组装任务

from Headless.robot_api import * def pick_and_stack(objects_positions, stack_position, stack_height_increment=30): """  从多个位置拾取物体并堆叠  """ current_stack_height = 50 # 初始高度 for i, obj_pos in enumerate(objects_positions): print(f"拾取物体 {i+1}/{len(objects_positions)}") # 打开夹爪 control_electric_gripper(action='open') # 移动到物体上方 approach_pos = obj_pos.copy() approach_pos[2] += 100 move_robot_cartesian(approach_pos, duration=2.0) # 下降抓取 move_robot_cartesian(obj_pos, duration=1.5) control_electric_gripper(action='move', position=200, speed=80) delay_robot(1.0) # 抬起 move_robot_cartesian(approach_pos, duration=1.5) # 移动到堆叠位置上方 stack_approach = stack_position.copy() stack_approach[2] = current_stack_height + 100 move_robot_cartesian(stack_approach, duration=3.0) # 下降放置 place_pos = stack_position.copy() place_pos[2] = current_stack_height move_robot_cartesian(place_pos, duration=1.5) # 松开 control_electric_gripper(action='open') delay_robot(0.5) # 抬起 move_robot_cartesian(stack_approach, duration=1.5) # 更新堆叠高度 current_stack_height += stack_height_increment print("堆叠完成!") # 使用示例 objects = [ [200, 100, 50, 180, 0, 0], [200, -100, 50, 180, 0, 0], [250, 0, 50, 180, 0, 0] ] stack_location = [150, 0, 50, 180, 0, 0] home_robot() pick_and_stack(objects, stack_location, stack_height_increment=25) home_robot()

🔧 手眼标定流程

视觉引导操作需要先进行手眼标定,将相机坐标系与机器人坐标系对齐。

1. 生成标定板

cd Headless/Vision python generate_charuco_board.py

打印生成的 ChArUco 标定板(A4 纸)

2. 执行标定

python calibrate_hand_eye.py

按照提示:

  1. 将标定板放在相机视野内
  2. 机器人自动移动到多个位置采集数据
  3. 自动计算手眼变换矩阵
  4. 保存标定结果到 Results/calibration/ 目录

3. 验证标定

python validate_calibration.py

检查标定精度,应该达到 ±3mm 以内

4. 优化标定(可选)

python calibration_refinement.py

通过迭代优化提高精度


⚙️ 配置说明

网络配置

如果客户端和服务器不在同一台电脑:

编辑 Headless/robot_api.py:

SERVER_IP = "192.168.1.100" # 改为服务器 IP SERVER_PORT = 5001 # 默认端口

确保防火墙允许 UDP 5001 和 5002 端口

相机配置

编辑 Headless/Vision/vision_controller.py:

CAMERA_WIDTH = 640 CAMERA_HEIGHT = 480 CAMERA_FPS = 30

运动参数调整

编辑 Headless/Gemini/robot_vision_tools.py:

APPROACH_HEIGHT = 50 # 接近高度 (mm) GRASP_HEIGHT = 100 # 抓取后抬升高度 (mm) SPEED_APPROACH = 40 # 接近速度 (%) SPEED_GRASP = 20 # 抓取速度 (%)

🛡️ 安全注意事项

硬件安全

  1. ⚠️ 急停按钮: 确保急停按钮随时可触及
  2. ⚠️ 工作空间: 保持工作区域无障碍物
  3. ⚠️ 电源: 使用稳定的电源供应
  4. ⚠️ 固定: 确保机器人底座固定牢固

软件安全

  • ✓ 系统自动检查关节限位
  • ✓ 运动前验证逆运动学解
  • ✓ 速度同步防止超速
  • ✓ 急停触发立即停止所有运动
  • ✓ 命令队列自动清空

操作规范

  1. 首次使用先在低速度测试
  2. 确认工作空间范围
  3. 观察首次运动路径
  4. 保持监控运行状态
  5. 异常情况立即按急停

🐛 故障排除

常见问题

1. 串口连接失败

现象: Serial port not found

解决:

  • Windows: 检查设备管理器中的 COM 端口号
  • Linux: 检查 /dev/ttyUSB*/dev/ttyACM*
  • 更新 com_port.txt 文件中的端口号
  • 检查串口权限: sudo usermod -a -G dialout $USER

2. UDP 通信失败

现象: 命令无响应

解决:

  • 检查服务器是否启动
  • 确认 IP 地址和端口正确
  • 检查防火墙设置
  • 测试网络连通性: ping 服务器IP

3. 运动学求解失败

现象: IK solution not found

解决:

  • 目标位置可能超出工作空间范围
  • 检查姿态角度是否合理
  • 尝试从当前位置分步移动
  • 使用 get_robot_pose() 查看可达范围

4. 相机无法启动

现象: RealSense camera not found

解决:

  • 检查 USB 连接(建议 USB 3.0)
  • 更新 RealSense 驱动
  • 运行 realsense-viewer 测试相机
  • 检查相机权限

5. Gemini API 错误

现象: API key invalid

解决:

  • 检查 .env 文件中的 API 密钥
  • 确认 API 密钥未过期
  • 检查网络连接
  • 验证 API 配额

6. 标定精度差

现象: 抓取位置偏移

解决:

  • 重新进行手眼标定
  • 增加标定采样点数量
  • 确保标定板打印比例准确
  • 使用 validate_calibration.py 验证
  • 尝试 calibration_refinement.py 优化

📊 性能指标

指标 数值
控制频率 100 Hz
定位精度 ±1 mm
重复精度 ±0.5 mm
最大负载 1.2 kg
最大速度 100%(关节相关)
工作半径 100-400 mm
响应延迟 <50 ms (局域网)
视觉帧率 30 fps
Gemini 响应 1-3 秒

🎯 使用场景

适用场景

✅ 桌面物体分拣 ✅ 视觉引导装配 ✅ 自动化测试 ✅ 教学演示 ✅ 研究实验 ✅ 原型开发

不适用场景

❌ 高速生产线(速度限制) ❌ 精密微米级加工 ❌ 重载工业应用 ❌ 长时间连续运行(建议<4小时/次)


🔗 相关资源


📄 许可证

请参考项目根目录的 LICENSE 文件


🙏 致谢

  • PAROL6 创建者及社区
  • Google Gemini AI 团队
  • Intel RealSense 团队
  • 所有贡献者和测试者

📮 联系方式

如有问题或建议:

  1. 提交 GitHub Issue
  2. 加入 PAROL6 Discord 频道
  3. 查看详细 API 文档:API-Specific-README.md

祝使用愉快!🤖

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 92.5%
  • Jupyter Notebook 7.5%