DisparityConverter.cpp
Go to the documentation of this file.
1 
3 
4 namespace dai {
5 
6 namespace ros {
7 
8 DisparityConverter::DisparityConverter(const std::string frameName, float focalLength, float baseline, float minDepth, float maxDepth)
9  : _frameName(frameName), _focalLength(focalLength), _baseline(baseline / 100.0), _minDepth(minDepth / 100.0), _maxDepth(maxDepth / 100.0) {}
10 
11 void DisparityConverter::toRosMsg(std::shared_ptr<dai::ImgFrame> inData, std::deque<DisparityMsgs::DisparityImage>& outDispImageMsgs) {
12  auto tstamp = inData->getTimestamp();
13  DisparityMsgs::DisparityImage outDispImageMsg;
14  outDispImageMsg.header.frame_id = _frameName;
15  outDispImageMsg.f = _focalLength;
16  outDispImageMsg.min_disparity = _focalLength * _baseline / _maxDepth;
17  outDispImageMsg.max_disparity = _focalLength * _baseline / _minDepth;
18 
19 #ifdef IS_ROS2
20  auto rclNow = rclcpp::Clock().now();
21  auto steadyTime = std::chrono::steady_clock::now();
22  auto diffTime = steadyTime - tstamp;
23  auto rclStamp = rclNow - diffTime;
24  outDispImageMsg.header.stamp = rclStamp;
25  outDispImageMsg.t = _baseline / 100; // converting cm to meters
26  sensor_msgs::msg::Image& outImageMsg = outDispImageMsg.image;
27 #else
28  auto rosNow = ::ros::Time::now();
29  auto steadyTime = std::chrono::steady_clock::now();
30  auto diffTime = steadyTime - tstamp;
31  uint64_t nsec = rosNow.toNSec() - diffTime.count();
32  auto rosStamp = rosNow.fromNSec(nsec);
33  outDispImageMsg.header.stamp = rosStamp;
34 
35  outDispImageMsg.header.seq = inData->getSequenceNum();
36  outDispImageMsg.T = _baseline / 100; // converting cm to meters
37  sensor_msgs::Image& outImageMsg = outDispImageMsg.image;
38 #endif
39 
40  // copying the data to ros msg
41  // outDispImageMsg.header = imgHeader;
42  // std::string temp_str(encodingEnumMap[inData->getType()]);
43  outImageMsg.encoding = sensor_msgs::image_encodings::TYPE_32FC1;
44  outImageMsg.header = outDispImageMsg.header;
45  if(inData->getType() == dai::RawImgFrame::Type::RAW8) {
46  outDispImageMsg.delta_d = 1;
47  size_t size = inData->getData().size() * sizeof(float);
48  outImageMsg.data.resize(size);
49  outImageMsg.height = inData->getHeight();
50  outImageMsg.width = inData->getWidth();
51  outImageMsg.step = size / inData->getHeight();
52  outImageMsg.is_bigendian = true;
53 
54  std::vector<float> convertedData(inData->getData().begin(), inData->getData().end());
55  unsigned char* imageMsgDataPtr = reinterpret_cast<unsigned char*>(outImageMsg.data.data());
56 
57  unsigned char* daiImgData = reinterpret_cast<unsigned char*>(convertedData.data());
58 
59  // TODO(Sachin): Try using assign since it is a vector
60  // img->data.assign(packet.data->cbegin(), packet.data->cend());
61  memcpy(imageMsgDataPtr, daiImgData, size);
62 
63  } else {
64  outDispImageMsg.delta_d = 1 / 32;
65  size_t size = inData->getHeight() * inData->getWidth() * sizeof(float);
66  outImageMsg.data.resize(size);
67  outImageMsg.height = inData->getHeight();
68  outImageMsg.width = inData->getWidth();
69  outImageMsg.step = size / inData->getHeight();
70  outImageMsg.is_bigendian = true;
71  unsigned char* daiImgData = reinterpret_cast<unsigned char*>(inData->getData().data());
72 
73  std::vector<int16_t> raw16Data(inData->getHeight() * inData->getWidth());
74  unsigned char* raw16DataPtr = reinterpret_cast<unsigned char*>(raw16Data.data());
75  memcpy(raw16DataPtr, daiImgData, inData->getData().size());
76  std::vector<float> convertedData;
77  std::transform(
78  raw16Data.begin(), raw16Data.end(), std::back_inserter(convertedData), [](int16_t disp) -> std::size_t { return static_cast<float>(disp) / 32.0; });
79 
80  unsigned char* imageMsgDataPtr = reinterpret_cast<unsigned char*>(outImageMsg.data.data());
81  unsigned char* convertedDataPtr = reinterpret_cast<unsigned char*>(convertedData.data());
82  memcpy(imageMsgDataPtr, convertedDataPtr, size);
83  }
84  outDispImageMsgs.push_back(outDispImageMsg);
85  return;
86 }
87 
88 /* void DisparityConverter::toDaiMsg(const DisparityMsgs::DisparityImage &inMsg,
89  dai::ImgFrame& outData) {
90 
91  std::unordered_map<dai::RawImgFrame::Type, std::string>::iterator
92  revEncodingIter;
93  if (_daiInterleaved) {
94  revEncodingIter = std::find_if(
95  encodingEnumMap.begin(), encodingEnumMap.end(),
96  [&](const std::pair<dai::RawImgFrame::Type, std::string> &pair) {
97  return pair.second == inMsg.encoding;
98  });
99  if (revEncodingIter == encodingEnumMap.end())
100  std::runtime_error("Unable to find DAI encoding for the corresponding "
101  "DisparityMsgs::DisparityImage.encoding stream");
102 
103  outData.setData(inMsg.data);
104  } else {
105  revEncodingIter = std::find_if(
106  encodingEnumMap.begin(), encodingEnumMap.end(),
107  [&](const std::pair<dai::RawImgFrame::Type, std::string> &pair) {
108  return pair.second.find(inMsg.encoding) != std::string::npos;
109  });
110 
111  std::istringstream f(revEncodingIter->second);
112  std::vector<std::string> encoding_info;
113  std::string s;
114 
115  while (getline(f, s, '_'))
116  encoding_info.push_back(s);
117 
118  std::vector<std::uint8_t> opData(inMsg.data.size());
119  interleavedToPlanar(inMsg.data, opData, inMsg.height, inMsg.width,
120  std::stoi(encoding_info[0]),
121  std::stoi(encoding_info[1]));
122  outData.setData(opData);
123  }
124 
125 
126  TimePoint ts(std::chrono::seconds((int)inMsg.header.stamp.toSec()) +
127  std::chrono::nanoseconds(inMsg.header.stamp.toNSec()));
128  outData.setTimestamp(ts);
129  outData.setSequenceNum(inMsg.header.seq);
130  outData.setWidth(inMsg.width);
131  outData.setHeight(inMsg.height);
132  outData.setType(revEncodingIter->first);
133 } */
134 
135 DisparityImagePtr DisparityConverter::toRosMsgPtr(std::shared_ptr<dai::ImgFrame> inData) {
136  std::deque<DisparityMsgs::DisparityImage> msgQueue;
137  toRosMsg(inData, msgQueue);
138  auto msg = msgQueue.front();
139 #ifdef IS_ROS2
140  DisparityImagePtr ptr = std::make_shared<DisparityMsgs::DisparityImage>(msg);
141 #else
142  DisparityImagePtr ptr = boost::make_shared<DisparityMsgs::DisparityImage>(msg);
143 #endif
144  return ptr;
145 }
146 
147 } // namespace ros
148 } // namespace dai
const std::string TYPE_32FC1
static Time now()
DisparityImagePtr toRosMsgPtr(std::shared_ptr< dai::ImgFrame > inData)
void toRosMsg(std::shared_ptr< dai::ImgFrame > inData, std::deque< DisparityMsgs::DisparityImage > &outImageMsg)
DisparityConverter(const std::string frameName, float focalLength, float baseline=7.5, float minDepth=80, float maxDepth=1100)
DisparityMsgs::DisparityImage::Ptr DisparityImagePtr


depthai_bridge
Author(s): Sachin Guruswamy
autogenerated on Tue May 10 2022 03:01:27