{ "cells": [ { "cell_type": "markdown", "id": "5e111b9b", "metadata": {}, "source": [ "# Demo of Detailed Voxels for Vegetation Modelling\n", "\n", "Notebook: Hannah Weiser & Sina Zumstein, 2023\n", "\n", "This demo simulation demonstrates the different `detailedVoxel` options for modelling vegetation using a single tree scene. We perform both virtual UAV-borne laser scanning (ULS) and airborne laser scanning (ALS). We will use the command-line access of HELIOS++ to run the simulation, and use Python just for displaying the input XMLs and the resulting point clouds.\n", "\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "049cfd31", "metadata": {}, "outputs": [], "source": [ "from IPython.display import Code\n", "from pyhelios.util.xmldisplayer import display_xml, find_playback_dir" ] }, { "cell_type": "code", "execution_count": 2, "id": "3a9cbd06", "metadata": {}, "outputs": [], "source": [ "import os\n", "os.chdir(\"..\")" ] }, { "cell_type": "markdown", "id": "4c5a26fd", "metadata": {}, "source": [ "## Survey\n", "Let us look at the XML files in the simulations. First, we investigate the two survey XML files for the ULS and the ALS simulation. We will start with the `uls_detailedVoxels_mode_comparison.xml`:" ] }, { "cell_type": "code", "execution_count": 3, "id": "20bcdb1b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
<document>\n",
"\t<scannerSettings id="uls_templ" active="true" pulseFreq_hz="100000" scanAngle_deg="90" scanFreq_hz="50" headRotatePerSec_deg="0.00" trajectoryTimeInterval_s="0.01" />\n",
" <survey name="uls_detailed_voxel_modes" seed="42" scene="data/scenes/voxels/detailedVoxels_mode_comparison.xml#F_BR08" platform="data/platforms.xml#copter_linearpath" scanner="data/scanners_als.xml#riegl_vux-1uav">\n",
"\t<FWFSettings beamSampleQuality="3" binSize_ns="0.25" maxFullwaveRange_ns="100" winSize_ns="1" />\n",
"\t\t<!-- platform: copter_linearpath, deflector: rotating -->\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-30" y="-30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-30" y="30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" active="false" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="0" y="30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="0" y="-30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" active="false" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="30" y="-30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="30" y="30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" active="false" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="30" y="30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-30" y="30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" active="false" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-30" y="0" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="30" y="0" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" active="false" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="30" y="-30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-30" y="-30" z="50" onGround="false" movePerSec_m="5" />\n",
"\t\t\t<scannerSettings template="uls_templ" active="false" />\n",
"\t\t</leg>\n",
"\n",
" </survey>\n",
"</document>\n",
"
<document>\n",
"\t<scannerSettings id="als_templ" active="true" pulseFreq_hz="100000" scanAngle_deg="30" scanFreq_hz="200" trajectoryTimeInterval_s="0.05" />\n",
" <survey name="als_detailed_voxel_modes" seed="42" scene="data/scenes/voxels/detailedVoxels_mode_comparison.xml#F_BR08" platform="data/platforms.xml#sr22" scanner="data/scanners_als.xml#riegl_lms-q780">\n",
"\t<FWFSettings beamSampleQuality="3" binSize_ns="0.25" maxFullwaveRange_ns="100" winSize_ns="1" />\n",
"\t\t<!-- platform: Plane, deflector: rotating -->\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-145" y="50" z="500" onGround="false" movePerSec_m="50" />\n",
"\t\t\t<scannerSettings template="als_templ" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-145" y="-50" z="500" onGround="false" movePerSec_m="50" />\n",
"\t\t\t<scannerSettings template="als_templ" active="false" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="145" y="-50" z="500" onGround="false" movePerSec_m="50" />\n",
"\t\t\t<scannerSettings template="als_templ" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="145" y="50" z="500" onGround="false" movePerSec_m="50" />\n",
"\t\t\t<scannerSettings template="als_templ" active="false" />\n",
"\t\t</leg>\n",
"\n",
" </survey>\n",
"</document>\n",
"
<scanner id="riegl_vux-1uav" accuracy_m="0.01" beamDivergence_rad="0.0005" name="RIEGL VUX-1UAV" optics="rotating" pulseFreqs_Hz="50000,100000,200000,300000,380000,550000" pulseLength_ns="4" rangeMin_m="3" scanAngleMax_deg="180" scanAngleEffectiveMax_deg="165" scanFreqMin_Hz="10" scanFreqMax_Hz="200">\n",
"\t\t\n",
"\t\t\t<beamOrigin x="0" y="0.085" z="0.06">\t\t\t\n",
"\t\t\t\t<rot axis="x" angle_deg="90" />\t\t\t\n",
"\t\t\t\t<rot axis="z" angle_deg="90" />\t\t\t\n",
"\t\t\t</beamOrigin>\n",
"\t\t<headRotateAxis x="0" y="0" z="1" />\n",
"\t</scanner>\n",
"\t\n",
"
<platform id="copter_linearpath" name="Quadrocopter UAV" type="linearpath">\n",
"\t\t<scannerMount x="0" y="0" z="0.2">\n",
"\t\t\t<rot axis="x" angle_deg="175" />\n",
"\t\t</scannerMount>\n",
"\t</platform>\n",
"\t\n",
"
<scene id="F_BR08" name="syssifoss F_BR08">\n",
" <part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/basic/groundplane/groundplane.obj" />\n",
" </filter>\n",
" <filter type="scale">\n",
" <param type="double" key="scale" value="15" />\n",
" </filter>\n",
" </part>\n",
"\t\t\n",
"\n",
"\t\t<!-- 1. from the left: OBJ-model for stem, fixed size (0.25 m) detailedVoxels for crown -->\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_stem_Poisson.obj" />\n",
" </filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-22;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
" </part>\n",
"\t\t<part>\n",
"\t\t\t<filter type="detailedvoxels">\n",
"\t\t\t\t<param type="string" key="intersectionMode" value="fixed" />\n",
"\t\t\t\t<param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_crown_250.vox" />\n",
"\t\t\t\t<param type="string" key="matfile" value="data/sceneparts/syssifoss/tree.mtl" />\n",
"\t\t\t\t<param type="string" key="matname" value="needles" />\n",
"\t\t\t</filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-22;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
"\t\t</part>\n",
"\t\t\n",
"\t\t\n",
"\t\t<!-- 2. OBJ-model for stem, fixed size (0.05 m) detailedVoxels for crown -->\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_stem_Poisson.obj" />\n",
" </filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-17;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
" </part>\n",
"\t\t<part>\n",
"\t\t\t<filter type="detailedvoxels">\n",
"\t\t\t\t<param type="string" key="intersectionMode" value="fixed" />\n",
"\t\t\t\t<param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_crown_50.vox" />\n",
"\t\t\t\t<param type="string" key="matfile" value="data/sceneparts/syssifoss/tree.mtl" />\n",
"\t\t\t\t<param type="string" key="matname" value="needles" />\n",
"\t\t\t</filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-17;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
"\t\t</part>\n",
"\t\t\n",
"\t\t\n",
"\t\t<!-- 3. OBJ-model for stem, transmittive (default) detailedVoxels for crown --> \n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_stem_Poisson.obj" />\n",
" </filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-12;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
" </part>\n",
"\t\t<part>\n",
"\t\t\t<filter type="detailedvoxels">\n",
"\t\t\t\t<param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_merged.vox" />\n",
"\t\t\t\t<param type="string" key="matfile" value="data/sceneparts/syssifoss/tree.mtl" />\n",
"\t\t\t\t<param type="string" key="matname" value="needles" />\n",
"\t\t\t</filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-12;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
"\t\t</part>\n",
"\t\t\n",
"\n",
"\t\t<!-- 4. OBJ-model for stem, scaled detailedVoxels for crown --> \n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_stem_Poisson.obj" />\n",
" </filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-2;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
" </part>\n",
"\t\t<part>\n",
"\t\t\t<filter type="detailedvoxels">\n",
"\t\t\t\t<param type="string" key="intersectionMode" value="scaled" />\n",
"\t\t\t\t<param type="double" key="intersectionArgument" value="0.5" />\n",
"\t\t\t\t<param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_merged.vox" />\n",
"\t\t\t\t<param type="string" key="matfile" value="data/sceneparts/syssifoss/tree.mtl" />\n",
"\t\t\t\t<param type="string" key="matname" value="needles" />\n",
"\t\t\t</filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-2;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
"\t\t</part>\n",
"\t\t\n",
"\t\t\n",
"\t\t<!-- 5. OBJ-model for stem, scaled and randomly shifted detailedVoxels for crown -->\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_stem_Poisson.obj" />\n",
" </filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-7;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
" </part>\n",
"\t\t<part>\n",
"\t\t\t<filter type="detailedvoxels">\n",
"\t\t\t\t<param type="string" key="intersectionMode" value="scaled" />\n",
"\t\t\t\t<param type="double" key="intersectionArgument" value="0.5" />\n",
"\t\t\t\t<param type="boolean" key="randomShift" value="true" />\n",
"\t\t\t\t<param type="string" key="filepath" value="data/sceneparts/syssifoss/F_BR08_08_merged.vox" />\n",
"\t\t\t\t<param type="string" key="matfile" value="data/sceneparts/syssifoss/tree.mtl" />\n",
"\t\t\t\t<param type="string" key="matname" value="needles" />\n",
"\t\t\t</filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="-7;+15;-241.401000" />\n",
"\t\t\t</filter>\n",
"\t\t</part>\n",
"\n",
" </scene>\n",
"