VisionarySData.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2023 SICK AG, Waldkirch
3 //
4 // SPDX-License-Identifier: Unlicense
5 
6 #include <cmath>
7 #include <cstdio>
8 
9 #include "VisionaryEndian.h"
10 #include "VisionarySData.h"
11 
12 #include <iostream>
13 // Boost library used for parseXML function
14 #if defined(__GNUC__) // GCC compiler
15 # pragma GCC diagnostic push // Save warning levels for later restoration
16 # pragma GCC diagnostic ignored "-Wpragmas"
17 # pragma GCC diagnostic ignored "-Wsign-conversion"
18 # pragma GCC diagnostic ignored "-Wold-style-cast"
19 # pragma GCC diagnostic ignored "-Wdeprecated-copy"
20 # pragma GCC diagnostic ignored "-Wshadow"
21 # pragma GCC diagnostic ignored "-Wparentheses"
22 # pragma GCC diagnostic ignored "-Wcast-align"
23 # pragma GCC diagnostic ignored "-Wstrict-overflow"
24 # pragma GCC diagnostic ignored "-Wdeprecated-declarations"
25 #endif
26 
27 #include <boost/foreach.hpp>
29 
30 #if defined(__GNUC__) // GCC compiler
31 # pragma GCC diagnostic pop // Restore previous warning levels
32 #endif
33 
34 namespace visionary {
35 
36 VisionarySData::VisionarySData() : VisionaryData(), m_zByteDepth(0), m_rgbaByteDepth(0), m_confidenceByteDepth(0)
37 {
38 }
39 
41 
42 bool VisionarySData::parseXML(const std::string& xmlString, uint32_t changeCounter)
43 {
44  //-----------------------------------------------
45  // Check if the segment data changed since last receive
46  if (m_changeCounter == changeCounter)
47  {
48  return true; // Same XML content as on last received blob
49  }
50  m_changeCounter = changeCounter;
52 
53  //-----------------------------------------------
54  // Build boost::property_tree for easy XML handling
56  std::istringstream ss(xmlString);
57  try
58  {
60  }
61  catch (...)
62  {
63  std::cout << "Reading XML tree in BLOB failed." << std::endl;
64  return false;
65  }
66 
67  boost::property_tree::ptree dataStreamTree =
68  xmlTree.get_child("SickRecord.DataSets.DataSetStereo.FormatDescriptionDepthMap.DataStream");
69 
70  //-----------------------------------------------
71  // Extract information stored in XML with boost::property_tree
72  m_cameraParams.width = dataStreamTree.get<int>("Width", 0);
73  m_cameraParams.height = dataStreamTree.get<int>("Height", 0);
74 
75  int i = 0;
76 
78  dataStreamTree.get_child("CameraToWorldTransform"))
79  {
80  m_cameraParams.cam2worldMatrix[i] = item.second.get_value<double>(0.);
81  ++i;
82  }
83 
84  m_cameraParams.fx = dataStreamTree.get<double>("CameraMatrix.FX", 0.0);
85  m_cameraParams.fy = dataStreamTree.get<double>("CameraMatrix.FY", 0.0);
86  m_cameraParams.cx = dataStreamTree.get<double>("CameraMatrix.CX", 0.0);
87  m_cameraParams.cy = dataStreamTree.get<double>("CameraMatrix.CY", 0.0);
88 
89  m_cameraParams.k1 = dataStreamTree.get<double>("CameraDistortionParams.K1", 0.0);
90  m_cameraParams.k2 = dataStreamTree.get<double>("CameraDistortionParams.K2", 0.0);
91  m_cameraParams.p1 = dataStreamTree.get<double>("CameraDistortionParams.P1", 0.0);
92  m_cameraParams.p2 = dataStreamTree.get<double>("CameraDistortionParams.P2", 0.0);
93  m_cameraParams.k3 = dataStreamTree.get<double>("CameraDistortionParams.K3", 0.0);
94 
95  m_cameraParams.f2rc = dataStreamTree.get<double>("FocalToRayCross", 0.0);
96 
97  m_zByteDepth = getItemLength(dataStreamTree.get<std::string>("Z", ""));
98  m_rgbaByteDepth = getItemLength(dataStreamTree.get<std::string>("Intensity", ""));
99  m_confidenceByteDepth = getItemLength(dataStreamTree.get<std::string>("Confidence", ""));
100 
101  const auto distanceDecimalExponent = dataStreamTree.get<int>("Z.<xmlattr>.decimalexponent", 0);
102  m_scaleZ = powf(10.0f, static_cast<float>(distanceDecimalExponent));
103 
104  return true;
105 }
106 
107 bool VisionarySData::parseBinaryData(std::vector<uint8_t>::iterator itBuf, size_t size)
108 {
109  if (m_cameraParams.height < 1 || m_cameraParams.width < 1)
110  {
111  std::cout << __FUNCTION__ << ": Invalid Image size" << std::endl;
112  return false;
113  }
114  auto remainingSize = size;
115  const size_t numPixel = static_cast<size_t>(m_cameraParams.width * m_cameraParams.height);
116  const size_t numBytesZ = numPixel * static_cast<size_t>(m_zByteDepth);
117  const size_t numBytesRGBA = numPixel * static_cast<size_t>(m_rgbaByteDepth);
118  const size_t numBytesConfidence = numPixel * static_cast<size_t>(m_confidenceByteDepth);
119  const size_t headerSize = 4u + 8u + 2u; // Length(32bit) + TimeStamp(64bit) + version(16bit)
120 
121  if (remainingSize < headerSize)
122  {
123  std::cout << "Malformed data. Did not receive enough data to parse header of binary segment" << std::endl;
124  return false;
125  }
126  remainingSize -= headerSize;
127 
128  //-----------------------------------------------
129  // The binary part starts with entries for length, a timestamp
130  // and a version identifier
131  const auto length = readUnalignLittleEndian<uint32_t>(&*itBuf);
132  if (length > size)
133  {
134  std::cout << "Malformed data, length in depth map header does not match package size." << std::endl;
135  return false;
136  }
137 
138  itBuf += sizeof(uint32_t);
139 
140  m_blobTimestamp = readUnalignLittleEndian<uint64_t>(&*itBuf);
141  itBuf += sizeof(uint64_t);
142 
143  const auto version = readUnalignLittleEndian<uint16_t>(&*itBuf);
144  itBuf += sizeof(uint16_t);
145 
146  //-----------------------------------------------
147  // The content of the Data part inside a data set has changed since the first released version.
148  if (version > 1)
149  {
150  const size_t extendedHeaderSize = 4u + 1u + 1u; // Framenumber(32bit) + dataQuality(8bit) + deviceStatus(8bit)
151  if (remainingSize < extendedHeaderSize)
152  {
153  std::cout << "Malformed data. Did not receive enough data to parse extended header of binary segment"
154  << std::endl;
155  return false;
156  }
157  remainingSize -= extendedHeaderSize;
158  // more frame information follows in this case: frame number, data quality, device status
159  m_frameNum = readUnalignLittleEndian<uint32_t>(&*itBuf);
160  itBuf += sizeof(uint32_t);
161 
162  // const uint8_t dataQuality = readUnalignLittleEndian<uint8_t>(&*itBuf);
163  itBuf += sizeof(uint8_t);
164 
165  // const uint8_t deviceStatus = readUnalignLittleEndian<uint8_t>(&*itBuf);
166  itBuf += sizeof(uint8_t);
167  }
168  else
169  {
170  ++m_frameNum;
171  }
172 
173  //-----------------------------------------------
174  // Extract the Images depending on the informations extracted from the XML part
175  const auto imageSetSize = (numBytesZ + numBytesRGBA + numBytesConfidence);
176  if (remainingSize < imageSetSize)
177  {
178  std::cout << "Malformed data. Did not receive enough data to parse images of binary segment" << std::endl;
179  return false;
180  }
181  remainingSize -= imageSetSize;
182  m_zMap.resize(numPixel);
183  memcpy((m_zMap).data(), &*itBuf, numBytesZ);
184  std::advance(itBuf, numBytesZ);
185 
186  m_rgbaMap.resize(numPixel);
187  memcpy((m_rgbaMap).data(), &*itBuf, numBytesRGBA);
188  std::advance(itBuf, numBytesRGBA);
189 
190  m_confidenceMap.resize(numPixel);
191  memcpy((m_confidenceMap).data(), &*itBuf, numBytesConfidence);
192  std::advance(itBuf, numBytesConfidence);
193 
194  const auto footerSize = (4u + 4u); // CRC(32bit) + LengthCopy(32bit)
195  if (remainingSize < footerSize)
196  {
197  std::cout << "Malformed data. Did not receive enough data to parse images of binary segment" << std::endl;
198  return false;
199  }
200 
201  //-----------------------------------------------
202  // Data ends with a (unused) 4 Byte CRC field and a copy of the length byte
203  // const uint32_t unusedCrc = readUnalignLittleEndian<uint32_t>(&*itBuf);
204  itBuf += sizeof(uint32_t);
205 
206  const auto lengthCopy = readUnalignLittleEndian<uint32_t>(&*itBuf);
207  itBuf += sizeof(uint32_t);
208 
209  if (length != lengthCopy)
210  {
211  std::cout << "Malformed data, length in header does not match package size." << std::endl;
212  return false;
213  }
214 
215  return true;
216 }
217 
218 void VisionarySData::generatePointCloud(std::vector<PointXYZ>& pointCloud)
219 {
221 }
222 
223 const std::vector<uint16_t>& VisionarySData::getZMap() const
224 {
225  return m_zMap;
226 }
227 
228 const std::vector<uint32_t>& VisionarySData::getRGBAMap() const
229 {
230  return m_rgbaMap;
231 }
232 
233 const std::vector<uint16_t>& VisionarySData::getConfidenceMap() const
234 {
235  return m_confidenceMap;
236 }
237 
238 } // namespace visionary
visionary::CameraParameters::fy
double fy
Definition: VisionaryData.h:27
boost::property_tree::basic_ptree::get
boost::enable_if< detail::is_translator< Translator >, Type >::type get(const path_type &path, Translator tr) const
Definition: ptree_implementation.hpp:741
VisionaryEndian.h
visionary::CameraParameters::p1
double p1
Definition: VisionaryData.h:29
visionary::VisionaryData::UNKNOWN
@ UNKNOWN
Definition: VisionaryData.h:98
visionary::CameraParameters::cy
double cy
Definition: VisionaryData.h:27
visionary::VisionaryData::generatePointCloud
virtual void generatePointCloud(std::vector< PointXYZ > &pointCloud)=0
visionary
Definition: MD5.cpp:44
VisionarySData.h
visionary::VisionarySData::VisionarySData
VisionarySData()
Definition: VisionarySData.cpp:36
visionary::CameraParameters::fx
double fx
Camera Matrix.
Definition: VisionaryData.h:27
visionary::VisionaryData::m_frameNum
std::uint_fast32_t m_frameNum
Definition: VisionaryData.h:131
visionary::VisionaryData::m_changeCounter
std::uint_fast32_t m_changeCounter
Change counter to detect changes in XML.
Definition: VisionaryData.h:126
visionary::VisionarySData::parseBinaryData
bool parseBinaryData(std::vector< uint8_t >::iterator itBuf, std::size_t size) override
Definition: VisionarySData.cpp:107
visionary::VisionarySData::getConfidenceMap
const std::vector< std::uint16_t > & getConfidenceMap() const
Definition: VisionarySData.cpp:233
xml_parser.hpp
visionary::CameraParameters::k3
double k3
Definition: VisionaryData.h:29
visionary::VisionarySData::m_zMap
std::vector< std::uint16_t > m_zMap
Definition: VisionarySData.h:55
data
data
f
f
visionary::VisionarySData::m_confidenceMap
std::vector< std::uint16_t > m_confidenceMap
Definition: VisionarySData.h:57
visionary::VisionaryData::m_preCalcCamInfoType
ImageType m_preCalcCamInfoType
Definition: VisionaryData.h:139
visionary::VisionarySData::m_confidenceByteDepth
std::size_t m_confidenceByteDepth
Definition: VisionarySData.h:52
visionary::VisionaryData::getItemLength
std::size_t getItemLength(const std::string &dataType) const
Definition: VisionaryData.cpp:36
visionary::VisionaryData::PLANAR
@ PLANAR
Definition: VisionaryData.h:99
visionary::CameraParameters::cx
double cx
Definition: VisionaryData.h:27
visionary::CameraParameters::height
int height
The height of the frame in pixels.
Definition: VisionaryData.h:21
visionary::VisionaryData
Definition: VisionaryData.h:49
visionary::VisionarySData::generatePointCloud
void generatePointCloud(std::vector< PointXYZ > &pointCloud) override
Definition: VisionarySData.cpp:218
visionary::VisionaryData::m_scaleZ
float m_scaleZ
Factor to convert unit of distance image to mm.
Definition: VisionaryData.h:123
boost::iterators::i
D const & i
Definition: iterator_facade.hpp:956
visionary::VisionarySData::m_zByteDepth
std::size_t m_zByteDepth
Byte depth of images.
Definition: VisionarySData.h:52
visionary::CameraParameters::k2
double k2
Definition: VisionaryData.h:29
visionary::CameraParameters::width
int width
The width of the frame in pixels.
Definition: VisionaryData.h:23
visionary::VisionarySData::getZMap
const std::vector< std::uint16_t > & getZMap() const
Definition: VisionarySData.cpp:223
foreach.hpp
boost::property_tree::basic_ptree::value_type
std::pair< const Key, self_type > value_type
Definition: ptree.hpp:67
length
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
visionary::VisionarySData::getRGBAMap
const std::vector< std::uint32_t > & getRGBAMap() const
Definition: VisionarySData.cpp:228
visionary::VisionarySData::m_rgbaByteDepth
std::size_t m_rgbaByteDepth
Definition: VisionarySData.h:52
BOOST_FOREACH
#define BOOST_FOREACH(VAR, COL)
Definition: foreach.hpp:1098
visionary::VisionarySData::m_rgbaMap
std::vector< std::uint32_t > m_rgbaMap
Definition: VisionarySData.h:56
visionary::CameraParameters::f2rc
double f2rc
FocalToRayCross - Correction Offset for depth info.
Definition: VisionaryData.h:31
visionary::VisionaryData::m_cameraParams
CameraParameters m_cameraParams
Definition: VisionaryData.h:120
boost::property_tree::xml_parser::read_xml
void read_xml(std::basic_istream< typename Ptree::key_type::value_type > &stream, Ptree &pt, int flags=0)
Definition: xml_parser.hpp:46
visionary::CameraParameters::p2
double p2
Definition: VisionaryData.h:29
boost::property_tree::basic_ptree
Definition: ptree.hpp:48
visionary::CameraParameters::cam2worldMatrix
double cam2worldMatrix[4 *4]
Camera to world transformation matrix.
Definition: VisionaryData.h:25
boost::property_tree::basic_ptree::get_child
self_type & get_child(const path_type &path)
Definition: ptree_implementation.hpp:571
visionary::VisionaryData::m_blobTimestamp
std::uint64_t m_blobTimestamp
Definition: VisionaryData.h:135
visionary::CameraParameters::k1
double k1
Camera Distortion Parameters.
Definition: VisionaryData.h:29
visionary::VisionarySData::~VisionarySData
~VisionarySData() override
visionary::VisionarySData::parseXML
bool parseXML(const std::string &xmlString, std::uint32_t changeCounter) override
Definition: VisionarySData.cpp:42


sick_visionary_ros
Author(s): SICK AG TechSupport 3D Snapshot
autogenerated on Thu Feb 8 2024 03:56:19