4. 机器人基础:工业机器人坐标系与运动学

在3D线扫相机视觉引导项目中,机器人是最终的执行机构。理解机器人的坐标系系统、运动学基础以及主流品牌的通信方式,是完成手眼标定与轨迹规划的前提。本节将系统梳理这些核心概念。

4.1 工业机器人坐标系系统

工业机器人通常定义四种核心坐标系,它们构成了机器人运动与外部传感器交互的参考框架。

坐标系名称 定义位置 典型用途 视觉引导中的角色
基座坐标系 (Base) 机器人安装底座中心 机器人全局运动参考,所有关节运动最终映射至此 作为世界坐标系的候选,标定相机相对于基座的位置
工具坐标系 (Tool) 机器人法兰盘末端(TCP) 定义工具(如夹爪、焊枪、线扫相机)的位姿 线扫相机通常安装在法兰盘上,TCP即相机光学中心
工件坐标系 (User/Work) 工件或工作台表面 简化编程,使轨迹点相对于工件定义 视觉系统检测到的缺陷或特征点坐标,需转换至此坐标系
关节坐标系 (Joint) 每个关节轴 单轴调试、奇点规避 通常不直接用于视觉引导,但用于运动学逆解计算
实操要点: 在视觉引导项目中,工具坐标系 (Tool) 的精确标定是第一步。线扫相机作为“工具”,其TCP(Tool Center Point)必须与相机光心重合,否则会导致“看哪里打哪里”的偏差。通常使用“四点法”或“六点法”进行TCP标定。
工业机器人四大坐标系关系图 基座坐标系 (Base) 关节坐标系 (Joint) 工具坐标系 (Tool / TCP) 工件坐标系 (User / Work) 运动学正解 法兰盘变换 视觉标定 坐标系变换链 Base → Joint (正解) Base → Tool (法兰) Tool → Work (标定) 视觉引导核心: 将像素坐标 → Work坐标 → Tool坐标 → 机器人运动

4.2 运动学基础

机器人运动学描述了关节空间与笛卡尔空间之间的映射关系,是轨迹规划与视觉引导的数学基础。

  • 正运动学 (Forward Kinematics):已知各关节角度 (θ₁, θ₂, ..., θₙ),求解末端执行器(TCP)在基座坐标系下的位姿 (x, y, z, rx, ry, rz)。
    应用: 实时显示当前TCP位置,验证运动是否到位。
  • 逆运动学 (Inverse Kinematics):已知目标位姿 (x, y, z, rx, ry, rz),求解各关节角度 (θ₁, θ₂, ..., θₙ)。
    应用: 视觉系统给出目标点后,机器人控制器自动计算如何运动过去。
视觉引导中的关键点: 逆运动学通常存在多解(如肘部向上/向下),且可能遇到奇点(关节角度无法实现目标速度)。在编程时,应通过姿态约束(如固定一个关节角度范围)来避免奇异位形。

4.3 常用机器人品牌通信方式

3D线扫相机通常作为“从站”或“传感器”,通过标准工业协议与机器人控制器交换数据。以下是三大主流品牌的通信方案对比。

品牌 控制器系列 推荐通信协议 数据格式 典型延迟 配置复杂度
ABB IRC5 / OmniCore EtherNet/IP、Socket (TCP/UDP) 字符串 / 二进制 < 10 ms 中等
FANUC R-30iB / R-30iB Plus EtherNet/IP、KAREL (Socket) 字符串 / 数组 < 5 ms 中等
KUKA KR C4 / KR C5 EtherCAT、EtherNet/IP、RSI (Robot Sensor Interface) XML / 二进制 < 2 ms (EtherCAT) 较高 (RSI)
避坑指南:
  • ABB 使用Socket通信时,需注意字符串解析的鲁棒性,建议使用分隔符(如逗号、分号)并添加校验和。
  • FANUC 的KAREL语言对数组操作较灵活,但需注意寄存器数量限制(通常为200个)。
  • KUKA 的RSI(Robot Sensor Interface)可实现实时闭环控制(1ms周期),但需要购买额外授权,且编程门槛较高。
3D线扫相机与机器人通信架构 3D线扫相机 (传感器/从站) 生成点云/坐标 工业通信协议 EtherNet/IP Socket (TCP/UDP) EtherCAT / RSI (数据交换层) 机器人控制器 (主站/执行器) 解析坐标 → 运动 发送坐标 转发指令 数据流示例 相机检测到缺陷坐标 (x,y,z) → 协议封装 → 控制器接收 → 逆解 → 机器人运动

4.4 通信配置示例(Socket / TCP)

以ABB机器人与3D线扫相机通过Socket通信为例,展示数据接收与解析的典型代码结构。

! ABB RAPID Socket 接收示例
VAR socketdev client_socket;
VAR string received_string;
VAR num pos_x, pos_y, pos_z;
VAR robtarget target_pos;

! 1. 创建并连接Socket
SocketCreate client_socket;
SocketConnect client_socket, "192.168.1.100", 5000;

! 2. 循环接收数据
WHILE TRUE DO
  SocketReceive client_socket \Bin:=received_string;
  
  ! 3. 解析字符串:假设格式为 "x,y,z"
  pos_x := StrToVal(StrPart(received_string, 1, ","));
  pos_y := StrToVal(StrPart(received_string, 2, ","));
  pos_z := StrToVal(StrPart(received_string, 3, ","));
  
  ! 4. 构建目标位姿(假设姿态固定)
  target_pos.trans.x := pos_x;
  target_pos.trans.y := pos_y;
  target_pos.trans.z := pos_z;
  target_pos.rot := [1,0,0,0]; ! 四元数
  
  ! 5. 运动指令
  MoveL target_pos, v500, fine, tool0;
ENDWHILE
优化建议: 实际项目中,建议在数据包中加入帧头(如 0xAA 0xBB)和校验字节(CRC16),避免因网络抖动导致误触发。同时,在机器人侧设置超时处理(SocketReceive \Time:=5),防止程序卡死。