package jass.contact; import jass.engine.*; /** A force model based on stick slip model. @author Kees van den Doel (kvdoel@cs.ubc.ca) */ public class StickSlip extends Out { private float srate; // sampling rate in Hertz private float k_damp; // damping of model/srate private float mu_static; // static friction coeff. private float mu_dynamic; // dynamic friction coeff. private float v_crit; // critical velocity where static friction kicks in/srate private float qt_1,qt_2; // last state private float v=1; // external slidevelocity in m/s / srate private float fn=1; // external; normal force/srate /** Construct force. @param srate sampling rate in Hertz. @param bufferSize bufferSize of this Out. */ public StickSlip(float srate, int bufferSize) { super(bufferSize); this.srate = srate; reset(); } /** Set stick-slip model parameters (all in S.I. units). @param k_damp damping of spring system @param dummy not used @param mu_static static friction coeff @param mu_dynamic dynamic friction coeff @param v_crit critical velocity for transition from dyn. to static friction */ public void setStickSlipParameters(float k_damp,float dummy,float mu_static,float mu_dynamic,float v_crit) { this.k_damp = k_damp/srate; this.mu_static = mu_static; this.mu_dynamic = mu_dynamic; this.v_crit = v_crit/srate; } /** Set normal force magnitude. @param val normal force in Newton */ public void setNormalForce(float val) { fn = val/srate; } /** Set velocity. @param v velocity in m/s */ public void setSpeed(float v) { this.v = v/srate; } /** Reset state. */ public void reset() { qt_1 = qt_2 = 0; } /** Compute the next buffer. q(t+1) = (1-k_damp)q(t)+fn mu[(v - (q(t)-q(t-1)))] * sign(v - (q(t)-q(t-1)) */ public void computeBuffer() { float factor = (1-k_damp); int bufsz = getBufferSize(); for(int k=0;k<bufsz;k++) { float f_mu_sign; float tmp = v - qt_1 + qt_2; int signOf = (tmp >= 0 ? 1 : -1); if((float)(Math.abs(tmp)) > v_crit) { f_mu_sign = fn * mu_dynamic * signOf; } else { f_mu_sign = fn * mu_static * signOf; } buf[k] = factor * qt_1 + f_mu_sign; qt_2 = qt_1; qt_1 = buf[k]; } } }