ArborFlow

ArborFlow is a cross-platform visual behavior tree editor for BehaviorTree.CPP. It runs as an Electron desktop app on Windows, Linux, and macOS.

Features

  • Drag-and-drop behavior tree canvas with cycle and child-count validation
  • BehaviorTree.CPP control, decorator, action, condition, and subtree nodes
  • Editable ports and blackboard expressions such as {goal}
  • Automatic tree layout, minimap, zoom, undo, and redo
  • ArborFlow project files (.arborflow) and BehaviorTree.CPP v4 XML import/export
  • Real-time node monitoring over a direct WebSocket or rosbridge_server
  • Runtime states: IDLE, RUNNING, SUCCESS, FAILURE, and SKIPPED

Development

Requirements: Node.js 20 or newer and npm.

npm install
npm run dev

Run a local status server in another terminal to exercise the monitor without ROS:

npm run mock:monitor

Connect ArborFlow to ws://127.0.0.1:1667 and the demo tree will cycle through live states.

Build the web assets and type-check the project:

npm run build

Create desktop packages on the current operating system:

npm run dist

Platform-specific targets are available as npm run dist:win, npm run dist:linux, and npm run dist:mac. Electron applications should normally be packaged on the matching host OS, especially for macOS signing.

Real-time Monitor

Open Monitor in the application toolbar and enter either a direct WebSocket endpoint or a rosbridge_server endpoint. Node references are matched in this order:

  1. ArborFlow node ID, visible in the Inspector
  2. Exact display name or registration name
  3. Last segment of a slash-separated path

Direct WebSocket protocol

ArborFlow accepts one JSON object per WebSocket message. A single status event can use any of nodeId, uid, node, name, or path as the node reference:

{"type":"status","nodeId":"navigate_action","status":"RUNNING","timestamp":1784635200000}

Numeric BehaviorTree.CPP status values are supported: 0=IDLE, 1=RUNNING, 2=SUCCESS, 3=FAILURE, and 4=SKIPPED.

A full snapshot can update several nodes at once:

{
  "type": "snapshot",
  "timestamp": 1784635200000,
  "nodes": {
    "BatteryOK": "SUCCESS",
    "NavigateToPose": "RUNNING",
    "ReportResult": "IDLE"
  }
}

The client sends {"type":"subscribe","client":"ArborFlow","protocol":1} after connecting and a ping every five seconds. A server may return the same timestamp using {"type":"pong","timestamp":1784635200000} to report round-trip latency.

ROS 2 with rosbridge

Start rosbridge and use its WebSocket address, usually ws://ROBOT_IP:9090:

ros2 launch rosbridge_server rosbridge_websocket_launch.xml

The default topic is /arborflow/status with type std_msgs/msg/String. Publish the direct-protocol JSON as the string payload:

ros2 topic pub --once /arborflow/status std_msgs/msg/String \
  "{data: '{\"node\":\"NavigateToPose\",\"status\":\"RUNNING\"}'}"

ArborFlow sends the rosbridge subscribe request automatically. The topic can be changed in the monitor panel.

Project format

.arborflow files retain visual positions, editor metadata, node ports, and stable monitor IDs. XML exports contain only BehaviorTree.CPP data. Runtime monitor state is transient and is never saved into either format.

License

MIT

Description
No description provided
Readme MIT 212 KiB
Languages
TypeScript 68.8%
CSS 25.9%
JavaScript 5%
HTML 0.3%