UNPKG

@foxglove/rosbag2-node

Version:

ROS 2 (Robot Operating System) bag reader and writer for node.js

175 lines 8.49 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable jest/no-conditional-expect */ const rosbag2_1 = require("@foxglove/rosbag2"); const rostime_1 = require("@foxglove/rostime"); const path_1 = __importDefault(require("path")); const open_1 = require("./open"); const BAG_START = { sec: 1585866235, nsec: 112411371 }; const BAG_END = { sec: 1585866239, nsec: 643508139 }; const TOPICS = ["/rosout", "/topic"]; const DATATYPES = ["rcl_interfaces/msg/Log", "std_msgs/msg/String"]; describe("SqliteNodejs single bag file handling", () => { it("reads messages", async () => { const bagFilename = path_1.default.join(__dirname, "..", "tests", "bags", "talker", "talker.db3"); const bag = await (0, open_1.openNodejsFile)(bagFilename); let seenRosout = false; let seenTopic = false; let prevTime = { sec: 0, nsec: 0 }; for await (const msg of bag.readMessages()) { expect((0, rostime_1.isTimeInRangeInclusive)(msg.timestamp, BAG_START, BAG_END)).toEqual(true); expect((0, rostime_1.isGreaterThan)(msg.timestamp, prevTime)).toEqual(true); expect(TOPICS.includes(msg.topic.name)).toEqual(true); expect(DATATYPES.includes(msg.topic.type)).toEqual(true); if (!seenRosout && msg.topic.name === "/rosout") { seenRosout = true; expect(msg.value).toEqual({ stamp: { sec: 1585866235, nanosec: 112130688 }, level: 20, name: "minimal_publisher", msg: "Publishing: 'Hello, world! 0'", file: "/opt/ros2_ws/eloquent/src/ros2/examples/rclcpp/minimal_publisher/lambda.cpp", function: "operator()", line: 38, }); expect(msg.data.byteLength).toBe(176); } else if (!seenTopic && msg.topic.name === "/topic") { seenTopic = true; expect(msg.value).toEqual({ data: "Hello, world! 0" }); expect(msg.data.byteLength).toBe(24); } prevTime = msg.timestamp; } }); it("reads messages with sec,nsec time type", async () => { const bagFilename = path_1.default.join(__dirname, "..", "tests", "bags", "talker", "talker.db3"); const bag = await (0, open_1.openNodejsFile)(bagFilename, { timeType: "sec,nsec" }); for await (const msg of bag.readMessages()) { if (msg.topic.name !== "/rosout") { continue; } expect(msg.value).toEqual({ stamp: { sec: 1585866235, nsec: 112130688 }, level: 20, name: "minimal_publisher", msg: "Publishing: 'Hello, world! 0'", file: "/opt/ros2_ws/eloquent/src/ros2/examples/rclcpp/minimal_publisher/lambda.cpp", function: "operator()", line: 38, }); expect(msg.data.byteLength).toBe(176); break; } }); it("reads start/end times", async () => { const bagFilename = path_1.default.join(__dirname, "..", "tests", "bags", "talker", "talker.db3"); const bag = await (0, open_1.openNodejsFile)(bagFilename); const [startTime, endTime] = await bag.timeRange(); expect(startTime).toEqual(BAG_START); expect(endTime).toEqual(BAG_END); }); it("reads the topic list", async () => { const bagFilename = path_1.default.join(__dirname, "..", "tests", "bags", "talker", "talker.db3"); const bag = await (0, open_1.openNodejsFile)(bagFilename); const topics = await bag.readTopics(); expect(topics.length).toEqual(3); expect(topics[0].name).toEqual("/rosout"); expect(topics[1].name).toEqual("/parameter_events"); expect(topics[2].name).toEqual("/topic"); }); it("reads message counts", async () => { const bagFilename = path_1.default.join(__dirname, "..", "tests", "bags", "talker", "talker.db3"); const bag = await (0, open_1.openNodejsFile)(bagFilename); const counts = await bag.messageCounts(); expect(counts.size).toEqual(2); expect(counts.get("/rosout")).toEqual(10); expect(counts.get("/topic")).toEqual(10); }); }); describe("SqliteNodejs single bag directory handling", () => { it("does not fail on an empty set", async () => { const bag = new rosbag2_1.Rosbag2([]); await expect(bag.open()).resolves.toBeUndefined(); }); it("reads messages", async () => { const bagPath = path_1.default.join(__dirname, "..", "tests", "bags", "talker"); const bag = await (0, open_1.openNodejsDirectory)(bagPath); let seenRosout = false; let seenTopic = false; let prevTime = { sec: 0, nsec: 0 }; for await (const msg of bag.readMessages()) { expect((0, rostime_1.isTimeInRangeInclusive)(msg.timestamp, BAG_START, BAG_END)).toEqual(true); expect((0, rostime_1.isGreaterThan)(msg.timestamp, prevTime)).toEqual(true); expect(TOPICS.includes(msg.topic.name)).toEqual(true); expect(DATATYPES.includes(msg.topic.type)).toEqual(true); if (!seenRosout && msg.topic.name === "/rosout") { seenRosout = true; expect(msg.value).toEqual({ stamp: { sec: 1585866235, nanosec: 112130688 }, level: 20, name: "minimal_publisher", msg: "Publishing: 'Hello, world! 0'", file: "/opt/ros2_ws/eloquent/src/ros2/examples/rclcpp/minimal_publisher/lambda.cpp", function: "operator()", line: 38, }); expect(msg.data.byteLength).toBe(176); } else if (!seenTopic && msg.topic.name === "/topic") { seenTopic = true; expect(msg.value).toEqual({ data: "Hello, world! 0" }); expect(msg.data.byteLength).toBe(24); } prevTime = msg.timestamp; } }); it("reads messages with sec,nsec time type", async () => { const bagPath = path_1.default.join(__dirname, "..", "tests", "bags", "talker"); const bag = await (0, open_1.openNodejsDirectory)(bagPath, { timeType: "sec,nsec" }); for await (const msg of bag.readMessages()) { if (msg.topic.name !== "/rosout") { continue; } expect(msg.value).toEqual({ stamp: { sec: 1585866235, nsec: 112130688 }, level: 20, name: "minimal_publisher", msg: "Publishing: 'Hello, world! 0'", file: "/opt/ros2_ws/eloquent/src/ros2/examples/rclcpp/minimal_publisher/lambda.cpp", function: "operator()", line: 38, }); expect(msg.data.byteLength).toBe(176); break; } }); it("reads start/end times", async () => { const bagPath = path_1.default.join(__dirname, "..", "tests", "bags", "talker"); const bag = await (0, open_1.openNodejsDirectory)(bagPath); const [startTime, endTime] = await bag.timeRange(); expect(startTime).toEqual(BAG_START); expect(endTime).toEqual(BAG_END); }); it("reads the topic list", async () => { const bagPath = path_1.default.join(__dirname, "..", "tests", "bags", "talker"); const bag = await (0, open_1.openNodejsDirectory)(bagPath); const topics = await bag.readTopics(); expect(topics.length).toEqual(3); expect(topics[0].name).toEqual("/rosout"); expect(topics[1].name).toEqual("/parameter_events"); expect(topics[2].name).toEqual("/topic"); }); it("reads message counts", async () => { const bagPath = path_1.default.join(__dirname, "..", "tests", "bags", "talker"); const bag = await (0, open_1.openNodejsDirectory)(bagPath); const counts = await bag.messageCounts(); expect(counts.size).toEqual(2); expect(counts.get("/rosout")).toEqual(10); expect(counts.get("/topic")).toEqual(10); }); }); //# sourceMappingURL=Rosbag2.test.js.map