Adding Urban Trajectory test / application

parent e207733b
......@@ -44,3 +44,13 @@ vista_install( GRAS_scene6 )
vista_create_default_info_file( GRAS_scene6 )
set_property( TARGET GRAS_scene6 PROPERTY FOLDER "ITAGeometricalAcoustics/Tests/ITAPropagationPathSim/CombinedModel" )
add_executable( UrbanTrajectory UrbanTrajectory.cpp )
target_link_libraries( UrbanTrajectory ${VISTA_USE_PACKAGE_LIBRARIES} )
vista_configure_app( UrbanTrajectory )
vista_install( UrbanTrajectory )
vista_create_default_info_file( UrbanTrajectory )
set_property( TARGET UrbanTrajectory PROPERTY FOLDER "ITAGeometricalAcoustics/Tests/ITAPropagationPathSim/CombinedModel" )
B໿SketchUp Model೿{18.0.16975}ន❔硪䴋벅띬璽ÿ磹岚￿ 噃牥楳湯慍ー￾䌉䄀爀挀䌀甀爀瘀攀̀＀￾䌊䄀琀琀爀椀戀甀琀攀＀￾䌓䄀琀琀爀椀戀甀琀攀䌀漀渀琀愀椀渀攀爀＀￾䌏䄀琀琀爀椀戀甀琀攀一愀洀攀搀Ā＀￾䌐䈀愀挀欀最爀漀甀渀搀䤀洀愀最攀਀＀￾䌇䌀愀洀攀爀愀Ԁ＀￾䌊䌀漀洀瀀漀渀攀渀琀଀＀￾䌒䌀漀洀瀀漀渀攀渀琀䈀攀栀愀瘀椀漀爀Ԁ＀￾䌔䌀漀洀瀀漀渀攀渀琀䐀攀昀椀渀椀琀椀漀渀଀＀￾䌒䌀漀洀瀀漀渀攀渀琀䤀渀猀琀愀渀挀攀؀＀￾䌕䌀漀渀猀琀爀甀挀琀椀漀渀䜀攀漀洀攀琀爀礀＀￾䌑䌀漀渀猀琀爀甀挀琀椀漀渀䰀椀渀攀Ā＀￾䌒䌀漀渀猀琀爀甀挀琀椀漀渀倀漀椀渀琀＀￾䌆䌀甀爀瘀攀Ѐ＀￾䌏䐀攀昀椀渀椀琀椀漀渀䰀椀猀琀＀￾䌄䐀椀戀̀＀￾䌊䐀椀洀攀渀猀椀漀渀Ā＀￾䌐䐀椀洀攀渀猀椀漀渀䰀椀渀攀愀爀؀＀￾䌐䐀椀洀攀渀猀椀漀渀刀愀搀椀愀氀Ȁ＀￾䌏䐀椀洀攀渀猀椀漀渀匀琀礀氀攀Ѐ＀￾䌏䐀爀愀眀椀渀最䔀氀攀洀攀渀琀ऀ＀￾䌅䔀搀最攀Ȁ＀￾䌈䔀搀最攀唀猀攀Ā＀￾䌇䔀渀琀椀琀礀Ԁ＀￾䌅䘀愀挀攀̀＀￾䌒䘀愀挀攀吀攀砀琀甀爀攀䌀漀漀爀搀猀Ѐ＀￾䌌䘀漀渀琀䴀愀渀愀最攀爀＀￾䌆䜀爀漀甀瀀Ā＀￾䌆䤀洀愀最攀Ā＀￾䌆䰀愀礀攀爀Ȁ＀￾䌍䰀愀礀攀爀䴀愀渀愀最攀爀Ѐ＀￾䌅䰀漀漀瀀Ā＀￾䌉䴀愀琀攀爀椀愀氀ఀ＀￾䌐䴀愀琀攀爀椀愀氀䴀愀渀愀最攀爀Ѐ＀￾䌉倀愀最攀䰀椀猀琀Ā＀￾䌋倀漀氀礀氀椀渀攀㌀搀＀￾䌍刀攀氀愀琀椀漀渀猀栀椀瀀＀￾䌐刀攀氀愀琀椀漀渀猀栀椀瀀䴀愀瀀＀￾䌑刀攀渀搀攀爀椀渀最伀瀀琀椀漀渀猀─＀￾䌋匀挀栀攀洀愀䘀椀氀攀Ā＀￾䌑匀挀栀攀洀愀䘀椀氀琀攀爀䘀椀氀攀＀￾䌎匀挀栀攀洀愀娀椀瀀䘀椀氀攀Ā＀￾䌍匀攀挀琀椀漀渀倀氀愀渀攀̀＀￾䌋匀栀愀搀漀眀䤀渀昀漀܀＀￾䌇匀欀䘀漀渀琀Ā＀￾䌉匀欀攀琀挀栀䌀匀＀￾䌎匀欀攀琀挀栀唀瀀䴀漀搀攀氀ᰀ＀￾䌍匀欀攀琀挀栀唀瀀倀愀最攀Ā＀￾䌉匀欀瀀匀琀礀氀攀Ā＀￾䌐匀欀瀀匀琀礀氀攀䴀愀渀愀最攀爀Ȁ＀￾䌅吀攀砀琀ऀ＀￾䌊吀攀砀琀匀琀礀氀攀Ԁ＀￾䌈吀攀砀琀甀爀攀؀＀￾䌊吀栀甀洀戀渀愀椀氀Ā＀￾䌇嘀攀爀琀攀砀＀￾䌉嘀椀攀眀倀愀最攀ఀ＀￾䌊圀愀琀攀爀洀愀爀欀Ā＀￾䌑圀愀琀攀爀洀愀爀欀䴀愀渀愀最攀爀Ȁ＀￾䔒渀搀ⴀ伀昀ⴀ嘀攀爀猀椀漀渀ⴀ䴀愀瀀Ā뀀Ȁ2＀ϿЀ䌀楄Ѣ樀2褀乐േᨊ
/*
* ----------------------------------------------------------------
*
* ITA geometrical acoustics
* (c) Copyright Institute of Technical Acoustics (ITA)
* RWTH Aachen University, Germany, 2015-2018
*
* ----------------------------------------------------------------
* ____ __________ _______
* // / //__ ___/ // _ |
* // / // / // /_| |
* // / // / // ___ |
* //__/ //__/ //__/ |__|
*
* ----------------------------------------------------------------
*
* Example generating propagaton paths along a trajectory in
* an urban setting.
*
*/
#include <ITAStopWatch.h>
#include <ITAStringUtils.h>
#include <ITAPropagationPathSim/CombinedModel/PropagationEngine.h>
#include <ITAGeo/Base.h>
#include <ITAGeo/Utils.h>
#include <ITAGeo/SketchUp/Model.h>
#include <ITAGeo/Material/Material.h>
#include <ITAGeo/Material/Manager.h>
#include <cassert>
using namespace std;
using namespace ITAGeo;
using namespace ITAPropagationPathSim;
#if 1 //#ifdef WITH_JSON_SUPPORT
#include <libjson.h>
#endif
int main( int iNumInArgs, char* pcInArgs[] )
{
std::string sInFile = "UrbanSetting.skp";
auto pMeshModelList = make_shared< ITAGeo::Halfedge::CMeshModelList>();
if( pMeshModelList->Load( sInFile ) )
{
cout << "Successfully loaded '" << sInFile << "'" << endl;
}
else
{
cerr << "Could not load " << sInFile << endl;
return 255;
}
// Scene
auto pReceiver = make_shared< CSensor >( VistaVector3D( 10.0f, 5.0f, 1.7f ) );
auto pVehicle = make_shared< CEmitter >( VistaVector3D( -1.0f, 20.f, 1.0f ) );
// Configuration
const bool bOnlyNeighbouredEdgeDiffraction = false;
const bool bDiffractionOnlyIntoShadowedEdges = false;//
const bool bFilterNotVisiblePathsBetweenEdges = false; //Intersection test between edges(expensive)
const bool bFilterNotVisiblePointToEdge = false; //Intersection test between emitter/sensor and edges
const bool bFilterNotVisiblePaths = true; //Intersection test of calculated sub paths
const float fIntersectionTestResolution = 0.001;
const int iNumIterations = 10;//!< Number of iterations for the calculation of the aperture points
const int fMaxAccumulatedDiffractionAngle = -2.0f * ITAConstants::PI_F; // zero or below -> disabled
const float fLevelDropThreshhold = -90.f - 30.f - 11.f; //90 dB Power level of Diesel; 30 dB masking; 11 dB initial power level drop
const float fReflectionPenalty = -10 * log10f( 0.8 ); //Level reduction of a reflection with reflection factor rho = 0.8 from ISO9613-2
const float fDiffractionPenalty = 2.5f; // Minimum level reduction of a diffracted signal into the shadow region for a low frequency (Taken from BA Filbert Figure 16. UTD)
const int iMaxDiffractionOrder = 2;
const int iMaxReflectionOrder = 2;
const int iMaxCombinedOrder = 4;
// Generate trajectory
ITAStopWatch sw;
int iNumSteps = 10; // @todo henry: determine number of spatial samples
for( int i = 0; i < iNumSteps; i++ )
{
sw.start();
cout << " #### Running step " << std::setw( 8 ) << std::setfill( '0' ) << i << " / " << iNumSteps << " #### " << endl;
auto pPathEngine = make_shared<CombinedModel::CPathEngine>();
pPathEngine->Configure( bOnlyNeighbouredEdgeDiffraction, bDiffractionOnlyIntoShadowedEdges, bFilterNotVisiblePathsBetweenEdges, bFilterNotVisiblePointToEdge, bFilterNotVisiblePointToEdge, bFilterNotVisiblePaths, iNumIterations, fIntersectionTestResolution );
pPathEngine->SetAbortionCriteria( iMaxDiffractionOrder, iMaxReflectionOrder, iMaxCombinedOrder, fLevelDropThreshhold, fReflectionPenalty, fDiffractionPenalty, fMaxAccumulatedDiffractionAngle );
pPathEngine->InitializePathEnvironment( pMeshModelList );
pPathEngine->ApplyEmitter( pVehicle );
pPathEngine->ApplySensor( pReceiver );
CPropagationPathList oPathList;
pPathEngine->ConstructPropagationPaths( oPathList );
cout << "Visible paths: " << to_string( oPathList.size() ) << endl;
std::stringstream ss;
ss << "UrbanTrajectory_pps_" << std::setfill( '0' ) << 8 << i << ".json";
oPathList.Store( ss.str().c_str() );
cout << "Done in " << timeToString( sw.stop() ) << " seconds." << endl;
// Every now and then, export a visualization model
if( i == 1 || i == ( int ) iNumIterations / 2 || i == iNumSteps )
{
SketchUp::CModel oGeoModel_Viz;
if( oGeoModel_Viz.Load( sInFile ) )
{
cout << "Successfully loaded '" << sInFile << "'" << endl;
}
else
{
cerr << "Could not load " << sInFile << endl;
return 255;
}
oGeoModel_Viz.AddEmitterVisualization( *pVehicle, "Vehicle" );
oGeoModel_Viz.AddSensorVisualization( *pReceiver, "Receiver" );
cout << "The path with the longest length is " << oPathList.GetMaxLength() << " m." << endl;
// Group propagation paths by order of reflection and diffraction (maybe we'll change this and add all paths for a handful of spatial steps for a nice animation)
size_t numberOfPaths[ iMaxDiffractionOrder + 1 ][ iMaxReflectionOrder + 1 ] = { 0 };
for( auto& oPath : oPathList )
{
long iNumReflections = ( long ) oPath.GetNumReflections();
long iNumDiffractions = ( long ) oPath.GetNumDiffractions();
numberOfPaths[ iNumDiffractions ][ iNumReflections ]++;
}
for( auto& oPath : oPathList )
{
long iNumReflections = ( long ) oPath.GetNumReflections();
long iNumDiffractions = ( long ) oPath.GetNumDiffractions();
string sPathName = "Refl_Order_" + to_string( iNumReflections ) + "_Diffr_Order_" + to_string( iNumDiffractions ) + "_Path_Amount_" + to_string( numberOfPaths[ iNumDiffractions ][ iNumReflections ] );
oGeoModel_Viz.AddPropagationPathVisualization( oPath, sPathName );
}
std::stringstream ss_viz;
ss_viz << "UrbanTrajectory_pps_" << std::setfill( '0' ) << 8 << i << "_viz.skp";
oGeoModel_Viz.Store( ss_viz.str().c_str() );
}
}
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment