Dear Nvidia,
I’ve just started using your software and I’ve ran into an issue.
What I would like to do is:
- Subscribe to a PointCloudProto topic
- Do modifications/calculations on raw PointCloud data
- Republish the modified PointCloud
As a primer I tried to simply create an “Echo” node that subscribes and publishes the same pointcloud:
reference.cpp:
include “reference.hpp”
void Reference::start() {
tickOnMessage(rx_cloud_in());
}void Reference::tick() {
PointCloudProto::Reader proto_in = rx_cloud_in().getProto();
PointCloudProto::Builder proto_out = tx_cloud_out().initProto();if (proto_in.hasPositions()) { proto_out.setPositions(proto_in.getPositions()); LOG_INFO("Received position"); } if (proto_in.hasNormals()) { proto_out.setNormals(proto_in.getNormals()); LOG_INFO("Received normals"); } if (proto_in.hasIntensities()) { proto_out.setIntensities(proto_in.getIntensities()); LOG_INFO("Received intensities"); } if (proto_in.hasColors()) { proto_out.setColors(proto_in.getColors()); LOG_INFO("Received colors"); } tx_cloud_out().publish();
}
void Reference::stop() {}
reference.hpp
#pragma once
include “engine/alice/alice_codelet.hpp”
include “messages/point_cloud.capnp.h”class Reference : public isaac::alice::Codelet {
public:
void start() override;
void tick() override;
void stop() override;
ISAAC_PROTO_RX(PointCloudProto, cloud_in);
ISAAC_PROTO_TX(PointCloudProto, cloud_out);
};
ISAAC_ALICE_REGISTER_CODELET(Reference);
These are the edges of the system:
"edges": [ { "source": "vlp16/isaac.velodyne_lidar.VelodyneLidar/scan", "target": "scan_accumulator/isaac.perception.ScanAccumulator/scan" }, { "source": "scan_accumulator/isaac.perception.ScanAccumulator/fullscan", "target": "point_cloud/isaac.perception.RangeToPointCloud/scan" }, { "source": "point_cloud/isaac.perception.RangeToPointCloud/cloud", "target": "reference/reference/cloud_in" }, { "source": "reference/reference/cloud_out", "target": "hgmm/isaac.hgmm.HgmmPointCloudMatching/cloud" } ]
Now the problem that I ran into, this is what gets printed to console:
2020-08-10 15:49:46.263 INFO packages/bridge/reference.cpp@13: Received position
2020-08-10 15:49:46.263 INFO packages/bridge/reference.cpp@21: Received intensities
2020-08-10 15:49:46.263 ERROR messages/tensor.cpp@49: Buffer index 0 out of range (0):
So the node DOES get triggered, the new proto_out function does write data, yet the receiver (hgmm) does not function. It does not compute a pose. Where is this tensor located?
The system DOES work if i bypass my own node, like this:
"edges": [ { "source": "vlp16/isaac.velodyne_lidar.VelodyneLidar/scan", "target": "scan_accumulator/isaac.perception.ScanAccumulator/scan" }, { "source": "scan_accumulator/isaac.perception.ScanAccumulator/fullscan", "target": "point_cloud/isaac.perception.RangeToPointCloud/scan" }, { "source": "point_cloud/isaac.perception.RangeToPointCloud/cloud", "target": "reference/reference/cloud_in" }, { "source": "point_cloud/isaac.perception.RangeToPointCloud/cloud", "target": "hgmm/isaac.hgmm.HgmmPointCloudMatching/cloud" } ]
Assuming that this is an easy fix, I would also like to know how I can easily inspect the raw pointcloud data to a form that i can easily/intuitively perform math on.