相机对位
带相机(或光学传感器)的切割机、绘图仪和激光机可以根据材料校正作业:已被拉伸的印刷刻字膜、放置时略有转动的板材、送料时跑偏的卷材。ParametriQ CAD 通过相机对位扩展实现这一点:在指定了对位扩展的机器配置文件写出作业之前,会告诉该扩展图纸的对位标记应在何处,扩展则返回相机实际找到它们的位置。然后作业按这些标记进行拟合——长作业沿长度逐帧进行——并以校正后的形式写出,无论使用何种格式。
工作原理
- 使用对位标记工具放置对位标记:放在设计的四角,或者对于长作业,沿所选内容的长度排成多行。对位 图层上的每个圆(或圆点)都是一个标记。
- 标记沿送料方向(标记分布的长边方向,除非配置文件指定 X 或 Y)分组为帧:沿送料方向彼此平齐的标记组成一行,每两个相邻的行组成一帧。四个角是一帧;沿卷材的六行是五帧。第一帧向前延伸到作业的开始,最后一帧向后延伸到作业的末尾。
- 对每一帧依次调用扩展的
register,向其提供该帧标记在图纸中的位置,它返回标记的实际位置。 - 对每帧的标记拟合一个单应变换(参见 HOMOGRAPHY)——四个标记时精确拟合,更多时取最小二乘最佳拟合——或配置文件指定的模型。找到的标记少于模型所需时,使用这些标记所允许的最灵活的模型(三个:仿射;两个:平移、旋转和缩放;一个:平移)。
- 如果某帧的标记与拟合结果的偏差超过配置文件所允许的值(其距离的均方根,以毫米为单位),作业会停止,不写出任何内容。报告会说明每帧的偏差有多大。
- 作业写出时,每个图元都被放到材料上的对应位置:其曲线在帧与帧相接处切断,每一部分按其所在帧的拟合结果移动。直线保持为直线;圆弧和圆变为拟合所产生的椭圆(或其他曲线),每种格式按其写出任何曲线的方式写出它们。钻孔移动到其中心的新位置,并保持其大小。
恰好有四个标记时,单应变换总能精确拟合,因此误差为 0,无法发现测量错误的标记。请为每帧提供更多标记(在对位标记工具中将 横向标记数 设为 3 可得到六个),以便检查拟合结果。
机器坐标
标记以及找到后返回的标记都以毫米为单位(无论图纸使用何种单位),X 和 Y 与图纸中相同,从图纸原点起算——即机器格式放置图纸的位置。请将机器原点设在图纸原点在材料上所处的位置,或者让扩展从该位置开始测量。写出对位作业时,GP-GL 和 LightBurn 会保留该原点,而不是将作业移到其左下角。
逐帧写出时("frames": "perFrame"),每帧从其自身的原点开始测量和写出:即沿送料方向的第一行标记。这适合向前送料、并为每帧重新设置原点的机器。
各格式中
| 格式 | 一次完成的作业(oneJob) |
逐帧(perFrame) |
|---|---|---|
| HP-GL | 一个文件,所有帧都使用机器坐标 | 一个文件:每帧的程序从其自身原点开始,帧之间用 PG;(HP-GL/2 Advance Full Page)向前送料 |
| GP-GL | 一个文件,从图纸原点开始 | 每帧一个文件(name-f01.gpgl……):所写出的、有文档说明的 GP-GL 命令集中没有送料命令 |
| G-code、DXF、CF2、LightBurn | 一个文件 | 每帧一个文件 |
| 后处理器 | 获得校正后的切割,与任何导出相同 | 每帧运行一次,各生成一个文件 |
图片和页面格式(PDF、SVG、激光 SVG,后者将作业放在单独的页面上)不进行对位。
送入一个作业的卷材切割机会随坐标推进而自行送料:请检查您的切割机是否能在一个作业中接受整个长度(大多数切割机对此有限制)。
声明相机对位
cameraRegistration({
name: "My camera",
description: "Reads the marks with the cutter's camera.",
model: "homography", // or "affine", "similarity", "rigid", "translation", "auto"
maxError: 0.3, // mm: a frame's marks further off than this (RMS) stop the job
services: ["http://localhost:8765/"], // the addresses httpRequest may reach
options: { exposure: { label: "Exposure", type: "number", value: 10, unit: "ms" } },
begin(job, options) { }, // before the first frame (optional)
register(job, options) { // each frame
return job.marks.map(m => [m.x + 0.4, m.y - 0.2]);
},
end(report, options) { } // after the last (optional)
});
options 的声明方式与其他扩展相同;配置文件可以设置它们。register 可以是 async 函数,也可以返回一个 promise:程序会等待它完成。
register 获得的内容
| 属性 | 含义 |
|---|---|
marks |
该帧标记在图纸中的位置:每个为 {index, x, y, diameter}(index:标记在作业中的编号)。 |
expected |
相同的位置,形式为 {x, y}。 |
frame |
{index, number, count, from, to, start, end, origin}:从 0 和从 1 起算的编号、帧的总数、沿送料方向的起止位置(null:作业自身的末端)、其第一行和最后一行标记,以及其原点。 |
frames、axis |
作业有多少帧,以及送料方向:"x" 或 "y"。 |
extent |
作业所有标记的范围:{minX, minY, maxX, maxY}。 |
units |
始终为 "mm"。 |
name、profile、machine、format |
图纸的名称,以及机器配置文件、其机器和导出格式。 |
register 返回的内容
- 一个列表,为每个标记给出一个位置,顺序相同:
[x, y]或{x, y},以毫米为单位;相机找不到的标记为null(它不参与拟合)。 - 或者
{ marks: [...] }。 - 或者
null:该帧按绘制原样保留。
抛出错误会停止作业,并显示错误消息。
连接相机
扩展无法访问文件或网络,但在测量期间(在 begin、register 和 end 中)可以向其声明的服务发送请求:
| 函数 | 含义 |
|---|---|
httpRequest(url, {method, headers, body, timeout}) |
发送请求并等待响应:{status, ok, text, json}(json:按 JSON 读取的响应,或 null)。省略 method 时为 "GET";对象或列表形式的 body 以 JSON 发送;timeout 以秒为单位(省略时为 30)。url 必须以所声明的某个 services 开头。 |
每次调用 register 都必须在扩展调用的时限(十秒)内完成:耗时更长的相机应由在后台测量、并可查询其结果的服务来驱动。
在机器配置文件中
配置文件在其文件中指定其对位(参见文件中的配置文件):
"registration": {
"extension": "Simulated camera",
"options": { "turn": 0.5 },
"model": "homography",
"maxError": 0.3,
"feed": "auto",
"frames": "oneJob",
"split": true
}
| 设置 | 含义 |
|---|---|
extension |
cameraRegistration 的名称。 |
options |
其选项(其他选项取扩展声明的值)。 |
model |
拟合方式;省略时:取扩展的设置,否则为单应变换。 |
maxError |
一帧标记允许的最大偏差(RMS,mm);省略时:取扩展的设置,否则为 0.5。 |
feed |
"auto"(标记分布的长边方向)、"x" 或 "y"。 |
frames |
"oneJob" 或 "perFrame"(参见各格式中)。 |
split |
true:图元在帧与帧相接处切断,每一部分按其所在帧校正。false:每个图元保持完整,按其中点所在的帧校正(不切断任何切割;最适合小件)。 |
此后对该配置文件使用 文件 › 使用机器配置文件发送 就会进行测量、拟合和写出;交互窗口会列出每帧找到的标记、其误差和偏差最大的标记,以及相邻帧在其相接处放置的线条相距多远。
应用自带的扩展
应用的 registration.js(要修改,请将其复制到您的 Extensions 文件夹)包含:
- Simulated camera:按已知的旋转、拉伸、梯形畸变和平移找到每个标记,带有测量噪声,并可按要求剔除一个标记:用于试用对位和测试设置。配置文件 Vinyl cutter with camera registration (HP-GL) 使用它。
- Camera service (HTTP):通过同一台计算机上的服务(
http://localhost:8765/register)连接相机的模板:它将每帧的作业以 JSON 发送,读回{ "marks": [[x, y], …] }(或{ "skip": true }),并在作业开始和结束时通知该服务。
另请参阅:对位标记工具、机器配置文件、HOMOGRAPHY、扩展、绘图 API。