Skip to content

Commit d9dcead

Browse files
Feature/reflectivity (#341)
* Introduce new field * First working version of reflectivity calculation with hardcoded alpha. * Introduce alpha of reflectivity. * Cleanup * Fix tape call * Introduce separate test. * PR fixes v1 * minor formating fixes * Update test/src/scene/reflectivityTest.cpp Co-authored-by: Piotr Rybicki <piotr.rybicki@robotec.ai> * fix naming conflict --------- Co-authored-by: Piotr Rybicki <piotr.rybicki@robotec.ai>
1 parent 756eb12 commit d9dcead

14 files changed

+175
-7
lines changed

include/rgl/api/core.h

+16
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,13 @@ typedef enum : int32_t
441441
*/
442442
RGL_FIELD_LASER_RETRO_F32,
443443

444+
/**
445+
* Reflectivity of the hit point.
446+
* Reflectivity is a scalar value that describes how much light is reflected by the hit point.
447+
* Reflectivity is a property of the material of the hit point.
448+
*/
449+
RGL_FIELD_REFLECTIVITY_F32,
450+
444451
// Dummy fields
445452
RGL_FIELD_PADDING_8 = 1024,
446453
RGL_FIELD_PADDING_16,
@@ -892,6 +899,15 @@ RGL_API rgl_status_t rgl_node_raytrace_configure_beam_divergence(rgl_node_t node
892899
*/
893900
RGL_API rgl_status_t rgl_node_raytrace_configure_default_intensity(rgl_node_t node, float default_intensity);
894901

902+
/**
903+
* Modifies RaytraceNode to set reflectivity alpha.
904+
* Reflectivity alpha is used to calculate reflectivity of the hit point. This value is constant for every hit point.
905+
* Default reflectivity alpha is set to 0.1f.
906+
* @param node RaytraceNode to modify.
907+
* @param reflectivity_alpha Reflectivity alpha to set.
908+
*/
909+
RGL_API rgl_status_t rgl_node_raytrace_configure_reflectivity_alpha(rgl_node_t node, float reflectivity_alpha);
910+
895911
/**
896912
* Modifies RaytraceNode to set return mode.
897913
* Point return types (RGL_FIELD_RETURN_TYPE_U8) will be set to corresponding rgl_return_type_t values, e.g. return mode

src/RGLFields.hpp

+8
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ typedef unsigned char TextureTexelFormat;
4141
#define ENTITY_ID_I32 RGL_FIELD_ENTITY_ID_I32
4242
#define INTENSITY_F32 RGL_FIELD_INTENSITY_F32
4343
#define INTENSITY_U8 RGL_FIELD_INTENSITY_U8
44+
#define REFLECTIVITY_F32 RGL_FIELD_REFLECTIVITY_F32
4445
#define LASER_RETRO_F32 RGL_FIELD_LASER_RETRO_F32
4546
#define RING_ID_U16 RGL_FIELD_RING_ID_U16
4647
#define AZIMUTH_F32 RGL_FIELD_AZIMUTH_F32
@@ -73,6 +74,7 @@ inline const std::set<rgl_field_t>& getAllRealFields()
7374
ENTITY_ID_I32,
7475
INTENSITY_F32,
7576
INTENSITY_U8,
77+
REFLECTIVITY_F32,
7678
LASER_RETRO_F32,
7779
RING_ID_U16,
7880
AZIMUTH_F32,
@@ -122,6 +124,7 @@ FIELD(RAY_IDX_U32, uint32_t); // PCL uses uint32_t
122124
FIELD(ENTITY_ID_I32, int32_t);
123125
FIELD(INTENSITY_F32, float);
124126
FIELD(INTENSITY_U8, uint8_t);
127+
FIELD(REFLECTIVITY_F32, float);
125128
FIELD(LASER_RETRO_F32, float);
126129
FIELD(IS_HIT_I32, int32_t); // Signed may be faster
127130
FIELD(IS_GROUND_I32, int32_t); // Signed may be faster
@@ -156,6 +159,7 @@ inline std::size_t getFieldSize(rgl_field_t type)
156159
case IS_GROUND_I32: return Field<IS_GROUND_I32>::size;
157160
case INTENSITY_F32: return Field<INTENSITY_F32>::size;
158161
case INTENSITY_U8: return Field<INTENSITY_U8>::size;
162+
case REFLECTIVITY_F32: return Field<REFLECTIVITY_F32>::size;
159163
case LASER_RETRO_F32: return Field<LASER_RETRO_F32>::size;
160164
case RING_ID_U16: return Field<RING_ID_U16>::size;
161165
case AZIMUTH_F32: return Field<AZIMUTH_F32>::size;
@@ -215,6 +219,7 @@ inline std::shared_ptr<IAnyArray> createArray(rgl_field_t type, Args&&... args)
215219
case ENTITY_ID_I32: return Subclass<Field<ENTITY_ID_I32>::type>::create(std::forward<Args>(args)...);
216220
case INTENSITY_F32: return Subclass<Field<INTENSITY_F32>::type>::create(std::forward<Args>(args)...);
217221
case INTENSITY_U8: return Subclass<Field<INTENSITY_U8>::type>::create(std::forward<Args>(args)...);
222+
case REFLECTIVITY_F32: return Subclass<Field<REFLECTIVITY_F32>::type>::create(std::forward<Args>(args)...);
218223
case LASER_RETRO_F32: return Subclass<Field<LASER_RETRO_F32>::type>::create(std::forward<Args>(args)...);
219224
case RING_ID_U16: return Subclass<Field<RING_ID_U16>::type>::create(std::forward<Args>(args)...);
220225
case AZIMUTH_F32: return Subclass<Field<AZIMUTH_F32>::type>::create(std::forward<Args>(args)...);
@@ -251,6 +256,7 @@ inline std::string toString(rgl_field_t type)
251256
case ENTITY_ID_I32: return "ENTITY_ID_I32";
252257
case INTENSITY_F32: return "INTENSITY_F32";
253258
case INTENSITY_U8: return "INTENSITY_U8";
259+
case REFLECTIVITY_F32: return "REFLECTIVITY_F32";
254260
case LASER_RETRO_F32: return "LASER_RETRO_F32";
255261
case RING_ID_U16: return "RING_ID_U16";
256262
case AZIMUTH_F32: return "AZIMUTH_F32";
@@ -291,6 +297,7 @@ inline std::vector<uint8_t> toRos2Fields(rgl_field_t type)
291297
case ENTITY_ID_I32: return {sensor_msgs::msg::PointField::INT32};
292298
case INTENSITY_F32: return {sensor_msgs::msg::PointField::FLOAT32};
293299
case INTENSITY_U8: return {sensor_msgs::msg::PointField::UINT8};
300+
case REFLECTIVITY_F32: return {sensor_msgs::msg::PointField::FLOAT32};
294301
case LASER_RETRO_F32: return {sensor_msgs::msg::PointField::FLOAT32};
295302
case RING_ID_U16: return {sensor_msgs::msg::PointField::UINT16};
296303
case AZIMUTH_F32: return {sensor_msgs::msg::PointField::FLOAT32};
@@ -342,6 +349,7 @@ inline std::vector<std::string> toRos2Names(rgl_field_t type)
342349
case INTENSITY_F32:
343350
case INTENSITY_U8:
344351
return {"intensity"};
352+
case REFLECTIVITY_F32: return {"reflectivity"};
345353
case LASER_RETRO_F32: return {"laser_retro"};
346354
case RING_ID_U16: return {"channel"};
347355
case AZIMUTH_F32: return {"azimuth"};

src/api/apiCore.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,27 @@ void TapeCore::tape_node_raytrace_configure_default_intensity(const YAML::Node&
10661066
rgl_node_raytrace_configure_default_intensity(node, yamlNode[1].as<float>());
10671067
}
10681068

1069+
RGL_API rgl_status_t rgl_node_raytrace_configure_reflectivity_alpha(rgl_node_t node, float reflectivity_alpha)
1070+
{
1071+
auto status = rglSafeCall([&]() {
1072+
RGL_API_LOG("rgl_node_raytrace_configure_reflectivity_alpha(node={}, default_intensity={})", repr(node),
1073+
reflectivity_alpha);
1074+
CHECK_ARG(node != nullptr);
1075+
CHECK_ARG(reflectivity_alpha >= 0.0f);
1076+
RaytraceNode::Ptr raytraceNode = Node::validatePtr<RaytraceNode>(node);
1077+
raytraceNode->setReflectivityAlpha(reflectivity_alpha);
1078+
});
1079+
TAPE_HOOK(node, reflectivity_alpha);
1080+
return status;
1081+
}
1082+
1083+
void TapeCore::tape_node_raytrace_configure_reflectivity_alpha(const YAML::Node& yamlNode, PlaybackState& state)
1084+
{
1085+
auto nodeId = yamlNode[0].as<TapeAPIObjectID>();
1086+
rgl_node_t node = state.nodes.at(nodeId);
1087+
rgl_node_raytrace_configure_reflectivity_alpha(node, yamlNode[1].as<float>());
1088+
}
1089+
10691090
RGL_API rgl_status_t rgl_node_raytrace_configure_return_mode(rgl_node_t node, rgl_return_mode_t return_mode)
10701091
{
10711092
auto status = rglSafeCall([&]() {

src/gpu/RaytraceRequestContext.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ struct RaytraceRequestContext
2929
float farNonHitDistance;
3030

3131
float defaultIntensity;
32+
float reflectivityAlpha;
3233

3334
const Mat3x4f* raysWorld;
3435
size_t rayCount;
@@ -58,6 +59,7 @@ struct RaytraceRequestContext
5859
Field<DISTANCE_F32>::type* distance;
5960
Field<INTENSITY_F32>::type* intensityF32;
6061
Field<INTENSITY_U8>::type* intensityU8;
62+
Field<REFLECTIVITY_F32>::type* reflectivityF32;
6163
Field<LASER_RETRO_F32>::type* laserRetro;
6264
Field<TIME_STAMP_F64>::type* timestampF64;
6365
Field<TIME_STAMP_U32>::type* timestampU32;

src/gpu/nodeKernels.cu

+7
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ __device__ void saveReturnAsHit(const RaytraceRequestContext* ctx, int beamIdx,
127127
static_cast<uint8_t>(std::round(ctx->mrSamples.intensity[sampleIdx])) :
128128
UINT8_MAX;
129129
}
130+
if (ctx->reflectivityF32 != nullptr) {
131+
const auto distance2 = ctx->mrSamples.distance[sampleIdx] * ctx->mrSamples.distance[sampleIdx];
132+
ctx->reflectivityF32[returnPointIdx] = ctx->reflectivityAlpha * ctx->mrSamples.intensity[sampleIdx] * distance2;
133+
}
130134
if (ctx->entityId != nullptr) {
131135
ctx->entityId[returnPointIdx] = ctx->mrSamples.entityId[sampleIdx];
132136
}
@@ -183,6 +187,9 @@ __device__ void saveReturnAsNonHit(const RaytraceRequestContext* ctx, int firstS
183187
if (ctx->intensityU8 != nullptr) {
184188
ctx->intensityU8[returnPointIdx] = 0;
185189
}
190+
if (ctx->reflectivityF32 != nullptr) {
191+
ctx->reflectivityF32[returnPointIdx] = 0;
192+
}
186193
if (ctx->entityId != nullptr) {
187194
ctx->entityId[returnPointIdx] = RGL_ENTITY_INVALID_ID;
188195
}

src/graph/NodesCore.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ struct RaytraceNode : IPointsNode
139139
void setNonHitDistanceValues(float nearDistance, float farDistance);
140140
void setNonHitsMask(const int8_t* maskRaw, size_t maskPointCount);
141141
void setDefaultIntensity(float intensity) { defaultIntensity = intensity; }
142+
void setReflectivityAlpha(float reflectivity_alpha) { reflectivityAlpha = reflectivity_alpha; }
142143
void setReturnMode(rgl_return_mode_t mode)
143144
{
144145
if (mode == RGL_RETURN_UNKNOWN) {
@@ -244,6 +245,7 @@ struct RaytraceNode : IPointsNode
244245
float nearNonHitDistance{std::numeric_limits<float>::infinity()};
245246
float farNonHitDistance{std::numeric_limits<float>::infinity()};
246247
float defaultIntensity = 0.0f;
248+
float reflectivityAlpha = 0.1f;
247249

248250
MultiReturnSamples mrSampleData = MultiReturnSamples{arrayMgr};
249251
rgl_return_mode_t returnMode = RGL_RETURN_FIRST;

src/graph/RaytraceNode.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ void RaytraceNode::enqueueExecImpl()
9898
.nearNonHitDistance = nearNonHitDistance,
9999
.farNonHitDistance = farNonHitDistance,
100100
.defaultIntensity = defaultIntensity,
101+
.reflectivityAlpha = reflectivityAlpha,
101102
.raysWorld = raysPtr,
102103
.rayCount = raysNode->getRayCount(),
103104
.rayOriginToWorld = raysNode->getCumulativeRayTransfrom(),
@@ -119,6 +120,7 @@ void RaytraceNode::enqueueExecImpl()
119120
.distance = getPtrTo<DISTANCE_F32>(),
120121
.intensityF32 = getPtrTo<INTENSITY_F32>(),
121122
.intensityU8 = getPtrTo<INTENSITY_U8>(),
123+
.reflectivityF32 = getPtrTo<REFLECTIVITY_F32>(),
122124
.laserRetro = getPtrTo<LASER_RETRO_F32>(),
123125
.timestampF64 = getPtrTo<TIME_STAMP_F64>(),
124126
.timestampU32 = getPtrTo<TIME_STAMP_U32>(),

src/tape/TapeCore.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class TapeCore
6060
static void tape_node_raytrace_configure_mask(const YAML::Node& yamlNode, PlaybackState& state);
6161
static void tape_node_raytrace_configure_beam_divergence(const YAML::Node& yamlNode, PlaybackState& state);
6262
static void tape_node_raytrace_configure_default_intensity(const YAML::Node& yamlNode, PlaybackState& state);
63+
static void tape_node_raytrace_configure_reflectivity_alpha(const YAML::Node& yamlNode, PlaybackState& state);
6364
static void tape_node_raytrace_configure_return_mode(const YAML::Node& yamlNode, PlaybackState& state);
6465
static void tape_node_points_format(const YAML::Node& yamlNode, PlaybackState& state);
6566
static void tape_node_points_yield(const YAML::Node& yamlNode, PlaybackState& state);
@@ -122,6 +123,8 @@ class TapeCore
122123
TapeCore::tape_node_raytrace_configure_beam_divergence),
123124
TAPE_CALL_MAPPING("rgl_node_raytrace_configure_default_intensity",
124125
TapeCore::tape_node_raytrace_configure_default_intensity),
126+
TAPE_CALL_MAPPING("rgl_node_raytrace_configure_reflectivity_alpha",
127+
TapeCore::tape_node_raytrace_configure_reflectivity_alpha),
125128
TAPE_CALL_MAPPING("rgl_node_raytrace_configure_return_mode",
126129
TapeCore::tape_node_raytrace_configure_return_mode),
127130
TAPE_CALL_MAPPING("rgl_node_points_format", TapeCore::tape_node_points_format),

test/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ set(RGL_TEST_FILES
4848
src/scene/entityVelocityTest.cpp
4949
src/scene/meshAPITest.cpp
5050
src/scene/textureTest.cpp
51+
src/scene/reflectivityTest.cpp
5152
src/synchronization/graphAndCopyStream.cpp
5253
src/synchronization/graphThreadSynchronization.cpp
5354
src/synchronization/testKernel.cu

test/include/helpers/fieldGenerators.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ static std::function<Field<INTENSITY_F32>::type(int)> genIntensityF32 = [](int i
3636
static std::function<Field<INTENSITY_U8>::type(int)> genIntensityU8 = [](int i) {
3737
return i % std::numeric_limits<Field<INTENSITY_U8>::type>::max();
3838
};
39+
static std::function<Field<REFLECTIVITY_F32>::type(int)> genReflectivityF32 = [](int i) {
40+
return static_cast<float>(i) / (static_cast<float>(i + 1));
41+
};
3942
static std::function<Field<LASER_RETRO_F32>::type(int)> genLaserRetro = [](int i) {
4043
return static_cast<float>(i) / (static_cast<float>(i + 1));
4144
};

test/include/helpers/testPointCloud.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ class TestPointCloud
289289
{ENTITY_ID_I32, [&](std::size_t count) {setFieldValues<ENTITY_ID_I32>(generateFieldValues(count, genEntityId));}},
290290
{INTENSITY_F32, [&](std::size_t count) {setFieldValues<INTENSITY_F32>(generateFieldValues(count, genIntensityF32));}},
291291
{INTENSITY_U8, [&](std::size_t count) {setFieldValues<INTENSITY_U8>(generateFieldValues(count, genIntensityU8));}},
292+
{REFLECTIVITY_F32, [&](std::size_t count) {setFieldValues<REFLECTIVITY_F32>(generateFieldValues(count, genReflectivityF32));}},
292293
{LASER_RETRO_F32, [&](std::size_t count) {setFieldValues<LASER_RETRO_F32>(generateFieldValues(count, genLaserRetro));}},
293294
{RING_ID_U16, [&](std::size_t count) {setFieldValues<RING_ID_U16>(generateFieldValues(count, genRingId));}},
294295
{AZIMUTH_F32, [&](std::size_t count) {setFieldValues<AZIMUTH_F32>(generateFieldValues(count, genAzimuth));}},

test/src/TapeTest.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,9 @@ TEST_F(TapeTest, RecordPlayAllCalls)
252252
float defaultIntensity = 1.1f;
253253
EXPECT_RGL_SUCCESS(rgl_node_raytrace_configure_default_intensity(raytrace, defaultIntensity));
254254

255+
float reflectivityAlpha = 0.1;
256+
EXPECT_RGL_SUCCESS(rgl_node_raytrace_configure_reflectivity_alpha(raytrace, reflectivityAlpha));
257+
255258
rgl_return_mode_t returnMode = RGL_RETURN_FIRST;
256259
EXPECT_RGL_SUCCESS(rgl_node_raytrace_configure_return_mode(raytrace, returnMode));
257260

test/src/helpers/pointsTest.cpp

+13-7
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@
55
class PointCloudTest : public ::testing::TestWithParam<int>
66
{
77
protected:
8-
std::vector<rgl_field_t> allNotDummyFields = {XYZ_VEC3_F32, IS_HIT_I32, RAY_IDX_U32, ENTITY_ID_I32, INTENSITY_F32,
9-
RING_ID_U16, AZIMUTH_F32, DISTANCE_F32, RETURN_TYPE_U8, TIME_STAMP_F64};
8+
std::vector<rgl_field_t> allNotDummyFields = {XYZ_VEC3_F32, IS_HIT_I32, RAY_IDX_U32, ENTITY_ID_I32,
9+
INTENSITY_F32, REFLECTIVITY_F32, RING_ID_U16, AZIMUTH_F32,
10+
DISTANCE_F32, RETURN_TYPE_U8, TIME_STAMP_F64};
1011

11-
std::vector<rgl_field_t> fieldsWithPaddings = {PADDING_32, XYZ_VEC3_F32, PADDING_16, IS_HIT_I32, PADDING_8,
12-
RAY_IDX_U32, ENTITY_ID_I32, INTENSITY_F32, RING_ID_U16, AZIMUTH_F32,
13-
DISTANCE_F32, RETURN_TYPE_U8, TIME_STAMP_F64, PADDING_16, PADDING_32};
12+
std::vector<rgl_field_t> fieldsWithPaddings = {
13+
PADDING_32, XYZ_VEC3_F32, PADDING_16, IS_HIT_I32, PADDING_8, RAY_IDX_U32, ENTITY_ID_I32, INTENSITY_F32,
14+
REFLECTIVITY_F32, RING_ID_U16, AZIMUTH_F32, DISTANCE_F32, RETURN_TYPE_U8, TIME_STAMP_F64, PADDING_16, PADDING_32};
1415

1516
std::vector<Field<XYZ_VEC3_F32>::type> pointCoord;
1617
std::vector<Field<IS_HIT_I32>::type> isHit;
1718
std::vector<Field<RAY_IDX_U32>::type> rayIdx;
1819
std::vector<Field<ENTITY_ID_I32>::type> entityId;
1920
std::vector<Field<INTENSITY_F32>::type> intensity;
21+
std::vector<Field<REFLECTIVITY_F32>::type> reflectivity;
2022
std::vector<Field<RING_ID_U16>::type> ringId;
2123
std::vector<Field<AZIMUTH_F32>::type> azimuth;
2224
std::vector<Field<DISTANCE_F32>::type> distance;
@@ -31,6 +33,7 @@ class PointCloudTest : public ::testing::TestWithParam<int>
3133
Field<RAY_IDX_U32>::type rayIdx;
3234
Field<ENTITY_ID_I32>::type entityId;
3335
Field<INTENSITY_F32>::type intensity;
36+
Field<REFLECTIVITY_F32>::type reflectivity;
3437
Field<RING_ID_U16>::type ringId;
3538
Field<AZIMUTH_F32>::type azimuth;
3639
Field<DISTANCE_F32>::type distance;
@@ -45,8 +48,8 @@ class PointCloudTest : public ::testing::TestWithParam<int>
4548
points.reserve(pointsCount);
4649
for (int i = 0; i < pointsCount; i++) {
4750
points.emplace_back(TestPointStruct{genCoord(i), genHalfHit(i), genRayIdx(i), genEntityId(i), genIntensityF32(i),
48-
genRingId(i), genAzimuth(i), genDistance(i), genReturnType(i),
49-
genTimeStampF64(i)});
51+
genReflectivityF32(i), genRingId(i), genAzimuth(i), genDistance(i),
52+
genReturnType(i), genTimeStampF64(i)});
5053
}
5154
return points;
5255
}
@@ -58,6 +61,7 @@ class PointCloudTest : public ::testing::TestWithParam<int>
5861
rayIdx = generateFieldValues(pointsCount, genRayIdx);
5962
entityId = generateFieldValues(pointsCount, genEntityId);
6063
intensity = generateFieldValues(pointsCount, genIntensityF32);
64+
reflectivity = generateFieldValues(pointsCount, genReflectivityF32);
6165
ringId = generateFieldValues(pointsCount, genRingId);
6266
azimuth = generateFieldValues(pointsCount, genAzimuth);
6367
distance = generateFieldValues(pointsCount, genDistance);
@@ -72,6 +76,7 @@ class PointCloudTest : public ::testing::TestWithParam<int>
7276
pointCloud.setFieldValues<RAY_IDX_U32>(rayIdx);
7377
pointCloud.setFieldValues<ENTITY_ID_I32>(entityId);
7478
pointCloud.setFieldValues<INTENSITY_F32>(intensity);
79+
pointCloud.setFieldValues<REFLECTIVITY_F32>(reflectivity);
7580
pointCloud.setFieldValues<RING_ID_U16>(ringId);
7681
pointCloud.setFieldValues<AZIMUTH_F32>(azimuth);
7782
pointCloud.setFieldValues<DISTANCE_F32>(distance);
@@ -92,6 +97,7 @@ class PointCloudTest : public ::testing::TestWithParam<int>
9297
EXPECT_EQ(pointCloud.getFieldValues<RAY_IDX_U32>(), rayIdx);
9398
EXPECT_EQ(pointCloud.getFieldValues<ENTITY_ID_I32>(), entityId);
9499
EXPECT_EQ(pointCloud.getFieldValues<INTENSITY_F32>(), intensity);
100+
EXPECT_EQ(pointCloud.getFieldValues<REFLECTIVITY_F32>(), reflectivity);
95101
EXPECT_EQ(pointCloud.getFieldValues<RING_ID_U16>(), ringId);
96102
EXPECT_EQ(pointCloud.getFieldValues<AZIMUTH_F32>(), azimuth);
97103
EXPECT_EQ(pointCloud.getFieldValues<DISTANCE_F32>(), distance);

0 commit comments

Comments
 (0)