FRP for Real - Computer Science

Download Report

Transcript FRP for Real - Computer Science

FRP for Real
Paul Hudak
Yale University
Department of Computer Science
April 2001
Joint work with:
Zhanyong Wan
Walid Taha
FRP




Fran is a DSL for graphics and animation.
Frob is a DSL for robotics.
FranTk is a DSL for graphical user interfaces.
FRP (functional reactive programming) is the
essence of Fran, Frob, and FranTk:



Fran = FRP + graphics engine + library
Frob = FRP + robot controller + library
FranTk = FRP + Tk substrate + library
 FRP has two key abstractions:


Continuous time-varying behaviors.
Discrete streams of events.
Domain-Specific Languages
FVision
FranTk
Frob
Fran
Graphics, Robotics, GUIs, Vision
FRP
Functional Programming
Applications
Specialized languages
Continuous behaviors
and discrete reactivity
Functions, types, etc.
(Haskell)
Behaviors
 Continuous behaviors capture any time-varying
quantity, whether:



input (sonar, temperature, video, etc.),
output (actuator voltage, velocity vector, etc.), or
intermediate values internal to a program.
 Operations on behaviors include:


Generic operations such as arithmetic, integration,
differentiation, and time-transformation.
Domain-specific operations such as edge-detection and
filtering for vision, scaling and rotation for animation and
graphics, etc.
Events
 Discrete event streams include user input as well as
domain-specific sensors, asynchronous messages,
interrupts, etc.
 They also include tests for dynamic constraints on
behaviors (temperature too high, level too low, etc.)
 Operations on event streams include:


Mapping, filtering, reduction, etc.
Reactive behavior modification (next slide).
Reactive Control of Continuous Values
One animation example that demonstrates
key aspects of FRP:
growFlower = stretch size flower
where size = 1 + integral bSign
bSign =
0 `until`
(lbp ==> -1 `until` lbr ==> bSign) .|.
(rbp ==> 1 `until` rbr ==> bSign)
Frob
 Recall that:
Frob = FRP + robot controller + robot/vision library
 Programming robots is a lot like programming an
animation!
 … except that:





The robot doesn’t always do what you want it to do.
Error / anomalous conditions are more common.
Real-time issues are more dominant.
Sensor input is critically important, but unreliable.
Robots have different response characteristics:


Often must react more quickly.
Often are slower than graphics hardware.
Robots with Vision
Nomadic Technologies SuperScout
(our old robots)
Vision
16 Sonars
Bumpers
Wheel
Controls
Computing:
PC running Linux
Hugs
Radio Modem
Autonomous Coordinated Motion
 Natural behavior amongst living animals:

flocking, herding, schooling, swarming
 Specific tasks of interest to us:

congregation, navigation, “escortation”,
formation motion, obstacle avoidance,
dispersion, etc.
 Key technologies of interest:


computational vision and control
FRP
Example of Coordinated Motion
 Problem:

Specify local control strategy for two differential-drive
robots in interleaving trajectories, where each robot only
knows the relative position of the other.
 Can be achieved by two-step simplification:


Non-holonomic constraint on differential-drive robot is
eliminated by considering a moving frame of reference.
Relative to that frame, each robot exhibits identical
behavior: simply circle the other robot.
 Frob permits abstract formulation of solution.


Two independent critically-damped PI controllers.
Local motion assumes holonomic vehicle; i.e. differential
drive robot can be treated as omni-directional robot.
Local Behavior
vFrame
desired rotation
vLat
vRot
moving
frame of
reference
Code Snippet
interleaveC dist omega0 vFrame =
let …
distError = distOther - dist
vLat = vector2Polar
(kpDist * distError +
kiDist * integralB distError)
angOther
vRot = vector2Polar
(omega0*distOther/2)
(angOther - pi/2)
in velocityV (vFrame + vLat + vRot)
History of FRP Research











TBag, Active VRML: Conal Elliott, ’95-97.
Fran: Elliott & Hudak, ICFP ’97.
Various implementations: Eliiott, DSL ’97, PLILP ’99.
Semantics: Anthony Daniels, PhD Thesis ‘99.
Frob: Peterson, Hager, Hudak, Elliott, ICRA ‘99, PADL ’99.
Used in robotics course at Yale in ‘99, ‘01.
Fvision: Peterson, Hager, Hudak, Reid, ICSE ’99, PADL ’01.
SOE’s “FAL”: Hudak, stream-based implementation of Fran-like
language, ’00.
FranTk: Fran-based GUI, Meurig Sage, ICFP ’00.
Frappé: Java-based FRP, Antony Courtney, PADL ’01.
Yale FRP: core language + growing library of graphics, robotics,
simulator, etc. code, ’00-01 (public release planned soon).
Semantics: Wan, Hudak, PLDI ’00, showed correspondence of
denotational and operational semantics.
Real-Time FRP
 How do we make FRP run fast?
 How do we make guarantees about both time and
space behavior?
 How does FRP relate to other models of hybrid
automata?
 Can FRP be used for embedded systems?
 And at a more abstract level:
What is an operational semantics for FRP?
Our goal:
Real-Time FRP, an abstract, restricted subset
of FRP, with guaranteed bounds on execution
time and space, and deadlock free.
Syntax of RT-FRP
 Syntax of lambda terms:
(“lifted” terms are just “Maybe” type)
 Syntax of values:
 Syntax of signals:
Note: “Event a” in FRP is isomorphic to “Behavior (Maybe a)”.
In RT-FRP we just combine them and call them “signals”.
Types
 Syntax of types:
 Contexts:
 Judgments:
“e is a functional term of type g”
“s is a signal carrying values of type g”
Or in Haskell: e :: g, and s :: Behavior g
Some Typing Rules
More typing rules
 Reactivity:
 Non-recursive binding:
 Recursive binding:
 Note:
let signal x = s in ext x == s
Recursion
 There are two “prototypical” kinds of recursion in FRP:
(1)
(2)
 Using recursive signals these can be expressed as:
(1)
(2)
But what about integral?
 Define using a delay in a recursive signal.
 By way of example, here is the running maximum of
a signal:
Definition of Integral
… using the forward Euler method:
From FRP to RT-FRP
and more…
Operational Semantics
 A program is executed in discrete steps, driven by
time-stamped input values.
 Given a time t and input i, a term s evaluates to a
value v and transitions to a new term s’.
 We write this as:
and
or, more compactly as:
where:
Program Execution
 A proper RT-FRP program never terminates.
Its meaning is the infinite sequence of values, or
“observations” that it yields.
 The sequence:
t0,i0
t1,i1
t2,i2
s0  s1,v1 ; s1  s2,v2 ; s2  s3,v3 ; …
is abbreviated:
t0,i0
t1,i1
t2,i2
s0  v1, s1  v2, s2  v3, s3 …
 Meta-comment: Program meaning depends on the
time-stamped input pairs (tj,ij).
Some Eval Rules
More Eval Rules
(ev-signal)
Some Transition Rules
More Transition Rules
and more…
(tr-switch-noc)
(tr-switch-occ)
Tail Signals
 Recursive signals are nice, but we’d like something
better:
 With let-continuation, we can define tail-recursive
signals that can also pass values.
 Similar to standard model of hybrid automata.
 Note: the syntax prevents unbounded term growth
as in: letcont k x = s0 until x=ev then k x + 1
not possible
For Example
 A simple model of a thermostat:
let signal temp =
let cont k1 () = <heating-model>
until when (temp>t) => k2
k2 () = <cooling-model>
until when (temp<t-hys) => k1
in t0 until startev => k1
in ext temp
Key Results

Type safety / preservation


Each step takes constant time


thus no time leaks!
Term size cannot grow


thus no core dumps!
thus no space leaks!
In addition, with a notion of well-formed
recursion, progress is guaranteed.

thus no deadlock!
Preventing Deadlock
 FRP programs are naturally “infinite” – signals are streams of
values with unbounded extent. This is a good thing!
 With recursion, however, terms can become “stuck”:

let signal x = ext x in ext x
 Solution: define notion of well-formed recursion that disallows
“direct” recursions, and thus prevents deadlock.
 Key idea: in “let signal x = s1 in s2”, we require that s1 is in
W{x}, where:
Wx = input | time | ext e where e contains no X |
delay v s | let signal y = Wx in Wx |
Wx switch on x = ev in Wx | …
 In other words, a delay must appear somewhere.
Future Work on RT-FRP






Enrich language for practical use.
Compile into lower-level code (C, etc.).
Examine sensor / behavior fusion.
Consider embedded systems.
Better formulation of well-formed recursion.
Test case: compile to PIC microcontroller on
our “soccer-bots”.
How to Hide a Flock of Turkeys