{ "cells": [ { "cell_type": "markdown", "id": "749df4dc", "metadata": {}, "source": [ "# Wheat demo scene \n", "\n", "Notebook creator: Hannah Weiser & Sina Zumstein, 2022\n", "\n", "This demo scene uses a 3D model of several wheat ears, which will be scanned by mobile laser scanning (MLS). 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 cloud." ] }, { "cell_type": "code", "execution_count": 1, "id": "36c544f4", "metadata": {}, "outputs": [], "source": [ "import sys, os\n", "from pathlib import Path\n", "from IPython.display import Code\n", "\n", "current_folder = globals()['_dh'][0]\n", "helios_path = str(Path(current_folder).parent)\n", "sys.path.append(helios_path) # add helios-plusplus directory to PATH\n", "import pyhelios\n", "\n", "from pyhelios.util.xmldisplayer import display_xml, find_playback_dir" ] }, { "cell_type": "markdown", "id": "6c330acc", "metadata": {}, "source": [ "# Survey\n", "Lets's have a look at the XML files in the simulation. First, we investigate the **survey** XML file, `mls_wheat_demo.xml`:" ] }, { "cell_type": "code", "execution_count": 2, "id": "185f9b23", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
<document>\n",
" <survey name="mls_arbaro_wheat" scene="data/scenes/demo/arbaro_wheat_field.xml#arbaro_wheat" platform="data/platforms.xml#tractor" scanner="data/scanners_tls.xml#riegl_vz400">\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-10" y="-10" z="0" onGround="true" movePerSec_m="3" />\n",
"\t\t\t<scannerSettings active="true" pulseFreq_hz="100000" scanAngle_deg="20" scanFreq_hz="50" headRotatePerSec_deg="0.00" headRotateStart_deg="0.00" headRotateStop_deg="0.00" trajectoryTimeInterval_s="0.05" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="10" y="-10" z="0" onGround="true" movePerSec_m="3" />\n",
"\t\t\t<scannerSettings active="true" pulseFreq_hz="100000" scanAngle_deg="20" scanFreq_hz="50" headRotatePerSec_deg="0.00" headRotateStart_deg="0.00" headRotateStop_deg="0.00" trajectoryTimeInterval_s="0.05" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="10" y="10" z="0" onGround="true" movePerSec_m="3" />\n",
"\t\t\t<scannerSettings active="true" pulseFreq_hz="100000" scanAngle_deg="20" scanFreq_hz="50" headRotatePerSec_deg="0.00" headRotateStart_deg="0.00" headRotateStop_deg="0.00" trajectoryTimeInterval_s="0.05" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-10" y="10" z="0" onGround="true" movePerSec_m="3" />\n",
"\t\t\t<scannerSettings active="true" pulseFreq_hz="100000" scanAngle_deg="20" scanFreq_hz="50" headRotatePerSec_deg="0.00" headRotateStart_deg="0.00" headRotateStop_deg="0.00" trajectoryTimeInterval_s="0.05" />\n",
"\t\t</leg>\n",
"\t\t\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-10" y="-10" z="0" onGround="true" movePerSec_m="3" />\n",
"\t\t\t<scannerSettings active="false" pulseFreq_hz="100000" scanAngle_deg="20" scanFreq_hz="50" headRotatePerSec_deg="0.00" headRotateStart_deg="0.00" headRotateStop_deg="0.00" trajectoryTimeInterval_s="0.05" />\n",
"\t\t</leg>\n",
" </survey>\n",
"</document>\n",
"
<platform id="tractor" name="Tractor" type="groundvehicle" drag="0.005">\n",
"\t\t<scannerMount x="0" y="1" z="4" rotations="local">\n",
"\t\t\t<rot axis="z" angle_deg="90" />\n",
"\t\t\t<rot axis="y" angle_deg="-30" />\n",
"\t\t</scannerMount>\n",
"\t\t<!--<positionXNoise\n",
"\t\t\tclipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"\n",
"\t\t\ttype="NORMAL" mean="0.0" stdev="0.02"/>\n",
"\t\t<positionYNoise\n",
"\t\t\tclipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"\n",
"\t\t\ttype="NORMAL" mean="0.0" stdev="0.02"/>\n",
"\t\t<positionZNoise\n",
"\t\t\tclipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"\n",
"\t\t\ttype="NORMAL" mean="0.0" stdev="0.02"/>\n",
"\t\t<attitudeXNoise\n",
"\t\t\tclipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"\n",
"\t\t\ttype="NORMAL" mean="0.0" stdev="0.001"/>\n",
"\t\t<attitudeYNoise\n",
"\t\t\tclipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"\n",
"\t\t\ttype="NORMAL" mean="0.0" stdev="0.001"/>\n",
"\t\t<attitudeZNoise\n",
"\t\t\tclipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"\n",
"\t\t\ttype="NORMAL" mean="0.0" stdev="0.001"/>-->\n",
"\t</platform>\n",
"\n",
"\t\n",
"
<scanner id="riegl_vz400" name="RIEGL VZ-400" accuracy_m="0.005" beamDivergence_rad="0.0003" headRotatePerSecMax_deg="60" optics="rotating" pulseFreqs_Hz="100000,300000" pulseLength_ns="5" rangeMin_m="1.5" scanAngleMax_deg="120" scanAngleEffectiveMax_deg="50" scanFreqMin_Hz="3" scanFreqMax_Hz="120">\n",
"\t\t\n",
"\t\t<FWFSettings beamSampleQuality="3" />\t\n",
"\t\t<beamOrigin x="0" y="0" z="0.2">\n",
"\t\t\t<rot axis="y" angle_deg="0" />\n",
"\t\t\t<rot axis="z" angle_deg="0" />\n",
"\t\t\t<rot axis="x" angle_deg="0" />\n",
"\t\t</beamOrigin>\n",
"\t\t<headRotateAxis x="0" y="0" z="1" />\n",
"\t\t\n",
"\t</scanner>\n",
"\t\n",
"
<scene id="arbaro_wheat" name="Arbaro wheat">\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="100" />\n",
" </filter>\n",
"\t\t\t<!--<filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>-->\n",
" </part>\n",
" <part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
" <part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="1.4;2.8;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="1.4;1.4;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="1.4;0;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="1.4;-1.4;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="1.4;-2.8;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="0;2.8;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="0;1.4;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="0;0;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="0;-1.4;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="0;-2.8;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="-1.4;2.8;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="-1.4;1.4;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="-1.4;0;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="-1.4;-1.4;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />\n",
" </filter>\n",
" <filter type="rotate">\n",
" <param type="rotation" key="rotation">\n",
" <rot axis="x" angle_deg="90" />\n",
" </param>\n",
" </filter>\n",
" <filter type="translate">\n",
" <param type="vec3" key="offset" value="-1.4;-2.8;0" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="2" />\n",
" </filter>\n",
" </part>\n",
"\t\t\n",
" </scene>\n",
"