| Crates.io | agentic-robotics-node |
| lib.rs | agentic-robotics-node |
| version | 0.1.1 |
| created_at | 2025-11-15 19:21:42.884726+00 |
| updated_at | 2025-11-15 20:01:36.273638+00 |
| description | High-performance agentic robotics framework with ROS2 compatibility |
| homepage | https://ruv.io |
| repository | https://github.com/ruvnet/vibecast |
| max_upload_size | |
| id | 1934679 |
| size | 129,715 |
Node.js/TypeScript bindings for Agentic Robotics
Part of the Agentic Robotics framework - high-performance robotics middleware with ROS2 compatibility.
npm install agentic-robotics
# or
yarn add agentic-robotics
# or
pnpm add agentic-robotics
import { Node, Publisher, Subscriber } from 'agentic-robotics';
// Create a node
const node = new Node('robot_node');
// Create publisher
const pubStatus = node.createPublisher<string>('/status');
// Create subscriber
const subCommands = node.createSubscriber<string>('/commands');
// Publish messages
pubStatus.publish('Robot initialized');
// Subscribe to messages
subCommands.onMessage((msg) => {
console.log('Received command:', msg);
});
const { Node } = require('agentic-robotics');
const node = new Node('robot_node');
const pubStatus = node.createPublisher('/status');
pubStatus.publish('Robot active');
const subSensor = node.createSubscriber('/sensor');
subSensor.onMessage((data) => {
console.log('Sensor data:', data);
});
import { Node } from 'agentic-robotics';
interface Pose {
x: number;
y: number;
theta: number;
}
interface Velocity {
linear: number;
angular: number;
}
const node = new Node('navigator');
// Subscribe to current pose
const subPose = node.createSubscriber<Pose>('/robot/pose');
// Publish velocity commands
const pubCmd = node.createPublisher<Velocity>('/cmd_vel');
// Navigation logic
subPose.onMessage((pose) => {
const target = { x: 10, y: 10 };
const cmd = computeVelocity(pose, target);
pubCmd.publish(cmd);
});
function computeVelocity(current: Pose, target: { x: number; y: number }): Velocity {
const dx = target.x - current.x;
const dy = target.y - current.y;
const distance = Math.sqrt(dx * dx + dy * dy);
const targetAngle = Math.atan2(dy, dx);
const angleError = targetAngle - current.theta;
return {
linear: Math.min(distance * 0.5, 1.0),
angular: angleError * 2.0,
};
}
import { Node } from 'agentic-robotics';
interface Image {
width: number;
height: number;
data: Uint8Array;
}
interface Detection {
label: string;
confidence: number;
bbox: { x: number; y: number; w: number; h: number };
}
const node = new Node('vision_node');
const subImage = node.createSubscriber<Image>('/camera/image');
const pubDetections = node.createPublisher<Detection[]>('/detections');
subImage.onMessage(async (image) => {
const detections = await detectObjects(image);
pubDetections.publish(detections);
});
async function detectObjects(image: Image): Promise<Detection[]> {
// Your ML inference here
return [
{ label: 'person', confidence: 0.95, bbox: { x: 100, y: 100, w: 50, h: 100 } },
];
}
import { Node } from 'agentic-robotics';
class RobotAgent {
private node: Node;
private id: string;
constructor(id: string) {
this.id = id;
this.node = new Node(`robot_${id}`);
// Subscribe to team status
const subTeam = this.node.createSubscriber<TeamStatus>('/team/status');
subTeam.onMessage((status) => this.onTeamUpdate(status));
// Publish own status
const pubStatus = this.node.createPublisher<RobotStatus>(`/robot/${id}/status`);
setInterval(() => {
pubStatus.publish({
id: this.id,
position: this.getPosition(),
battery: this.getBatteryLevel(),
});
}, 100);
}
private onTeamUpdate(status: TeamStatus) {
console.log(`Robot ${this.id} received team update:`, status);
// Coordinate with other robots
}
private getPosition() {
return { x: 0, y: 0, z: 0 };
}
private getBatteryLevel() {
return 95;
}
}
// Create robot swarm
const robots = [
new RobotAgent('scout_1'),
new RobotAgent('scout_2'),
new RobotAgent('worker_1'),
];
class Node {
constructor(name: string);
createPublisher<T>(topic: string): Publisher<T>;
createSubscriber<T>(topic: string): Subscriber<T>;
shutdown(): void;
}
class Publisher<T> {
publish(message: T): Promise<void>;
getTopic(): string;
}
class Subscriber<T> {
onMessage(callback: (message: T) => void): void;
getTopic(): string;
}
The Node.js bindings maintain near-native performance:
| Operation | Node.js | Rust Native | Overhead |
|---|---|---|---|
| Publish | 850 ns | 540 ns | 57% |
| Subscribe | 120 ns | 30 ns | 4x |
| Serialization | 1.2 ยตs | 540 ns | 2.2x |
Still significantly faster than traditional ROS2 Node.js bindings!
# Clone repository
git clone https://github.com/ruvnet/vibecast
cd vibecast
# Build Node.js addon
npm install
npm run build:node
# Run tests
npm test
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true,
"esModuleInterop": true
}
}
See the examples directory for complete working examples:
01-hello-robot.ts - Basic pub/sub02-autonomous-navigator.ts - A* pathfinding06-vision-tracking.ts - Object tracking with Kalman filters08-adaptive-learning.ts - Experience-based learningRun any example:
npm run build:ts
node examples/01-hello-robot.ts
The Node.js bindings are fully compatible with ROS2:
// Publish to ROS2 topic
const pubCmd = node.createPublisher<Twist>('/cmd_vel');
pubCmd.publish({
linear: { x: 0.5, y: 0, z: 0 },
angular: { x: 0, y: 0, z: 0.1 },
});
// Subscribe from ROS2 topic
const subPose = node.createSubscriber<PoseStamped>('/robot/pose');
Bridge with ROS2:
# Terminal 1: Node.js app
node my-robot.js
# Terminal 2: ROS2
ros2 topic echo /cmd_vel
Licensed under either of:
at your option.
Part of the Agentic Robotics framework โข Built with โค๏ธ by the Agentic Robotics Team