样条曲线运动 (Spline)
MoveJ / MoveL / MoveC 只能走直线或标准圆弧, 但复杂曲面路径 (自由曲线焊缝、汽车外壳涂装、弯管切割) 无法用有限段直线或圆弧精确描述。样条曲线 (Spline) 是从 CAD 离散点生成平滑曲线的标准方法, 可以直接在机器人上走。
支持的样条类型
| 类型 | 缩写 | 特点 | 应用 |
|---|---|---|---|
| Bezier 三次曲线 | Bezier | 2 个控制点, 起终点精确过 | 简单自由曲线 |
| Catmull-Rom | CR | 只需点列, 自动平滑连接 | 最常用, 示教点直接用 |
| B 样条 (均匀) | B-Spline | 局部控制, 不过控制点 | 平面涂胶路径 |
| NURBS | NURBS | 支持权重, 精确过工业曲面 | 汽车外壳, 飞机蒙皮 |
| 三次自然样条 | Cubic Spline | 过所有点, 二阶连续 | 通用 |
Darra 默认推荐 Catmull-Rom: 控制直观 (就是示教点), 自动平滑, 容易调优。NURBS 用于 CAD 直接出的高精度场景。
MoveSpline 功能块
VAR
mcSpline : MC_MoveSplineAbsolute;
waypoints : ARRAY[0..10] OF ROBOT_POS;
wp_count : UINT;
END_VAR
// 准备点列 (通常从 CAD 或示教获取)
waypoints[0] := p_start;
waypoints[1] := p_mid1;
waypoints[2] := p_mid2;
// ...
wp_count := 5;
mcSpline(
Robot := Robot1,
Execute := bStart,
SplineType := SPLINE_CATMULL_ROM,
Waypoints := ADR(waypoints),
WaypointCount := wp_count,
Velocity := 50.0, // 平均切向速度
VelocityMode := VEL_TANGENT, // 切向速度恒定 / 参数 u 恒定
Tension := 0.5, // Catmull-Rom 张力 (0..1)
OriMode := ORI_PATH_FOLLOW,
ToolId := 1,
UserFrameId := 1
);
Catmull-Rom 详解
原理
给定 N 个路径点 P0, P1, ..., PN-1, 两两之间用三次多项式连接, 使得:
- 曲线通过所有路径点
- 在每个点处切线连续 (C¹ 连续)
- 切线方向由前后两点的连线方向决定:
tangent_i = (P_{i+1} - P_{i-1}) · tension
端点 P0 和 PN-1 处用镜像 (或重复首末点) 定义切线。
Tension 参数
| Tension | 效果 |
|---|---|
| 0 | 直线段 (退化) |
| 0.5 (默认) | 平滑过渡 |
| 1 | 尖锐, 过冲可能 |
Tension 0.5 = centripetal Catmull-Rom, 是业界默认。
Bezier 示例
mcBezier(
Robot := Robot1, Execute := TRUE,
SplineType := SPLINE_BEZIER_CUBIC,
P0 := p_start,
P1 := p_control1, // 起点切线控制
P2 := p_control2, // 终点切线控制
P3 := p_end,
Velocity := 50.0
);
Bezier 起终点精确过 P0 / P3, 但不过 P1 / P2 (P1/P2 只控制切线方向和长度)。
NURBS 示例 (CAD 直接导出)
VAR
nurbs : NURBS_CURVE; // 由 CAD 导入的 NURBS 定义结构
END_VAR
// nurbs 从 STEP 文件加载
LoadNurbsFromStep(FilePath := 'D:\path\car_hood.step', EdgeId := 'Weld_Edge_1', Curve := nurbs);
mcNurbs(
Robot := Robot1,
Execute := TRUE,
SplineType := SPLINE_NURBS,
NurbsCurve := ADR(nurbs),
UStart := 0.0,
UEnd := 1.0,
Velocity := 30.0
);
NURBS 曲线保留 CAD 精度 (0.01 mm), 适合大型曲面生产线。
速度插值模式
样条曲线上速度控制有两种:
VEL_TANGENT — 切向速度恒定
TCP 沿曲线方向的速度 = Velocity, 曲率大的地方时间少, 曲率小的地方时间多. 焊接 / 涂胶必须用:
- 焊道宽度 / 胶量由
送丝速度 / TCP 切向速度决定 - 切向速度恒定 → 焊道厚薄均匀
VEL_UNIFORM — 参数 u 线性变化
du/dt = const, TCP 速度在不同曲率区段不同, 直道慢, 弯道快 (曲率大时切向速度大)。一般不用, 除了某些仿形打磨。
姿态插值 (Orientation)
样条路径上的姿态变化:
| 模式 | 说明 |
|---|---|
| ORI_SPLINE_QUATERNION | 每段用 Slerp 四元数插值, 与位置样条同步 |
| ORI_FIXED | 全程姿态不变 (起点姿态) |
| ORI_PATH_FOLLOW | 姿态跟随切线方向 (工具朝前) |
| ORI_SURFACE_NORMAL | 姿态垂直于曲面 (需提供法向量) |
焊接 / 涂胶用 ORI_PATH_FOLLOW, 打磨用 ORI_SURFACE_NORMAL。
光顺过渡 (Smoothing)
MoveJ + MoveL + Spline 混用时, 段间过渡:
mcJ(TargetPosition := p_home, Velocity := 200, Zone := 20);
mcL(TargetPosition := p_spline_enter, Velocity := 50, Zone := 5); // 进入样条前
mcSpline(Waypoints := waypoints, WaypointCount := 5,
Velocity := 30, EntryBlend := TRUE); // 与前段平滑拼接
mcL(TargetPosition := p_retreat, Velocity := 50);
EntryBlend / ExitBlend 控制样条首尾与相邻段的 C¹ 连续性 — 开启时, 曲线两端的切线会自动对齐前后段的运动方向, 避免拐点跳变。
预计算 vs 实时计算
| 模式 | 说明 | 适用 |
|---|---|---|
| 预计算 (Precomputed) | 程序启动时把整条样条插值成 0.1 mm 步长的点阵, 运行时查表 | 少变化、高节拍 |
| 实时 (Real-time) | 每个 PLC 周期动态计算下一位置 | 大型曲线, 曲线可参数化修改 |
预计算内存占用 (10 m 曲线按 0.1 mm 步长): 100,000 点 × 60 byte = 6 MB, 可以接受。实时计算 CPU 开销约 5 μs / 点 @ Catmull-Rom, 轻松满足 1 ms 周期。
CAD 导入流程
从 STEP 文件提取焊缝
- 外部 CAD (Solidworks / Creo) 把焊缝导出为 STEP
- Darra IDE 打开文件浏览器 → 导入 CAD 焊缝
- 选择 STEP 文件, IDE 解析并显示所有边 (Edge)
- 用户勾选焊缝边
- 系统自动:
- 沿边按 1 mm 间隔采样
- 转换到机器人工件坐标系
- 生成路径点或 NURBS 曲线
- 保存为样条路径对象
- SCL 程序里
mcSpline(NurbsCurve := ADR(imported_curve))调用
视觉生成样条
| 场景 | 方法 |
|---|---|
| 相机拍摄的水渍 / 胶痕复现 | 边缘检测 → 离散点 → Catmull-Rom 样条 |
| 激光扫描毛坯轮廓 | 点云去噪 → 凸包或 α-shape → 样条拟合 |
| 示教 + 自动加点 | 示教稀疏点, 系统在拐角处自动加密 |
参数表
| 参数 | 类型 | 单位 | 范围 | 默认 | 说明 |
|---|---|---|---|---|---|
| SplineType | ENUM | - | BEZIER/CR/B/NURBS/CUBIC | CR | 样条类型 |
| Waypoints | ARRAY OF ROBOT_POS | - | 2..1000 | - | 路径点 |
| Tension | LREAL | - | 0..1 | 0.5 | Catmull-Rom 张力 |
| Velocity | LREAL | mm/s | 0.1..500 | 30 | 切向速度 |
| VelocityMode | ENUM | - | TANGENT/UNIFORM | TANGENT | 速度插值模式 |
| MaxLateralAcc | LREAL | mm/s² | 100..5000 | 1000 | 最大横向加速度 (曲率限速用) |
| OriMode | ENUM | - | - | SPLINE_QUAT | 姿态模式 |
| DiscretStep | LREAL | mm | 0.01..10 | 0.1 | 预计算离散步长 |
| EntryBlend | BOOL | - | - | TRUE | 起点与前段 C¹ 平滑 |
| ExitBlend | BOOL | - | - | TRUE | 终点与后段 C¹ 平滑 |
曲率限速
样条曲线某些点曲率 κ 很大, 按恒切向速度走横向加速度 a_lat = v²·κ 可能超 MaxLateralAcc 甚至超工具能力 (焊丝甩飞 / 打磨烧痕). 系统自动:
- 扫描曲线曲率 κ(u)
- 曲率大的区段限速
v_max(u) = sqrt(MaxLateralAcc / κ(u)) - 全程速度曲线前后平滑 (加减速有限), 避免速度抖动
曲率限速会让部分段速度低于 Velocity 设定, 是正常行为。
排错清单
| 现象 | 原因 | 解决 |
|---|---|---|
| 样条曲线偏离示教点 | Catmull-Rom tension 0 | 调 tension 到 0.5 |
| 样条起点 / 终点方向不对 | 端点外推错误 | 前后各重复起终点, 或启用 EntryBlend |
| 焊道厚度不均 | 用了 VEL_UNIFORM | 换 VEL_TANGENT |
| 曲线过了示教点 (Bezier) | Bezier 不过 P1/P2 是正常 | 换 CR 或 Cubic Spline |
| NURBS 加载失败 | STEP 版本不支持 | CAD 另存为 AP242 / AP214 |
| 姿态翻转 | Slerp 在 ±180° 有短路径翻转 | 手动在中间加姿态约束点 |
| 速度达不到设定 | 曲率限速起作用 | 提高 MaxLateralAcc 或降低原设速度 |
最佳实践
- 少量稀疏控制点: Catmull-Rom 用 10~20 个点就够一米曲线, 更多点反而易抖
- 非相邻点不应过近: 连续两点距离 > 10 mm (对 0.1 mm 精度)
- CAD 导入优先: 曲线精度要求 < 0.5 mm 时, 从 CAD 直出比示教准
- 起点停顿一下: 样条前加
WaitTime(200)确保伺服完全稳定再开起弧 / 开胶 - 验证再运行: 3D 视口仿真看曲线形态, 不对就调 tension 或加点
- 曲率限速与目标节拍权衡: 高节拍要求下, 减少曲线拐点数量
- 姿态约束点: 长样条上每 500 mm 加一个强制姿态点, 避免累积飘移
相关文档
- MoveL 直线运动
- MoveC 圆弧运动
- 路径编辑器
- 模型导入 — STEP 曲面导入
- PLCopen MC