I posed a challenge problem in today's guest lecture in the Embedded Systems Programming course. The challenge is to efficiently control a simple differential steering robot. The Acumen code below presents both the model of the robot (dsbot), a target object, and a very simple controller. How well the controller performs is measured in the Main object by the total energy (e) at the end of the simulation. My score was 161.3. You are welcome to submit to me the code of an controller that performs better.
The only rule is that you can only send me the code for the controller. In other words, the code for the robot, target, and the main program has to remain the same.
class dsbot () // Differential steering robot
private x=0; x'=0; y=0; y'=0;
a=0; a'=0 ; v=0
end
x' [=] v * cos(a);
y' [=] v * sin(a);
end
class target () // A simple target moving in a circle
private t=0; t'=0; x=0; y=0 end
t' [=] 1;
x = 2*sin(t/1.5);
y = 2*cos(t/1.5);
end
class controller () // A simple controller
private t =0; t'=0; // local time
ex = 0; ey = 0; // Error in x and y
ia = 0; // Input angle
ov = 0; oap = 0; // Ouput v and a'
end
t' [=] 1;
if t>0.1
t = 0;
// Control code goes here
if (ex*ex + ey*ey) < 1 // Robot is close enough. Slow down
ov = 1
else
ov = 4;
if ( (ex>0 && cos(ia)<0)
|| (ey>0 && sin(ia)<0))
|| ( (ex<0 && cos(ia)>0)
||(ey<0 && sin(ia)>0))
oap = -10
else
oap = 0
end
end
else
end
end
class Main(simulator)
private r = create dsbot ();
t = create target ();
c = create controller ();
d = 0; e = 0; e'= 0; // Measures of success
end
// Controller see robot
c.ex [=] t.x - r.x;
c.ey [=] t.y - r.y;
c.ia [=] r.a;
// Robot listens to controller
r.a' [=] c.oap;
r.v [=] c.ov;
// Error over time
d [=] sqrt(c.ex*c.ex+c.ey*c.ey);
e' [=] r.v*r.v + 2*d*d
end
An intuitive tool for simulating mathematical models of cyber-physical systems and for visualizing them as plots or in 3D. Students as young as eight years and up to the PhD level use it to learn STEM subjects. Researchers use it to develop better CPS technologies. It is distributed as free, open-source software under a BSD licence.
Tuesday, December 7, 2010
Tuesday, October 26, 2010
Bouncing ball example in your favorite language
This is a request for audience participation!
The code below is a minimalist model defining the behavior of a ball subject to gravity, air resistance, and idealized bouncing. I'd like to use this example to collect in one place code written in different hybrid modeling languages. It would be great if you can send me (or add as comment) equivalent code written in your favorite hybrid modeling language, or for that matter any hybrid modeling language that you are familiar with. As much as possible, please follow the same style and avoid making stylistic changes to the extent possible. Please free to provide multiple versions if necessary, and to offer explanation of your stylistic choices as needed.
If you happen to know Verilog-AMS, PSPICE, Modelica, Sol, MapleSim, or Impromptu, I would really appreciate if you can express this model in those languages as well. All other languages are very welcome as well!
Here's the code:
// Minimalist model for ball with airodynamic
// resistance (2010/10/26, Scottsdale)
class Main (simulator)
private
a = create BouncingBall()
end
end
class BouncingBall ()
private
g = -9.8; cr = 0.95; cd = 0.075;
x = 10; x' = 2; x'' = 0;
end
if x>=0
if x'<0
x'' [=] g + cd * (x')^2
else
x'' [=] g - cd * (x')^2
end
else
x' = - cr * x';
x = 0
end
end
Updates:
From Andre Platzer:
Here's the bouncing ball as a hybrid program:
(if (x=0) then v := -r*v fi;
({x'=v,v'=g+d*v^2,v<=0,x>=0}
++{x'=v,v'=g-d*v^2,v>=0,x>=0}))*
Here's the bouncing ball as a differential-algebraic program:
(if (x=0) then v := -r*v fi;
{x'=v,((v'=g+d*v^2&v<=0)
|(v'= g-d*v^2&v>=0)), x>=0})*
The code below is a minimalist model defining the behavior of a ball subject to gravity, air resistance, and idealized bouncing. I'd like to use this example to collect in one place code written in different hybrid modeling languages. It would be great if you can send me (or add as comment) equivalent code written in your favorite hybrid modeling language, or for that matter any hybrid modeling language that you are familiar with. As much as possible, please follow the same style and avoid making stylistic changes to the extent possible. Please free to provide multiple versions if necessary, and to offer explanation of your stylistic choices as needed.
If you happen to know Verilog-AMS, PSPICE, Modelica, Sol, MapleSim, or Impromptu, I would really appreciate if you can express this model in those languages as well. All other languages are very welcome as well!
Here's the code:
// Minimalist model for ball with airodynamic
// resistance (2010/10/26, Scottsdale)
class Main (simulator)
private
a = create BouncingBall()
end
end
class BouncingBall ()
private
g = -9.8; cr = 0.95; cd = 0.075;
x = 10; x' = 2; x'' = 0;
end
if x>=0
if x'<0
x'' [=] g + cd * (x')^2
else
x'' [=] g - cd * (x')^2
end
else
x' = - cr * x';
x = 0
end
end
Updates:
From Andre Platzer:
Here's the bouncing ball as a hybrid program:
(if (x=0) then v := -r*v fi;
({x'=v,v'=g+d*v^2,v<=0,x>=0}
++{x'=v,v'=g-d*v^2,v>=0,x>=0}))*
Here's the bouncing ball as a differential-algebraic program:
(if (x=0) then v := -r*v fi;
{x'=v,((v'=g+d*v^2&v<=0)
|(v'=
Monday, September 20, 2010
Globally Parallel, Locally Sequential. Or, “Preserving Natural Parallelism”
We have just finished a draft of a short paper describing some preliminary results on the automatically parallelizing version of Acumen. The paper itself can be found here:
Please stay tuned for a release of the parallelizing version of Acumen that was used in these experiments!
Please stay tuned for a release of the parallelizing version of Acumen that was used in these experiments!
Tuesday, August 24, 2010
Sneak preview of Acumen 10
Acumen 10 features improvements to the syntax, semantics, expressivity, and user interface. The picture below is a snapshot using an example illustrating two different models of a bouncing ball.
Here's the code example in plain text:
class BouncingSpringBall1 (x,x',x'')
x'' [=] - 9.8 + (1/x^2)
end
class BouncingSpringBall2 (x,x',x'')
x'' [=] - 9.8;
if (x < 0)
x = -x; x' = -x'
else
end
end
class Main (mode, simulation)
private state = "Init" end
switch state
case "Init"
create BouncingSpringBall1 (2, 0, 0);
create BouncingSpringBall2 (2, 0, 0);
state = "Persist"
case "Persist"
end
end
New features in Acumen 10 include class declarations, dynamic object creation & deletion and an explicit imperative programming language for describing what happens during discrete mode changes.
Wednesday, August 4, 2010
Acumen 3D Trailer
Breaking news!
A preview of what Acumen 3D will look like can be seen in the videos put together by Paul Brauner and is available on YouTube.
A preview of what Acumen 3D will look like can be seen in the videos put together by Paul Brauner and is available on YouTube.
Monday, May 31, 2010
What New Acumen Animations Should Look Like :)
A google search for bouncing balls returned this interesting visualization of an audio, which has some nice ideas that we will try to use (at least for basic demos).
Scratch also has a bouncing ball demo.
And there is a video from some town with a bouncing ball invasion, probably somewhere in California. :)
Scratch also has a bouncing ball demo.
And there is a video from some town with a bouncing ball invasion, probably somewhere in California. :)
Tuesday, January 5, 2010
Draft paper
We've just finished a draft of a new paper describing the source language of Acumen and how it is compiled. The PDF can be downloaded from the links on the right of the page. Here's the abstract:
"Cyber-physical systems comprise digital components that directly interact with a physical environment. Specifying the behavior desired of such systems requires analytical modeling of physical phenomena. Similarly, testing them requires simulation of continuous systems. While numerous tools support later stages of developing simulation codes, there is still a large gap between analytical modeling and building running simulators. This gap significantly impedes the ability of scientists and engineers to develop novel cyber-physical systems.
We propose bridging this gap by automating the mapping from analytical models to simulation codes. Focusing on mechanical systems as an important class of models of physical systems, we study the form of analytical models that arise in this domain, along with the process by which domain experts map them to executable codes. We show that the key steps needed to automate this mapping are 1) a light-weight analysis to partially direct equations, 2) a binding-time analysis, and 3) an efficient implementation of symbolic differentiation. As such, our work pinpoints and highlights a number of limitations in the state of the art in tool support of simulation, and shows how some ofEnjoy!
these limitations can be overcome."
Subscribe to:
Posts (Atom)