halcon_pointcloud.cpp
Go to the documentation of this file.
1 
19 #include <boost/make_shared.hpp>
20 
21 #include <sensor_msgs/PointCloud2.h>
22 #include <sensor_msgs/PointField.h>
23 
24 namespace halcon_bridge {
25 
26  int getSizeFromDatatype(int datatype) {
27  if (datatype == sensor_msgs::PointField::INT8) return 1;
28  if (datatype == sensor_msgs::PointField::UINT8) return 1;
29  if (datatype == sensor_msgs::PointField::INT16) return 2;
30  if (datatype == sensor_msgs::PointField::UINT16) return 2;
31  if (datatype == sensor_msgs::PointField::INT32) return 4;
32  if (datatype == sensor_msgs::PointField::UINT32) return 4;
33  if (datatype == sensor_msgs::PointField::FLOAT32) return 4;
34  if (datatype == sensor_msgs::PointField::FLOAT64) return 8;
35 
36  return -1;
37  }
38 
40  delete model;
41  curvature.Clear();
42  }
43 
44  sensor_msgs::PointCloud2Ptr HalconPointcloud::toPointcloudMsg() const {
45  sensor_msgs::PointCloud2Ptr ptr = boost::make_shared<sensor_msgs::PointCloud2>();
46  toPointcloudMsg(*ptr);
47  return ptr;
48  }
49 
50  void HalconPointcloud::toPointcloudMsg(sensor_msgs::PointCloud2& ros_pointcloud) const {
51  ros_pointcloud.header = header;
52  ros_pointcloud.height = 1;
53  ros_pointcloud.width = (int)model->GetObjectModel3dParams("num_points")[0];
54  ros_pointcloud.is_dense = false;
55  ros_pointcloud.is_bigendian = false;
56  bool has_normals = ((HalconCpp::HString)model->GetObjectModel3dParams("has_point_normals")) == HalconCpp::HString("true");
57  std::vector<sensor_msgs::PointField> fields;
58  if (has_normals) {
59  ros_pointcloud.point_step = 28;
60  fields = std::vector<sensor_msgs::PointField>(7);
61  } else {
62  ros_pointcloud.point_step = 12;
63  fields = std::vector<sensor_msgs::PointField>(3);
64  }
65 
66  ros_pointcloud.row_step = ros_pointcloud.width * ros_pointcloud.point_step;
67 
68 
69  sensor_msgs::PointField x_field;
70  x_field.name = "x";
71  x_field.count = 1;
72  x_field.datatype = sensor_msgs::PointField::FLOAT32;
73  x_field.offset = 0;
74  fields[0] = x_field;
75 
76  sensor_msgs::PointField y_field;
77  y_field.name = "y";
78  y_field.count = 1;
79  y_field.datatype = sensor_msgs::PointField::FLOAT32;
80  y_field.offset = 4;
81  fields[1] = y_field;
82 
83  sensor_msgs::PointField z_field;
84  z_field.name = "z";
85  z_field.count = 1;
86  z_field.datatype = sensor_msgs::PointField::FLOAT32;
87  z_field.offset = 8;
88  fields[2] = z_field;
89 
90  if (has_normals) {
91  sensor_msgs::PointField x_normals_field;
92  x_normals_field.name = "normal_x";
93  x_normals_field.count = 1;
94  x_normals_field.datatype = sensor_msgs::PointField::FLOAT32;
95  x_normals_field.offset = 12;
96  fields[3] = x_normals_field;
97 
98  sensor_msgs::PointField y_normals_field;
99  y_normals_field.name = "normal_y";
100  y_normals_field.count = 1;
101  y_normals_field.datatype = sensor_msgs::PointField::FLOAT32;
102  y_normals_field.offset = 16;
103  fields[4] = y_normals_field;
104 
105  sensor_msgs::PointField z_normals_field;
106  z_normals_field.name = "normal_z";
107  z_normals_field.count = 1;
108  z_normals_field.datatype = sensor_msgs::PointField::FLOAT32;
109  z_normals_field.offset = 20;
110  fields[5] = z_normals_field;
111 
112  sensor_msgs::PointField curvature;
113  curvature.name = "curvature";
114  curvature.count = 1;
115  curvature.datatype = sensor_msgs::PointField::FLOAT32;
116  curvature.offset = 24;
117  fields[6] = curvature;
118  }
119 
120 
121  ros_pointcloud.fields = fields;
122 
123 
124  HalconCpp::HTuple x_values = model->GetObjectModel3dParams("point_coord_x");
125  HalconCpp::HTuple y_values = model->GetObjectModel3dParams("point_coord_y");
126  HalconCpp::HTuple z_values = model->GetObjectModel3dParams("point_coord_z");
127 
128  HalconCpp::HTuple x_normal_values;
129  HalconCpp::HTuple y_normal_values;
130  HalconCpp::HTuple z_normal_values;
131 
132 
133  float *interleavedPoints;
134 
135  if (has_normals) {
136  x_normal_values = model->GetObjectModel3dParams("point_normal_x");
137  y_normal_values = model->GetObjectModel3dParams("point_normal_y");
138  z_normal_values = model->GetObjectModel3dParams("point_normal_z");
139  interleavedPoints = new float[ros_pointcloud.width * 7];
140  } else {
141  interleavedPoints = new float[ros_pointcloud.width * 3];
142  }
143 
144  for (size_t i = 0; i < ros_pointcloud.width; i++) {
145  interleavedPoints[i * 3] = (float)x_values[i];
146  interleavedPoints[i * 3 + 1] = (float)y_values[i];
147  interleavedPoints[i * 3 + 2] = (float)z_values[i];
148  if (has_normals) {
149  interleavedPoints[i * 3 + 3] = (float)x_normal_values[i];
150  interleavedPoints[i * 3 + 4] = (float)y_normal_values[i];
151  interleavedPoints[i * 3 + 5] = (float)z_normal_values[i];
152  interleavedPoints[i * 3 + 6] = (float)(curvature)[i];
153  }
154  }
155 
156  size_t size;
157  if (has_normals) {
158  size = ros_pointcloud.width * 7 * 4;
159  } else {
160  size = ros_pointcloud.width * 3 * 4;
161  }
162  ros_pointcloud.data.resize(size);
163 
164  memcpy((float*)(&ros_pointcloud.data[0]), &interleavedPoints[0], size);
165 
166 
167  }
168 
169 
170 
171  HalconPointcloudPtr toHalconCopy(const sensor_msgs::PointCloud2ConstPtr& source) {
172  return toHalconCopy(*source);
173  }
174 
175  HalconPointcloudPtr toHalconCopy(const sensor_msgs::PointCloud2& source) {
176  HalconPointcloudPtr ptr = boost::make_shared<HalconPointcloud>();
177  ptr->header = source.header;
178 
179 
180  int offset_x, offset_y, offset_z, offset_x_normal, offset_y_normal, offset_z_normal, offset_curvature;
181  offset_x = offset_y = offset_z = offset_x_normal = offset_y_normal = offset_z_normal = offset_curvature = 0;
182  int count_x_normal, count_y_normal, count_z_normal, count_curvature;
183  count_x_normal = count_y_normal = count_z_normal = count_curvature = 0;
184 
185  for (unsigned int i = 0; i < source.fields.size(); i++) {
186  sensor_msgs::PointField field = source.fields[i];
187  if (field.name == "x") {
188  offset_x = field.offset;
189  }
190  if (field.name == "y") {
191  offset_y = field.offset;
192  }
193  if (field.name == "z") {
194  offset_z = field.offset;
195  }
196  if (field.name == "normal_x") {
197  offset_x_normal = field.offset;
198  count_x_normal = field.count;
199  }
200  if (field.name == "normal_y") {
201  offset_y_normal = field.offset;
202  count_y_normal = field.count;
203  }
204  if (field.name == "normal_z") {
205  offset_z_normal = field.offset;
206  count_z_normal = field.count;
207  }
208  if (field.name == "curvature") {
209  offset_curvature = field.offset;
210  count_curvature = field.count;
211  }
212 
213  }
214 
215  HalconCpp::HTuple x_coords = HalconCpp::HTuple::TupleGenConst((int)(source.width * source.height), 0);
216  HalconCpp::HTuple y_coords = HalconCpp::HTuple::TupleGenConst((int)(source.width * source.height), 0);
217  HalconCpp::HTuple z_coords = HalconCpp::HTuple::TupleGenConst((int)(source.width * source.height), 0);
218 
219  HalconCpp::HTuple x_normals = HalconCpp::HTuple::TupleGenConst((int)(source.width * source.height), 0);
220  HalconCpp::HTuple y_normals = HalconCpp::HTuple::TupleGenConst((int)(source.width * source.height), 0);
221  HalconCpp::HTuple z_normals = HalconCpp::HTuple::TupleGenConst((int)(source.width * source.height), 0);
222 
223  HalconCpp::HTuple curvature = HalconCpp::HTuple::TupleGenConst((int)(source.width * source.height), 0);
224 
225  for (int i = 0; i < x_coords.Length(); i++) {
226  x_coords[i] = *(float*)&source.data[(i * source.point_step) + offset_x];
227  y_coords[i] = *(float*)&source.data[(i * source.point_step) + offset_y];
228  z_coords[i] = *(float*)&source.data[(i * source.point_step) + offset_z];
229 
230  if ((count_x_normal > 0) && (count_y_normal > 0) && (count_z_normal > 0)) {
231  x_normals[i] = *(float*)&source.data[(i * source.point_step) + offset_x_normal];
232  y_normals[i] = *(float*)&source.data[(i * source.point_step) + offset_y_normal];
233  z_normals[i] = *(float*)&source.data[(i * source.point_step) + offset_z_normal];
234  }
235 
236  }
237  ptr->model = new HalconCpp::HObjectModel3D(x_coords, y_coords, z_coords);
238 
239  if (source.fields.size() > 4) {
240  HalconCpp::HTuple attrib_names("point_normal_x");
241  attrib_names.Append("point_normal_y");
242  attrib_names.Append("point_normal_z");
243  HalconCpp::HTuple attrib_values = (x_normals.TupleConcat(y_normals)).TupleConcat(z_normals);
244  HalconCpp::HObjectModel3D p_n_model = ptr->model->SetObjectModel3dAttrib(attrib_names, "", attrib_values);
245  *ptr->model = p_n_model;
246 
247  for (int i = 0; i < curvature.Length(); i++) {
248  curvature[i] = *(float*)&source.data[(i * source.point_step) + offset_curvature];
249  }
250  ptr->curvature = curvature;
251  }
252 
253  return ptr;
254  }
255 
256 }
257 
258 
259 
int getSizeFromDatatype(int datatype)
HalconImagePtr toHalconCopy(const sensor_msgs::ImageConstPtr &source)
Convert a sensor_msgs::Image message to a Halcon-compatible HImage, copying the image data...
sensor_msgs::PointCloud2Ptr toPointcloudMsg() const
Convert this message to a ROS sensor_msgs::PointCloud2 message.
HalconCpp::HObjectModel3D * model


asr_halcon_bridge
Author(s): Allgeyer Tobias
autogenerated on Fri Jun 19 2020 03:54:32