Notebook creator: Hannah Weiser & Sina Zumstein, 2022
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.
import sys, os
from pathlib import Path
from IPython.display import Code
current_folder = globals()['_dh'][0]
helios_path = str(Path(current_folder).parent)
sys.path.append(helios_path) # add helios-plusplus directory to PATH
import pyhelios
from pyhelios.util.xmldisplayer import display_xml, find_playback_dir
Lets's have a look at the XML files in the simulation. First, we investigate the survey XML file, mls_wheat_demo.xml
:
os.chdir(helios_path)
Code(display_xml('data/surveys/demo/mls_wheat_demo.xml'), language='XML')
<document>
<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">
<leg>
<platformSettings x="-10" y="-10" z="0" onGround="true" movePerSec_m="3" />
<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" />
</leg>
<leg>
<platformSettings x="10" y="-10" z="0" onGround="true" movePerSec_m="3" />
<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" />
</leg>
<leg>
<platformSettings x="10" y="10" z="0" onGround="true" movePerSec_m="3" />
<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" />
</leg>
<leg>
<platformSettings x="-10" y="10" z="0" onGround="true" movePerSec_m="3" />
<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" />
</leg>
<leg>
<platformSettings x="-10" y="-10" z="0" onGround="true" movePerSec_m="3" />
<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" />
</leg>
</survey>
</document>
We can see, that there are five leg
elements, that define the waypoints of the vehicle around the to be scanned object. Here, only x
and y
values are important z
remains at 0. In total there are four lines the vehicle will drive along. The movePerSec_m
parameter indicates the speed between these waypoints. Furthermore, we see that the tractor
platform in data/platforms.xml
is referenced, so let's have a look at that next:
Code(display_xml('data/platforms.xml', 'tractor'))
<platform id="tractor" name="Tractor" type="groundvehicle" drag="0.005">
<scannerMount x="0" y="1" z="4" rotations="local">
<rot axis="z" angle_deg="90" />
<rot axis="y" angle_deg="-30" />
</scannerMount>
<!--<positionXNoise
clipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"
type="NORMAL" mean="0.0" stdev="0.02"/>
<positionYNoise
clipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"
type="NORMAL" mean="0.0" stdev="0.02"/>
<positionZNoise
clipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"
type="NORMAL" mean="0.0" stdev="0.02"/>
<attitudeXNoise
clipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"
type="NORMAL" mean="0.0" stdev="0.001"/>
<attitudeYNoise
clipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"
type="NORMAL" mean="0.0" stdev="0.001"/>
<attitudeZNoise
clipMin="0.0" clipMax="0.0" clipEnabled="false" fixedLifespan="1"
type="NORMAL" mean="0.0" stdev="0.001"/>-->
</platform>
This is a groundvehicle
type platform, a mobile platform which moves on the ground between the consecutive legs with a constant speed provided by the user. The scannerMount
parameter defines the exact position of the scanner and the angle of rotation around the Z- and Y-axis. The scanner is rotated 90° around the Z-axis and -30° around the Y-axis, so that the scene in the center can be capured the best way possible. The ground vehicle tries to mimic real vehicles. It performs "smooth turns" for wide-angle curves. For narrow-angle curves, it first turns, then backs up, then finishes the turn. This can also be seen in the plot at a later point.
Next we will have a look at the scanner that is placed on the platform. Here it is the riegl_vz400
defined in data/scanners_als.xml as shown in the survey XML.
Code(display_xml('data/scanners_tls.xml', 'riegl_vz400'))
<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">
<FWFSettings beamSampleQuality="3" />
<beamOrigin x="0" y="0" z="0.2">
<rot axis="y" angle_deg="0" />
<rot axis="z" angle_deg="0" />
<rot axis="x" angle_deg="0" />
</beamOrigin>
<headRotateAxis x="0" y="0" z="1" />
</scanner>
Here we can see the scanner-specific settings, for example beamDivergence_rad
, the accuracy
or the possible pulse frequencies (pulseFreqs_Hz
). This scanner has an rotating beam deflector (optics
).
Now we will have a look at the scene, arbaro_wheat_field.xml
in data/scenes/demo/arbaro_wheat_field.xml
:
Code(display_xml('data/scenes/demo/arbaro_wheat_field.xml', 'arbaro_wheat'))
<scene id="arbaro_wheat" name="Arbaro wheat">
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/basic/groundplane/groundplane.obj" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="100" />
</filter>
<!--<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>-->
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="1.4;2.8;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="1.4;1.4;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="1.4;0;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="1.4;-1.4;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="1.4;-2.8;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="0;2.8;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="0;1.4;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="0;0;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="0;-1.4;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="0;-2.8;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-1.4;2.8;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-1.4;1.4;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-1.4;0;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-1.4;-1.4;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
<part>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/arbaro/wheat.obj" />
</filter>
<filter type="rotate">
<param type="rotation" key="rotation">
<rot axis="x" angle_deg="90" />
</param>
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-1.4;-2.8;0" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2" />
</filter>
</part>
</scene>
Here we see two objects, which compose the scene: the groundplane.obj
and the wheat.obj
. To load it we use the objloader
filter and give the the relative path to the file in the filepath
parameter.
The same object (the wheat plant) is placed in the scene 15 times. Using the translate
filter, it is positioned in three columns and five rows to form a wheat field.
Next, we will run the simulation. In Jupyter Notebooks, we can run external commands with the !command syntax, but you can also just run it from the command line.
!"run/helios" data/surveys/demo/mls_wheat_demo.xml
HELIOS++ VERSION 1.2.0 CWD: "H:\helios4pyhelios\helios" seed: AUTO surveyPath: "data/surveys/demo/mls_wheat_demo.xml" assetsPath: "assets/" outputPath: "output/" writeWaveform: 0 calcEchowidth: 0 fullWaveNoise: 0 splitByChannel: 0 parallelization: 1 njobs: 0 chunkSize: 32 warehouseFactor: 4 platformNoiseDisabled: 0 legNoiseDisabled: 0 rebuildScene: 0 lasOutput: 0 las10: 0 fixedIncidenceAngle: 0 gpsStartTime: kdtType: 4 kdtJobs: 0 kdtGeomJobs: 0 sahLossNodes: 32 xmlDocFilename: mls_wheat_demo.xml xmlDocFilePath: data/surveys/demo xmlDocFilename: scanners_tls.xml xmlDocFilePath: data Using default value for attribute 'averagePower_w' : 4 Using default value for attribute 'beamQualityFactor' : 1 Using default value for attribute 'opticalEfficiency' : 0.99 Using default value for attribute 'receiverDiameter_m' : 0.15 Using default value for attribute 'atmosphericVisibility_km' : 23 Using default value for attribute 'wavelength_nm' : 1064 Scanner: riegl_vz400 Device[0]: riegl_vz400 Average Power: 4 W Beam Divergence: 0.3 mrad Wavelength: 1064 nm Visibility: 23 km Using default value for attribute 'maxNOR' : 0 Using default value for attribute 'rangeMax_m' : 1.79769e+308 Using default value for attribute 'binSize_ns' : 0.25 Using default value for attribute 'winSize_ns' : 1.25 Using default value for attribute 'maxFullwaveRange_ns' : 0 Number of subsampling rays (riegl_vz400): 19 xmlDocFilename: platforms.xml xmlDocFilePath: data Number of subsampling rays (riegl_vz400): 19 Using default value for attribute 'numRuns' : 1 Using default value for attribute 'simSpeed' : 1 Using default value for attribute 'stripId' : NULL_STRIP_ID Using platform default value for attribute 'stopAndTurn' : 1 Using platform default value for attribute 'smoothTurn' : 0 Using platform default value for attribute 'slowdownEnabled' : 1 Using scanner default value for attribute 'beamDivergence_rad' : 0.003 Using default value for attribute 'stripId' : NULL_STRIP_ID Using platform default value for attribute 'stopAndTurn' : 1 Using platform default value for attribute 'smoothTurn' : 0 Using platform default value for attribute 'slowdownEnabled' : 1 Using scanner default value for attribute 'beamDivergence_rad' : 0.003 Using default value for attribute 'stripId' : NULL_STRIP_ID Using platform default value for attribute 'stopAndTurn' : 1 Using platform default value for attribute 'smoothTurn' : 0 Using platform default value for attribute 'slowdownEnabled' : 1 Using scanner default value for attribute 'beamDivergence_rad' : 0.003 Using default value for attribute 'stripId' : NULL_STRIP_ID Using platform default value for attribute 'stopAndTurn' : 1 Using platform default value for attribute 'smoothTurn' : 0 Using platform default value for attribute 'slowdownEnabled' : 1 Using scanner default value for attribute 'beamDivergence_rad' : 0.003 Using default value for attribute 'stripId' : NULL_STRIP_ID Using platform default value for attribute 'stopAndTurn' : 1 Using platform default value for attribute 'smoothTurn' : 0 Using platform default value for attribute 'slowdownEnabled' : 1 Using scanner default value for attribute 'beamDivergence_rad' : 0.003 Loading Scene... xmlDocFilename: arbaro_wheat_field.xml xmlDocFilePath: data/scenes/demo Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/basic/groundplane/groundplane.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get Failed to read 'up'-axis from scene XML file. Assuming 'z' axis points upwards for scene part "data/sceneparts/arbaro/wheat.obj". Set up axis explicitly to silence this warning. C++ Exception: boost::bad_get: failed value get using boost::get 17 sceneparts loaded in 10.664s CRS bounding box (by vertices): Min: dvec3(-100.000000, -100.000000, -0.001500), Max: dvec3(100.000000, 100.000000, 1.187800) Shift: dvec3(-100.000000, -100.000000, -0.001500) # vertices to translate: 3629142 Actual bounding box (by vertices): Min: dvec3(0.000000, 0.000000, 0.000000), Max: dvec3(200.000000, 200.000000, 1.189300) Writing serial scene wrapper object to data/scenes/demo/arbaro_wheat_field.scene ... Building KD-Grove... KDTree (num. primitives 1209714) : Max. # primitives in leaf: 264 Min. # primitives in leaf: 1 Max. depth reached: 45 KDTree axis-aligned surface area: 80951.4 Interior nodes: 1110989 Leaf nodes: 855568 Total tree cost: 6.11116 KDGrove stats: Number of trees: 1 Number of static trees: 1 Number of dynamic trees: 0 Statistics (min, max, total, mean, stdev): Building time: (2.7320, 2.7320, 2.7320, 2.7320, 0.0000) Tree primitives: (1209714, 1209714, 1209714, 1209714.0000, 0.0000) Max primitives in leaf: (264, 264, 264, 264.0000, 0.0000) Min primitives in leaf: (1, 1, 1, 1.0000, 0.0000) Maximum depth: (45, 45, 45, 45.0000, 0.0000) Axis-aligned surface area: (80951.4400, 80951.4400, 80951.4400, 80951.4400, 0.0000) Number of interior nodes: (1110989, 1110989, 1110989, 1110989.0000, 0.0000) Number of leaf nodes: (855568, 855568, 855568, 855568.0000, 0.0000) Tree cost: (6.1112, 6.1112, 6.1112, 6.1112, 0.0000) KDG built in 2.74s Scene loaded in 26.015s Reading Spectral Library... Using default value for attribute 'seed' : AUTO Output directory: "output/\mls_arbaro_wheat\2023-02-27_09-30-03\" Simulation: Scanner changed! Starting leg 0 Pulse frequency set to 100000 Scan angle set to 20 Applying settings for PolygonMirrorBeamDeflector... Vertical angle min/max -nan(ind)/-nan(ind) -- verticalAngleMin not set, using the value of -20 degrees -- verticalAngleMax not set, using the value of 20 degrees Leg0 waypoints: Origin: (90, 90, 0.0015) Target: (110, 90, 0.0015) Next: (110, 110, 0.0015) Iterative mode was used for manual leg initialization because default one failed for MovingPlatform Running simulation... Clearing point cloud: "output/\mls_arbaro_wheat\2023-02-27_09-30-03\leg000_points.xyz" Survey 0.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 1.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 0.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 2.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 0.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 3.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 1.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 4.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 1.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 5.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 1.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 6.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 1.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 7.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 2.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 8.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 2.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 9.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 2.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 10.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 2.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 11.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 3.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 12.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 3.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 13.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 3.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 14.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 3.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 15.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 4.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 16.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 4.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 17.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 4.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 18.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 4.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 19.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 5.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 20.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 5.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 21.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 5.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 22.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 5.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 23.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 6.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 24.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 6.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 25.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 6.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 26.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 6.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 27.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 7.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 28.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 7.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 29.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 7.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 30.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 7.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 31.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 8.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 32.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 8.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 33.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 8.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 34.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 8.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 35.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 9.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 36.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 9.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 37.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 9.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 38.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 9.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 39.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 10.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 40.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 10.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 41.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 10.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 42.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 10.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 43.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 11.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 44.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 11.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 45.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 11.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 46.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 11.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 47.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 12.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 48.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 12.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 49.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 12.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 50.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 12.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 51.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 13.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 52.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 13.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 53.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 13.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 54.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 13.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 55.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 14.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 56.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 14.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 57.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 14.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 58.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 14.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 59.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 15.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 60.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 15.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 61.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 15.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 62.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 15.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 63.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 16.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 64.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 16.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 65.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 16.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 66.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 16.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 67.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 17.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 68.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 17.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 69.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 17.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 70.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 17.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 71.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 18.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 72.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 18.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 73.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 18.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 74.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 18.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 75.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 19.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 76.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 19.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 77.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 19.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 78.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 19.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 79.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 20.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 80.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 20.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 81.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 20.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 82.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 20.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 83.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 21.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 84.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 21.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 85.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 21.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 86.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 21.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 87.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 22.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 88.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 22.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 89.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 22.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 90.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 22.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 91.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 23.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 92.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 23.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 93.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 23.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 94.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 23.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 95.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 24.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 96.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 24.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 97.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 24.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 98.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 24.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg1/4 99.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Waypoint reached! Starting leg 1 Pulse frequency set to 100000 Scan angle set to 20 Applying settings for PolygonMirrorBeamDeflector... Vertical angle min/max -nan(ind)/-nan(ind) -- verticalAngleMin not set, using the value of -20 degrees -- verticalAngleMax not set, using the value of 20 degrees Leg1 waypoints: Origin: (110, 90, 0.0015) Target: (110, 110, 0.0015) Next: (90, 110, 0.0015) Clearing point cloud: "output/\mls_arbaro_wheat\2023-02-27_09-30-03\leg001_points.xyz" Turn mode 1 Survey 25.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 1.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 25.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 2.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Turn mode 2 Survey 25.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 3.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 26.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 4.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 26.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 5.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 26.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 6.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 26.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 7.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 27.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 8.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 27.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 9.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 27.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 10.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 27.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 11.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 28.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 12.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 28.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 13.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 28.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 14.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 28.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 15.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 29.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 16.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 29.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 17.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 29.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 18.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 29.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 19.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 30.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 20.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 30.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 21.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 30.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 22.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 30.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 23.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 31.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 24.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 31.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 25.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 31.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 26.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 31.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 27.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 32.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 28.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 32.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 29.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 32.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 30.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 32.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 31.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 33.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 32.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 33.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 33.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 33.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 34.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 33.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 35.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 34.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 36.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 34.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 37.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 34.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 38.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 34.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 39.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 35.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 40.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 35.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 41.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 35.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 42.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 35.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 43.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 36.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 44.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 36.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 45.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 36.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 46.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 36.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 47.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 37.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 48.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 37.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 49.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 37.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 50.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 37.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 51.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 38.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 52.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 38.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 53.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 38.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 54.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 38.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 55.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 39.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 56.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 39.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 57.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 39.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 58.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 39.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 59.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 40.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 60.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 40.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 61.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 40.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 62.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 40.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 63.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 41.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 64.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 41.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 65.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 41.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 66.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 41.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 67.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 42.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 68.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 42.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 69.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 42.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 70.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 42.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 71.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 43.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 72.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 43.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 73.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 43.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 74.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 43.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 75.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 44.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 76.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 44.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 77.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 44.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 78.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 44.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 79.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 45.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 80.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 45.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 81.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 45.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 82.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 45.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 83.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 46.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 84.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 46.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 85.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 46.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 86.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 46.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 87.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 47.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 88.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 47.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 89.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 47.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 90.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 47.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 91.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 48.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 92.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 48.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 93.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 48.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 94.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 48.75% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 95.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 49.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 96.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 49.25% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 97.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 49.50% Elapsed 00 00:00:00 Remaining 00 00:00:01 Leg2/4 98.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 49.75% Elapsed 00 00:00:00 Remaining 00 00:00:00 Leg2/4 99.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Waypoint reached! Starting leg 2 Pulse frequency set to 100000 Scan angle set to 20 Applying settings for PolygonMirrorBeamDeflector... Vertical angle min/max -nan(ind)/-nan(ind) -- verticalAngleMin not set, using the value of -20 degrees -- verticalAngleMax not set, using the value of 20 degrees Leg2 waypoints: Origin: (110, 110, 0.0015) Target: (90, 110, 0.0015) Next: (90, 90, 0.0015) Clearing point cloud: "output/\mls_arbaro_wheat\2023-02-27_09-30-03\leg002_points.xyz" Turn mode 1 Survey 50.25% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 1.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 50.50% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 2.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Turn mode 2 Survey 50.75% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 3.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 51.00% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 4.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 51.25% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 5.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 51.50% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 6.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 51.75% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 7.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 52.00% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 8.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 52.25% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 9.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 52.50% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 10.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 52.75% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 11.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 53.00% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 12.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 53.25% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 13.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 53.50% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 14.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 53.75% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 15.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 54.00% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 16.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 54.25% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 17.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 54.50% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 18.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 54.75% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 19.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 55.00% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 20.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 55.25% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 21.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 55.50% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 22.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 55.75% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 23.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 56.00% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 24.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 56.25% Elapsed 00 00:00:01 Remaining 00 00:00:01 Leg3/4 25.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 56.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 26.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 56.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 27.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 57.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 28.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 57.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 29.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 57.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 30.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 57.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 31.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 58.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 32.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 58.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 33.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 58.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 34.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 58.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 35.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 59.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 36.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 59.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 37.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 59.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 38.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 59.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 39.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 60.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 40.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 60.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 41.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 60.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 42.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 60.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 43.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 61.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 44.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 61.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 45.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 61.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 46.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 61.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 47.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 62.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 48.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 62.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 49.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 62.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 50.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 62.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 51.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 63.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 52.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 63.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 53.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 63.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 54.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 63.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 55.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 64.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 56.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 64.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 57.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 64.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 58.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 64.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 59.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 65.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 60.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 65.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 61.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 65.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 62.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 65.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 63.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 66.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 64.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 66.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 65.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 66.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 66.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 66.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 67.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 67.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 68.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 67.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 69.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 67.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 70.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 67.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 71.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 68.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 72.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 68.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 73.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 68.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 74.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 68.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 75.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 69.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 76.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 69.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 77.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 69.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 78.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 69.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 79.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 70.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 80.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 70.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 81.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 70.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 82.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 70.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 83.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 71.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 84.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 71.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 85.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 71.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 86.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 71.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 87.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 72.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 88.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 72.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 89.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 72.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 90.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 72.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 91.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 73.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 92.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 73.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 93.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 73.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 94.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 73.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 95.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 74.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 96.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 74.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 97.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 74.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 98.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 74.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg3/4 99.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Waypoint reached! Starting leg 3 Pulse frequency set to 100000 Scan angle set to 20 Applying settings for PolygonMirrorBeamDeflector... Vertical angle min/max -nan(ind)/-nan(ind) -- verticalAngleMin not set, using the value of -20 degrees -- verticalAngleMax not set, using the value of 20 degrees Leg3 waypoints: Origin: (90, 110, 0.0015) Target: (90, 90, 0.0015) Next: (90, 90, 0.0015) Clearing point cloud: "output/\mls_arbaro_wheat\2023-02-27_09-30-03\leg003_points.xyz" Turn mode 1 Survey 75.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 1.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 75.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 2.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Turn mode 2 Survey 75.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 3.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 76.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 4.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 76.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 5.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 76.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 6.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 76.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 7.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 77.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 8.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 77.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 9.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 77.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 10.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 77.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 11.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 78.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 12.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 78.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 13.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 78.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 14.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 78.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 15.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 79.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 16.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 79.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 17.00% Elapsed 00 00:00:00 Remaining 00 00:00:01 Survey 79.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 18.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 79.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 19.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 80.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 20.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 80.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 21.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 80.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 22.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 80.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 23.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 81.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 24.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 81.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 25.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 81.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 26.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 81.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 27.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 82.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 28.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 82.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 29.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 82.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 30.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 82.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 31.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 83.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 32.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 83.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 33.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 83.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 34.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 83.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 35.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 84.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 36.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 84.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 37.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 84.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 38.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 84.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 39.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 85.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 40.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 85.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 41.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 85.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 42.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 85.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 43.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 86.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 44.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 86.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 45.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 86.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 46.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 86.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 47.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 87.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 48.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 87.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 49.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 87.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 50.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 87.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 51.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 88.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 52.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 88.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 53.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 88.50% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 54.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 88.75% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 55.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 89.00% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 56.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 89.25% Elapsed 00 00:00:01 Remaining 00 00:00:00 Leg4/4 57.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 89.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 58.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 89.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 59.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 90.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 60.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 90.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 61.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 90.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 62.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 90.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 63.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 91.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 64.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 91.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 65.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 91.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 66.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 91.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 67.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 92.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 68.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 92.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 69.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 92.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 70.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 92.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 71.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 93.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 72.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 93.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 73.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 93.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 74.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 93.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 75.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 94.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 76.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 94.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 77.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 94.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 78.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 94.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 79.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 95.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 80.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 95.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 81.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 95.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 82.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 95.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 83.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 96.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 84.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 96.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 85.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 96.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 86.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 96.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 87.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 97.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 88.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 97.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 89.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 97.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 90.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 97.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 91.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 98.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 92.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 98.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 93.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 98.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 94.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 98.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 95.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 99.00% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 96.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 99.25% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 97.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 99.50% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 98.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Survey 99.75% Elapsed 00 00:00:02 Remaining 00 00:00:00 Leg4/4 99.00% Elapsed 00 00:00:00 Remaining 00 00:00:00 Waypoint reached! Starting leg 4 Pulse frequency set to 100000 Scan angle set to 20 Applying settings for PolygonMirrorBeamDeflector... Vertical angle min/max -nan(ind)/-nan(ind) -- verticalAngleMin not set, using the value of -20 degrees -- verticalAngleMax not set, using the value of 20 degrees Waypoint reached! Elapsed simulation steps = 3404028 Elapsed virtual time = 34.0403 sec. Main thread simulation loop finished in 2.20997 sec. Waiting for completion of pulse computation tasks... Pulse computation tasks finished in 2.21026 sec. Total simulation time: 0:00:2
Now we can display a 3D plot
#%matplotlib widget
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
output_path = find_playback_dir('data/surveys/demo/mls_wheat_demo.xml')
print('Loading points from', output_path)
strip_1 = np.loadtxt(Path(output_path) / 'leg000_points.xyz')
strip_2 = np.loadtxt(Path(output_path) / 'leg001_points.xyz')
strip_3 = np.loadtxt(Path(output_path) / 'leg002_points.xyz')
strip_4 = np.loadtxt(Path(output_path) / 'leg003_points.xyz')
traj_1 = np.loadtxt(Path(output_path) / 'leg000_trajectory.txt')
traj_2 = np.loadtxt(Path(output_path) / 'leg001_trajectory.txt')
traj_3 = np.loadtxt(Path(output_path) / 'leg002_trajectory.txt')
traj_4 = np.loadtxt(Path(output_path) / 'leg003_trajectory.txt')
traj = np.vstack((traj_1[:, :3], traj_2[:, :3], traj_3[:, :3], traj_4[:, :3]))
Loading points from H:\helios4pyhelios\helios\output\mls_arbaro_wheat\2023-02-27_09-30-03
def set_axes_equal(ax):
'''Make axes of 3D plot have equal scale so that spheres appear as spheres,
cubes as cubes, etc.. This is one possible solution to Matplotlib's
ax.set_aspect('equal') and ax.axis('equal') not working for 3D.
Input
ax: a matplotlib axis, e.g., as output from plt.gca().
'''
x_limits = ax.get_xlim3d()
y_limits = ax.get_ylim3d()
z_limits = ax.get_zlim3d()
x_range = abs(x_limits[1] - x_limits[0])
x_middle = np.mean(x_limits)
y_range = abs(y_limits[1] - y_limits[0])
y_middle = np.mean(y_limits)
z_range = abs(z_limits[1] - z_limits[0])
z_middle = np.mean(z_limits)
# The plot bounding box is a sphere in the sense of the infinity
# norm, hence I call half the max range the plot radius.
plot_radius = 0.5*max([x_range, y_range, z_range])
ax.set_xlim3d([x_middle - plot_radius, x_middle + plot_radius])
ax.set_ylim3d([y_middle - plot_radius, y_middle + plot_radius])
ax.set_zlim3d([z_middle - plot_radius, z_middle + plot_radius])
def extract_by_bb(arr, b_box):
assert len(b_box) == 6
x_min, y_min, z_min, x_max, y_max, z_max = b_box
subset = arr[(arr[:, 0] > x_min) &
(arr[:, 0] < x_max) &
(arr[:, 1] > y_min) &
(arr[:, 1] < y_max) &
(arr[:, 2] > z_min) &
(arr[:, 2] < z_max)]
return subset
# Matplotlib figure.
fig = plt.figure(figsize=(12,8))
# Axes3d axis onto mpl figure.
ax = fig.add_subplot(projection='3d')
# create scene subset
bbox = [-5, -5, 0, 5, 5, 1.5]
strip_1_sub = extract_by_bb(strip_1, bbox)
strip_2_sub = extract_by_bb(strip_2, bbox)
strip_3_sub = extract_by_bb(strip_3, bbox)
strip_4_sub = extract_by_bb(strip_4, bbox)
# Scatter plot of points (coloured by height).
sc = ax.scatter(strip_1_sub[:, 0], strip_1_sub[:, 1], strip_1_sub[:, 2], c=strip_1_sub[:, 2], cmap="RdYlBu_r", s=0.02, label='scene')
sc = ax.scatter(strip_2_sub[:, 0], strip_2_sub[:, 1], strip_2_sub[:, 2], c=strip_2_sub[:, 2], cmap="RdYlBu_r", s=0.02, label='scene')
sc = ax.scatter(strip_3_sub[:, 0], strip_3_sub[:, 1], strip_3_sub[:, 2], c=strip_3_sub[:, 2], cmap="RdYlBu_r", s=0.02, label='scene')
sc = ax.scatter(strip_4_sub[:, 0], strip_4_sub[:, 1], strip_4_sub[:, 2], c=strip_4_sub[:, 2], cmap="RdYlBu_r", s=0.02, label='scene')
# Plot of trajectory.
ax.plot(traj[:,0], traj[:,1], traj[:,2], c = 'black', label = 'scanner trajectory')
cax = plt.axes([0.85, 0.2, 0.025, 0.55])
cbar = plt.colorbar(sc, cax=cax)
cbar.set_label("Height ($Z$)")
# Add axis labels.
ax.set_xlabel('$X$')
ax.set_ylabel('$Y$')
ax.set_zlabel('$Z$')
set_axes_equal(ax)
# Set title.
ax.set_title(label='Point cloud and trajectory of scanner',fontsize=15)
# Set subtitle.
# Display results
plt.show()