Skip to content

Change log

han16nah edited this page Dec 1, 2021 · 6 revisions

Version 1.0.0

HELIOS++version 1.0 is the major release of the Heidelberg LiDAR Operations Simulator in C++ with Python Bindings, ported from the original Java implementation. The original implementation is still available here. A guide to update existent surveys (XML files) for simulations in HELIOS++ is given at the bottom of this page. New features and improvements are listed below, detailed explanations on all functionalities can be found in the Wiki documentation. List of fixed bugs is without claim to completeness. Use of HELIOS++ is recommended for all future simulations. The Java implementation is considered deprecated. All changes in HELIOS++ versions > 1.0.0 are documented under releases.

New features

  • Simulation of errors / random noise
  • Support of voxel format as scene input with detailedVoxels for advanced vegetation simulation
  • Extensions dynamic platform functionality, especially UAV with smoothTurn and stopAndTurn options
  • pyHELIOS: HELIOS++ Python bindings

Improvements

  • Performance: HELIOS++ is around 3x faster than the previous implementation
  • New output formats: HELIOS++ can output point clouds in LAS format and compressed output (zip)
  • More control over output information:
    • Trajectory files of non-static surveys can be written
    • Full waveform output is now optional
    • Seed for random numbers can be fixed
  • Improved parametrization of the fullwave detector (binSize instead of numTimeBins and numFullwaveBin)
  • Extensive logging with different levels
  • Fully revised and extended documentation in this wiki

Bug fixes

  • Revision of airborne platforms (especially UAV)
  • Revision of peak detection in full waveform simulation
  • Revision of combinations between scanner and platform settings

Conversion between HELIOS and HELIOS ++ XML files

Survey parameters

Tag HELIOS (Java) HELIOS++ Comment
<survey> / <scannerSettings> defaultScannerSettings in <survey>-tag template in <scannerSettings> of <leg> Global settings can be defined in the beginning and can then be called by their ID in the <scannerSettings> of each leg
<FWFSettings [...]> numFullWaveBins binSize_ns and maxFullwaveRange_ns replaced, see Full Waveform Simulation
<scannerSettings> - trajectoryTimeInterval_s new
<platformSettings> (multicopter only) - stopAndTurn and smoothTurn mode, yawAtDeparture new, see dynamic platforms

Scene parameters

Tag HELIOS (Java) HELIOS++ Comment
<scene> <sunDir>, <skybox> - deprecated
<param> in objloader castShadows, receiveShadows, recomputeVertexNormals - deprecated
Rotation filter pitch, roll, yaw x, y, z naming of axes replaced, see Scene#Coordinate transformations, REQUIRED
<param> in xyzloader - estimateNormals, snapNeighborNormal, matfile, matname, RGB and Normals index specifiers new, see XYZ Point Cloud Loader
<filter [...]> - detailedVoxels new voxel geometry loader with different modes, see detailedVoxels
param of all loaders (objloader, xyzloader, detailedVoxels, geotiffloader) - efilepath new option for loading multiple geometry files with the same configurations, see Loaders
Rotation filter - rotations="global" (default) or rotations="local" new modes of rotation, see Scene#Coordinate transformations

Platform parameters

Tag HELIOS (Java) HELIOS++ Comment
<scannerMount> pitch, roll, yaw x, y, z naming of rotation axes replaced, see Platforms#Rotations, REQUIRED
<scannerMount> - rotations="global" (default) or rotations="local" new modes of rotation, see Platforms#Rotations
<platform [...]> (multicopter only) - engine_max_force, speedup_magnitude, slowdown_distance, base_pitch_deg, roll_speed_deg, pitch_speed_deg, yaw_speed_deg, roll_offset_deg, pitch_offset_deg new, see dynamic platforms
<platform> - position and attitude noise tags, e.g. <positionXNoise [...]> new, see platform noise

Scanner parameters

Tag HELIOS (Java) HELIOS++ Comment
<scanner> - <FWFSettings [...]> new, possible parameters listed at Fullwave
<beamOrigin> pitch, roll, yaw x, y, z naming of rotation axes replaced, see Platforms#Rotations, REQUIRED
<beamOrigin> - rotations="global" (default) or rotations="local" new modes of rotation, see Platforms#Rotations

Example XMLs

Survey

Java:

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <!-- Default scanner settings: -->
    <scannerSettings id="profile1" active="true" pulseFreq_hz="100000" scanAngle_deg="50.0" scanFreq_hz="120" headRotatePerSec_deg="10.0" headRotateStart_deg="0.0" headRotateStop_deg="0.0" />
    <survey defaultScannerSettings="profile1" name="Arbaro Demo" scene="data/scenes/demo/arbaro_demo.xml#arbaro_demo" platform="data/platforms.xml#tripod" scanner="data/scanners_tls.xml#riegl_vz400">
        <FWFSettings numFullwaveBins="200" />
        <leg>
            <platformSettings x="0.8566228596501162" y="25.587345982284987" z="-1.1102230246251565E-16" onGround="true" />
            <scannerSettings headRotateStart_deg="128.91550582542592" headRotateStop_deg="223.45354343073828" />
        </leg>
        <leg>
            <platformSettings x="1.8566228596501162" y="25.587345982284987" z="-1.1102230246251565E-16" onGround="true" />
            <scannerSettings headRotateStart_deg="128.91550582542592" headRotateStop_deg="223.45354343073828" />
        </leg>
    </survey>
</document>

HELIOS++:

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <!-- Default scanner settings: -->
    <scannerSettings id="profile1" active="true" pulseFreq_hz="100000" scanAngle_deg="50.0" scanFreq_hz="120" headRotatePerSec_deg="10.0" headRotateStart_deg="0.0" headRotateStop_deg="0.0" />
    <survey name="Arbaro Demo" scene="data/scenes/demo/arbaro_demo.xml#arbaro_demo" platform="data/platforms.xml#tripod" scanner="data/scanners_tls.xml#riegl_vz400">
        <FWFSettings binSize_ns="0.25"/>
        <leg>
            <platformSettings x="0.8566228596501162" y="25.587345982284987" z="-1.1102230246251565E-16" onGround="true" />
            <scannerSettings template="profile1" headRotateStart_deg="128.91550582542592" headRotateStop_deg="223.45354343073828" />
        </leg>
        <leg>
            <platformSettings x="1.8566228596501162" y="25.587345982284987" z="-1.1102230246251565E-16" onGround="true" />
            <scannerSettings template="profile1" headRotateStart_deg="128.91550582542592" headRotateStop_deg="223.45354343073828" />
        </leg>
    </survey>
</document>

Scene

Java:

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <scene id="arbaro_demo" name="Arbaro Demo">
        <sunDir x="0" y="1" z="-1" />
        <skybox azimuth_deg="275" texturesFolder="textures/sky/sky6_1024" />
        <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>
        </part>
        <part>
            <filter type="objloader">
                <param type="string" key="filepath" value="data/sceneparts/arbaro/black_tupelo_low.obj" />
                <param type="boolean" key="castShadows" value="true" />
                <param type="boolean" key="receiveShadows" value="true" />
                <param type="boolean" key="recomputeVertexNormals" value="true" />
            </filter>
            <filter type="rotate">
                <param type="rotation" key="rotation">
                    <rot axis="pitch" angle_deg="90" />
                </param>
            </filter>
            <filter type="translate">
                <param type="vec3" key="offset" value="0;15;0" />
            </filter>
            <filter type="scale">
                <param type="double" key="scale" value="0.5" />
            </filter>
        </part>
        <part>
            <filter type="objloader">
                <param type="string" key="filepath" value="data/sceneparts/arbaro/sassafras_low.obj" />
                <param type="boolean" key="castShadows" value="true" />
                <param type="boolean" key="receiveShadows" value="true" />
                <param type="boolean" key="recomputeVertexNormals" value="true" />
            </filter>
            <filter type="rotate">
                <param type="rotation" key="rotation">
                    <rot axis="pitch" angle_deg="90" />
                </param>
            </filter>
            <filter type="translate">
                <param type="vec3" key="offset" value="-10;15;0" />
            </filter>
            <filter type="scale">
                <param type="double" key="scale" value="0.5" />
            </filter>
        </part>
    </scene>
</document>

HELIOS++:

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <scene id="arbaro_demo" name="Arbaro Demo">
        <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>
        </part>
        <part>
            <filter type="objloader">
                <param type="string" key="filepath" value="data/sceneparts/arbaro/black_tupelo_low.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;15;0" />
            </filter>
            <filter type="scale">
                <param type="double" key="scale" value="0.5" />
            </filter>
        </part>
        <part>
            <filter type="objloader">
                <param type="string" key="filepath" value="data/sceneparts/arbaro/sassafras_low.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="-10;15;0" />
            </filter>
            <filter type="scale">
                <param type="double" key="scale" value="0.5" />
            </filter>
        </part>
    </scene>
</document>