≣
{{ curProg.name }}
{{ row.label }}
{{ icon(row.ins.type) }}
{{ row.ins._name || describe(row.ins) }}{{ row.ins._name ? row.ins.type + ' — ' + describe(row.ins) : row.ins.type }}
{{ selRow && !selRow.label && (selRow.ins.type==='Loop'||selRow.ins.type==='If')
? 'palette blocks are added into the selected ' + selRow.ins.type : 'palette blocks are appended here' }}
BLOCKS
Tap a block to add it (into the selected Loop/If, otherwise at the end).
Robot is in Simulation
📷 Camera ● live
⧉
⤓
✕
{{ camera.info.source }} · {{ camera.info.w }}×{{ camera.info.h }} · {{ camera.detections.length }} object{{ camera.detections.length===1?'':'s' }}
▶ {{ run.program }}
{{ run.state }}
{{ run.elapsed.toFixed(1) }}s
{{ classifyCode('Error', run.error) }} · {{ run.error }}
{{ row.label }}
{{ icon(row.ins.type) }}{{ describe(row.ins) }}
{{ n.type }}
{{ n.type==='Start' ? 'program entry' : describe(n.ins) }}
{{ p }}
{{ connectFrom ? 'release / click a green IN port to connect — background cancels'
: 'drag from a teal OUT port to a green IN port · drag nodes · click an edge to delete · drag background to pan' }}
⚙ Joint ✕
A{{ i+1 }}
{{ qDeg[i].toFixed(2) }} °
Angular Velocity
°/s
°
⤧ Cartesian
Angles
Position
✕
Linear Velocity mm/s
Angular Velocity °/s
{{ jog.cartMode==='Position'?'mm':'°' }}
✋ ZeroG ✕
Drag the teal handle at the TCP — the arm follows by IK (simulated hand guiding).
Lock:
Goto Manual
Go to → Manual
deg
X Y
Z mm
A B
C deg
{{ msg }}
⚠ Could not load robot files
{{ fatal }}
Serve this folder over HTTP: run
Serve this folder over HTTP: run
run_simulator.bat, then open
http://localhost:8000.Loading MAiRA — {{ loadMsg }}
Poses ✕
⌖
WorldRoot
⌖
{{ f.name }}{{ f.parent }}
▼
{{ p.name }}{{ p.frame }} · {{ p.owner ? ('local · ' + p.owner) : 'global' }}
{{ pointInfo(points.find(p=>p.name===selPoint)) }}
Program List
{{ ui.collapsed[grp.name] ? '▸' : '▾' }}
{{ grp.name }}{{ grp.items.length }} item{{ grp.items.length===1?'':'s' }}
{{ it.kind==='graph' ? '🧩' : '≣' }}
{{ it.name }}{{ it.kind==='graph' ? it.count+' nodes' : it.count+' blocks' }}
No programs yet. Create one in the editor, generate a node graph, or run an app.
Notifications ✕
[{{ l.t }}] {{ l.code }} {{ l.level }}: {{ l.msg }}
{{ edIns.type.toUpperCase() }}
✕ Close
🏬 App Store
🔎
✕
{{ c }}
{{ storeApps()[0].icon || '📦' }}
Featured · {{ appCategory(storeApps()[0]) }}
{{ storeApps()[0].name }}
{{ storeApps()[0].desc }}
{{ (ui.storeCat&&ui.storeCat!=='All') ? ui.storeCat : 'All apps' }} · {{ storeApps().length }}
{{ a.icon || '📦' }}
{{ appCategory(a) }}· 3rd-party
{{ a.name }}
{{ a.desc }}
v{{ a.version || '1.0' }}
No apps match your search.
PALLETIZING CONFIGURATOR
✕ Close
{{ ai.note }}
ADVANCED PALLETIZING ✕ Close
{{ app.name }}
Stations {{ advPlan.stations.length }} · Layers/stack {{ advPlan.total }} · Boxes {{ advPlan.totalBoxes }} · Stack height {{ advPlan.stackHeight }} mm
Track {{ app.params.axes.track.enabled ? 'on' : 'off' }} · Lift {{ app.params.axes.lift.enabled ? 'on' : 'off' }} · Slip {{ app.params.slip.enabled ? app.params.slip.triggers.length+' sheet(s)' : 'off' }}
{{ advPlan ? advPlan.totalBoxes : 0 }}boxes total
{{ advPlan ? advPlan.perStack : 0 }}boxes / stack
{{ app.params.stack.totalLayers }}layers / stack
{{ advPlan ? advPlan.stackHeight : 0 }} mmstack height
Separation of concerns: the Workcell tab defines the physical cell (axes, stations, infeed); the Pattern tab defines stacking logic. Edit either without touching the other.
{{ ai.note }}
ADVANCED SCREWDRIVING ✕ Close
{{ app.name }}
Parts {{ scrPlan.workpieces.length }} · Screws/part {{ scrPlan.perPart }} · Total {{ scrPlan.total }} · {{ app.params.program.mode }} {{ app.params.program.torque }} Nm · ~{{ scrPlan.cycleEst }}s
{{ scrPlan ? scrPlan.total : 0 }}screws total
{{ scrPlan ? scrPlan.perPart : 0 }}screws / part
{{ app.params.program.torque }} Nmtarget torque
~{{ scrPlan ? scrPlan.cycleEst : 0 }} sest. cycle
Sequence order: {{ app.params.sequence.order }} ({{ {'as-listed':'as listed','cross':'cross/star — reduces warping','nearest':'nearest-neighbour — shortest travel'}[app.params.sequence.order] }}). Screw program is separate from the workcell so the same recipe runs on any fixtured part.
{{ ai.note }}
ADVANCED WELDING ✕ Close
{{ app.name }}
{{ weldPlanC.process }} · Seams {{ weldPlanC.seams }} · Length {{ weldPlanC.totalLen }} mm · Passes {{ weldPlanC.passes }} · ~{{ weldPlanC.arcEst }}s arc
{{ weldPlanC ? weldPlanC.seams : 0 }}seams
{{ weldPlanC ? weldPlanC.totalLen : 0 }} mmweld length
{{ weldPlanC ? weldPlanC.passes : 1 }}passes
~{{ weldPlanC ? weldPlanC.arcEst : 0 }} sest. arc time
Process {{ app.params.process }} · {{ app.params.schedule.current }}A / {{ app.params.schedule.voltage }}V · travel {{ app.params.schedule.travel }} mm/s · {{ app.params.schedule.weave ? 'weave '+app.params.schedule.pattern : 'no weave' }} · gas {{ app.params.gas.type }}. The weld schedule is independent of the workcell, so the same recipe runs on any part on the table.
{{ ai.note }}
BIN PICKING ✕ Close
{{ app.name }}
Item classes {{ binPlanC.items }} · Picks {{ binPlanC.picks }} · Cycles {{ binPlanC.cycles }} · Models: {{ binPlanC.models.join(', ') }}
{{ binPlanC ? binPlanC.items : 0 }}item classes
{{ binPlanC ? binPlanC.picks : 0 }}picks total
{{ app.params.cycles }}cycles
{{ app.params.models.length }}models loaded for app
Vision-guided picking: each item class is located by its detection model, then picked from the bin and placed at the drop point. Order = the sequence in the Models & sequence tab.
{{ ai.note }}
MACHINE TENDING ✕ Close
{{ app.name }}
Parts {{ machinePlan.parts }} · Machining {{ machinePlan.cycleTime }}s · Door {{ machinePlan.doorIO }} · Chuck {{ machinePlan.chuckIO }}
{{ ai.note }}
CONVEYOR PALLETIZING ✕ Close
{{ app.name }}
{{ conveyorPlan.types }} type(s) → {{ conveyorPlan.pallets }} pallet(s) · {{ conveyorPlan.count }} boxes · part-present DI{{ conveyorPlan.di }}
Boxes arrive in random order; the belt stops at the pick when DI{{ app.params.di }} goes high, the robot sorts each type onto its pallet, then the belt feeds the next. The conveyor & boxes are simulated.
{{ ai.note }}
DUAL-BOX SUCTION PALLETIZER ✕ Close
The robot waits until 2 boxes are present at the infeed (DI{{ app.params.di }}), then picks both at once with a suction tool and palletizes the pair together. → {{ dualPickPlan.pairs }} pairs = {{ dualPickPlan.boxes }} boxes.
{{ ai.note }}
VISION DEPALLETIZER ✕ Close
A camera scans the top layer of the source pallet; the robot picks each detected box and places it on the outfeed, de-stacking top-down. → {{ visionDepalPlan.boxes }} boxes, {{ visionDepalPlan.layers }} layers.
{{ ai.note }}
PCB HANDLING ✕ Close
{{ app.name }}
3rd-party
{{ app.vendor }} · SICK PLB vision · vacuum tool ‘pcbSauger’
Imported from Extern App / tac_pn3024_neura_backend. This prototype replays the vendor's taught poses (home · scan · open-cycle pcb1–pcb9 · close · place) and process sequence in the simulator.
{{ ai.note }}
BIN SORTING ✕ Close
{{ app.name }}
Kinds {{ sortPlanC.items }} → Bins {{ sortPlanC.bins }} · Models: {{ sortPlanC.models.join(', ') }}
{{ sortPlanC ? sortPlanC.items : 0 }}item kinds
{{ sortPlanC ? sortPlanC.bins : 0 }}destination bins
{{ app.params.cycles }}cycles
{{ ai.note }}
{{ dapp.icon || '📦' }}
{{ dapp.name }}Running exclusively · the main HMI is still active in the background
{{ estop?'E-Stop':(collision.active?'Collision':(safety.violation?'Safety':(moving?'Running':'Idle'))) }}
3D scene · live · drag to orbit, scroll to zoom
Layers · {{ palDash.placedTotal }}/{{ palDash.grandTotal }} placed · 🟧 placing · 🟩 placed
Layer {{ L.label }}placing{{ L.placed }}/{{ L.total }}
{{ ai.note }}
This view runs only {{ dapp.name }}. Pre-check warnings (COL-130) and suggestions appear in the notifications. Exit to return to the HMI.
{{ {frame:'USER REFERENCE FRAME', ai:'AI PROCESS ASSISTANT', calib:'ROBOT MOUNTING'}[ui.wizardItem] }}
✕ Close
X Y
Z mm
A B
C deg
Frames appear in the Poses drawer and as jog reference frames.
{{ ai.note }}
mm
Raises the robot base (kinematics + visual stand). The AI palletizing process mounts a 400 mm pedestal automatically for full EPAL coverage.
{{ ui.settingsSection.toUpperCase() }}
✕ Close
{{ name }}{{ g ? g.maker + ' · ' + (g.stroke*1000) + ' mm · ' + g.payload : 'no tool' }}
Gripper:
{{ gripper==='Close'?'Closed':'Open' }}
Stylised parametric models; TCP remains at the flange.
mm
Genesis backend:
{{ genesis.connected ? ('connected — '+genesis.backend) : 'offline' }}.
When offline the simulator automatically uses the generic in-browser engine. Start the backend with
run_simulator.bat (port 8090).
Robot: MAiRA 7-axis (maira.urdf) · Simulator v5 (HMI-style)
Functions per LARA Software Manual v5.1.0 — see REQUIREMENTS.md.
Kinematic simulation: joint/velocity limits, IK reachability, floor-contact collision. No dynamics (use Genesis for physics).
Functions per LARA Software Manual v5.1.0 — see REQUIREMENTS.md.
Kinematic simulation: joint/velocity limits, IK reachability, floor-contact collision. No dynamics (use Genesis for physics).
Generic vision models. Load one, then select it in a Camera node to run it on the live stream.
🧠
{{ m.name }}{{ m.type }} · {{ m.info }}
✓ loaded
failed
Weights download from the CDN on first load (needs internet once). More models can be added to the registry later.
Edit mode active: click & drag a table,
pallet or box in the 3D view. Collision detection is suspended while editing.
{{ o.type==='Robot' ? '🦾 ' : (o.locked ? '🔒 ' : '') }}{{ o.name }}{{ o.type }}
the robot — attach it to a frame to mount it
rides its parent's frame
X
Y
Z
⟳ °
{{ o.attachTo ? 'offset' : 'base' }}
X
Y
Z
⟳ °
W
D
H
speed mm/s
carries program boxes along +X (yaw)
H = deck height · stroke
mm
travel mm
robot can be bolted to the table top ({{ o.h }} mm)
LINAK Elevate · H = housing
stroke mm
lift mm
CNC mill · front (−Y) open
chuck Z mm
kit joint with a seam-root line
wall mm
hollow container (Z = stand height)
mm / deg, robot base frame. Boxes accept Z for stacking. Programs read this
equipment as assets (the AI palletizing process uses your Pallet and Table) and never add entries here.
Program-placed boxes (runtime): {{ runtimeCount }}
Generate runnable NeuraPy Python for the real robot from any program, app or node-graph. Review carefully — this drives a physical robot.
joint {{ codeViewOpts.jointSpeed }}% · linear {{ codeViewOpts.linearSpeed }} m/s
⚠ {{ ui.codeView.warnings.length }} note(s): {{ ui.codeView.warnings.join('; ') }}
{{ ui.codeView.code || '— select a program —' }}
{{ (ui.codeView.code||'').split('\n').length }} lines
⚠ {{ safety.violation }}
The tool TCP must stay inside the keep-in envelope and outside every keep-out box.
If the robot/program tries to cross a wall it is held at the boundary and motion pauses. With no zones, motion is unrestricted.
{{ z.mode==='keep-out' ? '⛔' : '✅' }}
centre X
Y
Z
size W
D
H mm
No zones yet — add a keep-in envelope to bound the workspace, or a keep-out box to protect an obstacle/operator area.
mm in the robot base frame. Green = keep-in, red = keep-out (shown as translucent boxes in the 3D view).
≡ Controls ✕
Collision
Safety zones
Path avoidance
Reflex
HMI Button
Shadows
TCP Trail
⇄ I/O (simulated) ✕
Digital Outputs (click to toggle)
Digital Inputs (click to simulate)
Program access: variables DI1…DI8 / DO1…DO8 mirror these states
(use them in If conditions; SetVariable DOx drives outputs).