1 package org.ocera.orte.demo;
3 import org.ocera.orte.DomainApp;
4 import org.ocera.orte.JOrte;
5 import org.ocera.orte.Publication;
6 import org.ocera.orte.types.NtpTime;
7 import org.ocera.orte.types.PublProp;
9 public class MotionSpeedPublish implements Runnable {
11 public static final int VMAX = 16000;
12 public static final double r = 0.15;
14 private short[] speed = new short[2];
15 private boolean isCancelled = false;
16 private float maxRange;
17 private float[] accelData = new float[2];
18 private SpeedMotionType speedmsg;
19 private Publication pub;
20 private Object lock = new Object();
21 private Thread thread = null;
22 private PublProp publProp;
23 private DomainApp appDomain;
25 public MotionSpeedPublish(float maxRange, DomainApp appDomain) {
26 this.maxRange = maxRange;
27 this.appDomain = appDomain;
29 NtpTime persistence = new NtpTime(3);
32 speedmsg = new SpeedMotionType(appDomain,"motion_speed");
34 publProp = new PublProp(speedmsg.getTopic(),
44 pub = appDomain.createPublication(publProp, speedmsg);
45 thread = new Thread(this);
49 private void calculateSpeed(float[] mAccel) {
51 double angle = 0, lenght, v, omega;
53 v = (double)mAccel[1]/maxRange;
54 omega = (double)mAccel[0]/maxRange;
55 lenght = Math.sqrt(Math.pow(v,2) + Math.pow(omega,2));
57 angle = Math.atan2(mAccel[1], mAccel[0]);
59 omega = Math.cos(angle);
63 speed[0] = (short)(-(v + (v>0 ? -r*omega : r*omega))*VMAX);
64 speed[1] = (short)(-(v - (v>0 ? -r*omega : r*omega))*VMAX);
67 public void cancel() {
71 } catch (InterruptedException e) {
77 public boolean isCancelled() {
85 calculateSpeed(accelData);
86 speedmsg.speed = this.speed;
95 public void setSpeed(float accelX, float accelY) {
97 this.accelData[0] = accelX;
98 this.accelData[1] = accelY;