{ "cells": [ { "cell_type": "markdown", "id": "b1d28a55", "metadata": {}, "source": [ "# Light Multi-Channel ALS Demo with Toyblocks Scene\n", "Notebook: Hannah Weiser & Sina Zumstein, 2023\n", "\n", "This demo scene showcases various toyblock models scanned by airborne laserscanning. 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": "db7cd2fc", "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": "88d70ab5", "metadata": {}, "outputs": [], "source": [ "import os\n", "os.chdir(\"..\")" ] }, { "cell_type": "markdown", "id": "06b6b9df", "metadata": {}, "source": [ "## Survey\n", "Let us look at the XML files in the simulation. First, we investigate the survey XML file, `light_als_toyblocks_multiscanner.xml`:" ] }, { "cell_type": "code", "execution_count": 3, "id": "798c249d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
<document>\n",
"\t<platformSettings id="platform1" movePerSec_m="30" z="100.0" />\n",
" <scannerSettings active="true" id="scanner1" pulseFreq_hz="10000" scanAngle_deg="20.0" scanFreq_hz="100" trajectoryTimeInterval_s="0.01" />\n",
" <survey name="light_toyblocks_als" platform="data/platforms.xml#sr22" scanner="data/scanners_als.xml#livox-mid-100" scene="data/scenes/toyblocks/light_toyblocks_scene.xml#light_toyblocks_scene">\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-30.0" y="-50.0" template="platform1" />\n",
"\t\t\t<scannerSettings template="scanner1" />\n",
"\t\t</leg>\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="70.0" y="-50.0" template="platform1" />\n",
"\t\t\t<scannerSettings template="scanner1" active="false" />\n",
"\t\t</leg>\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="70.0" y="0.0" template="platform1" />\n",
"\t\t\t<scannerSettings template="scanner1" />\n",
"\t\t</leg>\n",
"\t\t<leg>\n",
"\t\t\t<platformSettings x="-30.0" y="0.0" template="platform1" />\n",
"\t\t\t<scannerSettings template="scanner1" active="false" />\n",
"\t\t</leg>\n",
"\t</survey>\n",
"</document>\n",
"
<scanner id="livox-mid-100" accuracy_m="0.02" beamDivergence_rad="0.0027" name="livox-mid-100" optics="risley" pulseFreqs_Hz="50000" pulseLength_ns="4" rangeMin_m="2" scanAngleMax_deg="35" scanAngleEffectiveMax_deg="35" rotorFreq1_Hz="7294" rotorFreq2_Hz="-4664" wavelength_nm="905">\n",
"\t\t<channels>\n",
"\t\t\t<channel id="0">\n",
"\t\t\t\t<FWFSettings beamSampleQuality="3" />\t\n",
"\t\t\t\t<beamOrigin x="0" y="0" z="0">\n",
"\t\t\t\t\t<rot axis="z" angle_deg="-30" /> <!-- cone center looking left 30 deg -->\n",
"\t\t\t\t</beamOrigin>\n",
"\t\t\t\t<!-- scan plane is defined by the central ray -->\n",
"\t\t\t</channel>\n",
"\t\t\t<channel id="1">\n",
"\t\t\t\t<FWFSettings beamSampleQuality="3" />\n",
"\t\t\t\t<beamOrigin x="0" y="0" z="0">\n",
"\t\t\t\t\t<!-- central cone -->\n",
"\t\t\t\t</beamOrigin>\n",
"\t\t\t</channel>\n",
"\t\t\t<channel id="2">\n",
"\t\t\t\t<FWFSettings beamSampleQuality="3" />\n",
"\t\t\t\t<beamOrigin x="0" y="0" z="0">\n",
"\t\t\t\t\t<rot axis="z" angle_deg="30" /> <!-- cone center looking right 30 deg -->\n",
"\t\t\t\t</beamOrigin>\n",
"\t\t\t</channel>\n",
"\t\t</channels>\n",
"\t\t<FWFSettings beamSampleQuality="3" />\n",
"\t</scanner>\n",
"\n",
"\t\n",
"
<scene id="light_toyblocks_scene" name="LightToyblocksScene">\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="70" />\n",
" </filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="vec3" key="offset" value="20.0;0;0" />\n",
"\t\t\t</filter>\n",
" </part>\n",
" <part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/toyblocks/cube.obj" />\n",
" </filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="1" />\n",
" </filter>\n",
" </part>\n",
"\t\t<part>\n",
" <filter type="objloader">\n",
" <param type="string" key="filepath" value="data/sceneparts/toyblocks/cube.obj" />\n",
" </filter>\n",
"\t\t\t<filter type="rotate">\n",
"\t\t\t\t<param key="rotation" type="rotation">\n",
"\t\t\t\t\t<rot angle_deg="45" axis="z" />\n",
"\t\t\t\t</param>\n",
"\t\t\t</filter>\n",
"\t\t\t<filter type="scale">\n",
" <param type="double" key="scale" value="0.5" />\n",
" </filter>\n",
"\t\t\t<filter type="translate">\n",
"\t\t\t\t<param type="integer" key="onGround" value="-1" />\n",
"\t\t\t\t<param type="vec3" key="offset" value="-45.0;10.0;10" />\n",
"\t\t\t</filter>\n",
" </part>\n",
" </scene>\n",
"