UNPKG

rclnodejs

Version:
84 lines (67 loc) 2.18 kB
// Multi-frequency stress test for subscription performance 'use strict'; const rclnodejs = require('./index.js'); const PUBLISH_HZ = parseInt(process.argv[2] || '100'); const TEST_DURATION_SEC = 10; async function main() { await rclnodejs.init(); const pubNode = new rclnodejs.Node('stress_pub_node'); const subNode = new rclnodejs.Node('stress_sub_node'); const publisher = pubNode.createPublisher( 'std_msgs/msg/Float64MultiArray', '/stress_test_topic' ); let msgCount = 0; let lastTs = null; const hzSamples = []; subNode.createSubscription( 'std_msgs/msg/Float64MultiArray', '/stress_test_topic', (msg) => { const now = Date.now(); msgCount++; if (lastTs) { const hz = 1000 / (now - lastTs); hzSamples.push(hz); } lastTs = now; } ); pubNode.spin(); subNode.spin(); let pubCount = 0; // Use high-resolution timer for more precise publishing const intervalMs = 1000 / PUBLISH_HZ; const pubInterval = setInterval(() => { publisher.publish({ data: [1.0, 2.0, 3.0, 4.0, 5.0] }); pubCount++; }, intervalMs); setTimeout(() => { clearInterval(pubInterval); if (hzSamples.length > 0) { const avgHz = hzSamples.reduce((a, b) => a + b, 0) / hzSamples.length; const minHz = Math.min(...hzSamples); const maxHz = Math.max(...hzSamples); const dropRate = ((pubCount - msgCount) / pubCount * 100); console.log(`Target: ${PUBLISH_HZ} Hz`); console.log(`Published: ${pubCount}`); console.log(`Received: ${msgCount}`); console.log(`Avg Hz: ${avgHz.toFixed(2)}`); console.log(`Min Hz: ${minHz.toFixed(2)}`); console.log(`Max Hz: ${maxHz.toFixed(2)}`); console.log(`Drop rate: ${dropRate.toFixed(1)}%`); if (avgHz < PUBLISH_HZ * 0.5) { console.log(`FAIL: Avg Hz significantly below target`); } else { console.log(`PASS`); } } else { console.log('No messages received!'); } pubNode.stop(); subNode.stop(); rclnodejs.shutdown(); process.exit(0); }, TEST_DURATION_SEC * 1000); } main().catch(console.error);