Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Track object with radar postprocess input test #311

Open
wants to merge 21 commits into
base: develop
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f0ce4bf
Implement sub-sampling in raytracing code (#277)
prybicki Apr 24, 2024
02c0516
Add node for radar object tracking (#280)
PawelLiberadzki Apr 25, 2024
c8ea5a1
Feature/fault injection (#281)
PiotrMrozik May 6, 2024
a62de0d
Integration with radar udp publisher (#282)
msz-rai May 6, 2024
01ea29b
Implement sub-sampling reduction kernels (#284)
prybicki May 10, 2024
c4ab95d
Add API call to configure beam divergence (#283)
prybicki May 15, 2024
323d983
Add object tracking to RadarTrackObjectsNode (#288)
PawelLiberadzki May 22, 2024
c632a10
Architectural changes to support multi-return feature (#285)
prybicki May 23, 2024
d23a43e
Add missing MR API call declaration (#289)
prybicki May 23, 2024
f9b6a43
Compute XYZ in MR based on distance, not XYZ samples (#295)
prybicki Jun 5, 2024
9cdcaea
Add MR test (#290)
nebraszka Jun 5, 2024
922246a
Update MR beam model - distinct vertical/horizontal divergence (#297)
nebraszka Jun 7, 2024
4bdc9b6
Update multi-return sampling parameters to (3,19) (#299)
prybicki Jun 11, 2024
6e7435f
Add initial support for object classification in RadarTrackObjectsNode.
PawelLiberadzki Jun 7, 2024
5613984
Add API call for setting radar object classes.
PawelLiberadzki Jun 10, 2024
0fd52b5
Update radar track objects tests to handle object ids.
PawelLiberadzki Jun 10, 2024
b58ad2d
Add safety static_cast.
PawelLiberadzki Jun 10, 2024
6c66642
Make fixes based on the review.
PawelLiberadzki Jun 11, 2024
fe0afff
Prevent underflow in loop condition (#308)
nebraszka Jun 13, 2024
bb367b1
Add handling nan radial speeds in radar nodes (#309)
PawelLiberadzki Jun 17, 2024
40539f7
Tracking reflector with radar postprocess input test
nebraszka Jun 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Architectural changes to support multi-return feature (#285)
* Architectural changes to support multi-return feature
prybicki authored May 23, 2024
commit c632a10ce0977d063545a7809ece8abdc3a86583
21 changes: 21 additions & 0 deletions src/api/apiCore.cpp
Original file line number Diff line number Diff line change
@@ -1311,6 +1311,27 @@ void TapeCore::tape_node_gaussian_noise_distance(const YAML::Node& yamlNode, Pla
state.nodes.insert({nodeId, node});
}

RGL_API rgl_status_t rgl_node_multi_return_switch(rgl_node_t* node, rgl_return_type_t return_type)
{
auto status = rglSafeCall([&]() {
RGL_API_LOG("rgl_node_multi_return_switch(node={}, return_type={})", repr(node), return_type);
CHECK_ARG(node != nullptr);

createOrUpdateNode<MultiReturnSwitchNode>(node, return_type);
});
TAPE_HOOK(node, return_type);
return status;
}

void TapeCore::tape_node_multi_return_switch(const YAML::Node& yamlNode, PlaybackState& state)
{
auto nodeId = yamlNode[0].as<TapeAPIObjectID>();
auto return_type = static_cast<rgl_return_type_t>(yamlNode[1].as<int>());
rgl_node_t node = state.nodes.contains(nodeId) ? state.nodes.at(nodeId) : nullptr;
rgl_node_multi_return_switch(&node, return_type);
state.nodes.insert({nodeId, node});
}

rgl_status_t rgl_node_is_alive(rgl_node_t node, bool* out_alive)
{
auto status = rglSafeCall([&]() {
27 changes: 16 additions & 11 deletions src/gpu/nodeKernels.cu
Original file line number Diff line number Diff line change
@@ -229,25 +229,30 @@ __global__ void kProcessBeamSamplesFirstLast(size_t beamCount, int samplesPerBea
LIMIT(beamCount);

const auto beamIdx = tid;
int firstIdx = 0;
int lastIdx = 0;
int firstIdx = -1;
int lastIdx = -1;
for (int sampleIdx = 0; sampleIdx < samplesPerBeam; ++sampleIdx) {
if (beamSamples.isHit[beamIdx * samplesPerBeam + sampleIdx] == 0) {
continue;
}
if (beamSamples.distance[beamIdx * samplesPerBeam + sampleIdx] <
beamSamples.distance[beamIdx * samplesPerBeam + firstIdx]) {
auto currentFirstDistance = firstIdx >= 0 ? beamSamples.distance[beamIdx * samplesPerBeam + firstIdx] : FLT_MAX;
auto currentLastDistance = lastIdx >= 0 ? beamSamples.distance[beamIdx * samplesPerBeam + lastIdx] : -FLT_MAX;
if (beamSamples.distance[beamIdx * samplesPerBeam + sampleIdx] < currentFirstDistance) {
firstIdx = sampleIdx;
}
if (beamSamples.distance[beamIdx * samplesPerBeam + sampleIdx] >
beamSamples.distance[beamIdx * samplesPerBeam + lastIdx]) {
if (beamSamples.distance[beamIdx * samplesPerBeam + sampleIdx] > currentLastDistance) {
lastIdx = sampleIdx;
}
}
first.xyz[beamIdx] = beamSamples.xyz[beamIdx * samplesPerBeam + firstIdx];
first.distance[beamIdx] = beamSamples.distance[beamIdx * samplesPerBeam + firstIdx];
last.xyz[beamIdx] = beamSamples.xyz[beamIdx * samplesPerBeam + lastIdx];
last.distance[beamIdx] = beamSamples.distance[beamIdx * samplesPerBeam + lastIdx];
bool isHit = firstIdx >= 0; // Note that firstHit >= 0 implies lastHit >= 0
first.isHit[beamIdx] = isHit;
last.isHit[beamIdx] = isHit;
if (isHit) {
first.xyz[beamIdx] = beamSamples.xyz[beamIdx * samplesPerBeam + firstIdx];
first.distance[beamIdx] = beamSamples.distance[beamIdx * samplesPerBeam + firstIdx];
last.xyz[beamIdx] = beamSamples.xyz[beamIdx * samplesPerBeam + lastIdx];
last.distance[beamIdx] = beamSamples.distance[beamIdx * samplesPerBeam + lastIdx];
}
}


@@ -327,4 +332,4 @@ void gpuProcessBeamSamplesFirstLast(cudaStream_t stream, size_t beamCount, int s
MultiReturnPointers first, MultiReturnPointers last)
{
run(kProcessBeamSamplesFirstLast, stream, beamCount, samplesPerBeam, beamSamples, first, last);
}
}
27 changes: 27 additions & 0 deletions src/graph/NodesCore.hpp
Original file line number Diff line number Diff line change
@@ -128,6 +128,8 @@ struct RaytraceNode : IPointsNode
return std::const_pointer_cast<const IAnyArray>(fieldData.at(field));
}

IAnyArray::ConstPtr getFieldDataMultiReturn(rgl_field_t field, rgl_return_type_t);

// RaytraceNode specific
void setVelocity(const Vec3f& linearVelocity, const Vec3f& angularVelocity);
void enableRayDistortion(bool enabled) { doApplyDistortion = enabled; }
@@ -193,6 +195,31 @@ struct RaytraceNode : IPointsNode
void setFields(const std::set<rgl_field_t>& fields);
};

struct MultiReturnSwitchNode : IPointsNodeSingleInput
{
using Ptr = std::shared_ptr<MultiReturnSwitchNode>;
void setParameters(rgl_return_type_t returnType) { this->returnType = returnType; }

// Node
void validateImpl() override
{
IPointsNodeSingleInput::validateImpl();
rtxInput = getExactlyOneInputOfType<RaytraceNode>();
}

void enqueueExecImpl() override {}

// Data getters
IAnyArray::ConstPtr getFieldData(rgl_field_t field) override
{
return rtxInput->getFieldDataMultiReturn(field, returnType);
}

private:
rgl_return_type_t returnType;
RaytraceNode::Ptr rtxInput;
};

struct TransformPointsNode : IPointsNodeSingleInput
{
using Ptr = std::shared_ptr<TransformPointsNode>;
21 changes: 21 additions & 0 deletions src/graph/RaytraceNode.cpp
Original file line number Diff line number Diff line change
@@ -137,6 +137,27 @@ void RaytraceNode::enqueueExecImpl()
mrSamples.getPointers(), mrFirst.getPointers(), mrLast.getPointers());
}

IAnyArray::ConstPtr RaytraceNode::getFieldDataMultiReturn(rgl_field_t field, rgl_return_type_t type)
{
if (type == RGL_RETURN_TYPE_FIRST) {
switch (field) {
case XYZ_VEC3_F32: return mrFirst.xyz;
case DISTANCE_F32: return mrFirst.distance;
case IS_HIT_I32: return mrFirst.isHit;
default: throw InvalidPipeline(fmt::format("Multi-Return not supported for this field ({})", toString(field)));
}
}
if (type == RGL_RETURN_TYPE_LAST) {
switch (field) {
case XYZ_VEC3_F32: return mrLast.xyz;
case DISTANCE_F32: return mrLast.distance;
case IS_HIT_I32: return mrLast.isHit;
default: throw InvalidPipeline(fmt::format("Multi-Return not supported for this field ({})", toString(field)));
}
}
throw InvalidPipeline(fmt::format("Unknown multi-return type ({})", type));
}

void RaytraceNode::setFields(const std::set<rgl_field_t>& fields)
{
auto keyViewer = std::views::keys(fieldData);
2 changes: 2 additions & 0 deletions src/tape/TapeCore.hpp
Original file line number Diff line number Diff line change
@@ -68,6 +68,7 @@ class TapeCore
static void tape_node_gaussian_noise_angular_ray(const YAML::Node& yamlNode, PlaybackState& state);
static void tape_node_gaussian_noise_angular_hitpoint(const YAML::Node& yamlNode, PlaybackState& state);
static void tape_node_gaussian_noise_distance(const YAML::Node& yamlNode, PlaybackState& state);
static void tape_node_multi_return_switch(const YAML::Node& yamlNode, PlaybackState& state);

// Called once in the translation unit
static inline bool autoExtendTapeFunctions = std::invoke([]() {
@@ -123,6 +124,7 @@ class TapeCore
TAPE_CALL_MAPPING("rgl_node_gaussian_noise_angular_ray", TapeCore::tape_node_gaussian_noise_angular_ray),
TAPE_CALL_MAPPING("rgl_node_gaussian_noise_angular_hitpoint", TapeCore::tape_node_gaussian_noise_angular_hitpoint),
TAPE_CALL_MAPPING("rgl_node_gaussian_noise_distance", TapeCore::tape_node_gaussian_noise_distance),
TAPE_CALL_MAPPING("rgl_node_multi_return_switch", TapeCore::tape_node_multi_return_switch),
};
TapePlayer::extendTapeFunctions(tapeFunctions);
return true;