IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart -...

10
/ IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014

Transcript of IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart -...

Page 1: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

/

IoT and RESTful HardwareWhat We’ve Learned from Three Years Treating Motion as REST

Alden Hart - Synthetos

O’Reilly Solid Conference

May 21, 2014

Page 2: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

TinyG Motion Controller

what’s TinyG?• multi-axis motion control system designed for desktop CNC, 3D printing, pick & place…• accepts Gcode from USB port and executes it locally on the board• behaves like a RESTful server

Page 3: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

The Controller Problem & Design Goals

the problem• the motion control functions are all good – but people got stuck at controller implementation• specialized parsers and stateful clients got in the way

design goals• control interface that’s easy and intuitive

• simple• compact / lightweight• human readable / typeable / hackable• relatively ubiquitous / low learning curve• easily persisted and instantiated• object oriented

• don’t have to be an industrial automation engineer to use (1 : 1000)• does not require gateways or other additional hardware

not design goals• highly optimized transfer / storage• support bandwidth starved and flakey communications channels• support for hard, a-priori contracts• XML-isms like Xpath/Xquery, annotation, schemas

Page 4: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

RESTful Hardware

what is RESTful?• state exists on the server and is transferred to the client• representation is flexible, independent • well-defined resource model

RESTful hardware• server is an embedded chip / may not have an OS• RESTful conventions make talking to the device very easy

JSON• JSON is the natural representation• meets most of our design goals

• simple• compact / lightweight• human readable / typeable / hackable• relatively ubiquitous / low learning curve• easily persisted and instantiated• object oriented

Page 5: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

Putting JSON / REST on the Hardware

put it On.The.Hardware• code runs on the chip - not a gateway / translator / some-other-intermediary

• “Run JSON right over the traces”• simple JSON parser, serializer, dispatcher and serial IO in < 8K C/C++ code• bind names to dispatch tables to perform actions for the verbs• marshalling in and out of floating point

• strtof() < 70 uSec on a 16 MHz AVR atmega328P (Arduino Uno)• strtof() < 7uSec on a 84 MHz ARM Cortex M3 core

• all memory statically allocated – no mallocs• transport doesn’t matter

• USB, SPI, Serial, MQTT, CoAP, HTTP…

subset of JSON spec• 7 bit ASCII only (UTF-8 sub-set)• objects on a single line (no embedded line feeds)• objects limited to 512 characters (less on smaller CPUs)• decimal only, no hexadecimal• limited support for arrays

Page 6: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

Implementation Considerations

well defined resource model• static model – e.g. X axis, motor 1, machine setup parameters…• dynamic model – e.g. position, velocity, coordinate system in use, tool in use…• favor flat namespaces – right level of object granularity

keeping it compact• short, mnemonic tokens for names – e.g. xvm instead of XaxisVelocityMaximum

• don’t need to be globally unique – objects define scope• many values are enumerated – e.g. 3 instead of GcodeProgramStop• simple verbs (get, post)

cheats & shortcuts • no request headers. Use null to mean get• no request ID – request / response is synchronous• can consume Gcode natively without a JSON wrapper

• so people don’t have to pre-process their Gcode files

Page 7: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

Implementation Examples from TinyG (1 of 2)

get • {“xvm”:null}

• {“ct”:null}

• {xvm:n}

• {ct:n}

post (set) • {xvm:16000}

• {ct:0.01}

objects• {x:{vm:16000}}

• {r:{x:{am:1,vm:16000,fr:10000,tn:0,tm:100,jm:200,jh:10000,jd:0.0100,sn:0,sx:0,sv:3000,lv:100,lb:20.000,zb:3.000}},f:[1,0,6,5473]}

• {r:{sys:{fb:428.01,fv:0.970,hp:1,hv:8,id:"2X2660-EVD”…

• {gc:”N75 G3 X0.6785 Y2.2371 Z0.0014 I0.0003 J0.0594”}

footer revision status code flow control checksum

footers

• f:[1,0,6,5473]

Page 8: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

Implementation Examples from TinyG (2 of 2)

status reports• event reporting for the dynamic model• timed and filtered

• timed reports during movement – e.g. every 250 milliseconds and at end-of-move• filtered so only changed values are reported

• setup status report• {sr:{posx:true, posy:true, posz:true, vel:true, momo:true, stat:true}}

• status reports for an X move from 0 to 100• {sr:{posx:0.000,vel:1.54,momo:0,stat:5}}• {sr:{posx:2.494,vel:1740.87}}• {sr:{posx:18.137,vel:5540.05}}• {sr:{posx:43.528,vel:6500.00}}• {sr:{posx:69.885,vel:6393.34}}• {sr:{posx:91.760,vel:3918.13}}• {sr:{posx:99.670,vel:479.38}}• {sr:{posx:100.000,vel:0.00,stat:3}}

exception reports• {er:{fb:428.01,st:29,msg:"Generic exception report"}}

Page 9: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

Useful Conventions

We need some conventions for non-application specific functions

don’t innovate. copy.• $ root to discover objects (cribbed from JSONpath)

• {$:null} return top-level objects

• {r:{x:n,y:n,z:n,a:n,b:n,c:n,1:n,2:n,3:n,4:n,5:n,6:n,sys:n,gm:n,rm:n}},f:[1,0,6,6271]}

• @ prefix for addressing, binding and routing

• {@3F2504E0-4F89-41D3-9A0C-0305E82C3301:ex1} assign a short name (handle)

• {ex1:null} address device “ex1” and route object to that device

• # topic prefix

• {#time:”2013-03-28T15:52:49.680Z”} devices that want time will process this message

• ! priority. Jump the queue

• {!fh:true} stop movement now! (feedhold)

Page 10: IoT and RESTful Hardware What We’ve Learned from Three Years Treating Motion as REST Alden Hart - Synthetos O’Reilly Solid Conference May 21, 2014.

Questions