20 import static ca.uqac.lif.cep.Connector.connect;
22 import java.util.Vector;
24 import ca.uqac.lif.cep.GroupProcessor;
25 import ca.uqac.lif.cep.Processor;
26 import ca.uqac.lif.cep.Pushable;
27 import ca.uqac.lif.cep.complex.RangeCep;
28 import ca.uqac.lif.cep.functions.ApplyFunction;
29 import ca.uqac.lif.cep.functions.Constant;
30 import ca.uqac.lif.cep.functions.Cumulate;
31 import ca.uqac.lif.cep.functions.CumulativeFunction;
32 import ca.uqac.lif.cep.functions.FunctionTree;
33 import ca.uqac.lif.cep.functions.IfThenElse;
34 import ca.uqac.lif.cep.functions.StreamVariable;
35 import ca.uqac.lif.cep.functions.TurnInto;
36 import ca.uqac.lif.cep.io.Print.Println;
37 import ca.uqac.lif.cep.tmf.Fork;
38 import ca.uqac.lif.cep.tmf.Freeze;
39 import ca.uqac.lif.cep.tmf.Window;
40 import ca.uqac.lif.cep.util.Bags;
41 import ca.uqac.lif.cep.util.Booleans;
42 import ca.uqac.lif.cep.util.Numbers;
77 @SuppressWarnings(
"unused")
78 public static void main(String[] args)
83 float skid_angle =
rad(30);
91 FunctionTree angular_dev =
new FunctionTree(Numbers.absoluteValue,
92 new FunctionTree(Numbers.subtraction,
100 FunctionTree skidding =
new FunctionTree(Numbers.isGreaterOrEqual,
101 angular_dev.duplicate(),
new Constant(skid_angle));
107 GroupProcessor skid_start =
new GroupProcessor(1, 1);
109 Window win =
new Window(
new GroupProcessor(1, 1) {{
110 Fork f =
new Fork(3);
111 ApplyFunction eq =
new ApplyFunction(skidding);
112 connect(f, 0, eq, 0);
113 ApplyFunction ite =
new ApplyFunction(IfThenElse.instance);
114 connect(eq, 0, ite, 0);
115 TurnInto one =
new TurnInto(1);
116 connect(f, 1, one, 0);
117 connect(one, 0, ite, 1);
118 TurnInto zero =
new TurnInto(0);
119 connect(f, 2, zero, 0);
120 connect(zero, 0, ite, 2);
121 Cumulate sum =
new Cumulate(
new CumulativeFunction<Number>(Numbers.addition));
123 addProcessors(f, eq, ite, one, zero, sum).associateInput(f).associateOutput(sum);
125 ApplyFunction gt =
new ApplyFunction(
new FunctionTree(Numbers.isGreaterOrEqual, StreamVariable.X,
new Constant(m)));
127 skid_start.addProcessors(win, gt).associateInput(win).associateOutput(gt);
133 GroupProcessor skid_end =
new GroupProcessor(1, 1) {{
134 Processor cond = skid_start.duplicate();
135 ApplyFunction not =
new ApplyFunction(Booleans.not);
137 addProcessors(not, cond).associateInput(cond).associateOutput(not);
142 GroupProcessor start_vel =
new GroupProcessor(1, 1) {{
144 Freeze f =
new Freeze();
146 addProcessors(get_vel, f).associateInput(get_vel).associateOutput(f);
150 GroupProcessor ev_count =
new GroupProcessor(1, 1) {{
151 TurnInto one =
new TurnInto(1);
152 Cumulate sum =
new Cumulate(
new CumulativeFunction<Number>(Numbers.addition));
154 addProcessors(one, sum).associateInput(one).associateOutput(sum);
158 GroupProcessor max_angle =
new GroupProcessor(1, 1) {{
159 ApplyFunction dev =
new ApplyFunction(angular_dev.duplicate());
160 Cumulate max =
new Cumulate(
new CumulativeFunction<Number>(Numbers.maximum));
162 addProcessors(dev, max).associateInput(dev).associateOutput(max);
167 RangeCep cep =
new RangeCep(skid_start,
168 new Processor[] {start_vel, ev_count, max_angle},
169 new Bags.ToList(Number.class, Number.class, Number.class));
170 connect(cep,
new Println());
178 Pushable p = cep.getPushableInput();
194 public static Vector<Float>
vecc(Number x, Number y)
196 Vector<Float> v =
new Vector<Float>(2);
197 v.add(x.floatValue());
198 v.add(y.floatValue());
208 public static Vector<Float>
vecp(Number r, Number theta)
210 Vector<Float> v =
new Vector<Float>(2);
211 v.add(r.floatValue() * (float) Math.cos(theta.floatValue()));
212 v.add(r.floatValue() * (float) Math.sin(theta.floatValue()));
221 public static float rad(
float deg)
223 return (
float) (2 * Math.PI * deg / 360f);
static final ArcTanVector instance
A publicly visible instance of the function.
static float rad(float deg)
Converts degrees to radians.
static final GetAngle getAngle
Static reference to the function GetAngle.
Detects situations where a moving robot loses traction and starts skidding.
static final GetVelocity getVel
Static reference to the function GetVelocity.
Function that calculates the angle of a two-dimensional vector.
Event representing the status of a fictional robot that moves in a two-dimensional space...
static Vector< Float > vecc(Number x, Number y)
Utility method to create a 2D vector from Cartesian coordinates.
static Vector< Float > vecp(Number r, Number theta)
Utility method to create a 2D vector from polar coordinates.