rclnodejs
Version:
ROS2.0 JavaScript client with Node.js
84 lines (67 loc) • 2.18 kB
JavaScript
// Multi-frequency stress test for subscription performance
;
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);