Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
pointcloud2_helper.hpp
Go to the documentation of this file.
1#include "sensor_msgs/msg/point_cloud2.hpp"
2#include "sensor_msgs/msg/point_field.hpp"
3
4namespace test_utils {
5
6inline sensor_msgs::msg::PointCloud2::SharedPtr make_lidar_pointcloud2(
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";
10 msg->height = 1;
11 msg->width = pts.size();
12 msg->is_dense = true;
13 msg->is_bigendian = false;
14 msg->point_step = 26;
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);
50 uint64_t ts = 0;
51 std::memcpy(&msg->data[i * 26 + 18], &ts, 8);
52 }
53 return msg;
54}
55
56} // namespace test_utils
sensor_msgs::msg::PointCloud2::SharedPtr make_lidar_pointcloud2(const std::vector< std::array< float, 5 > > &pts)