-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathevaluation.html
More file actions
162 lines (144 loc) · 6.7 KB
/
evaluation.html
File metadata and controls
162 lines (144 loc) · 6.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Evaluation | Print-While-Drive</title>
<meta name="description" content="Project page for Print-While-Drive for robotic large-scale additive manufacturing." />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Source+Serif+4:wght@600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<header class="site-header">
<div class="container nav">
<a class="brand" href="index.html">match · Print-While-Drive</a>
<nav>
<a href="index.html#video">Video</a>
<a href="index.html#chapters">Chapters</a>
<a href="index.html#gallery">Gallery</a>
<a href="paper.pdf">Paper</a>
<a href="https://github.com/match-ROS/match_additive_manufacturing" target="_blank" rel="noopener noreferrer">Code</a>
</nav>
</div>
</header>
<main>
<section class="chapter-hero container">
<a class="back-link" href="index.html">← Back to landing page</a>
<div class="subnav"><a href="printing-process.html">Printing Process</a><a href="trajectory-planning.html">Trajectory Planning</a><a href="trajectory-retiming.html">Trajectory Retiming</a><a href="robot-control.html">Robot Control</a><a href="evaluation.html" class="active">Evaluation</a></div>
<div class="chapter-layout" style="margin-top:18px;">
<div>
<div class="eyebrow">Chapter overview</div>
<h1>Evaluation</h1>
<p class="chapter-lead">
The evaluation assesses the proposed framework at three levels: trajectory tracking of the coupled robot system, closed-loop compensation of process disturbances during printing, and geometric agreement between the planned and the as-built component. Together, these experiments quantify both the control performance and the manufacturing quality of the full print-while-drive system.
</p>
<ul class="chapter-list">
<li>
The robot control system is first evaluated independently of active height correction in order to assess TCP velocity tracking and path-following accuracy under continuous mobile operation.
</li>
<li>
The Layer Height Controller is then tested under a controlled disturbance, where an integrated HT pipe introduces a local height error that must be compensated online through feed-rate adaptation.
</li>
<li>
Finally, the as-built geometry is reconstructed from the recorded line-laser profiles and compared with the target model to assess global part accuracy and systematic process deviations.
</li>
<li>
Beyond validating the control concept, the evaluation also shows that the same laser data used for online control can be reused to generate a digital twin of the fabricated component.
</li>
</ul>
</div>
<div class="asset-box">
<div class="viewer-box">
<div id="pointcloud-viewer"></div>
</div>
</div>
</section>
<section class="section container">
<div class="figure-grid">
<figure class="figure">
<img src="assets/evaluation/evaluation-01.png" alt="Evaluation placeholder 1">
<figcaption>Measured TCP trajectory and velocity tracking during continuous print-while-drive operation, illustrating the performance of the coupled robot control system.</figcaption>
</figure>
<figure class="figure">
<img src="assets/evaluation/evaluation-02.png" alt="Evaluation placeholder 2">
<figcaption>Height-disturbance compensation after integration of an HT pipe, showing how the Layer Height Controller gradually restores the nominal layer height.</figcaption>
</figure>
<figure class="figure">
<img src="assets/evaluation/evaluation-03.png" alt="Evaluation placeholder 3">
<figcaption>Reconstructed as-built point cloud aligned with the target geometry, highlighting the final component quality and the distribution of geometric deviations.</figcaption>
</figure>
</div>
</section>
</main>
<footer>
<div class="container row">
<div class="small">Evaluation · Print-While-Drive project page</div>
</div>
</footer>
<script type="importmap">
{
"imports": {
"three": "https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js",
"three/addons/": "https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { PLYLoader } from 'three/addons/loaders/PLYLoader.js';
const container = document.getElementById('pointcloud-viewer');
const scene = new THREE.Scene();
scene.background = new THREE.Color(0xf6f7f9);
const camera = new THREE.PerspectiveCamera(
45,
container.clientWidth / container.clientHeight,
0.001,
10000
);
camera.position.set(0, 0, 2);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(container.clientWidth, container.clientHeight);
renderer.setPixelRatio(window.devicePixelRatio);
container.appendChild(renderer.domElement);
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
scene.add(new THREE.AxesHelper(0.5));
const light = new THREE.HemisphereLight(0xffffff, 0x888888, 1.2);
scene.add(light);
const loader = new PLYLoader();
loader.load(
'assets/evaluation/pointcloud.ply',
(geometry) => {
console.log('PLY loaded:', geometry);
geometry.computeBoundingBox();
console.log('Bounding box:', geometry.boundingBox);
geometry.center();
const material = new THREE.PointsMaterial({
size: 0.01,
color: 0x1f5faa
});
const points = new THREE.Points(geometry, material);
scene.add(points);
const box = geometry.boundingBox;
const size = new THREE.Vector3();
box.getSize(size);
const maxDim = Math.max(size.x, size.y, size.z);
camera.position.set(0, 0, Math.max(1, maxDim * 2));
controls.target.set(0, 0, 0);
controls.update();
},
undefined,
(error) => console.error('PLY load error:', error)
);
function animate() {
requestAnimationFrame(animate);
controls.update();
renderer.render(scene, camera);
}
animate();
</script>
</body>
</html>