我正在试验太阳黑子上的加速度计。 我试图通过从X轴和Y轴测量加速度计的值来计算速度,但它们对我来说似乎是随机的。
获取运动的值和方向/方向并计算其速度的正确方法是什么?
这是我的代码:
while (true) {
try {
offset=Math.sqrt(accel.getAccelX()*accel.getAccelX()+accel.getAccelY()*accel.getAccelY());
if(offset<0.1 && offset>-0.1)
offset=0;
v=(offset+ ((offset-anterior))/2)*0.2; //0.2 is 200millisecs
anterior=offset;
Utils.sleep(200);//5 reads per secound
}}...
更新 例如,我在一个方向上移动太阳黑子,变量v(速度)通过随机顺序(不是顺序)给出从负到7ms的值。如果改变运动的方向,它并没有像我预期的那样给出负值。
例子:(如果我把它移到右边)
v =0.4771031167950723
v =0.4771031167950723
v =-0.15903437226502407
v =-0.15903437226502407
v =0.33841556285063856
v =0.33841556285063856
v =0.7397145777969039
提前致谢。
答案 0 :(得分:0)
就像@John Story所说,解决这个问题的最佳方法是制作平均值。 太阳斑加速度计非常不稳定,不适合精确的速度预测。
无论如何,这是我能做的最好的代码
double v=0;
double anterior=0;
while (true) {
double time=System.currentTimeMillis()+200;
double currentTime=System.currentTimeMillis();
double offset=0;
int tries=0;
double maximo=0;
double minimo=0;
while(time>currentTime){ //lets run for 0.2seconds :)
try {
double temp=-accel.getAccelY(); //front shouln't be negative
tries++;
if(temp<0.1201 && temp>-0.1201){
tries--; //oops threadshould sample
}else{
if(temp>maximo)
maximo=temp;
if(temp<minimo)
minimo=temp;
offset+=temp;
}
}catch (Exception e) {
System.err.println("Caught " + e + " while collecting/sending sensor samples.");
}
Utils.sleep(10); //sleep 10milisecs
currentTime=System.currentTimeMillis();
}
if(tries>2)
offset=(offset-minimo-maximo)/(tries-2); //remove max value and min value from sample and makes average
else if(tries>0)
offset/=2; //you wont take max or min from a two value sample
try {
dg.reset(); //clears
v=anterior+offset*0.2; //vf=vi+at
dg.writeDouble(Math.abs(v*100)); // sends in cm
anterior=offset; //vi=vf
rCon.send(dg); //sends radiogram
Utils.sleep(200); //sleep 0.2s
}catch (Exception e) {
System.err.println("Caught " + e + " while sending velocity.");
}
}
}