4. 机器人基础:工业机器人坐标系与运动学
在3D线扫相机视觉引导项目中,机器人是最终的执行机构。理解机器人的坐标系系统、运动学基础以及主流品牌的通信方式,是完成手眼标定与轨迹规划的前提。本节将系统梳理这些核心概念。
4.1 工业机器人坐标系系统
工业机器人通常定义四种核心坐标系,它们构成了机器人运动与外部传感器交互的参考框架。
| 坐标系名称 | 定义位置 | 典型用途 | 视觉引导中的角色 |
|---|---|---|---|
| 基座坐标系 (Base) | 机器人安装底座中心 | 机器人全局运动参考,所有关节运动最终映射至此 | 作为世界坐标系的候选,标定相机相对于基座的位置 |
| 工具坐标系 (Tool) | 机器人法兰盘末端(TCP) | 定义工具(如夹爪、焊枪、线扫相机)的位姿 | 线扫相机通常安装在法兰盘上,TCP即相机光学中心 |
| 工件坐标系 (User/Work) | 工件或工作台表面 | 简化编程,使轨迹点相对于工件定义 | 视觉系统检测到的缺陷或特征点坐标,需转换至此坐标系 |
| 关节坐标系 (Joint) | 每个关节轴 | 单轴调试、奇点规避 | 通常不直接用于视觉引导,但用于运动学逆解计算 |
实操要点: 在视觉引导项目中,工具坐标系 (Tool) 的精确标定是第一步。线扫相机作为“工具”,其TCP(Tool Center Point)必须与相机光心重合,否则会导致“看哪里打哪里”的偏差。通常使用“四点法”或“六点法”进行TCP标定。
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周期),但需要购买额外授权,且编程门槛较高。
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),防止程序卡死。