7 const std::vector<std::array<float, 5>>& pts) {
8 auto msg = std::make_shared<sensor_msgs::msg::PointCloud2>();
9 msg->header.frame_id =
"test";
11 msg->width = pts.size();
13 msg->is_bigendian =
false;
15 msg->row_step = msg->point_step * msg->width;
16 msg->fields.resize(6);
17 msg->fields[0].name =
"x";
18 msg->fields[0].offset = 0;
19 msg->fields[0].datatype = sensor_msgs::msg::PointField::FLOAT32;
20 msg->fields[0].count = 1;
21 msg->fields[1].name =
"y";
22 msg->fields[1].offset = 4;
23 msg->fields[1].datatype = sensor_msgs::msg::PointField::FLOAT32;
24 msg->fields[1].count = 1;
25 msg->fields[2].name =
"z";
26 msg->fields[2].offset = 8;
27 msg->fields[2].datatype = sensor_msgs::msg::PointField::FLOAT32;
28 msg->fields[2].count = 1;
29 msg->fields[3].name =
"intensity";
30 msg->fields[3].offset = 12;
31 msg->fields[3].datatype = sensor_msgs::msg::PointField::FLOAT32;
32 msg->fields[3].count = 1;
33 msg->fields[4].name =
"ring";
34 msg->fields[4].offset = 16;
35 msg->fields[4].datatype = sensor_msgs::msg::PointField::UINT16;
36 msg->fields[4].count = 1;
37 msg->fields[5].name =
"timestamp";
38 msg->fields[5].offset = 18;
39 msg->fields[5].datatype = sensor_msgs::msg::PointField::FLOAT64;
40 msg->fields[5].count = 1;
41 msg->data.resize(msg->row_step);
42 for (
size_t i = 0; i < pts.size(); ++i) {
43 std::memcpy(&msg->data[i * 26 + 0], &pts[i][0], 4);
44 std::memcpy(&msg->data[i * 26 + 4], &pts[i][1], 4);
45 std::memcpy(&msg->data[i * 26 + 8], &pts[i][2], 4);
46 float intensity = 0.0f;
47 std::memcpy(&msg->data[i * 26 + 12], &intensity, 4);
48 uint16_t ring =
static_cast<uint16_t
>(pts[i][4]);
49 std::memcpy(&msg->data[i * 26 + 16], &ring, 2);
51 std::memcpy(&msg->data[i * 26 + 18], &ts, 8);