rclnodejs
Version:
ROS2.0 JavaScript client with Node.js
65 lines (54 loc) • 1.74 kB
JavaScript
// Cross-process data integrity test: validates data from external ROS2 publisher
;
const rclnodejs = require('./index.js');
const EXPECTED_DATA = [1.0, 2.0, 3.0];
async function main() {
await rclnodejs.init();
const node = new rclnodejs.Node('xproc_data_sub');
let msgCount = 0;
let errCount = 0;
const errors = [];
node.createSubscription(
'std_msgs/msg/Float64MultiArray',
'/xproc_data_topic',
(msg) => {
msgCount++;
if (!msg || !msg.data) {
errCount++;
errors.push(`msg#${msgCount}: missing data`);
} else {
const arr = Array.from(msg.data);
for (let i = 0; i < EXPECTED_DATA.length; i++) {
if (Math.abs(arr[i] - EXPECTED_DATA[i]) > 1e-9) {
errCount++;
errors.push(
`msg#${msgCount}: data[${i}] expected ${EXPECTED_DATA[i]}, got ${arr[i]}`
);
}
}
if (arr.length !== EXPECTED_DATA.length) {
errCount++;
errors.push(
`msg#${msgCount}: expected ${EXPECTED_DATA.length} elements, got ${arr.length}`
);
}
}
}
);
rclnodejs.spin(node);
console.log('Listening on /xproc_data_topic for 10s...');
setTimeout(() => {
console.log(`\n=== Cross-Process Data Integrity ===`);
console.log(`Received: ${msgCount} messages`);
console.log(`Data errors: ${errCount}`);
if (errors.length > 0) {
errors.slice(0, 10).forEach((e) => console.log(` ${e}`));
}
const pass = errCount === 0 && msgCount > 0;
console.log(`Result: ${pass ? 'PASS' : 'FAIL'}`);
node.stop();
rclnodejs.shutdown();
process.exit(0);
}, 10000);
}
main().catch(console.error);