Skip to content

Commit

Permalink
Merge pull request #9 from albertoesmp/repeat_swap
Browse files Browse the repository at this point in the history
Swap on repeat
  • Loading branch information
albertoesmp authored Mar 14, 2024
2 parents 6367613 + 3519395 commit 1ced12d
Show file tree
Hide file tree
Showing 40 changed files with 1,445 additions and 171 deletions.
167 changes: 167 additions & 0 deletions data/scenes/dyn/dyn_geom_swap_scene.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8"?>
<document>
<scene id="dyn_geom_swap_scene" name="DynGeomSwapScene">


<!-- Ground plane -->
<!-- ************ -->
<part id="1">
<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="120" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="50.0;0;0" />
</filter>
</part>




<!-- Small cube goes sphere for two repetitions then goes big cube -->
<!-- ************************************************************* -->
<part id="2">
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/toyblocks/cube.obj" />
</filter>
<filter type="rotate">
<param key="rotation" type="rotation">
<rot angle_deg="45" axis="z"/>
</param>
</filter>
<filter type="scale">
<param type="double" key="scale" value="0.75" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-40.0;-50.0;0" />
</filter>
<!-- Swap small cube by sphere -->
<swap swapStep="2">
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/toyblocks/sphere.obj" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="1.25" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-30.0;-60.0;0" />
</filter>
</swap>
<!-- Swap sphere by big cube -->
<swap swapStep="1">
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/toyblocks/cube.obj" />
</filter>
<filter type="rotate">
<param key="rotation" type="rotation">
<rot angle_deg="45" axis="z"/>
</param>
</filter>
<filter type="scale">
<param type="double" key="scale" value="1.5" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-20.0;-60.0;0" />
</filter>
</swap>
</part>




<!-- Sphere goes cube goes nothing -->
<!-- ***************************** -->
<part id="3">
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/toyblocks/sphere.obj" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="1.25" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-10.0;-20.0;0" />
</filter>
<!-- Swap sphere by cube -->
<swap>
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/toyblocks/cube.obj" />
</filter>
<filter type="scale">
<param type="double" key="scale" value="2.0" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-40.0;40.0;0" />
</filter>
</swap>
<!-- Swap cube by nothing -->
<swap force_null="true">
</swap>
</part>




<!-- Small cube goes mid goes big goes bigger -->
<!-- **************************************** -->
<part id="4">
<filter type="objloader">
<param type="string" key="filepath" value="data/sceneparts/toyblocks/cube.obj" />
</filter>
<filter type="rotate">
<param key="rotation" type="rotation">
<rot angle_deg="45" axis="z"/>
</param>
</filter>
<filter type="scale">
<param type="double" key="scale" value="0.75" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-20.0;10.0;0" />
</filter>
<!-- Swap small cube by mid cube -->
<swap swapStep="1">
<filter type="rotate">
<param key="rotation" type="rotation">
<rot angle_deg="45" axis="z"/>
</param>
</filter>
<filter type="scale">
<param type="double" key="scale" value="2.0" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-22.0;12.0;0" />
</filter>
</swap>
<!-- Swap mid cube by big cube -->
<swap swapStep="1">
<filter type="rotate">
<param key="rotation" type="rotation">
<rot angle_deg="45" axis="z"/>
</param>
</filter>
<filter type="scale">
<param type="double" key="scale" value="3.0" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-18.0;11.0;0.0" />
</filter>
</swap>
<!-- Swap big cube by bigger cube -->
<swap swapStep="1">
<filter type="rotate">
<param key="rotation" type="rotation">
<rot angle_deg="45" axis="z"/>
</param>
</filter>
<filter type="scale">
<param type="double" key="scale" value="3.5" />
</filter>
<filter type="translate">
<param type="vec3" key="offset" value="-42.0;12.0;0.0" />
</filter>
</swap>
</part>
</scene>
</document>
21 changes: 21 additions & 0 deletions data/surveys/dyn/als_dyn_geom_swap.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<document>
<survey name="dyn_geom_swap_als" scene="data/scenes/dyn/dyn_geom_swap_scene.xml#dyn_geom_swap_scene" platform="data/platforms.xml#sr22" scanner="data/scanners_als.xml#leica_als50">
<leg>
<platformSettings x="100" y="100.0" z="400" onGround="false" movePerSec_m="5" />
<scannerSettings active="true" pulseFreq_hz="83000" scanFreq_hz="70" scanAngle_deg="60" />
</leg>
<leg>
<platformSettings x="-100" y="-100.0" z="400" onGround="false" movePerSec_m="5" />
<scannerSettings active="false" pulseFreq_hz="83000" scanFreq_hz="70" scanAngle_deg="60" />
</leg>
<leg>
<platformSettings x="-100" y="100.0" z="400" onGround="false" movePerSec_m="5" />
<scannerSettings active="true" pulseFreq_hz="83000" scanFreq_hz="70" scanAngle_deg="60" />
</leg>
<leg>
<platformSettings x="100" y="-100.0" z="400" onGround="false" movePerSec_m="5" />
<scannerSettings active="false" pulseFreq_hz="83000" scanFreq_hz="70" scanAngle_deg="60" />
</leg>
</survey>
</document>
24 changes: 24 additions & 0 deletions data/surveys/dyn/interp_dyn_geom_swap.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<document>
<survey name="dyn_geom_swap_interp"
scene="data/scenes/dyn/dyn_geom_swap_scene.xml#dyn_geom_swap_scene"
platform="interpolated" basePlatform="data/platforms.xml#sr22"
scanner="data/scanners_als.xml#leica_als50"
>
<leg>
<platformSettings
trajectory="data/trajectories/swap_on_repeat_trajectory.txt"
tIndex="0" xIndex="1" yIndex="2" zIndex="3" rollIndex="4" pitchIndex="5" yawIndex="6"
tStart="0" teleportToStart="true" trajectory_separator="," interpolationDomain="position"
/>
<scannerSettings active="true" pulseFreq_hz="83000" scanFreq_hz="70" scanAngle_deg="60" trajectoryTimeInterval_s="0.033" />
</leg>
<leg>
<platformSettings
trajectory="data/trajectories/swap_on_repeat_trajectory.txt"
tStart="0" teleportToStart="true" trajectory_separator="," interpolationDomain="position"
/>
<scannerSettings active="true" pulseFreq_hz="83000" scanFreq_hz="70" scanAngle_deg="30" trajectoryTimeInterval_s="0.033" />
</leg>
</survey>
</document>
13 changes: 13 additions & 0 deletions data/surveys/dyn/tls_dyn_geom_swap.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<document>
<survey name="dyn_geom_swap_tls" scene="data/scenes/dyn/dyn_geom_swap_scene.xml#dyn_geom_swap_scene" platform="data/platforms.xml#tripod" scanner="data/scanners_tls.xml#riegl_vz400">
<leg>
<platformSettings x="-30" y="-30.0" z="0" onGround="true"/>
<scannerSettings active="true" pulseFreq_hz="100000" verticalAngleMin_deg="-40.0" verticalAngleMax_deg="60.0" scanFreq_hz="120" headRotatePerSec_deg="-5.00" headRotateStart_deg="360.0" headRotateStop_deg="120.0"/>
</leg>
<leg>
<platformSettings x="-30" y="-30.0" z="0" onGround="true"/>
<scannerSettings active="true" pulseFreq_hz="100000" verticalAngleMin_deg="-50.0" verticalAngleMax_deg="70.0" scanFreq_hz="120" headRotatePerSec_deg="-15.00" headRotateStart_deg="360.0" headRotateStop_deg="90.0"/>
</leg>
</survey>
</document>
109 changes: 63 additions & 46 deletions scripts/debug/hda_pulse_records_plotter.py
Original file line number Diff line number Diff line change
Expand Up @@ -1078,25 +1078,13 @@ def do_energy_plots(arec, brec, outdir):
theta_linspace = np.linspace(theta_min, theta_max, n_cases)
ray_indices_a = []
ray_indices_b = []
print(f'ray_idx_a:\n{arec["ray_idx"]}\n') # TODO Remove
print(f'ray_idx_b:\n{brec["ray_idx"]}\n') # TODO Remove
for theta_target in theta_linspace:
print(f'theta_target: {theta_target}') # TODO Remove
theta_index_a = np.argmin(np.abs(theta_rad_a-theta_target))
print(f'theta_index_a: {theta_index_a}') # TODO Remove
ray_idx_a = int(arec['ray_idx'][theta_index_a])
print(f'ray_idx_a: {ray_idx_a}') # TODO Remove
ray_indices_a.append(ray_idx_a)
theta_index_b = np.argmin(np.abs(theta_rad_b-theta_target))
print(f'theta_index_b: {theta_index_b}') # TODO Remove
ray_idx_b = int(brec['ray_idx'][theta_index_b])
print(f'ray_idx_b: {ray_idx_b}') # TODO Remove
ray_indices_b.append(ray_idx_b)
print('-----------------------------------') # TODO Remove
# TODO Remove section ---
print(f'ray_indices_a:\n{ray_indices_a}\n')
print(f'ray_indices_b:\n{ray_indices_b}\n')
# --- TODO Remove section
# For each case generate a dataset with all the subrays
ray_idx_a, ray_idx_b = arec['ray_idx'], brec['ray_idx']
energy_dataset_a, energy_dataset_b = [], []
Expand All @@ -1121,72 +1109,101 @@ def do_energy_plots(arec, brec, outdir):
'radius_step': brec['radius_step'][mask_b],
'ray_idx': brec['ray_idx'][mask_b]
})
print(f'len(energy_dataset_a) = {len(energy_dataset_a)}') # TODO Remove
print(f'len(energy_dataset_a[0][x]) = {len(energy_dataset_a[0]["incidence_angle_rad"])}') # TODO Remove
print(f'len(energy_dataset_b) = {len(energy_dataset_b)}') # TODO Remove
print(f'len(energy_dataset_b[0][x]) = {len(energy_dataset_b[0]["incidence_angle_rad"])}') # TODO Remove
# Do the energy plots
_do_energy_plots(energy_dataset_a, energy_dataset_b, outdir)


def _do_energy_plots(eda, edb, outdir):
# Build figure
fig = init_figure() # Initialize figure
# Prepare figures
n_cases = 2*len(eda)
nrows = int(np.sqrt(n_cases))
ncols = int(np.ceil(n_cases/nrows))
fig = plt.figure(figsize=(16, 10))
# Do the subplots
for i in range(n_cases//2):
ax = fig.add_subplot(nrows, ncols, i+1)
do_energy_subplot(fig, ax, eda[i], 'A')
ax = fig.add_subplot(nrows, ncols, i+1+n_cases//2)
do_energy_subplot(fig, ax, edb[i], 'B')
# Post-process figure
fig.tight_layout()
# Save figure to file and remove it from memory
fig.savefig(
os.path.join(outdir, 'energy_plots.png')
)
fig.clear()
plt.close(fig)
fig_data = [
{
'key': 'emitted_power',
'full_name': 'Emitted power',
'name': '$P_e$'
},
{
'key': 'target_area_m2',
'full_name': 'Target area',
'name': '$A$'
},
{
'key': 'cross_section',
'full_name': 'Cross-section',
'name': '$\\sigma$'
},
{
'key': 'received_power',
'full_name': 'Received power',
'name': '$P_r$'
}
]
for fig_record in fig_data:
# Build figure
fig = init_figure(figsize=(16, 10)) # Initialize figure
# Do the subplots
for i in range(n_cases//2):
ax = fig.add_subplot(nrows, ncols, i+1)
do_energy_subplots(
fig, ax, eda[i], 'A',
fig_record['key'],
fig_record['full_name'],
fig_record['name']
)
ax = fig.add_subplot(nrows, ncols, i+1+n_cases//2)
do_energy_subplots(
fig, ax, edb[i], 'B',
fig_record['key'],
fig_record['full_name'],
fig_record['name']
)
# Post-process figure
fig.tight_layout()
# Save figure to file and remove it from memory
fig.savefig(
os.path.join(outdir, f'energy_plots_{fig_record["key"]}.png')
)
fig.clear()
plt.close(fig)


def do_energy_subplot(fig, ax, edi, case_letter):
def do_energy_subplots(
fig, ax, edi, case_letter, key, full_name, name
):
# Extract values of interest
rstep = edi['radius_step']
n_subrays = len(rstep)
rstep_uniq = np.unique(rstep)
# Group by radius step
pe = edi['emitted_power']
pe_by_rs = [pe[rstep == rstepk] for rstepk in rstep_uniq]
x = edi[key]
x_by_rs = [x[rstep == rstepk] for rstepk in rstep_uniq]
# Do the plot
pe_by_rs_sum = 0
print(f'rstep_uniq: {rstep_uniq}') # TODO Remove
print(f'pe_by_rs:\n{pe_by_rs}') # TODO Remove
x_by_rs_sum = 0
for j, rstepk in enumerate(rstep_uniq):
pe_by_rsj = pe_by_rs[j]
pe_by_rsj_sum = np.sum(pe_by_rsj)
pe_by_rs_sum += pe_by_rsj_sum
x_by_rsj = x_by_rs[j]
x_by_rsj_sum = np.sum(x_by_rsj)
x_by_rs_sum += x_by_rsj_sum
ax.bar(
rstepk, pe_by_rsj_sum,
rstepk, x_by_rsj_sum,
color='gray',
align='center',
width=0.8,
label='sum' if j == 0 else None
)
ax.bar(
rstepk, pe_by_rsj[0],
rstepk, x_by_rsj[0],
color='tab:red',
align='center',
width=0.8,
label='subray' if j == 0 else None
)
ax.legend(loc='best')
ax.set_xlabel('Radius step', fontsize=14)
ax.set_ylabel('Emitted power ($P_e$)', fontsize=14)
ax.set_ylabel(f'{full_name} ({name})', fontsize=14)
ax.set_title(
f'{case_letter}) $P_e = $ {pe_by_rs_sum:.3g} ({n_subrays} subrays)\n'
f'{case_letter}) {name} $ = $ {x_by_rs_sum:.3g} ({n_subrays} subrays)\n'
f'$\\theta = {(edi["incidence_angle_rad"][0]*180/np.pi):.3f}$ deg'
)

Expand Down
Loading

0 comments on commit 1ced12d

Please sign in to comment.