Hi, I am using the “Unity examples” v2.6.0 downloaded from Magic Leap Hub 3.
I only modified the script named “PixelSensorExample.cs” in scene “PixelSensor”. From line 341 to line 360. The original one is:
public void UpdateVisualizer(StringBuilder frameDataText)
{
if (!PixelSensorFeature.GetSensorData(SensorId, ConfiguredStream, out var frame, out _, Allocator.Temp))
{
return;
}
frameDataText.AppendLine("");
frameDataText.AppendLine($"Sensor: {SensorId.SensorName}");
frameDataText.AppendLine($"Frame Type: {frame.FrameType}");
frameDataText.AppendLine($"Frame Valid: {frame.IsValid}");
frameDataText.AppendLine($"Capture Time: {frame.CaptureTime}");
frameDataText.AppendLine($"Frame Plane Count: {frame.Planes.Length}");
Visualizer.ProcessFrame(in frame);
}
I simple added a debug log to see if it is returning metadata
public void UpdateVisualizer(StringBuilder frameDataText)
{
if (!PixelSensorFeature.GetSensorData(SensorId, ConfiguredStream, out var frame, out PixelSensorMetaData[] metadata, Allocator.Temp))
{
return;
}
string debugString = "";
foreach (var meta in metadata)
{
debugString += meta;
debugString += "|";
}
Debug.Log(metadata.Length+"|"+debugString);
//asdas
frameDataText.AppendLine("");
frameDataText.AppendLine($"Sensor: {SensorId.SensorName}");
frameDataText.AppendLine($"Frame Type: {frame.FrameType}");
frameDataText.AppendLine($"Frame Valid: {frame.IsValid}");
frameDataText.AppendLine($"Capture Time: {frame.CaptureTime}");
frameDataText.AppendLine($"Frame Plane Count: {frame.Planes.Length}");
Visualizer.ProcessFrame(in frame);
}
As for my project, I took reference from API Overview | MagicLeap Developer Documentation , the example usage part of query sensor data.
The following is part of my code in my project. Frame data is outputed correctly but not metadata. If you need extra information please ask. I have no idea on what I should look into. Thank you very much!
public List<Vector3> Capture(StringBuilder frameDataText, out string datetimeString)
{
List<Vector3> depthPoints = new();
PixelSensorPinholeIntrinsics pinholeIntrinsics;
datetimeString = "";
if (PixelSensorFeature.GetSensorStatus(SensorId) ==
PixelSensorStatus.Started)
{
if (!PixelSensorFeature.GetSensorData(SensorId, ConfiguredStream, out PixelSensorFrame frame, out PixelSensorMetaData[] metaData, Allocator.Temp))
{
return depthPoints;
}
foreach (var meta in metaData)
{
Debug.Log("meta:" + meta);
}
if (PixelSensorFeature.GetSensorData(SensorId, ConfiguredStream, out frame,
out metaData, Allocator.Temp, shouldFlipTexture: false))
{
Debug.Log(SensorId + " | " + metaData.Length + " | " + metaData);
frameDataText.AppendLine("[Metadata]");
frameDataText.AppendLine($"Capture Time: {frame.CaptureTime}");
frameDataText.AppendLine($"Sensor: {SensorId.SensorName}");
frameDataText.AppendLine($"Frame Type: {frame.FrameType}");
frameDataText.AppendLine($"Frame Valid: {frame.IsValid}");
frameDataText.AppendLine($"Frame Plane Count: {frame.Planes.Length}");
Debug.Log("GetStringFromMetaData");
GetStringFromMetaData(in metaData, in frameDataText, out pinholeIntrinsics);
Debug.Log("pinholeIntrinsics: " + pinholeIntrinsics);
// pose
frameDataText.AppendLine($"[Extrinsics]");
var frameRotation = PixelSensorFeature.GetSensorFrameRotation(SensorId);
Pose sensorPose;
if (xrOrigin != null)
{
Pose offset = new Pose(
xrOrigin.CameraFloorOffsetObject.transform.position,
xrOrigin.transform.rotation);
sensorPose = PixelSensorFeature.GetSensorPose(SensorId, frame.CaptureTime, offset);
}
else
{
sensorPose = PixelSensorFeature.GetSensorPose(SensorId);
}
frameDataText.AppendLine($"Sensor Pose Position: {sensorPose.position.x:F7},{sensorPose.position.y:F7},{sensorPose.position.z:F7}");
frameDataText.AppendLine($"Sensor Pose Rotation: {sensorPose.rotation.x:F8},{sensorPose.rotation.y:F8},{sensorPose.rotation.z:F8},{sensorPose.rotation.w:F8}");
frameDataText.AppendLine($"Frame Rotation: {frameRotation}");
var confidenceBuffer = metaData.OfType<PixelSensorDepthConfidenceBuffer>().FirstOrDefault();
var flagBuffer = metaData.OfType<PixelSensorDepthFlagBuffer>().FirstOrDefault();
uint height, width;
Debug.Log("ProcessFrame");
var texture = ProcessFrame(in frame, in frameDataText, in confidenceBuffer, in flagBuffer, out height, out width, out string datetime);
datetimeString = datetime;
Debug.Log("resolution: " + height + " | " + width);
if (frame.FrameType == PixelSensorFrameType.Depth32)
{
//something to generate PCD from depth image
}
if (frame.FrameType == PixelSensorFrameType.DepthRaw)
{
//something else
}
}
}
return depthPoints;
}