temp commit
[SARndbox.git] / README-original
bloba64052abb7526788b7ce18752a74155fc9fcac71
1 ========================================================================
2 README for Augmented Reality Sandbox (SARndbox) version 2.6
3 Copyright (c) 2012-2018 Oliver Kreylos
4 ========================================================================
6 Overview
7 ========
9 The Augmented Reality Sandbox is an augmented reality application
10 scanning a sand surface using a Kinect 3D camera, and projecting a real-
11 time updated topography map with topographic contour lines, hillshading,
12 and an optional real-time water flow simulation back onto the sand
13 surface using a calibrated projector.
15 Requirements
16 ============
18 The Augmented Reality Sandbox requires Vrui version 4.6 build 005 or
19 newer, and the Kinect 3D Video Capture Project version 3.7 or newer.
21 Installation Guide
22 ==================
24 It is recommended to download or move the source packages for Vrui, the
25 Kinect 3D Video Capture Project, and the Augmented Reality Sandbox into
26 a src directory underneath the user's home directory. Otherwise,
27 references to ~/src in the following instructions need to be changed.
29 0. Install Vrui from ~/src/Vrui-<version>-<build> (see Vrui README file).
31 0.5 Install the Kinect 3D Video Capture Project from
32     ~/src/Kinect-<version> (see the Kinect 3D Video Capture Project
33     README file).
35 1. Change into ~/src directory and unpack the Augmented Reality Sandbox
36    tarball:
37    > cd ~/src
38    > tar xfz <download path>/SARndbox-<version>.tar.gz
39    - or -
40    > tar xf <download path>/SARndbox-<version>.tar
42 2. Change into the Augmented Reality Sandbox's base directory:
43    > cd SARndbox-<version>
45 3. If the Vrui version installed in step 0 was not 4.6, or Vrui's
46    installation directory was changed from the default of /usr/local,
47    adapt the makefile using a text editor. Change the value of
48    VRUI_MAKEDIR close to the beginning of the file as follows:
49    VRUI_MAKEDIR := <Vrui install dir>/share/make
50    Where <Vrui install dir> is the installation directory chosen in
51    step 0. Use $(HOME) to refer to the user's home directory instead
52    of ~.
54 4. Build the Augmented Reality Sandbox:
55    > make
57 5. Install the Augmented Reality Sandbox in the selected target
58    location. To install:
59    > sudo make install
60    This will copy all executables into <INSTALLDIR>/bin, all
61    configuration files into <INSTALLDIR>/etc/SARndbox-<version>, all
62    resource files into <INSTALLDIR>/share/SARndbox-<version>, and all
63    shader source codes into
64    <INSTALLDIR>/share/SARndbox-<version>/Shaders.
66 Use
67 ===
69 The Augmented Reality Sandbox package contains the sandbox application
70 itself, SARndbox, and a calibration utility to interactively measure a
71 transformation between the Kinect camera scanning the sandbox surface,
72 and the projector projecting onto it. The setup procedure described
73 below also uses several utilities from the Kinect 3D video capture
74 project.
76 Setup and Calibration
77 ---------------------
79 Before the Augmented Reality Sandbox can be used, the hardware (physical
80 sandbox, Kinect camera, and projector) has to be set up properly, and
81 the various components have to be calibrated internally and with respect
82 to each other. While the sandbox can be run in "trial mode" with very
83 little required setup, for the full effect the following steps have to
84 be performed in order:
86 1. (Optional) Calculate per-pixel depth correction coefficients for the
87    Kinect camera.
89 2. (Optional) Internally calibrate the Kinect camera. We strongly
90    recommend skipping this step on initial installation, and only
91    performing it if there are intolerable offsets between the real sand
92    surface in the AR Sandbox and the projected topographic image.
94 3. Mount the Kinect camera above the sandbox so that it is looking
95    straight down, and can see the entire sand surface. Use
96    RawKinectViewer from the Kinect 3D video capture project to line up
97    the depth camera while ignoring the color camera.
99 4. Measure the base plane equation of the sand surface relative to the
100    Kinect camera's internal coordinate system using RawKinectViewer's
101    plane extraction tool. (See "Using Vrui Applications" in the Vrui
102    HTML documentation on how to use RawKinectViewer, and particularly on
103    how to create / destroy tools.)
105 5. Measure the extents of the sand surface relative to the Kinect
106    camera's internal coordinate system using KinectViewer and a 3D
107    measurement tool.
109 6. Mount the projector above the sand surface so that it projects its
110    image perpendicularly onto the flattened sand surface, and so that
111    the projector's field-of-projection and the Kinect camera's field-of-
112    view overlap as much as possible. Focus the projector to the
113    flattened average-height sand surface.
115 7. Calculate a calibration matrix from the Kinect camera's camera space
116    to projector space using the CalibrateProjector utility and a
117    circular calibration target (a CD with a fitting white paper disk
118    glued to one surface).
120 8. Test the setup by running the Augmented Reality Sandbox application.
122 Step 1: Per-pixel depth correction
123 ----------------------------------
125 Kinect cameras have non-linear distortions in their depth measurements
126 due to uncorrected lens distortions in the depth camera. The Kinect 3D
127 video capture project has a calibration tool to gather per-pixel
128 correction factors to "straighten out" the depth image.
130 To calculate depth correction coefficients, start the RawKinectViewer
131 utility and create a "Calibrate Depth Lens" tool. (See "Using Vrui
132 Applications" in the Vrui HTML documentation on how to create tools.)
133 Then find a completely flat surface, and point the Kinect camera
134 perpendicularly at that surface from a variety of distances. Ensure that
135 the depth camera only sees the flat surface and no other objects, and
136 that there are no holes in the depth images.
138 Then capture one depth correction tie point for each distance between
139 the Kinect camera and the flat surface:
141 1. Line up the Kinect camera.
143 2. Capture an average depth frame by selecting the "Average Frames" main
144    menu item, and wait until a static depth frame is displayed.
146 3. Create a tie point by pressing the first button bound to the
147    "Calibrate Depth Lens" tool.
149 4. De-select the "Average Frames" main menu item, and repeat from step 1
150    until the surface has been captured from sufficiently many distances.
152 After all tie points have been collected:
154 5. Press the second button bound to the "Calibrate Depth Lens" tool to
155    calculate the per-pixel depth correction factors based on the
156    collected tie points. This will write a depth correction file to the
157    Kinect 3D video capture project's configuration directory, and print
158    a status message to the terminal.
160 Step 2: Internally calibrate the Kinect camera
161 ----------------------------------------------
163 Individual Kinect cameras have slightly different internal layouts and
164 slightly different optical properties, meaning that their internal
165 calibrations, i.e., the projection matrices defining how to project
166 depth images back out into 3D space, and how to project color images
167 onto those reprojected depth images, differ individually as well. While
168 all Kinects are factory-calibrated and contain the necessary calibration
169 data in their firmware, the format of those data is proprietary and
170 cannot be read by the Kinect 3D video capture project software, meaning
171 that each Kinect camera has to be calibrated internally before it can be
172 used. In practice, the differences are small, and a Kinect camera can be
173 used without internal calibration by assigning default calibration
174 values, but it is strongly recommended to perform calibration on each
175 device individually.
177 The internal calibration procedure requires a semi-transparent
178 calibration target; precisely, a checkerboard with alternating clear and
179 opaque tiles. Such a target can be constructed by gluing a large sheet
180 of paper to a clear glass plate, drawing or ideally printing a
181 checkerboard onto it, and cutting out all "odd" tiles using large rulers
182 and a sharp knife. It is important that the tiles are lined up precisely
183 and have precise sizes, and that the clear tiles are completely clean
184 without any dust, specks, or fingerprints. Calibration targets can have
185 a range of sizes and numbers of tiles, but we found the ideal target to
186 contain 7x5 tiles of 3.5"x3.5" each.
188 Given an appropriate calibration target, the calibration process is
189 performed using RawKinectViewer and its "Draw Grids" tool. The procedure
190 is to show the calibration target to the Kinect camera from a variety of
191 angles and distances, and to capture a calibration tie point for each
192 viewpoint by fitting a grid to the target's images in the depth and
193 color streams interactively.
195 The detailed procedure is:
197 1. Aim Kinect camera at calibration target from a certain position and
198    angle. It is important to include several views where the calibration
199    target is seen at an angle.
201 2. Capture an average depth frame by selecting the "Average Frames" main
202    menu item, and wait until a static depth frame is displayed.
204 3. Drag the virtual grids displayed in the depth and color frames using
205    the "Draw Grid" tool's first button until the virtual grids exactly
206    match the calibration target. Matching the target in the depth frame
207    is relatively tricky due to the inherent fuzziness of the Kinect's
208    depth camera. Doing this properly will probably take some practice.
209    The important idea is to get a "best fit" between the calibration
210    target and the grid. For the particular purpose of the Augmented
211    Reality Sandbox, the color frame grids can be completely ignored
212    because only the depth camera is used; however, since calibration
213    files are shared between all uses of the Kinect 3D video capture
214    project, it is best to perform a full, depth and color, calibration.
216 4. Press the "Draw Grid" tool's second button to store the just-created
217    calibration tie point.
219 5. Deselect the "Average Frames" main menu entry, and repeat from step 1
220    until a sufficient number of calibration tie points have been
221    captured. The set of all tie points already selected can be displayed
222    by pressing the "Draw Grid" tool's third button.
224 After all tie points have been collected:
226 6. Press the "Draw Grid" tool's fourth button to calculate the Kinect
227    camera's internal calibration parameters. These will be written to an
228    intrinsic parameter file in the Kinect 3D video capture project's
229    configuration directory.
231 This calibration step is illustrated in the following tutorial video:
232 http://www.youtube.com/watch?v=Qo05LVxdlfo
234 Step 3: Mount the Kinect camera above the sandbox
235 -------------------------------------------------
237 In theory, the Kinect camera can be aimed at the sand surface from any
238 position and/or angle, but for best results, we recommend to position
239 the camera such that it looks straight down onto the surface, and such
240 that the depth camera's field-of-view exactly matches the extents of the
241 sandbox. RawKinectViewer can be used to get real-time visual feedback
242 while aligning the Kinect camera.
244 Step 4: Measure the base plane equation of the sand surface
245 -----------------------------------------------------------
247 Because the Kinect camera can be aimed at the sand surface arbitrarily,
248 the Augmented Reality Sandbox needs to know the equation of the "base
249 plane" corresponding to the average flattened sand surface, and the "up
250 direction" defining elevation above or below that base plane.
252 The base plane can be measured using RawKinectViewer and the "Extract
253 Planes" tool. Flatten and average the sand surface such that it is
254 exactly horizontal, or place a flat board above the sand surface. Then
255 capture an average depth frame by selecting the "Average Frames" main
256 menu entry, and wait until the depth image stabilizes. Now use the
257 "Extract Planes" tool to draw a rectangle in the depth frame that *only*
258 contains the flattened sand surface. After releasing the "Extract
259 Planes" tool's button, the tool will calculate the equation of the plane
260 best fitting the selected depth pixels, and print two versions of that
261 plane equation to the terminal: the equation in depth image space, and
262 the equation in camera space. Of these, only the second is important.
263 The tool prints the camera-space plane equation in the form
265 x * (normal_x, normal_y, normal_z) = offset
267 This equation has to be entered into the sandbox layout file, which is
268 by default called BoxLayout.txt and contained in the Augmented Reality
269 Sandbox's configuration directory. The format of this file is simple:
270 the first line contains the sandbox's base plane equation in the form
272 (normal_x, normal_y, normal_z), offset
274 The plane equation printed by the "Extract Planes" tool only needs to be
275 modified slightly when pasting it into the sandbox layout file: the "x
276 *" part has to be removed, and the equal sign has to be replaced by a
277 comma. The other four lines in the sandbox layout file are filled in in
278 the next calibration step.
280 The base plane equation defines the zero elevation level of the sand
281 surface. Since standard color maps equate zero elevation with sea level,
282 and due to practical reasons, the base plane is often measured above the
283 flattened average sand surface, it might be desirable to lower the zero
284 elevation level. This can be done easily be editing the sandbox layout
285 file. The zero elevation level can be shifted upwards by increasing the
286 offset value (the fourth component) of the plane equation, and can be
287 shifted downwards by decreasing the offset value. The offset value is
288 measured in cm; therefore, adding 10 to the original offset value will
289 move sea level 10 cm upwards.
291 This calibration step is illustrated in the following tutorial video:
292 http://www.youtube.com/watch?v=9Lt4J_BErs0
294 Step 5: Measure the extents of the sand surface
295 -----------------------------------------------
297 The Augmented Reality Sandbox needs to know the lateral extents of the
298 visible sand surface with respect to the base plane. These are defined
299 by measuring the 3D positions of the four corners of the flattened
300 average sand surface using RawKinectViewer and a 3D measurement tool,
301 and then entering those positions into the sandbox layout file.
303 Start RawKinectViewer, and create a 3D measurement tool by assigning a
304 "Measure 3D Positions" tool to some button. Then measure the 3D
305 positions of the four corners of the flattened sand surface in the order
306 lower left, lower right, upper left, upper right; in other words, form a
307 mirrored Z starting in the lower left.
309 To measure a 3D position, press and release the button to which the
310 measurement tool was bound inside the depth frame. This will query the
311 current depth value at the selected position, project it into 3D camera
312 space, and print the resulting 3D position to the console. Simply paste
313 the four corner positions, in the order mentioned above, into the
314 sandbox layout file.
316 Step 6: Mount the projector above the sandbox
317 ---------------------------------------------
319 Just like with the Kinect camera, the Augmented Reality Sandbox is
320 capable of dealing with arbitrary projector alignments. As long as there
321 is some overlap between the Kinect camera's field-of-view and the
322 projector's projection area, the two can be calibrated with respect to
323 each other. However, for several reasons, it is best to align the
324 projector carefully such that it projects perpendicularly to the
325 flattened average sand surface. The main reason is pixel distortion: if
326 the projection is wildly off-axis, the size of projected pixels will
327 change sometimes drastically along the sand surface. While the Augmented
328 Reality Sandbox can account for overall geometric distortion, it cannot
329 change the size of displayed pixels, and the projected image looks best
330 if all pixels are approximately square and the same size.
332 Some projectors, especially short-throw projectors, have off-axis
333 projections, meaning that the image is not centered on a line coming
334 straight out of the projection lens. In such cases, perpendicular
335 projection does not imply that the projector is laterally centered above
336 the sandbox; in fact, it will have to be mounted off to one side. The
337 criterion to judge perpendicular projection is that the projected image
338 appears as a rectangle, not a trapezoid.
340 We strongly recommend against using any built-in keystone correction a
341 particular projector model might provide. The Augmented Reality Sandbox
342 corrects for keystoning internally, and projector-based keystone
343 correction works on an already pixelated image, meaning that it severely
344 degrages image quality. Never use keystone correction. Align the
345 projector as perpendicularly as possible, and let the Augmented Reality
346 Sandbox handle the rest.
348 The second reason to aim for perpendicular projections is focus.
349 Projector images are focused in a plane perpendicular to the projection
350 direction, meaning that only a single line of the projected image will
351 be in correct focus when a non-perpendicular projection is chosen.
352 Either way, after the projector has been mounted, we recommend to focus
353 it such that the entirety of the flattened average sand surface is as
354 much in focus as possible.
356 On a tangential note, we also strongly recommend to only run projectors
357 at their native pixel resolutions. Most projector models will support a
358 wide range of input video formats to accomodate multiple uses, but using
359 any resolution besides the one corresponding to the projector's image
360 generator is a very bad idea because the projector will have to rescale
361 the input pixel grid to its native pixel grid, which causes severe
362 degradation in image quality. Some projectors "lie" about their
363 capabilities to seem more advanced, resulting in a suboptimal resolution
364 when using plug&play or automatic setups. It is always a good idea to
365 check the projector's specification for its native resolution, and
366 ensure that the graphics card uses that resolution when the projector is
367 connected.
369 Step 7: Calculate the projector calibration matrix
370 --------------------------------------------------
372 The most important step to create a true augmented reality display is to
373 calibrate the Kinect camera capturing the sand surface and the projector
374 projecting onto it with respect to each other, so that the projected
375 colors and topographic contour lines appear exactly in the right place.
376 Without this calibration, the Augmented Reality Sandbox is just a
377 sandbox with some projection.
379 This calibration step is performed using the CalibrateProjector utility,
380 and a custom calibration target. This target has to be a flat circular
381 disk whose exact center point is marked in some fashion. We recommend to
382 use an old CD, glue a white paper disk of the proper size to one side,
383 and draw two orthogonal lines through the CD's center point onto the
384 paper disk. It is important that the two lines intersect in the exact
385 center of the disk.
387 The calibration procedure is to place the disk target into the Kinect
388 camera's field-of-view in a sequence of prescribed positions, guided by
389 the projector. When CalibrateProjector is started, it will first capture
390 a background image of the current sand surface; it is important that the
391 surface is not disturbed during or after this capture step, and that no
392 other objects are between the Kinect camera and the sand surface.
393 Afterwards, CalibrateProjector will collect a sequence of 3D tie points.
394 For each tie point, it will display two intersecting lines. The user has
395 to position the disk target such that the projected lines exactly
396 intersect in the disk's center point, and such that the disk surface is
397 parallel to the flattened average sand surface, i.e., the base plane
398 that was collected in a previous calibration step. It is important to
399 place the disk at a variety of elevations above and ideally below the
400 base surface to collect a full 3D calibration matrix. If all tie points
401 are in the same plane, the calibration procedure will fail.
403 The exact procedure is as follows:
405 1. Start CalibrateProjector and wait for it to collect a background
406    frame. Background capture is active while the screen is red. It is
407    essential to run CalibrateProjector in full-screen mode on the
408    projector, or the resulting calibration will be defective. See the
409    Vrui user's manual on how to force Vrui applications to run at the
410    proper position and size. Alternatively, switch CalibrateProjector
411    into full-screen mode manually by pressing the F11 function key.
412    
413    When started, CalibrateProjector must be told the exact pixel size of
414    the projector's image using the -s <width> <height> command line
415    option. Using a wrong pixel size will result in a defective
416    calibration. The recommended BenQ short-throw projector has 1024x768
417    pixels, which is also the default in the software. In other words,
418    when using an XGA-resolution projector, the -s option is not
419    required.
421 2. Create a "Capture" tool and bind it to two keys (here "1" and "2").
422    Press and hold "1" and move the mouse to highlight the "Capture" item
423    in the tool selection menu that pops up. Then release "1" to select
424    the highlighted item. This will open a dialog box prompting to press
425    a second key; press and release "2". This will close the dialog box.
426    Do not press "1" again when the dialog box is still open; that will
427    cancel the tool creation process.
428    This process binds functions to two keys: "1" will capture a tie
429    point, and "2" will re-capture the background sand surface. "2"
430    should only be pressed if the sand surface changes during the
431    calibration procedure, for example if a hole is dug to capture a
432    lower tie point. After any change to the sand surface, remove the
433    calibration object and any other objects, press "2", and wait for the
434    screen to turn black again.
436 3. Place the disk target at some random elevation above or below the
437    flattened average sand surface such that the intersection of the
438    projected white lines exactly coincides with the target's center
439    point.
441 4. Remove your hands from the disk target and confirm that the target
442    is seen by the Kinect camera. CalibrateProjector will display all
443    non-background objects as yellow blobs, and the object it identified
444    as the calibration target as a green blob. Because there is no
445    calibration yet, the green blob corresponding to the disk target will
446    not be aligned with the target; simply ensure that there is a green
447    blob, that it is circular and stable, and that it matches the actual
448    calibration target (put your hand next to it, and see if the yellow
449    blob matching your hand appears next to the green blob).
451 5. Press the "Capture" tool's first button ("1"), and wait until the tie
452    point is captured. Do not move the calibration target or hold any
453    objects above the sand surface while a tie point is captured.
455 6. CalibrateProjector will move on to the next tie point position, and
456    display a new set of white lines. Repeat from step 3 until all tie
457    points have been captured. Once the full set has been collected,
458    CalibrateProjector will calculate the resulting calibration matrix,
459    print some status information, and write the matrix to a file inside
460    the Augmented Reality Sandbox's configuration directory. The user can
461    continue to capture more tie points to improve calibration as
462    desired; the calibration file will be updated after every additional
463    tie point. Simply close the application window when satisfied.
464          Additionally, after the first round of tie points has been collected,
465    CalibrateProjector will track the calibration target in real-time and
466    indicate its position with red crosshairs. To check calibration
467    quality, place the target anywhere in or above the sandbox, remove
468    your hands, and ensure that the red crosshairs intersect in the
469    target's center.
471 This calibration step is illustrated in the following tutorial video:
472 http://www.youtube.com/watch?v=V_-Qn7oEsn4
473 This older video:
474 http://www.youtube.com/watch?v=vXkA9gUoSAc
475 shows the previous calibration procedure, and does no longer apply.
477 Step 8: Run the Augmented Reality Sandbox
478 -----------------------------------------
480 At this point, calibration is complete. It is now possible to run the
481 main Augmented Reality Sandbox application from inside the source code
482 directory (or the -- optionally chosen -- installation directory):
484 > ./bin/SARndbox -uhm -fpv
486 The -fpv ("fix projector view") option tells the AR Sandbox to use the
487 projector calibration matrix created in step 7. The -uhm ("Use Height
488 Map") option tells the AR Sandbox to color-map the 3D surface by
489 elevation, using the default height color map.
491 It is very important to run the application in full-screen mode on the
492 projector, or at least with the exact same window position and size as
493 CalibrateProjector in step 7. If this is not done correctly, the
494 calibration will not work as desired. To manually switch SARndbox into
495 full-screen mode after start-up, press the F11 function key.
497 To check the calibration, observe how the projected colors and
498 topographic contour lines exactly match the physical features of the
499 sand surface. If there are discrepancies between the two, repeat
500 calibration step 7 until satisfied. On a typical 40"x30" sandbox, where
501 the Kinect is mounted approximately 38" above the sandbox's center
502 point, and using a perpendicularly projecting 1024x768 projector,
503 alignment between the real sand surface and the projected features
504 should be on the order of 1 mm.
506 SARndbox provides a plethora of configuration files and command line
507 options to fine-tune the operation of the Augmented Reality Sandbox as
508 desired. Run SARndbox -h to see the full list of options and their
509 default values, or refer to external documentation on the project's web
510 site.
512 Note on water simulation
513 ------------------------
515 Without the real-time water simulation, the Augmented Reality Sandbox
516 has very reasonable hardware requirements. Any current PC with any
517 current graphics card should be able to run it smoothly. The water
518 simulation, on the other hand, places extreme load even on high-end
519 current hardware. We therefore recommend to turn off the water
520 simulation, using the -ws 0.0 0 command line option to SARndbox, or
521 reducing its resolution using the -wts <width> <height> command line
522 option with small sizes, e.g., -wts 200 150, for initial testing or
523 unless the PC running the Augmented Reality Sandbox has a top-of-the
524 line CPU, a high-end gaming graphics card, e.g., an Nvidia GeForce 970,
525 and the vendor-supplied proprietary drivers for that graphics card.