compact_parser.h
Go to the documentation of this file.
1 #include "sick_scan/sick_scan_base.h" /* Base definitions included in all header files, added by add_sick_scan_base_header.py. Do not edit this line. */
2 /*
3  * @brief compact_parser parses and convertes scandata in compact format
4  *
5  * Copyright (C) 2020,2021 Ing.-Buero Dr. Michael Lehning, Hildesheim
6  * Copyright (C) 2020,2021 SICK AG, Waldkirch
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  * All rights reserved.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions are met:
24  *
25  * * Redistributions of source code must retain the above copyright
26  * notice, this list of conditions and the following disclaimer.
27  * * Redistributions in binary form must reproduce the above copyright
28  * notice, this list of conditions and the following disclaimer in the
29  * documentation and/or other materials provided with the distribution.
30  * * Neither the name of SICK AG nor the names of its
31  * contributors may be used to endorse or promote products derived from
32  * this software without specific prior written permission
33  * * Neither the name of Ing.-Buero Dr. Michael Lehning nor the names of its
34  * contributors may be used to endorse or promote products derived from
35  * this software without specific prior written permission
36  *
37  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
38  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
39  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
40  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
41  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
42  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
43  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
44  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
45  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
47  * POSSIBILITY OF SUCH DAMAGE.
48  *
49  * Authors:
50  * Michael Lehning <michael.lehning@lehning.de>
51  *
52  * Copyright 2020 SICK AG
53  * Copyright 2020 Ing.-Buero Dr. Michael Lehning
54  *
55  */
56 #ifndef __SICK_SCANSEGMENT_XD_COMPACT_PARSER_H
57 #define __SICK_SCANSEGMENT_XD_COMPACT_PARSER_H
58 
65 
66 
67 namespace sick_scansegment_xd
68 {
69  /*
70  * @brief class CompactDataHeader is a container for the header of scandata in compact format
71  */
73  {
74  public:
75  uint32_t commandId = 0; // Telegram type, expected value: 1 for scan data, 2 for imu data
76  uint64_t telegramCounter = 0; // Incrementing telegram counter, starting with 1, number of telegrams since power on
77  uint64_t timeStampTransmit = 0; // Sensor timestamp in microseconds since 1.1.1970 00:00 UTC
78  uint32_t telegramVersion = 0; // Telegram version, expected value: 3
79  uint32_t sizeModule0 = 0; // Size of first module in byte
80  CompactImuData imudata; // IMU data in case of commandId == 2;
81  bool isImu() const { return commandId == 2 && imudata.valid; } // true if the telegram is imu data
82  std::string to_string() const; // returns a human readable description of the header data
83  }; // class CompactDataHeader
84 
85  /*
86  * @brief class CompactModuleMetaData is a container for the metadata of scandata module in compact format
87  */
89  {
90  public:
91  uint64_t SegmentCounter = 0; // Incrementing segment counter
92  uint64_t FrameNumber = 0; // Number of frames since power on
93  uint32_t SenderId = 0; // The serial number of the device
94  uint32_t NumberOfLinesInModule = 0; // Number of layers in this module
95  uint32_t NumberOfBeamsPerScan = 0; // Number of beams per layer (all layers have the same number of beams)
96  uint32_t NumberOfEchosPerBeam = 0; // Number of echos per beams
97  std::vector<uint64_t> TimeStampStart; // Array of timestamps of the first beam in a scan in microseconds, number of elements is numberOfLinesInModule
98  std::vector<uint64_t> TimeStampStop; // Array of timestamps of the last beam in a scan in microseconds, number of elements is numberOfLinesInModule
99  std::vector<float> Phi; // Array of elevation angles in radians for each layer in this module, number of elements is numberOfLinesInModule
100  std::vector<float> ThetaStart; // Array of azimuth angles in radians for first beam of each layer in this module, number of elements is numberOfLinesInModule
101  std::vector<float> ThetaStop; // Array of azimuth angles in radians for last beam of each layer in this module, number of elements is numberOfLinesInModule
102  float DistanceScalingFactor = 1; // Scaling factor for 16-bit distance values: distance_mm = DistanceScalingFactor * distance_16bit_sensor
103  uint32_t NextModuleSize = 0; // Size of the next module (or 0 if this module is the last one)
104  uint8_t Availability = 0; // Reserved for futher use (flag indication distortion in scan data)
105  uint8_t DataContentEchos = 0; // Bitarray: (DataContentEchos & 0x01) == 0x01 if distance values available, (DataContentEchos & 0x02) == 0x02 if RSSI values available, (DataContentEchos & 0x03) == 0x03: distance and RSSI values available
106  uint8_t DataContentBeams = 0; // Bitarray: (DataContentBeams & 0x01) == 0x01 if beam properties available, (DataContentBeams & 0x02) == 0x02 if azimuth angle per beam available, (DataContentBeams & 0x03) == 0x03: both available
107  uint8_t reserved = 0; // Reserved for 32 bit alignment
108  bool valid = false; // valid flag set true after successful parsing
109  std::string to_string() const; // returns a human readable description of the module metadata
110  }; // class CompactModuleMetaData
111 
112  /*
113  * @brief class CompactModuleMeasurementData is a container for measurement data of a module in compact format
114  */
116  {
117  public:
118  std::vector<ScanSegmentParserOutput::Scangroup> scandata; // measurement data converted to ScanSegmentParserOutput scanlines
119  bool valid = false; // valid flag set true after successful parsing
120  std::string to_string() const; // returns a human readable description of the module measurement data
121  }; // class CompactModuleMeasurementData
122 
123  /*
124  * @brief class CompactModuleData is a container for meta and measurement data of a module in compact format
125  */
127  {
128  public:
131  }; // class CompactModuleData
132 
133  /*
134  * @brief class CompactSegmentData is a container for segment data in compact format
135  */
137  {
138  public:
140  std::vector<CompactModuleData> segmentModules;
141  }; // class CompactSegmentData
142 
143  /*
144  * @brief class CompactDataParser parses scandata in compact format
145  */
147  {
148  public:
149 
150  /*
151  * @brief Parses scandata header in compact format.
152  * @param[in] scandata 32 byte scandata header
153  */
154  static CompactDataHeader ParseHeader(const uint8_t* scandata);
155 
156  /*
157  * @brief Parses module meta data in compact format.
158  * @param[in] scandata received bytes
159  * @param[in] module_size Number of bytes to parse
160  * @param[in] telegramVersion compact format version, currently version 3 and 4 supported
161  * @param[out] module_metadata_size number of bytes parsed (i.e. size of meta data in bytes if successful, i.e. if metadata.valid == true)
162  */
163  static CompactModuleMetaData ParseModuleMetaData(const uint8_t* scandata, uint32_t module_size, uint32_t telegramVersion, uint32_t& module_metadata_size);
164 
165  /*
166  * @brief Parses module measurement data in compact format.
167  * @param[in] payload binary payload
168  * @param[in] num_bytes size of binary payload in bytes
169  * @param[in] meta_data module metadata with measurement properties
170  * @param[out] measurement_data parsed and converted module measurement data
171  * @return true on success, false on error
172  */
173  static bool ParseModuleMeasurementData(const uint8_t* payload, uint32_t num_bytes, const sick_scansegment_xd::CompactDataHeader& compact_header,
174  const sick_scansegment_xd::CompactModuleMetaData& meta_data, float azimuth_offset, sick_scansegment_xd::CompactModuleMeasurementData& measurement_data);
175 
176  /*
177  * @brief Parses a scandata segment in compact format.
178  * @param[in] payload binary payload
179  * @param[in] bytes_received size of binary payload in bytes
180  * @param[out] segment_data parsed segment data (or 0 if not required)
181  * @param[out] payload_length_bytes parsed number of bytes
182  * @param[out] num_bytes_required min number of bytes required for successful parsing
183  * @param[in] azimuth_offset optional offset in case of additional coordinate transform (default: 0)
184  * @param[in] verbose > 0: print debug messages (default: 0)
185  */
186  static bool ParseSegment(const uint8_t* payload, size_t bytes_received, sick_scansegment_xd::CompactSegmentData* segment_data,
187  uint32_t& payload_length_bytes, uint32_t& num_bytes_required , float azimuth_offset = 0, int verbose = 0);
188 
189  /*
190  * @brief Parses a scandata segment in compact format.
191  * @param[in] parser_config configuration and settings for multiScan and picoScan parser
192  * @param[in] payload binary segment data in compact format
193  * @param[in] system_timestamp receive timestamp of segment_data (system time)
194  * @param[in] add_transform_xyz_rpy Optionally apply an additional transform to the cartesian pointcloud, default: "0,0,0,0,0,0" (i.e. no transform)
195  * @param[out] result scandata converted to ScanSegmentParserOutput
196  * @param[in] use_software_pll true (default): result timestamp from sensor ticks by software pll, false: result timestamp from msg receiving
197  * @param[in] verbose true: enable debug output, false: quiet mode
198  */
199  static bool Parse(const ScanSegmentParserConfig& parser_config, const std::vector<uint8_t>& payload, fifo_timestamp system_timestamp, sick_scan_xd::SickCloudTransform& add_transform_xyz_rpy,
200  ScanSegmentParserOutput& result, bool use_software_pll = true, bool verbose = false);
201 
202  /*
203  * @brief Sets the elevation in mdeg for layers in compact format.
204  * @param[in] layer_elevation_table_mdeg layer_elevation_table_mdeg[layer_idx] := ideal elevation in mdeg
205  */
206  static void SetLayerElevationTable(const std::vector<int>& layer_elevation_table_mdeg);
207 
208  /*
209  * @brief Return a layer-id from a given elevation angle. See compact scanformat documention:
210  * The line/layer index in the figure below is not a layer id according to layer numbering for multi layer sensors.
211  * Therefore this functions returns a layer-id from the elevation angle in rad.
212  * @param[in] layer_elevation_rad layer_elevation in radians
213  * @return layer-id
214  */
215  static int GetLayerIDfromElevation(float layer_elevation_rad);
216 
217  /*
218  * @brief Return the typical (default) elevation of a given layer index
219  * @param[in] layer_idx layer index
220  * @return layer elevation in degree
221  */
222  static float GetElevationDegFromLayerIdx(int layer_idx);
223 
224  }; // class CompactDataParser
225 
226 } // namespace sick_scansegment_xd
227 #endif // __SICK_SCANSEGMENT_XD_COMPACT_PARSER_H
common.h
sick_scansegment_xd::CompactModuleMetaData::NumberOfEchosPerBeam
uint32_t NumberOfEchosPerBeam
Definition: compact_parser.h:96
sick_cloud_transform.h
sick_scansegment_xd::CompactModuleMetaData::FrameNumber
uint64_t FrameNumber
Definition: compact_parser.h:92
sick_scansegment_xd::CompactModuleMetaData::SenderId
uint32_t SenderId
Definition: compact_parser.h:93
sick_scansegment_xd::CompactDataHeader::imudata
CompactImuData imudata
Definition: compact_parser.h:80
sick_scansegment_xd::CompactDataHeader::timeStampTransmit
uint64_t timeStampTransmit
Definition: compact_parser.h:77
sick_scansegment_xd::CompactDataParser::SetLayerElevationTable
static void SetLayerElevationTable(const std::vector< int > &layer_elevation_table_mdeg)
Definition: compact_parser.cpp:430
sick_scan_xd::SickCloudTransform
Definition: sick_cloud_transform.h:85
sick_scansegment_xd::CompactDataHeader::telegramCounter
uint64_t telegramCounter
Definition: compact_parser.h:76
sick_scansegment_xd::CompactDataHeader::sizeModule0
uint32_t sizeModule0
Definition: compact_parser.h:79
sick_scansegment_xd::CompactModuleMetaData::TimeStampStop
std::vector< uint64_t > TimeStampStop
Definition: compact_parser.h:98
sick_scansegment_xd
Definition: include/sick_scansegment_xd/common.h:138
sick_scansegment_xd::CompactModuleMetaData::DistanceScalingFactor
float DistanceScalingFactor
Definition: compact_parser.h:102
sick_scansegment_xd::CompactModuleMetaData::NextModuleSize
uint32_t NextModuleSize
Definition: compact_parser.h:103
fifo.h
sick_scansegment_xd::CompactModuleMetaData::reserved
uint8_t reserved
Definition: compact_parser.h:107
sick_scansegment_xd::CompactModuleMeasurementData::scandata
std::vector< ScanSegmentParserOutput::Scangroup > scandata
Definition: compact_parser.h:118
sick_scansegment_xd::CompactModuleMetaData::NumberOfBeamsPerScan
uint32_t NumberOfBeamsPerScan
Definition: compact_parser.h:95
sick_scansegment_xd::CompactModuleData
Definition: compact_parser.h:126
sick_scansegment_xd::CompactDataParser
Definition: compact_parser.h:146
scansegment_parser_output.h
sick_scansegment_xd::CompactSegmentData::segmentHeader
CompactDataHeader segmentHeader
Definition: compact_parser.h:139
sick_range_filter.h
sick_scansegment_xd::CompactSegmentData
Definition: compact_parser.h:136
sick_ros_wrapper.h
multiscan_pcap_player.verbose
int verbose
Definition: multiscan_pcap_player.py:142
sick_scansegment_xd::CompactModuleMetaData::DataContentBeams
uint8_t DataContentBeams
Definition: compact_parser.h:106
sick_scansegment_xd::CompactModuleMetaData::to_string
std::string to_string() const
Definition: compact_parser.cpp:190
pcap_json_converter.payload
string payload
Definition: pcap_json_converter.py:130
sick_scansegment_xd::CompactSegmentData::segmentModules
std::vector< CompactModuleData > segmentModules
Definition: compact_parser.h:140
sick_scansegment_xd::ScanSegmentParserOutput
Definition: scansegment_parser_output.h:118
sick_scansegment_xd::CompactDataParser::ParseModuleMeasurementData
static bool ParseModuleMeasurementData(const uint8_t *payload, uint32_t num_bytes, const sick_scansegment_xd::CompactDataHeader &compact_header, const sick_scansegment_xd::CompactModuleMetaData &meta_data, float azimuth_offset, sick_scansegment_xd::CompactModuleMeasurementData &measurement_data)
Definition: compact_parser.cpp:501
sick_scansegment_xd::CompactModuleMeasurementData
Definition: compact_parser.h:115
sick_scansegment_xd::CompactDataHeader::isImu
bool isImu() const
Definition: compact_parser.h:81
sick_scansegment_xd::CompactModuleMetaData::valid
bool valid
Definition: compact_parser.h:108
sick_scansegment_xd::CompactDataHeader::telegramVersion
uint32_t telegramVersion
Definition: compact_parser.h:78
sick_scansegment_xd::CompactModuleMetaData::ThetaStop
std::vector< float > ThetaStop
Definition: compact_parser.h:101
sick_scansegment_xd::CompactModuleMetaData::ThetaStart
std::vector< float > ThetaStart
Definition: compact_parser.h:100
sick_scansegment_xd::CompactDataParser::Parse
static bool Parse(const ScanSegmentParserConfig &parser_config, const std::vector< uint8_t > &payload, fifo_timestamp system_timestamp, sick_scan_xd::SickCloudTransform &add_transform_xyz_rpy, ScanSegmentParserOutput &result, bool use_software_pll=true, bool verbose=false)
Definition: compact_parser.cpp:864
fifo_timestamp
std::chrono::time_point< std::chrono::system_clock > fifo_timestamp
Definition: fifo.h:68
sick_scansegment_xd::CompactModuleMetaData::SegmentCounter
uint64_t SegmentCounter
Definition: compact_parser.h:91
sick_scansegment_xd::CompactModuleData::moduleMetadata
CompactModuleMetaData moduleMetadata
Definition: compact_parser.h:129
sick_scansegment_xd::CompactDataParser::ParseSegment
static bool ParseSegment(const uint8_t *payload, size_t bytes_received, sick_scansegment_xd::CompactSegmentData *segment_data, uint32_t &payload_length_bytes, uint32_t &num_bytes_required, float azimuth_offset=0, int verbose=0)
Definition: compact_parser.cpp:695
sick_scansegment_xd::CompactModuleMeasurementData::valid
bool valid
Definition: compact_parser.h:119
sick_scansegment_xd::CompactModuleMeasurementData::to_string
std::string to_string() const
Definition: compact_parser.cpp:224
sick_scansegment_xd::CompactModuleMetaData::TimeStampStart
std::vector< uint64_t > TimeStampStart
Definition: compact_parser.h:97
sick_scansegment_xd::CompactModuleMetaData::DataContentEchos
uint8_t DataContentEchos
Definition: compact_parser.h:105
sick_scansegment_xd::CompactDataParser::ParseHeader
static CompactDataHeader ParseHeader(const uint8_t *scandata)
Definition: compact_parser.cpp:254
sick_scansegment_xd::CompactDataParser::GetElevationDegFromLayerIdx
static float GetElevationDegFromLayerIdx(int layer_idx)
Definition: compact_parser.cpp:483
sick_scansegment_xd::CompactDataHeader::commandId
uint32_t commandId
Definition: compact_parser.h:75
sick_scan_base.h
sick_scansegment_xd::CompactModuleMetaData::Phi
std::vector< float > Phi
Definition: compact_parser.h:99
sick_scansegment_xd::CompactDataHeader
Definition: compact_parser.h:72
sick_scansegment_xd::CompactDataParser::ParseModuleMetaData
static CompactModuleMetaData ParseModuleMetaData(const uint8_t *scandata, uint32_t module_size, uint32_t telegramVersion, uint32_t &module_metadata_size)
Definition: compact_parser.cpp:320
sick_scansegment_xd::ScanSegmentParserConfig
Definition: scansegment_parser_output.h:91
sick_scansegment_xd::CompactModuleMetaData
Definition: compact_parser.h:88
sick_scansegment_xd::CompactModuleMetaData::NumberOfLinesInModule
uint32_t NumberOfLinesInModule
Definition: compact_parser.h:94
sick_scansegment_xd::CompactImuData
Definition: scansegment_parser_output.h:101
sick_scansegment_xd::CompactModuleMetaData::Availability
uint8_t Availability
Definition: compact_parser.h:104
sick_scansegment_xd::CompactDataHeader::to_string
std::string to_string() const
Definition: compact_parser.cpp:171
sick_scansegment_xd::CompactImuData::valid
bool valid
Definition: scansegment_parser_output.h:104
sick_scansegment_xd::CompactModuleData::moduleMeasurement
CompactModuleMeasurementData moduleMeasurement
Definition: compact_parser.h:130
sick_scansegment_xd::CompactDataParser::GetLayerIDfromElevation
static int GetLayerIDfromElevation(float layer_elevation_rad)
Definition: compact_parser.cpp:442


sick_scan_xd
Author(s): Michael Lehning , Jochen Sprickerhof , Martin Günther
autogenerated on Fri Oct 25 2024 02:47:08