PulseWaves writer example (pulseexample_write_pulse)

76 views
Skip to first unread message

Eric Rehm

unread,
Jan 29, 2019, 6:04:11 PM1/29/19
to PulseWaves - no pulse left behind
Following on my previous effort to use LASlib for full waveform (WDP) storage, I decided to "bootcamp" myself into PulseWaves by coding the same example in PulseWaves.  The code synthesizes the same waveform, following the data in the ASPRSorg Full Waveform example.  (In the last few days, the very nice figure on the ASPRS.org link seems to have disappeared.)

Caveats:  I don't claim that this code is perfect, but it does pass pulseinfo.exe and pulseview.exe "tests".  If you see something amiss, let me know. I did not use the PulseWaves API, as the API seemed to be in less good shape than the underlying PulseWaves C++ library code.

In addition to adding the example application (pulseexample_write_pulse.cpp), I needed to fix a few minor* things in the PulseWaves library code (pulsewaves/src and pulsewaves/inc)  to get Version 1.0 of this PulseWaves version running on macOS 10.13.6 (High Sierra).  For the reader's convenience, I branched the PulseWaves git AND pushed to to a public repo on Gitlab. Again, this compiles and runs based on the macOS g++ / make environment (XCode 10.1; no Macports, no Brew). I’m on git branch tak01.  (I'll let Martin decide if he wants to mainstream this fixes.)

So to repeat what I did, you can:

git clone https://gitlab.com/SentinelleNord/pulsewaves.git  # or git clone g...@gitlab.com:SentinelleNord/pulsewaves.git
cd pulsewaves
git checkout tak01
make

cd example
./pulseexample_write_pulse -vv -o out.pls


Then switching over to Windows, you can query visualize this pulse with

pulseinfo -i out.pls
pulse2pulse
-i out.pls -o out.txt
pulseview
-i out.pls

and you should see a view similar to that below.

PastedGraphic-1.png


I've attached a snapshot of the code here and the pulseinfo output.


This was a very useful exercise for me and I hope it will help others who want use PulseWaves to write out LiDAR files.  (I'm working on full-waveform underwater LiDAR.  Some hints here.)



* The minor fixes in the PulseWaves src code included:

  • Replacing memset() object initialization in some constructors with the proper C++ initialization.  (On some platforms, memset()can wipe out the vtable pointer.)
  • Fixing some incorrect pointer tests (e.g.,  samples == 0 ---> samples[1] == 0, etc.)
  • Fix references to non-existent C++ stdlib.h routine atoill() to atoll()
  • Fix warnings by changing fprintf %u to %lu for U32 integers, etc.
  • Fix Makefiles so you can "make from the top" (as shown above) plus src/Makefile will make libpulsewaves.a by default, etc.
  • Add #ifdef to reference long long instead of __int64 for pulsewaves_I64 on non-Win platforms in pulsewaves_dll.h


/eric rehm
Univeristé Laval / Takuvik

pulseexample_write_pulse.cpp
out.info

Eric Rehm

unread,
Jan 29, 2019, 9:22:19 PM1/29/19
to PulseWaves - no pulse left behind
So, I just compared:
  • LAS output from lasexample_write_full_waveform  (out.las) . (Hard coded to be three returns)
  • LAS output from pulseextract -i out.pls -o out2.las (Waveform with three peaks)   
  • Visualized both with: lasview -i out.las out2.las -merged
Why did pulseextract create only two returns in out2.las even thought there are three peaks? (Verified with lasinfo out2.las.)

(Hint: I would love to have the code for the PulseTools so I could figure this out myself...)

/eric

Screenshot 2019-01-29 20.36.16.png


Martin Isenburg

unread,
Feb 13, 2019, 4:00:26 AM2/13/19
to PulseWaves - no pulse left behind
Hello Eric,

I have not yet had time to compile the code that you provided but I had a look at the PLS/WVS file that you send along and have several comments. For comparison I also list an example of a recent RIEGL export. Below I mark the "critical" elements in red.

It's nice to have information about the PULSEscanner and the PULSEtable as part of the VLRs so your full waveform data is better documented. Have a look at the RIEGL lasinfo report as an example. The use of 0x8FFFFFFF ('fluctuate') for the distance from the optical center to the anchor point should be avoided if possible. For the type of scanner you are using I would think that a distance of zero could be used such that the durations for the first_returning_sample and the last_returning_sample become more meaningful in the sense that they encode how far from the scanning system the sampled returning waveform segment are located.

Otherwise this looks pretty good to me already. Why pulseextract (or pressing 'd' in pulseview as in the attached picture) does not pic up the last bump should not concern you. This is not a very strong waveform deconvolution implementation and has some hard-coded threshholds that your waveform may simply not meet.

Regards,

Martin

============================

C:\software\pulsetools\bin>pulseinfo -i out.pls
reporting all PULSE header entries:
  file signature:             'PulseWavesPulse'
  global parameters:          0
  file source ID:             0
  project ID GUID data 1-4:   386B421C-61E7-4036-9E28-0AE989223561
  system identifier:          'ASPRSorg full waveform Example'
  generating software:        'pulseexample: PulseWaves 0.3 r11 (160127) by rapidlasso'
  file creation day/year:     19/2019
  version major.minor:        0.3
  header size:                352
  offset to pulse data:       644
  number of pulses:           1
  pulse format:               0
  pulse attributes:           0
  pulse size:                 48
  pulse compression:          0
  number vlrs:                1
  number avlrs:               0
  scale factor and offset t:  1e-006 1000000000
  min max T:                  23365829000000 23365829000000
  scale factor x y z:         0.01 0.01 0.01
  offset x y z:               500000 4100000 0
  min x y z:                  235373.48 5800927.96 267.51
  max x y z:                  235377.84 5800928.49 279.81
variable length header record 1 of 1:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200001
  length after header  196
  description          'PulseWaves 0.3 r11 (160127) by rapidlasso'
    PULSEdescriptor 1
      optical_center_to_anchor_point:  0x8FFFFFFF ('fluctuate')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             1
      sample_units:                    1 [nanoseconds]
      scanner_index:                   undefined
      compression:                     0
      description:                     'ASPRSorg full waveform example, Descriptor 1'
        sampling[0]
          type:        2 ('returning')
          channel:     0
          bits_for_duration_from_anchor:             0
          scale_for_duration_from_anchor:            1
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:                0
          number_of_segments:   1
          number_of_samples:   88
          bits_per_sample:      8
          lookup_table_index:   0 ('undefined')
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '88 samples at 8 bits'
reporting minimum and maximum for all PULSE record entries ...
  T          23365829000000   23365829000000
  offset                 60               60
  anchor_X   -26462651   -26462651
  anchor_Y   170092848   170092848
  anchor_Z       27980       27980
  target_X   -26457658   -26457658
  target_Y   170092258   170092258
  target_Z       13862       13862
  first_returning_sample     0     0
  last_returning_sample     87    87
  descriptor_index     1   1
  reserved             0   0
  edge_of_scan_line    0   0
  scan_direction       0   0
  mirror_facet         0   0
  intensity          255 255
  classification       0   0
  min x y z  235373.49 5800927.97 267.52
  max x y z  235377.83 5800928.48 279.80

C:\software\pulsetools\bin>more out.txt
file_signature:         PulseWavesPulse
global_parameters:      0
file_source_ID:         0
project ID GUID:        386B421C-61E7-4036-9E28-0AE989223561
system_identifier:      'ASPRSorg full waveform Example'
generating_software:    'pulseexample: PulseWaves 0.3 r11 (160127) by rapidlasso'
file_creation_day_year: 19 2019
version:                0.3
header_size:            352
offset_to_pulse_data:   644
number_of_pulses:       1
pulse_format:           0
pulse_attributes:       0
pulse_size:             48
pulse_compression:      0
reserved:               0
number_of_vlrs:         1
number_of_avlrs:        0
t_scale_factor:         1e-006
t_offset:               1e+009
min_T max_T             23365829000000 23365829000000
xyz_scale_factors:      0.01 0.01 0.01
xyz_offsets:            500000 4.1e+006 0
min_x min_y min_z:      235373 5.80093e+006 267.51
max_x max_y max_z:      235378 5.80093e+006 279.81
P
23365829000000
941
-26462651 170092848 27980
-26457658 170092258 13862
0 87
1
0 0 0 0
255 0
W
m
s 88 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 96 96 192 192 192 96 96 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 64 64 128 128 128 64 64 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 16 32 32 64 64 64 32 32 16 0 0 0 0 0



===============================

C:\software\pulsetools\bin>pulseinfo.exe "Q1560 - Channel 1 - 190116_123917_1.part - originalpoints.pls"
reporting all PULSE header entries:
  file signature:             'PulseWavesPulse'
  global parameters:          0
  file source ID:             0
  project ID GUID data 1-4:   00000000-0000-0000-0000-000000000000
  system identifier:          'RiPROCESS 1.8.5.1091'
  generating software:        'PulseWaves DLL 0.3 r11 (150617) by rapidlasso'
  file creation day/year:     36/2019
  version major.minor:        0.3
  header size:                352
  offset to pulse data:       9955
  number of pulses:           257421
  pulse format:               0
  pulse attributes:           0
  pulse size:                 48
  pulse compression:          0
  number vlrs:                20
  number avlrs:               0
  scale factor and offset t:  1e-006 0
  min max T:                  45589000001 45589998784
  scale factor x y z:         0.00025 0.00025 0.00025
  offset x y z:               548671 5390201 868
  min x y z:                  548353.32949999999 5390120.1537499996 284.35450000000003
  max x y z:                  548986.85800000001 5390372.57125 353.17124999999999
variable length header record 1 of 20:
  reserved             0
  user ID              'PulseWaves_Proj'
  record ID            34735
  length after header  208
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    GeoKeyDirectoryTag version 1.1.0 number of keys 25
      key 1024 tiff_tag_location 0 count 1 value_offset 1 - GTModelTypeGeoKey: ModelTypeProjected
      key 1025 tiff_tag_location 0 count 1 value_offset 2 - GTRasterTypeGeoKey: RasterPixelIsPoint
      key 1026 tiff_tag_location 34737 count 34 value_offset 0 - GTCitationGeoKey: ETRS89 / UTM 33N / Geoid N╓ GRS80
      key 2048 tiff_tag_location 0 count 1 value_offset 32767 - GeographicTypeGeoKey: user-defined
      key 2049 tiff_tag_location 34737 count 7 value_offset 68 - GeogCitationGeoKey: ETRS89
      key 2050 tiff_tag_location 0 count 1 value_offset 32767 - GeogGeodeticDatumGeoKey: user-defined
      key 2051 tiff_tag_location 0 count 1 value_offset 32767 - GeogPrimeMeridianGeoKey: look-up for 32767 not implemented
      key 2052 tiff_tag_location 0 count 1 value_offset 9001 - GeogLinearUnitsGeoKey: Linear_Meter
      key 2054 tiff_tag_location 0 count 1 value_offset 9102 - GeogAngularUnitsGeoKey: Angular_Degree
      key 2056 tiff_tag_location 0 count 1 value_offset 32767 - GeogEllipsoidGeoKey: look-up for 32767 not implemented
      key 2057 tiff_tag_location 34736 count 1 value_offset 0 - GeogSemiMajorAxisGeoKey: 0
      key 2059 tiff_tag_location 34736 count 1 value_offset 1 - GeogInvFlatteningGeoKey: 0
      key 2060 tiff_tag_location 0 count 1 value_offset 9102 - GeogAzimuthUnitsGeoKey: Angular_Degree
      key 2061 tiff_tag_location 34736 count 1 value_offset 2 - GeogPrimeMeridianLongGeoKey: 0
      key 3072 tiff_tag_location 0 count 1 value_offset 32767 - ProjectedCSTypeGeoKey: user-defined
      key 3073 tiff_tag_location 34737 count 34 value_offset 34 - PCSCitationGeoKey: ETRS89 / UTM 33N / Geoid N╓ GRS80
      key 3074 tiff_tag_location 0 count 1 value_offset 32767 - ProjectionGeoKey: user-defined
      key 3075 tiff_tag_location 0 count 1 value_offset 1 - ProjCoordTransGeoKey: CT_TransverseMercator
      key 3076 tiff_tag_location 0 count 1 value_offset 9001 - ProjLinearUnitsGeoKey: Linear_Meter
      key 3080 tiff_tag_location 34736 count 1 value_offset 4 - ProjNatOriginLongGeoKey: 0
      key 3081 tiff_tag_location 34736 count 1 value_offset 3 - ProjNatOriginLatGeoKey: 0
      key 3082 tiff_tag_location 34736 count 1 value_offset 5 - ProjFalseEastingGeoKey: 0
      key 3083 tiff_tag_location 34736 count 1 value_offset 6 - ProjFalseNorthingGeoKey: 0
      key 3092 tiff_tag_location 34736 count 1 value_offset 7 - ProjScaleAtNatOriginGeoKey: 0
      key 4099 tiff_tag_location 0 count 1 value_offset 9001 - VerticalUnitsGeoKey: Linear_Meter
variable length header record 2 of 20:
  reserved             0
  user ID              'PulseWaves_Proj'
  record ID            34736
  length after header  64
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    GeoDoubleParamsTag (number of doubles 8)
      0 0 0 0 0 0 0 0
variable length header record 3 of 20:
  reserved             0
  user ID              'PulseWaves_Proj'
  record ID            34737
  length after header  75
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    GeoAsciiParamsTag (number of characters 75)
      ETRS89 / UTM 33N / Geoid N╓ GRS80|ETRS89 / UTM 33N / Geoid N╓ GRS80|ETRS89|
variable length header record 4 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            100001
  length after header  248
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEscanner 1
      instrument:                      'Q1560'
      serial:                          '2220671'
      wave_length:                     1064 [nanometer]
      outgoing_pulse_width:            4.72389 [nanoseconds]
      scan_pattern:                    2 ('line')
      number_of_mirror_facets:         4
      scan_frequency:                  155.556 [hertz]
      scan_angle_min:                  0.000255905 [degree]
      scan_angle_max:                  360 [degree]
      pulse_frequency:                 400 [kilohertz]
      beam_diameter_at_exit_aperture:  10 [millimeters]
      beam_divergence:                 0.5 [milliradians]
      minimal_range:                   518.795 [meters]
      maximal_range:                   651.804 [meters]
      description:                     ''
variable length header record 5 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            300001
  length after header  1184
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEtable 1
      number_tables:                   1
      description:                     'PulseWaves DLL 0.3 r11 (150617) by rapidlasso'
      PULSElookupTable 0
        number_entries:                256
        unit_of_measurement:           1
        data_type:                     8 ('float')
        description:                   'amplitude conversion table for low channel'
-empty- -empty- -empty- -empty- -5.4407 -3.6798 -2.4304 -1.4613
-0.6695 0.0000 0.5799 1.0914 1.5490 1.9629 2.3408 2.6885
3.0103 3.3099 3.5902 3.8535 4.1017 4.3366 4.5593 4.7712
4.9732 5.1663 5.3511 5.5284 5.6988 5.8627 6.0206 6.1730
6.3202 6.4626 6.6005 6.7342 6.8638 6.9897 7.1120 7.2310
7.3469 7.4597 7.5696 7.6769 7.7815 7.8837 7.9835 8.0811
8.1766 8.2700 8.3614 8.4510 8.5387 8.6247 8.7091 8.7918
8.8730 8.9526 9.0309 9.1078 9.1833 9.2575 9.3305 9.4023
9.4729 9.5424 9.6108 9.6782 9.7445 9.8098 9.8741 9.9375
10.0000 10.0616 10.1223 10.1822 10.2413 10.2996 10.3572 10.4139
10.4700 10.5253 10.5799 10.6339 10.6872 10.7398 10.7918 10.8432
10.8940 10.9442 10.9938 11.0429 11.0914 11.1394 11.1869 11.2338
11.2803 11.3263 11.3717 11.4167 11.4613 11.5054 11.5490 11.5922
11.6350 11.6774 11.7194 11.7609 11.8021 11.8429 11.8833 11.9233
11.9629 12.0022 12.0412 12.0798 12.1181 12.1560 12.1936 12.2309
12.2678 12.3045 12.3769 12.4126 12.4481 12.4832 12.5527 12.5871
12.6211 12.6549 12.7217 12.7548 12.7875 12.8524 12.8844 12.9162
12.9792 13.0103 13.0719 13.1024 13.1326 13.1925 13.2222 13.2809
13.3099 13.3675 13.4242 13.4523 13.5080 13.5356 13.5902 13.6442
13.6975 13.7239 13.7762 13.8279 13.8790 13.9295 13.9794 14.0288
14.0775 14.1258 14.1735 14.2207 14.2674 14.3136 14.3820 14.4270
14.4716 14.5375 14.5810 14.6240 14.6877 14.7297 14.7918 14.8328
14.8936 14.9535 14.9929 15.0515 15.1093 15.1663 15.2039 15.2597
15.3148 15.3692 15.4229 15.4760 15.5284 15.5974 15.6484 15.6988
15.7486 15.8141 15.8627 15.9106 15.9738 16.0206 16.0822 16.1278
16.1880 16.2325 16.2912 16.3491 16.4062 16.4486 16.5045 16.5596
16.6141 16.6812 16.7342 16.7865 16.8510 16.9020 16.9648 17.0268
17.0879 17.1481 17.2075 17.2661 17.3354 17.3923 17.4597 17.5260
17.6021 17.6663 17.7400 17.8021 17.8736 17.9439 18.0229 18.1004
18.1671 18.2515 18.3251 18.3975 18.4775 18.5561 18.6417 18.7340
18.8407 18.9526 19.0695 19.1982 19.3233 19.4589 19.5972 19.7379
19.8741 20.0124 20.1524 20.2938 20.4308 20.5636 20.6977 20.8279
variable length header record 6 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            300002
  length after header  1184
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEtable 2
      number_tables:                   1
      description:                     'PulseWaves DLL 0.3 r11 (150617) by rapidlasso'
      PULSElookupTable 0
        number_entries:                256
        unit_of_measurement:           1
        data_type:                     8 ('float')
        description:                   'amplitude conversion table for high channel'
-empty- -empty- -empty- -empty- -1.4613 2.3408 5.1663 7.1120
8.7091 10.0616 11.0914 12.0022 12.7875 13.4803 14.0532 14.5593
14.9929 15.3511 15.6652 15.9265 16.1278 16.3057 16.4766 16.6276
16.7735 16.9020 17.0268 17.1481 17.2544 17.3583 17.4597 17.5587
17.6556 17.7504 17.8533 17.9439 18.0326 18.1291 18.2235 18.3251
18.4243 18.5213 18.6247 18.7257 18.8244 18.9209 19.0231 19.1154
19.2131 19.3088 19.4023 19.5009 19.5904 19.6848 19.7772 19.8677
19.9626 20.0494 20.1404 20.2355 20.3227 20.4139 20.5032 20.5962
20.6872 20.7763 20.8636 20.9542 21.0478 21.1347 21.2245 21.3171
21.4078 21.5010 21.5922 21.6816 21.7774 21.8671 21.9629 22.0528
22.1484 22.2420 22.3336 22.4268 22.5216 22.6143 22.7085 22.8006
22.8940 22.9885 23.0811 23.1747 23.2663 23.3589 23.4495 23.5438
23.6334 23.7265 23.8176 23.9094 24.0017 24.0969 24.1901 24.2860
24.3820 24.4782 24.5745 24.6708 24.7671 24.8633 24.9614 25.0573
25.1550 25.2523 25.3475 25.4442 25.5406 25.6365 25.7320 25.8271
25.9218 26.0159 26.1096 26.2043 26.2970 26.3892 26.4822 26.5747
26.6665 26.7591 26.8510 26.9448 27.0366 27.1301 27.2240 27.3182
27.4126 27.5073 27.6021 27.6969 27.7939 27.8898 27.9865 28.0840
28.1823 28.2811 28.3795 28.4792 28.5785 28.6789 28.7795 28.8810
28.9818 29.0818 29.1818 29.2803 29.3788 29.4764 29.5747 29.6721
29.7694 29.8671 29.9651 30.0628 30.1614 30.2595 30.3583 30.4577
30.5571 30.6574 30.7581 30.8590 30.9607 31.0624 31.1651 31.2683
31.3722 31.4763 31.5810 31.6862 31.7918 31.8981 32.0050 32.1120
32.2197 32.3278 32.4361 32.5448 32.6539 32.7633 32.8732 32.9832
33.0933 33.2038 33.3146 33.4254 33.5361 33.6474 33.7585 33.8696
33.9809 34.0931 34.2071 34.3244 34.4458 34.5721 34.7039 34.8418
34.9863 35.1375 35.2958 35.4610 35.6333 35.8125 35.9982 36.1905
36.3887 36.5926 36.8017 37.0156 37.2336 37.4555 37.6808 37.9088
38.1392 38.3716 38.6054 38.8403 39.0817 39.5802 39.7119 39.7120
39.7120 39.7121 39.7122 39.7122 39.7123 39.7124 39.7124 39.7125
39.7126 39.7126 39.7127 39.7128 39.7128 39.7129 39.7130 39.7130
39.7131 39.7132 39.7132 39.7133 39.7134 39.7134 39.7135 39.7136
variable length header record 7 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200001
  length after header  196
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 1
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             1
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 0 x LP, 0 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
variable length header record 8 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200002
  length after header  300
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 2
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             2
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 1 x LP, 0 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 lowpower segment(s)'
variable length header record 9 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200003
  length after header  404
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 3
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             3
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 1 x LP, 1 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 lowpower segment(s)'
        sampling[2]
          type:        2 ('returning')
          channel:     0
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   2
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 highpower segment(s)'
variable length header record 10 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200004
  length after header  300
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 4
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             2
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 2 x LP, 0 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   2
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '2 lowpower segment(s)'
variable length header record 11 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200005
  length after header  404
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 5
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             3
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 2 x LP, 1 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   2
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '2 lowpower segment(s)'
        sampling[2]
          type:        2 ('returning')
          channel:     0
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   2
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 highpower segment(s)'
variable length header record 12 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200006
  length after header  404
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 6
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             3
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 2 x LP, 2 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   2
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '2 lowpower segment(s)'
        sampling[2]
          type:        2 ('returning')
          channel:     0
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   2
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   2
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '2 highpower segment(s)'
variable length header record 13 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200007
  length after header  300
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 7
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             2
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 3 x LP, 0 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   3
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '3 lowpower segment(s)'
variable length header record 14 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200008
  length after header  404
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 8
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             3
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 3 x LP, 1 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   3
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '3 lowpower segment(s)'
        sampling[2]
          type:        2 ('returning')
          channel:     0
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   2
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 highpower segment(s)'
variable length header record 15 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200009
  length after header  404
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 9
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             3
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 3 x LP, 2 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   3
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '3 lowpower segment(s)'
        sampling[2]
          type:        2 ('returning')
          channel:     0
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   2
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   2
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '2 highpower segment(s)'
variable length header record 16 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200010
  length after header  404
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 10
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             3
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     '1 x RP, 3 x LP, 3 x HP'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   1
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '1 reference segment(s)'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   3
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '3 lowpower segment(s)'
        sampling[2]
          type:        2 ('returning')
          channel:     0
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               0
          bits_for_number_of_samples:               16
          number_of_segments:   3
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   2
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        '3 highpower segment(s)'
variable length header record 17 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200011
  length after header  404
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 11
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             3
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     'out+return(s), vary'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               8
          bits_for_number_of_samples:               16
          number_of_segments:   0
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        'outgoing, reference, vary'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               8
          bits_for_number_of_samples:               16
          number_of_segments:   0
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        'returning, lowpower, vary'
        sampling[2]
          type:        2 ('returning')
          channel:     0
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               8
          bits_for_number_of_samples:               16
          number_of_segments:   0
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   2
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        'returning, highpower, vary'
variable length header record 18 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200012
  length after header  300
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 12
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             2
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     'out+return(s), lowpower only'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               8
          bits_for_number_of_samples:               16
          number_of_segments:   0
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        'outgoing, reference, vary'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               8
          bits_for_number_of_samples:               16
          number_of_segments:   0
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        'returning, lowpower, vary'
variable length header record 19 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200013
  length after header  196
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 13
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             1
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     'returns(s), vary'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               8
          bits_for_number_of_samples:               16
          number_of_segments:   0
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        'outgoing, reference, vary'
variable length header record 20 of 20:
  reserved             0
  user ID              'PulseWaves_Spec'
  record ID            200014
  length after header  300
  description          'PulseWaves 0.3 r11 (150617) by rapidlasso'
    PULSEdescriptor 14
      optical_center_to_anchor_point:  0x0 ('coincide')
      number_of_extra_waves_bytes:     0
      number_of_samplings:             2
      sample_units:                    1 [nanoseconds]
      scanner_index:                   1
      compression:                     0
      description:                     'out+return(s), lowpower only'
        sampling[0]
          type:        1 ('outgoing')
          channel:     3
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               8
          bits_for_number_of_samples:               16
          number_of_segments:   0
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        'outgoing, reference, vary'
        sampling[1]
          type:        2 ('returning')
          channel:     1
          bits_for_duration_from_anchor:            32
          scale_for_duration_from_anchor:            0.00166828
          offset_for_duration_from_anchor:           0
          bits_for_number_of_segments:               8
          bits_for_number_of_samples:               16
          number_of_segments:   0
          number_of_samples:    0
          bits_per_sample:      8
          lookup_table_index:   1
          sample_units:       1.0 [nanoseconds]
          compression:          0
          description:        'returning, lowpower, vary'
reporting minimum and maximum for all PULSE record entries ...
  T             45589000001      45589998786
  offset                 60         31196624
  anchor_X      -84152          41
  anchor_Y        -840      193058
  anchor_Z       -1682         388
  target_X     -357829      290299
  target_Y      -75055      304706
  target_Z     -600650     -508246
  first_returning_sample  3444  4333
  last_returning_sample   3503  4416
  descriptor_index     1   4
  reserved             0   0
  edge_of_scan_line    0   1
  scan_direction       0   0
  mirror_facet         0   3
  intensity            0   0
  classification       0   0
  min x y z  548353.32968632691 5390120.1539953733 284.35477888345713
  max x y z  548986.85778886301 5390372.5709221223 353.17097307634356

--
--
Post to "PulseWaves" by email to pulse...@googlegroups.com
Unsubscribe by email to pulsewaves+...@googlegroups.com
Visit this group's message archives at http://pulsewaves.org

---
You received this message because you are subscribed to the Google Groups "PulseWaves - no pulse left behind" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pulsewaves+...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Eric_Rehm_PulseWaves_export.jpg

Eric Rehm

unread,
Mar 10, 2019, 10:58:39 PM3/10/19
to PulseWaves - no pulse left behind
Bonjour Martin,


On Wednesday, 13 February 2019 04:00:26 UTC-5, Martin Isenburg wrote:
Hello Eric,

I have not yet had time to compile the code that you provided but I had a look at the PLS/WVS file that you send along and have several comments. For comparison I also list an example of a recent RIEGL export. Below I mark the "critical" elements in red.

Thanks, Martin.  I understand your comments.

Upon further consideration, I would rather take the approach to develop PULSEreaderXXX subclass of PULSEreader for our underwater LiDAR-XXX in order to leverage the other PulseTools.

Therefore, I would like to request access to the C++ source code for pulse2pulse and pulseinfo in order to start to extend PulseTools to our LiDAR, and leverage the existing (and correct) pulsewriter_pls code.  Additionally, I would like to request access to the pulseextract source code too -- we would like to contribute a more robust pulse deconvolution program to this Open Source project.

Can you entertain these requests?  We're moving quickly (first sea trials in late March), so I would like to get pulse2pulse and pulseinfo before then.

Thanks for your consideration.

/eric rehm
Université Laval

p.s.  Nice interviews recently on the Points + Pixels podcast!
Reply all
Reply to author
Forward
0 new messages