@foxglove/velodyne-cloud
Version:
TypeScript library for converting Velodyne LIDAR packet data to point clouds
72 lines • 4.03 kB
JavaScript
;
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/
Object.defineProperty(exports, "__esModule", { value: true });
const kelonio_1 = require("kelonio");
const Calibration_1 = require("./Calibration");
const PointCloud_1 = require("./PointCloud");
const RawPacket_1 = require("./RawPacket");
const Transformer_1 = require("./Transformer");
const VelodyneTypes_1 = require("./VelodyneTypes");
const packets_1 = require("./fixtures/packets");
function norm(x, y, z) {
return Math.hypot(x, y, z);
}
describe("Transformer", () => {
it("can transform a packet from an HDL-32E", () => {
const calibration = new Calibration_1.Calibration(VelodyneTypes_1.Model.HDL32E);
const transform = new Transformer_1.Transformer(calibration);
expect(transform.calibration).toStrictEqual(calibration);
expect(transform.minRange).toEqual(0.4);
expect(transform.maxRange).toEqual(100);
const raw = new RawPacket_1.RawPacket(packets_1.HDL32E_PACKET1);
const cloud = new PointCloud_1.PointCloud({ stamp: 42, maxPoints: RawPacket_1.RawPacket.MAX_POINTS_PER_PACKET });
transform.unpack(raw, 42, 42.1, cloud);
cloud.trim();
expect(cloud.height).toEqual(1);
expect(cloud.width).toEqual(382);
expect(cloud.data.byteLength).toEqual(382 * PointCloud_1.PointCloud.POINT_STEP);
const view = new DataView(cloud.data.buffer, cloud.data.byteOffset, cloud.data.byteLength);
expect(view.getFloat32(0, true)).toEqual(-1.5504857301712036); // x
expect(view.getFloat32(4, true)).toEqual(1.4397920370101929); // y
expect(view.getFloat32(8, true)).toEqual(-1.254827857017517); // z
expect(view.getFloat32(12, true)).toEqual(2.4600000381469727); // distance
expect(view.getFloat32(16, true)).toEqual(9); // intensity
expect(view.getUint16(20, true)).toEqual(0); // ring
expect(view.getUint16(22, true)).toEqual(22288); // azimuth
expect(view.getUint32(24, true)).toEqual(1e8); // deltaNs
for (let i = 0; i < cloud.width; i++) {
const p = cloud.point(i);
expect(norm(p.x, p.y, p.z)).toBeCloseTo(p.distance);
expect(p.azimuth).toBeGreaterThanOrEqual(transform.minAngle);
expect(p.azimuth).toBeLessThanOrEqual(transform.maxAngle);
expect(p.distance).toBeGreaterThanOrEqual(transform.minRange);
expect(p.distance).toBeLessThanOrEqual(transform.maxRange);
expect(p.intensity).toBeGreaterThanOrEqual(0);
expect(p.intensity).toBeLessThanOrEqual(255);
expect(p.ring).toBeGreaterThanOrEqual(0);
expect(p.ring).toBeLessThanOrEqual(31);
expect(p.deltaNs).toBeGreaterThanOrEqual(0);
expect(p.deltaNs).toBeLessThanOrEqual(2e8);
}
});
// CI performance is non-deterministic, a better approach will be to have dedicated machines
// and log performance over time to correlate regressions rather than gate
// eslint-disable-next-line jest/no-disabled-tests
it.skip("has expected performance", async () => {
const calibration = new Calibration_1.Calibration(VelodyneTypes_1.Model.HDL32E);
const transform = new Transformer_1.Transformer(calibration);
const maxPoints = RawPacket_1.RawPacket.MAX_POINTS_PER_PACKET * 100;
await kelonio_1.benchmark.record(["Transformer", "HDL-32E"], () => {
const raw = new RawPacket_1.RawPacket(packets_1.HDL32E_PACKET1);
const cloud = new PointCloud_1.PointCloud({ stamp: 0, maxPoints });
for (let i = 0; i < 100; i++) {
transform.unpack(raw, 0, 0, cloud);
}
cloud.trim();
}, { iterations: 10, meanUnder: 15 });
console.log(kelonio_1.benchmark.report());
}, 10000);
});
//# sourceMappingURL=Transformer.test.js.map