23void ParseField(sensor_msgs::msg::PointField field,
24 std::shared_ptr<apollo::drivers::PointCloud> point_clouds,
25 std::string field_name,
26 sensor_msgs::msg::PointCloud2& raw_message) {
27 switch (field.datatype) {
28 case sensor_msgs::msg::PointField::INT8: {
29 sensor_msgs::PointCloud2ConstIterator<int8_t> iter(raw_message,
32 for (; iter != iter.end(); ++iter) {
33 if (field_name ==
"intensity") {
34 point_clouds->mutable_point(index)->set_intensity(
35 static_cast<uint32_t
>(*iter));
37 point_clouds->mutable_point(index)->set_timestamp(
38 static_cast<uint64_t
>(*iter));
45 case sensor_msgs::msg::PointField::UINT8: {
46 sensor_msgs::PointCloud2ConstIterator<int8_t> iter(raw_message,
49 for (; iter != iter.end(); ++iter) {
50 if (field_name ==
"intensity") {
51 point_clouds->mutable_point(index)->set_intensity(
52 static_cast<uint32_t
>(*iter));
54 point_clouds->mutable_point(index)->set_timestamp(
55 static_cast<uint64_t
>(*iter));
62 case sensor_msgs::msg::PointField::INT16: {
63 sensor_msgs::PointCloud2ConstIterator<int16_t> iter(raw_message,
66 for (; iter != iter.end(); ++iter) {
67 if (field_name ==
"intensity") {
68 point_clouds->mutable_point(index)->set_intensity(
69 static_cast<uint32_t
>(*iter));
71 point_clouds->mutable_point(index)->set_timestamp(
72 static_cast<uint64_t
>(*iter));
79 case sensor_msgs::msg::PointField::UINT16: {
80 sensor_msgs::PointCloud2ConstIterator<int16_t> iter(raw_message,
83 for (; iter != iter.end(); ++iter) {
84 if (field_name ==
"intensity") {
85 point_clouds->mutable_point(index)->set_intensity(
86 static_cast<uint32_t
>(*iter));
88 point_clouds->mutable_point(index)->set_timestamp(
89 static_cast<uint64_t
>(*iter));
96 case sensor_msgs::msg::PointField::INT32: {
97 sensor_msgs::PointCloud2ConstIterator<int32_t> iter(raw_message,
100 for (; iter != iter.end(); ++iter) {
101 if (field_name ==
"intensity") {
102 point_clouds->mutable_point(index)->set_intensity(
103 static_cast<uint32_t
>(*iter));
105 point_clouds->mutable_point(index)->set_timestamp(
106 static_cast<uint64_t
>(*iter));
113 case sensor_msgs::msg::PointField::UINT32: {
114 sensor_msgs::PointCloud2ConstIterator<uint32_t> iter(raw_message,
117 for (; iter != iter.end(); ++iter) {
118 if (field_name ==
"intensity") {
119 point_clouds->mutable_point(index)->set_intensity(
120 static_cast<uint32_t
>(*iter));
122 point_clouds->mutable_point(index)->set_timestamp(
123 static_cast<uint64_t
>(*iter));
130 case sensor_msgs::msg::PointField::FLOAT32: {
131 sensor_msgs::PointCloud2ConstIterator<float> iter(raw_message,
134 for (; iter != iter.end(); ++iter) {
135 if (field_name ==
"intensity") {
136 point_clouds->mutable_point(index)->set_intensity(
137 static_cast<uint32_t
>(*iter));
139 point_clouds->mutable_point(index)->set_timestamp(
140 static_cast<uint64_t
>(*iter));
147 case sensor_msgs::msg::PointField::FLOAT64: {
148 sensor_msgs::PointCloud2ConstIterator<double> iter(raw_message,
151 for (; iter != iter.end(); ++iter) {
152 if (field_name ==
"intensity") {
153 point_clouds->mutable_point(index)->set_intensity(
154 static_cast<uint32_t
>(*iter));
156 point_clouds->mutable_point(index)->set_timestamp(
157 static_cast<uint64_t
>(*iter));
165 throw std::runtime_error(
"Unsupported PointField datatype");
173 auto in_msg = std::get<0>(in.
values);
174 auto out_msg = std::get<0>(out.
values);
176 float intensity = -1.0;
177 double timestamp = 0.0;
178 auto& cloud_msg = (*in_msg);
180 bool has_x =
false, has_y =
false, has_z =
false, has_intensity =
false,
182 std::string time_field_name;
183 sensor_msgs::msg::PointField time_field_type;
184 sensor_msgs::msg::PointField intensity_field_type;
185 for (
const auto& field : cloud_msg.fields) {
186 if (field.name ==
"x") has_x =
true;
187 if (field.name ==
"y") has_y =
true;
188 if (field.name ==
"z") has_z =
true;
189 if (field.name ==
"intensity") {
190 has_intensity =
true;
191 intensity_field_type = field;
193 if (field.name ==
"t" || field.name ==
"time" ||
194 field.name ==
"timestamp") {
196 time_field_type = field;
197 time_field_name = field.name;
200 if (!(has_x && has_y && has_z)) {
201 AERROR <<
"PointCloud2 does not contain x, y, z fields.";
205 sensor_msgs::PointCloud2ConstIterator<float> iter_x(cloud_msg,
"x");
206 sensor_msgs::PointCloud2ConstIterator<float> iter_y(cloud_msg,
"y");
207 sensor_msgs::PointCloud2ConstIterator<float> iter_z(cloud_msg,
"z");
209 for (; iter_x != iter_x.end(); ++iter_x, ++iter_y, ++iter_z) {
214 auto pointcloud = out_msg->add_point();
215 pointcloud->set_x(x);
216 pointcloud->set_y(y);
217 pointcloud->set_z(z);
220 ParseField(time_field_type, out_msg, time_field_name, cloud_msg);
223 ParseField(intensity_field_type, out_msg,
"intensity", cloud_msg);
virtual bool ConvertMsg(InputTypes< InputMsgPtr > &, OutputTypes< OutputMsgPtr > &)
convert the message between ros and apollo
std::tuple< Types... > values