public bool Save(string path) { int rotationCount = Mathf.CeilToInt(360.0f / HorizontalAngleLimit); float minAngle = 360.0f / CurrentMeasurementsPerRotation; int count = (int)(HorizontalAngleLimit / minAngle); float angle = HorizontalAngleLimit / 2.0f; var active = new ReadRequest[rotationCount]; var cmd = CommandBufferPool.Get(); try { for (int i = 0; i < rotationCount; i++) { var rotation = Quaternion.AngleAxis(angle, Vector3.up); SensorCamera.transform.localRotation = rotation; BeginReadRequest(count, ref active[i]); angle += HorizontalAngleLimit; if (angle >= 360.0f) { angle -= 360.0f; } } for (int i = 0; i < rotationCount; i++) { EndReadRequest(cmd, active[i]); } } finally { HDRPUtilities.ExecuteAndClearCommandBuffer(cmd); CommandBufferPool.Release(cmd); Array.ForEach(active, req => AvailableRenderTextures.Push(req.TextureSet)); } PointCloudBuffer.GetData(Points); var worldToLocal = LidarTransform; if (Compensated) { worldToLocal = worldToLocal * transform.worldToLocalMatrix; } try { using (var writer = new PcdWriter(path)) { for (int p = 0; p < Points.Length; p++) { var point = Points[p]; if (point != Vector4.zero) { writer.Write(worldToLocal.MultiplyPoint3x4(point), point.w); } } ; } return(true); } catch (Exception ex) { Debug.LogException(ex); return(false); } }
void Generate(MapLane[] lanes) { var settings = EditorSettings.Load(); var lidar = Instantiate(settings.LidarSensor); lidar.Init(); lidar.TemplateIndex = LidarTemplate; lidar.LaserCount = LidarLaserCount; lidar.MinDistance = LidarMinDistance; lidar.MaxDistance = LidarMaxDistance; lidar.RotationFrequency = LidarRotationFrequency; lidar.RotationFrequency = LidarRotationFrequency; lidar.MeasurementsPerRotation = LidarMeasurementsPerRotation; lidar.RotationFrequency = LidarRotationFrequency; lidar.FieldOfView = LidarFieldOfView; lidar.CenterAngle = LidarCenterAngle; lidar.ApplyTemplate(); lidar.Reset(); int mapLayerMask = LayerMask.GetMask("Default"); try { using (var writer = new PcdWriter(FileName)) { for (int i = 0; i < lanes.Length; i++) { var lane = lanes[i]; float progress = (float)i / (lanes.Length - 1); var size = EditorUtility.FormatBytes(writer.Size); if (EditorUtility.DisplayCancelableProgressBar("Generating Point Cloud...", $"{writer.Count:N0} points ({size})", progress)) { return; } var positions = lane.mapLocalPositions; if (positions.Count > 1) { Vector3 p0 = lane.transform.TransformPoint(positions[0]); Vector3 p1; foreach (var next in positions.Skip(1)) { p1 = lane.transform.TransformPoint(next); RaycastHit hit; if (Physics.Raycast(p0 + Vector3.up * LidarMaxDistance, Vector2.down, out hit, float.MaxValue, mapLayerMask)) { float length = Vector3.Distance(p0, p1); int capturesPerSegment = (int)(Mathf.Max(Distance, length) / Distance); var delta = (p1 - p0) / capturesPerSegment; for (int c = 0; c < capturesPerSegment; c++) { var position = p0 + delta * c + hit.normal * Height; lidar.transform.position = position; var points = lidar.Capture(); for (int p = 0; p < points.Length; p++) { var point = points[p]; if (point != Vector4.zero && Random.value < Ratio) { var pt = point; writer.Write(new Vector3(pt.x, pt.z, pt.y), point.w); } } ; } } p0 = p1; } } } } } finally { EditorUtility.ClearProgressBar(); lidar.OnDestroy(); DestroyImmediate(lidar.gameObject); } }
public bool Save(string path) { int rotationCount = Mathf.CeilToInt(360.0f / HorizontalAngleLimit); float minAngle = 360.0f / CurrentMeasurementsPerRotation; int count = (int)(HorizontalAngleLimit / minAngle); float angle = HorizontalAngleLimit / 2.0f; var jobs = new NativeArray <JobHandle>(rotationCount, Allocator.Persistent); var active = new ReadRequest[rotationCount]; try { for (int i = 0; i < rotationCount; i++) { var rotation = Quaternion.AngleAxis(angle, Vector3.up); Camera.transform.localRotation = rotation; if (BeginReadRequest(count, angle, HorizontalAngleLimit, ref active[i])) { active[i].Readback = AsyncGPUReadback.Request(active[i].RenderTexture, 0); } angle += HorizontalAngleLimit; if (angle >= 360.0f) { angle -= 360.0f; } } for (int i = 0; i < rotationCount; i++) { active[i].Readback.WaitForCompletion(); jobs[i] = EndReadRequest(active[i], active[i].Readback.GetData <byte>()); } JobHandle.CompleteAll(jobs); } finally { Array.ForEach(active, req => AvailableRenderTextures.Push(req.RenderTexture)); jobs.Dispose(); } var worldToLocal = LidarTransform; if (Compensated) { worldToLocal = worldToLocal * transform.worldToLocalMatrix; } try { using (var writer = new PcdWriter(path)) { for (int p = 0; p < Points.Length; p++) { var point = Points[p]; if (point != Vector4.zero) { writer.Write(worldToLocal.MultiplyPoint3x4(point), point.w); } } ; } return(true); } catch (Exception ex) { Debug.LogException(ex); return(false); } }
private void Generate(MapTrafficLane[] lanes) { var sensorName = availableGeneratorTypes[GeneratorTypeIndex].Name; var path = $"Assets/External/Sensors/{sensorName}/{sensorName}.prefab"; var prefab = AssetDatabase.LoadAssetAtPath <GameObject>(path); var go = Instantiate(prefab); var generator = go.GetComponent <IPointCloudGenerator>(); generator.ApplySettings(currentTemplate); int mapLayerMask = LayerMask.GetMask("Default", "Obstacle"); try { using (var writer = new PcdWriter(FileName)) { for (int i = 0; i < lanes.Length; i++) { var lane = lanes[i]; float progress = (float)i / (lanes.Length - 1); var size = EditorUtility.FormatBytes(writer.Size); if (EditorUtility.DisplayCancelableProgressBar("Generating Point Cloud...", $"{writer.Count:N0} points ({size})", progress)) { return; } var positions = lane.mapLocalPositions; if (positions.Count > 1) { Vector3 p0 = lane.transform.TransformPoint(positions[0]); Vector3 p1; foreach (var next in positions.Skip(1)) { p1 = lane.transform.TransformPoint(next); RaycastHit hit; if (Physics.Raycast(p0 + Vector3.up * LidarMaxDistance, Vector2.down, out hit, float.MaxValue, mapLayerMask)) { float length = Vector3.Distance(p0, p1); int capturesPerSegment = (int)(Mathf.Max(Distance, length) / Distance); var delta = (p1 - p0) / capturesPerSegment; for (int c = 0; c < capturesPerSegment; c++) { var pos = p0 + delta * c + hit.normal * Height; var points = generator.GeneratePoints(pos); for (int p = 0; p < points.Length; p++) { var point = points[p]; if (point != Vector4.zero && UnityEngine.Random.Range(0f, 1f) < Ratio) { var pt = point; writer.Write(new Vector3(pt.z, -pt.x, pt.y), point.w); // Converting to right-handed xyz } } ; } } p0 = p1; } } } } } finally { EditorUtility.ClearProgressBar(); generator.Cleanup(); DestroyImmediate(go); } }