Skip to content

Commit 6e30707

Browse files
Merge pull request #28 from Digital-Production-Aachen/scannerLookaheadMode
Scanner lookahead mode
2 parents b5f5d51 + 7ae6301 commit 6e30707

1 file changed

Lines changed: 93 additions & 19 deletions

File tree

open_vector_format.proto

Lines changed: 93 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// MIT License
22
//
3-
// Copyright (c) 2023 Digital-Production-Aachen
3+
// Copyright (c) 2025 Digital-Production-Aachen
44
//
55
// Permission is hereby granted, free of charge, to any person obtaining a copy
66
// of this software and associated documentation files (the "Software"), to deal
@@ -59,6 +59,10 @@ message JobParameters {
5959
repeated double shielding_gas_directions = 2;
6060
//vector of main direction of a material feed (e.g. powder coater, powder feed, extrusion nozzle) (xy or xyz)
6161
repeated double material_feed_directions = 3;
62+
//bounds of the scan fields associated with the respective laser_index found in vector blocks data
63+
repeated AxisAlignedBox2D scan_field_bounds = 5;
64+
//map of additional proprietary parameters
65+
map<string,Part.ProcessStrategy.ProprietaryParam> additional_parameters = 4;
6266
}
6367

6468
//Parameters controlling the tool (e.g. laser beam) behaviour
@@ -85,7 +89,8 @@ message MarkingParams {
8589

8690
//marking mode switches between normal marking and skywriting modes
8791
MarkingMode marking_mode = 10;
88-
92+
CornerBlendMode blend_mode = 28;
93+
8994
//Parameters for marking without Skywriting
9095
float jump_delay_in_us = 11;
9196
float laser_off_delay_in_us = 12;
@@ -96,9 +101,17 @@ message MarkingParams {
96101
//Parameters for marking with Skywriting
97102
float time_lag_in_us = 16;
98103
float laser_on_shift_in_us = 17;
104+
//limit angle to switch from polygon delay to skywriting [degrees]
99105
float limit = 18;
100106
float n_prev_in_us = 19;
101107
float n_post_in_us = 20;
108+
//maximum allowed deviation from the setpoint mark path to optimize scanner dynamics by "cutting corners"
109+
//Only applies in CornerBlendMode.SWIFT_BLENDING_MAXIMIZE_SPEED and
110+
//Synonyms: radial tolerance
111+
float corner_tolerance = 29;
112+
//minimum mark speed to guaranty by scanner dynamics
113+
//mark speed may be reduced down between laser_speed_in_mm_per_s and minimum_mark_speed when "cutting corners"
114+
float minimum_mark_speed = 30;
102115

103116
//Parameters for marking with Wobble
104117
float wob_frequency_in_hz = 21;
@@ -119,6 +132,31 @@ message MarkingParams {
119132
SKY_1 = 1;
120133
SKY_2 = 2;
121134
SKY_3 = 3;
135+
//Controls Sky Writing jerk-limited based on a lookahead simulation of scanner dynamics.
136+
//manual skywriting params (n_prev_in_us, n_post_in_us, time_lag_in_us, laser_on_shift_in_us, limit, polygon_delay_in_us) are ignored
137+
//Synonyms: BlendMode (ScanLab), ScanPack (Novanta)
138+
SKYWRITING_LOOKAHEAD = 4;
139+
}
140+
141+
enum CornerBlendMode {
142+
//Uses the angle given by "limit" to choose between executing polygon delay or skywriting.
143+
//When skywriting is not performed, a delay of length polygon_delay_in_us is inserted.
144+
LIMIT_ANGLE_POLYGON_DELAY = 0;
145+
//Keeps the marking speed constant to the speed defined in laser_speed_in_mm_per_s.
146+
//Then optimizes the accuracy to be as close to the setpoint geometry as scanner dynamics allow.
147+
//If the corner_tolerance cannot be fulfilled, the behaviour depends on the skywriting mode.
148+
//If skywriting is DYNAMIC_LOOKAHEAD, a skywriting motion is inserted. If skywriting mode is NO_SKY, a dynamics violation is triggered.
149+
SWIFT_BLENDING_CONSTANT_SPEED = 1;
150+
//Utilizes scanner dynamics lookahead to maximize the speed of the scanning process.
151+
//Guaranties that the corner_tolerance is fulfilled.
152+
//Maximizes the scanning speed possibly beyond the limits of minimum_mark_speed and laser_speed_in_mm_per_s.
153+
//Does not insert sky writing-like motions, instead decelerates as needed on the trajectory. Ignores marking_mode.
154+
SWIFT_BLENDING_MAXIMIZE_SPEED = 2;
155+
//Utilizes scanner dynamics lookahead to maximize the accuracy of the scanning process.
156+
//Guaranties that the minimum_mark_speed is fulfilled.
157+
//If the corner_tolerance cannot be fulfilled, the behaviour depends on the skywriting mode.
158+
//If skywriting is DYNAMIC_LOOKAHEAD, a skywriting motion is inserted. If skywriting mode is NO_SKY, a dynamics violation is triggered.
159+
BEST_ACCURACY_MIN_MARK_SPEED = 3;
122160
}
123161

124162
enum WobbleMode {
@@ -228,7 +266,11 @@ message Part {
228266
//generic definition of proprietary parameters descriptor
229267
message ProprietaryParam{
230268
string param_name = 1;
231-
double param_value = 2;
269+
oneof parameter_value{
270+
double param_value = 2;
271+
string param_string = 4;
272+
bytes param_blob = 5;
273+
}
232274
string param_description = 3;
233275
}
234276

@@ -374,14 +416,16 @@ message VectorBlock {
374416
ExposurePause exposure_pause = 10;
375417
LineSequenceParaAdapt line_sequence_para_adapt = 11;
376418
HatchesParaAdapt _hatchParaAdapt = 12;
377-
CubicBezierHatches cubic_bezier_hatches = 13;
378-
QuadraticBezierHatches quadratic_bezier_hatches = 14;
379-
CubicBezierSpline cubic_bezier_spline = 15;
380-
QuadraticBezierSpline quadratic_bezier_spline = 16;
381-
CubicBezierHatches3D cubic_bezier_hatches_3d = 17;
382-
QuadraticBezierHatches3D quadratic_bezier_hatches_3d = 18;
383-
CubicBezierSpline3D cubic_bezier_spline_3d = 19;
384-
QuadraticBezierSpline3D quadratic_bezier_spline_3d = 20;
419+
CubicBezierHatches cubic_bezier_hatches = 13;
420+
QuadraticBezierHatches quadratic_bezier_hatches = 14;
421+
CubicBezierSpline cubic_bezier_spline = 15;
422+
QuadraticBezierSpline quadratic_bezier_spline = 16;
423+
CubicBezierHatches3D cubic_bezier_hatches_3d = 17;
424+
QuadraticBezierHatches3D quadratic_bezier_hatches_3d = 18;
425+
CubicBezierSpline3D cubic_bezier_spline_3d = 19;
426+
QuadraticBezierSpline3D quadratic_bezier_spline_3d = 20;
427+
428+
SynchronizationBlock sync_block = 21;
385429
}
386430

387431
//key used in Job/markingParamsMap
@@ -424,7 +468,22 @@ message VectorBlock {
424468
AxisAlignedBox2D bounds = 6;
425469
//Optional metadata defining a preferred 32bit RGBA color to render the vector data of this vector block in a viewer.
426470
//int32 is interpreted as byte[4] with byte[0] = red, byte[1] = green, byte[2] = blue, byte[3] = alpha
427-
int32 display_color = 7; }
471+
int32 display_color = 7;
472+
473+
//---these fields can be used by simulation software to write detailed exposure times into the OVF structure---
474+
475+
//internal execution time of the vector block, including block internal delays and skywriting
476+
//this time stays constant when the vector block is translated/rotated, excludes jump_to_time_in_s
477+
//the full execution time is the sum of exposure_time_in_s and jump_to_time_in_s
478+
double exposure_time_in_s = 8;
479+
//jump time from the end position of the previous vector block to the start position of this vector block
480+
//this time changes when the vector block is translated/rotated
481+
//the full execution time is the sum of exposure_time_in_s and jump_to_time_in_s
482+
double jump_to_time_in_s = 9;
483+
//time the laser power was on
484+
//can be used to calculate productive time percentage and theoretical energy input (multiply with laser_power_in_w)
485+
double laser_on_time_in_s = 10;
486+
}
428487

429488
// ProcessMetaData for LPBF
430489
message LPBFMetadata {
@@ -589,28 +648,43 @@ message VectorBlock {
589648
//Pause the exposure procedure. This can be necessary e.g. for thermal reasons,
590649
//or for syncing mulitple laser scanner units, preventing overlap or smoke interaction.
591650
message ExposurePause {
651+
//static wait time in the exposure
592652
uint64 pause_in_us = 1;
593653
}
594-
595-
//A LineSequence with additional adaption of one laser parameter along the vectors.
596-
//Each point consists of (x,y,parameterValue) for 2D.
597-
//The parameterValue is the goal value that will be reached at the end of the vector,
654+
655+
//Synchronization block for multi laser scanner unit systems.
656+
//Creates dynamic dependencies between multiple lasers exposure orders that shall be enforced by the machine controller in real time.
657+
message SynchronizationBlock {
658+
//The SynchronizationBlock references another vector block to wait on in the same workplane by index.
659+
//Exposure of the laser of SynchronizationBlock (referenced by laser_index) will pause and not continue
660+
//until the block referenced by vector_block_index_to_wait_on has been fully executed.
661+
//Caution must be taken to not create cyclic synchronization dependencies, which would cause a deadlock.
662+
int32 vector_block_index_to_wait_on = 1;
663+
}
664+
665+
//A LineSequence with additional adaption of one or more laser parameters along the vectors.
666+
//Each point consists of (x,y,parameterValue1,parameterValue2...) for 2D.
667+
//The parameter field defines which parameter values are contained inside points_with_paras.
668+
//The count of the parameter field defines how many floats define parameters (and which) after x and y.
669+
//Each parameterValue is the goal value that will be reached at the end of the vector,
598670
//scaling linear along the vector. The goal gets priority and overwrites settings of the
599-
//parameter set.
671+
//marking parameter set. All other values are still statically set as defined in the marking parameter set.
600672
message LineSequenceParaAdapt {
601673
repeated float points_with_paras = 1; // len % 3 == 0, len >= 3
602674

603-
AdaptedParameter parameter = 2;
675+
repeated AdaptedParameter parameter = 2;
604676
enum AdaptedParameter {
605677
LASER_POWER_IN_W = 0;
606678
LASER_FOCUS_SHIFT_IN_MM = 1;
607-
//for Q-Switch only
608679
LASER_PULSE_LENGTH_IN_US = 2;
609680
LASER_PULSE_REPITION_RATE_IN_HZ = 3;
681+
LASER_SPEED_IN_MM_PER_S = 4;
610682
}
611683
}
612684

613685
//A hatch divided into a line sequence with adaption parameter
686+
//this vector block type saves significant amounts of vector block meta data
687+
//compared to writing every hatch as its own LineSequenceParaAdapt block
614688
message HatchesParaAdapt {
615689
repeated LineSequenceParaAdapt hatchAsLinesequence = 1;
616690
}

0 commit comments

Comments
 (0)