VisionaryTMiniData.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 <cstdio>
7 
8 #include "VisionaryEndian.h"
9 #include "VisionaryTMiniData.h"
10 
11 #include <iostream>
12 // Boost library used for parseXML function
13 #if defined(__GNUC__) // GCC compiler
14 # pragma GCC diagnostic push // Save warning levels for later restoration
15 # pragma GCC diagnostic ignored "-Wpragmas"
16 # pragma GCC diagnostic ignored "-Wsign-conversion"
17 # pragma GCC diagnostic ignored "-Wold-style-cast"
18 # pragma GCC diagnostic ignored "-Wdeprecated-copy"
19 # pragma GCC diagnostic ignored "-Wshadow"
20 # pragma GCC diagnostic ignored "-Wparentheses"
21 # pragma GCC diagnostic ignored "-Wcast-align"
22 # pragma GCC diagnostic ignored "-Wstrict-overflow"
23 # pragma GCC diagnostic ignored "-Wdeprecated-declarations"
24 #endif
25 
26 #include <boost/foreach.hpp>
28 
29 #if defined(__GNUC__) // GCC compiler
30 # pragma GCC diagnostic pop // Restore previous warning levels
31 #endif
32 
33 namespace visionary {
34 
36 {
38  return t;
39 }
40 
41 const float VisionaryTMiniData::DISTANCE_MAP_UNIT = 0.25f;
42 
44  : VisionaryData(), m_dataSetsActive(), m_distanceByteDepth(0), m_intensityByteDepth(0), m_stateByteDepth(0)
45 {
46 }
47 
49 
50 bool VisionaryTMiniData::parseXML(const std::string& xmlString, uint32_t changeCounter)
51 {
52  //-----------------------------------------------
53  // Check if the segment data changed since last receive
54  if (m_changeCounter == changeCounter)
55  {
56  return true; // Same XML content as on last received blob
57  }
58  m_changeCounter = changeCounter;
60 
61  //-----------------------------------------------
62  // Build boost::property_tree for easy XML handling
64  std::istringstream ss(xmlString);
65  try
66  {
68  }
69  catch (...)
70  {
71  std::cout << "Reading XML tree in BLOB failed." << std::endl;
72  return false;
73  }
74 
75  //-----------------------------------------------
76  // Extract information stored in XML with boost::property_tree
77  const boost::property_tree::ptree dataSetsTree = xmlTree.get_child("SickRecord.DataSets", empty_ptree());
78  m_dataSetsActive.hasDataSetDepthMap = static_cast<bool>(dataSetsTree.get_child_optional("DataSetDepthMap"));
79 
80  // DataSetDepthMap specific data
81  {
82  boost::property_tree::ptree dataStreamTree =
83  dataSetsTree.get_child("DataSetDepthMap.FormatDescriptionDepthMap.DataStream", empty_ptree());
84 
85  m_cameraParams.width = dataStreamTree.get<int>("Width", 0);
86  m_cameraParams.height = dataStreamTree.get<int>("Height", 0);
87 
89  {
90  int i = 0;
92  dataStreamTree.get_child("CameraToWorldTransform"))
93  {
94  m_cameraParams.cam2worldMatrix[i] = item.second.get_value<double>(0.);
95  ++i;
96  }
97  }
98  else
99  {
100  std::fill_n(m_cameraParams.cam2worldMatrix, 16, 0.0);
101  }
102 
103  m_cameraParams.fx = dataStreamTree.get<double>("CameraMatrix.FX", 0.0);
104  m_cameraParams.fy = dataStreamTree.get<double>("CameraMatrix.FY", 0.0);
105  m_cameraParams.cx = dataStreamTree.get<double>("CameraMatrix.CX", 0.0);
106  m_cameraParams.cy = dataStreamTree.get<double>("CameraMatrix.CY", 0.0);
107 
108  m_cameraParams.k1 = dataStreamTree.get<double>("CameraDistortionParams.K1", 0.0);
109  m_cameraParams.k2 = dataStreamTree.get<double>("CameraDistortionParams.K2", 0.0);
110  m_cameraParams.p1 = dataStreamTree.get<double>("CameraDistortionParams.P1", 0.0);
111  m_cameraParams.p2 = dataStreamTree.get<double>("CameraDistortionParams.P2", 0.0);
112  m_cameraParams.k3 = dataStreamTree.get<double>("CameraDistortionParams.K3", 0.0);
113 
114  m_cameraParams.f2rc = dataStreamTree.get<double>("FocalToRayCross", 0.0);
115 
116  m_distanceByteDepth = getItemLength(dataStreamTree.get<std::string>("Distance", ""));
117  m_intensityByteDepth = getItemLength(dataStreamTree.get<std::string>("Intensity", ""));
118  m_stateByteDepth = getItemLength(dataStreamTree.get<std::string>("Confidence", ""));
119 
120  // const auto distanceDecimalExponent = dataStreamTree.get<int>("Distance.<xmlattr>.decimalexponent", 0);
121  // Scaling is fixed to 0.25mm on ToF Mini
123  }
124 
125  return true;
126 }
127 
128 bool VisionaryTMiniData::parseBinaryData(std::vector<uint8_t>::iterator itBuf, size_t size)
129 {
130  if (m_cameraParams.height < 1 || m_cameraParams.width < 1)
131  {
132  std::cout << __FUNCTION__ << ": Invalid image size" << std::endl;
133  return false;
134  }
135  size_t dataSetslength = 0;
136  auto remainingSize = size;
137 
139  {
140  const size_t numPixel = static_cast<size_t>(m_cameraParams.width * m_cameraParams.height);
141  const size_t numBytesDistance = numPixel * static_cast<size_t>(m_distanceByteDepth);
142  const size_t numBytesIntensity = numPixel * static_cast<size_t>(m_intensityByteDepth);
143  const size_t numBytesState = numPixel * static_cast<size_t>(m_stateByteDepth);
144  const size_t headerSize = 4u + 8u + 2u; // Length(32bit) + TimeStamp(64bit) + version(16bit)
145 
146  if (remainingSize < headerSize)
147  {
148  std::cout << "Malformed data. Did not receive enough data to parse header of binary segment" << std::endl;
149  return false;
150  }
151  remainingSize -= headerSize;
152 
153  //-----------------------------------------------
154  // The binary part starts with entries for length, a timestamp
155  // and a version identifier
156  const auto length = readUnalignLittleEndian<uint32_t>(&*itBuf);
157  dataSetslength += length;
158  if (dataSetslength > size)
159  {
160  std::cout << "Malformed data, length in depth map header does not match package size." << std::endl;
161  return false;
162  }
163  itBuf += sizeof(uint32_t);
164 
165  m_blobTimestamp = readUnalignLittleEndian<uint64_t>(&*itBuf);
166  itBuf += sizeof(uint64_t);
167 
168  const auto version = readUnalignLittleEndian<uint16_t>(&*itBuf);
169  itBuf += sizeof(uint16_t);
170 
171  //-----------------------------------------------
172  // The content of the Data part inside a data set has changed since the first released version.
173  if (version > 1)
174  {
175  const size_t extendedHeaderSize = 4u + 1u + 1u; // Framenumber(32bit) + dataQuality(8bit) + deviceStatus(8bit)
176  if (remainingSize < extendedHeaderSize)
177  {
178  std::cout << "Malformed data. Did not receive enough data to parse extended header of binary segment"
179  << std::endl;
180  return false;
181  }
182  remainingSize -= extendedHeaderSize;
183  // more frame information follows in this case: frame number, data quality, device status
184  m_frameNum = readUnalignLittleEndian<uint32_t>(&*itBuf);
185  itBuf += sizeof(uint32_t);
186 
187  // const uint8_t dataQuality = readUnalignLittleEndian<uint8_t>(&*itBuf);
188  itBuf += sizeof(uint8_t);
189 
190  // const uint8_t deviceStatus = readUnalignLittleEndian<uint8_t>(&*itBuf);
191  itBuf += sizeof(uint8_t);
192  }
193  else
194  {
195  ++m_frameNum;
196  }
197 
198  //-----------------------------------------------
199  // Extract the Images depending on the informations extracted from the XML part
200  const auto imageSetSize = (numBytesDistance + numBytesIntensity + numBytesState);
201  if (remainingSize < imageSetSize)
202  {
203  std::cout << "Malformed data. Did not receive enough data to parse images of binary segment" << std::endl;
204  return false;
205  }
206  remainingSize -= imageSetSize;
207  if (numBytesDistance != 0)
208  {
209  m_distanceMap.resize(numPixel);
210  memcpy((m_distanceMap).data(), &*itBuf, numBytesDistance);
211  std::advance(itBuf, numBytesDistance);
212  }
213  else
214  {
215  m_distanceMap.clear();
216  }
217  if (numBytesIntensity != 0)
218  {
219  m_intensityMap.resize(numPixel);
220  memcpy((m_intensityMap).data(), &*itBuf, numBytesIntensity);
221  std::advance(itBuf, numBytesIntensity);
222  }
223  else
224  {
225  m_intensityMap.clear();
226  }
227  if (numBytesState != 0)
228  {
229  m_stateMap.resize(numPixel);
230  memcpy((m_stateMap).data(), &*itBuf, numBytesState);
231  std::advance(itBuf, numBytesState);
232  }
233  else
234  {
235  m_stateMap.clear();
236  }
237 
238  const auto footerSize = (4u + 4u); // CRC(32bit) + LengthCopy(32bit)
239  if (remainingSize < footerSize)
240  {
241  std::cout << "Malformed data. Did not receive enough data to parse footer of binary segment" << std::endl;
242  return false;
243  }
244 
245  //-----------------------------------------------
246  // Data ends with a (unused) 4 Byte CRC field and a copy of the length byte
247  // const uint32_t unusedCrc = readUnalignLittleEndian<uint32_t>(&*itBuf);
248  itBuf += sizeof(uint32_t);
249 
250  const auto lengthCopy = readUnalignLittleEndian<uint32_t>(&*itBuf);
251  itBuf += sizeof(uint32_t);
252 
253  if (length != lengthCopy)
254  {
255  std::cout << "Malformed data, length in header(" << length << ") does not match package size(" << lengthCopy
256  << ")." << std::endl;
257  return false;
258  }
259  }
260  else
261  {
262  m_distanceMap.clear();
263  m_intensityMap.clear();
264  m_stateMap.clear();
265  }
266 
267  return true;
268 }
269 
270 void VisionaryTMiniData::generatePointCloud(std::vector<PointXYZ>& pointCloud)
271 {
273 }
274 
275 const std::vector<uint16_t>& VisionaryTMiniData::getDistanceMap() const
276 {
277  return m_distanceMap;
278 }
279 
280 const std::vector<uint16_t>& VisionaryTMiniData::getIntensityMap() const
281 {
282  return m_intensityMap;
283 }
284 
285 const std::vector<uint16_t>& VisionaryTMiniData::getStateMap() const
286 {
287  return m_stateMap;
288 }
289 
290 } // namespace visionary
visionary::VisionaryTMiniData::m_intensityMap
std::vector< std::uint16_t > m_intensityMap
Definition: VisionaryTMiniData.h:65
visionary::VisionaryTMiniData::VisionaryTMiniData
VisionaryTMiniData()
Definition: VisionaryTMiniData.cpp:43
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::VisionaryTMiniData::getStateMap
const std::vector< std::uint16_t > & getStateMap() const
Definition: VisionaryTMiniData.cpp:285
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
visionary::VisionaryTMiniData::m_intensityByteDepth
std::size_t m_intensityByteDepth
Definition: VisionaryTMiniData.h:61
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::VisionaryTMiniData::m_stateByteDepth
std::size_t m_stateByteDepth
Definition: VisionaryTMiniData.h:61
xml_parser.hpp
visionary::CameraParameters::k3
double k3
Definition: VisionaryData.h:29
boost::property_tree::basic_ptree::get_child_optional
optional< self_type & > get_child_optional(const path_type &path)
Definition: ptree_implementation.hpp:610
visionary::VisionaryTMiniData::~VisionaryTMiniData
~VisionaryTMiniData() override
data
data
visionary::VisionaryData::m_preCalcCamInfoType
ImageType m_preCalcCamInfoType
Definition: VisionaryData.h:139
visionary::VisionaryTMiniData::m_distanceByteDepth
std::size_t m_distanceByteDepth
Definition: VisionaryTMiniData.h:61
visionary::VisionaryTMiniData::getDistanceMap
const std::vector< std::uint16_t > & getDistanceMap() const
Definition: VisionaryTMiniData.cpp:275
visionary::VisionaryData::getItemLength
std::size_t getItemLength(const std::string &dataType) const
Definition: VisionaryData.cpp:36
visionary::VisionaryTMiniData::getIntensityMap
const std::vector< std::uint16_t > & getIntensityMap() const
Definition: VisionaryTMiniData.cpp:280
visionary::VisionaryTMiniData::parseBinaryData
bool parseBinaryData(std::vector< uint8_t >::iterator itBuf, std::size_t size) override
Definition: VisionaryTMiniData.cpp:128
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::VisionaryTMiniData::m_dataSetsActive
DataSetsActive m_dataSetsActive
Definition: VisionaryTMiniData.h:58
visionary::VisionaryData
Definition: VisionaryData.h:49
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::CameraParameters::k2
double k2
Definition: VisionaryData.h:29
visionary::VisionaryTMiniData::m_stateMap
std::vector< std::uint16_t > m_stateMap
Definition: VisionaryTMiniData.h:66
visionary::CameraParameters::width
int width
The width of the frame in pixels.
Definition: VisionaryData.h:23
visionary::VisionaryTMiniData::m_distanceMap
std::vector< std::uint16_t > m_distanceMap
Definition: VisionaryTMiniData.h:64
VisionaryTMiniData.h
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)
BOOST_FOREACH
#define BOOST_FOREACH(VAR, COL)
Definition: foreach.hpp:1098
visionary::VisionaryTMiniData::generatePointCloud
void generatePointCloud(std::vector< PointXYZ > &pointCloud) override
Definition: VisionaryTMiniData.cpp:270
visionary::CameraParameters::f2rc
double f2rc
FocalToRayCross - Correction Offset for depth info.
Definition: VisionaryData.h:31
visionary::VisionaryTMiniData::parseXML
bool parseXML(const std::string &xmlString, std::uint32_t changeCounter) override
Definition: VisionaryTMiniData.cpp:50
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::DataSetsActive::hasDataSetDepthMap
bool hasDataSetDepthMap
Definition: VisionaryData.h:36
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::empty_ptree
static const boost::property_tree::ptree & empty_ptree()
Definition: VisionaryTData.cpp:36
visionary::VisionaryTMiniData::DISTANCE_MAP_UNIT
static const float DISTANCE_MAP_UNIT
Definition: VisionaryTMiniData.h:40
visionary::VisionaryData::RADIAL
@ RADIAL
Definition: VisionaryData.h:100
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


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