如何在java中进行三边测量

如何在java中进行三边测量,java,formula,distance,trilateration,Java,Formula,Distance,Trilateration,我正在进行三边测量以找到未知位置的位置,为了找到距离,我使用路径损耗常数为2,就像在文章中一样,我使用2部手机和一台笔记本电脑作为发射器和参考。代码如下: distance1 = (double) Math.pow(10, ((rssi.get(k)-rssi1.get(a))/10*2)); rssi是距离参考1m的rssi值,rssi1是未知位置rssi 这是三边测量代码,公式来自: 起初它给出了相当准确的结果,但后来结果没有改变,甚至有很大的误差。我想知道为什么结果没有改变是因为什么时候

我正在进行三边测量以找到未知位置的位置,为了找到距离,我使用路径损耗常数为2,就像在文章中一样,我使用2部手机和一台笔记本电脑作为发射器和参考。代码如下:

distance1 = (double) Math.pow(10, ((rssi.get(k)-rssi1.get(a))/10*2));
rssi是距离参考1m的rssi值,rssi1是未知位置rssi

这是三边测量代码,公式来自:

起初它给出了相当准确的结果,但后来结果没有改变,甚至有很大的误差。我想知道为什么结果没有改变是因为什么时候新的计算没有清除以前的结果还是什么?或者我的代码中有错误?我有点困惑,因为从许多来源进行三边测量的方法不止一种,比如:

            double delta = 4*((X1-X2)*(Y1-Y3)-(X1-X3)*(Y1-Y2));
            double x0 = (1/delta) * ((2*A*(y1-y3))-(2*B*(y1-y2)));
            double y0 = (1/delta) * ((2*B*(x1-x2))-(2*A*(x1-x3)));
它是用delta来计算的,我不知道它是从哪里来的。我理解第一个代码,它是一个线性方程。是我计算距离的常数错了吗?有没有代码可以解释三边测量的公式?我还试图扩大接收rssi信号的时间,并将其平均化,但结果仍然很糟糕

完整代码:

ArrayList<String> buildings;
    DatabaseHelper db;
    ArrayAdapter<String> arrayAdapter;
    ArrayList<PositionData> positionsData;
    String building;
    TextView result;
    TextView result2;
    TextView result3;
    Button locate;

    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.locate_wifi);
        db = new DatabaseHelper(this);
        buildings = db.getBuildings_wifi();
        locate = (Button) findViewById(R.id.locate);

        result = (TextView) findViewById(R.id.result);
        result2 = (TextView) findViewById(R.id.result2);
        result3 = (TextView) findViewById(R.id.result3);
        arrayAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, buildings);

        locate.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(getApplicationContext(), Scan.class);
                intent.putExtra("isLearning", false);
                startActivityForResult(intent,0);

            }
        });

        arrayAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, buildings);
        // Set The Adapter
        if (buildings.size()==0) {
            Toast.makeText(this, "No building data available.", Toast.LENGTH_LONG).show();
            locate.setEnabled(false);
        }
        else{


            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setCancelable(false);
            builder.setTitle("Choose building");
            builder.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // the user clicked on colors[which]
                    building = buildings.get(which);



                }
            });
            builder.show();
        }

    }



    @Override
    protected void onActivityResult(int requestCode, int resultCode,
                                    Intent intent) {
        // TODO Auto-generated method stub
        if(resultCode==RESULT_OK){


            PositionData positionData = (PositionData) intent
                    .getSerializableExtra("PositionData");
            positionsData=db.getWifiPositions(building);

            ArrayList<Router> wifis = db.getFriendlyWifis(building);

            HashMap<String, Double> rssi = positionData.getValues();
            HashMap<String, Double> rssi1 = positionsData.get(0).getValues();
            HashMap<String, Double> rssi2 = positionsData.get(1).getValues();
            HashMap<String, Double> rssi3 = positionsData.get(2).getValues();
            double X1 = positionsData.get(0).getX();
            Double X2 = positionsData.get(1).getX();
            Double X3 = positionsData.get(2).getX();
            Double Y1 = positionsData.get(0).getY();
            Double Y2 = positionsData.get(1).getY();
            Double Y3 = positionsData.get(2).getY();
            double distance1 = 0;
            double distance2 = 0;
            double distance3 = 0;




            for (String k : rssi.keySet()) {
                for (String a : rssi1.keySet()) {
                    if (k.equals(a)) {
                        Log.d("value",((Math.pow(10, ((rssi.get(k)-rssi1.get(a))/10*2))))+"");
                        distance1 = (double) Math.pow(10, ((rssi.get(k)-rssi1.get(a))/10*2));
                    }
                }
                for (String b : rssi2.keySet()) {
                    if (k.equals(b)) {
                        Log.d("value2",((Math.pow(10, ((rssi.get(k)-rssi2.get(b))/10*2))))+"");
                        distance2  = (double) Math.pow(10, ((rssi.get(k)-rssi2.get(b))/10*2));
                    }
                }
                for (String c : rssi3.keySet()) {
                    if (k.equals(c)) {
                        Log.d("value3",((Math.pow(10, ((rssi.get(k)-rssi3.get(c))/10*2))))+"");
                        distance3 = (double) Math.pow(10, ((rssi.get(k)-rssi3.get(c))/10*2));
                    }
                }

            }


            double r1 = Math.pow(distance1,2 );
            double r2 = Math.pow(distance2,2 );
            double r3 = Math.pow(distance3,2 );
            double x1 = Math.pow(X1,2 );
            double x2 = Math.pow(X2,2 );
            double x3 = Math.pow(X3,2 );
            double y1 = Math.pow(Y1,2 );
            double y2 = Math.pow(Y2,2 );
            double y3 = Math.pow(Y3,2 );
            double A = r1 - r2 - x1+x2 - y1+y2;
            double B = r2 - r3 - x2+x3 - y2+y3;
            //double delta = 4*((X1-X2)*(Y1-Y3)-(X1-X3)*(Y1-Y2));
            //double x0 = (1/delta) * ((2*A*(y1-y3))-(2*B*(y1-y2)));
            //double y0 = (1/delta) * ((2*B*(x1-x2))-(2*A*(x1-x3)));
            double C = ((-2*X1)+(2*X2));
            double D = ((-2*Y1)+(2*Y2));
            double E = ((-2*X2)+(2*X3));
            double F = ((-2*Y2)+(2*Y3));
            double x0 = (((A*F)-(B*D))/((F*C)-(E*D)));
            double y0 = (((A*E)-(C*B))/((D*E)-(C*F)));

            Log.v("x", String.valueOf(x0));
            Log.v("y", String.valueOf(y0));

            result.setText("X:  "+ x0);
            result2.setText("Y:  "+ y0);


            super.onActivityResult(requestCode, resultCode, intent);
        }
    }


    public class CustomOnItemSelectedListener implements
            AdapterView.OnItemSelectedListener {

        public void onItemSelected(AdapterView<?> parent, View view, int pos,
                                   long id) {

            building = parent.getItemAtPosition(pos).toString();
            locate.setEnabled(true);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
            locate.setEnabled(false);
        }

    }



}

ArrayList建筑;
数据库辅助数据库;
ArrayAdapter ArrayAdapter;
ArrayList位置数据;
弦乐楼;
文本视图结果;
文本视图结果2;
文本视图结果3;
按钮定位;
创建公共void(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(右布局,定位无线网络);
db=新的DatabaseHelper(此);
建筑物=db.getBuildings_wifi();
locate=(按钮)findViewById(R.id.locate);
结果=(TextView)findViewById(R.id.result);
result2=(TextView)findViewById(R.id.result2);
结果3=(TextView)findViewById(R.id.result3);
arrayAdapter=新的arrayAdapter(此,
android.R.layout.simple_微调器(项目、建筑);
locate.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
Intent Intent=新的Intent(getApplicationContext(),Scan.class);
意图。putExtra(“isLearning”,假);
startActivityForResult(意向,0);
}
});
arrayAdapter=新的arrayAdapter(此,
android.R.layout.simple_list_item_1,建筑物);
//设置适配器
if(buildings.size()==0){
Toast.makeText(这是“没有可用的建筑数据”,Toast.LENGTH_LONG.show();
locate.setEnabled(false);
}
否则{
AlertDialog.Builder=新建AlertDialog.Builder(此);
builder.setCancelable(false);
builder.setTitle(“选择建筑”);
setAdapter(arrayAdapter,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//用户单击了颜色[哪个]
building=buildings.get(哪个);
}
});
builder.show();
}
}
@凌驾
ActivityResult上受保护的void(int请求代码、int结果代码、,
意图(意图){
//TODO自动生成的方法存根
if(resultCode==RESULT\u OK){
位置数据位置数据=(位置数据)意图
.getSerializableExtra(“位置数据”);
位置数据=db.getWifiPositions(建筑物);
ArrayList wifis=db.getFriendlyWifis(建筑物);
HashMap rssi=positionData.getValues();
HashMap rssi1=positionsData.get(0.getValues();
HashMap rssi2=positionsData.get(1.getValues();
HashMap rssi3=positionsData.get(2.getValues();
double-X1=positionsData.get(0.getX();
Double X2=positionsData.get(1.getX();
Double X3=positionsData.get(2.getX();
Double Y1=positionsData.get(0.getY();
Double Y2=positionsData.get(1.getY();
Double Y3=positionsData.get(2.getY();
双距离1=0;
双距离2=0;
双距离3=0;
for(字符串k:rssi.keySet()){
对于(字符串a:rssi1.keySet()){
如果(k等于(a)){
Log.d(“值”),((Math.pow(10,((rssi.get(k)-rssi1.get(a))/10*2))+“”);
距离1=(双精度)数学功率(10,((rssi.get(k)-rssi1.get(a))/10*2));
}
}
对于(字符串b:rssi2.keySet()){
如果(k等于(b)){
Log.d(“value2”,((Math.pow(10,((rssi.get(k)-rssi2.get(b))/10*2)))+“”);
距离2=(双精度)数学功率(10,((rssi.get(k)-rssi2.get(b))/10*2));
}
}
对于(字符串c:rssi3.keySet()){
如果(k等于(c)){
Log.d(“value3”,((Math.pow(10,((rssi.get(k)-rssi3.get(c))/10*2)))+“”);
距离3=(双精度)数学功率(10,((rssi.get(k)-rssi3.get(c))/10*2));
}
}
}
双r1=数学功率(距离1,2);
双r2=数学功率(距离2,2);
双r3=数学功率(距离3,2);
双x1=数学功率(x1,2);
double x2=数学功率(x2,2);
双x3=数学功率(x3,2);
双y1=数学功率(y1,2);
双y2=数学功率(y2,2);
双y3=数学功率(y3,2);
双A=r1-r2-x1+x2-y1+y2;
双B=r2-r3-x2+x3-y2+y3;
//双三角=4*((X1-X2)*(Y1-Y3)-(X1-X3)*(Y1-Y2));
//双x0=(1/delta)*((2*A*(y1-y3))-(2*B*(y1-y2));
//双y0=(1/delta)*((2*B*(x1-x2))-(2*A*(
ArrayList<String> buildings;
    DatabaseHelper db;
    ArrayAdapter<String> arrayAdapter;
    ArrayList<PositionData> positionsData;
    String building;
    TextView result;
    TextView result2;
    TextView result3;
    Button locate;

    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.locate_wifi);
        db = new DatabaseHelper(this);
        buildings = db.getBuildings_wifi();
        locate = (Button) findViewById(R.id.locate);

        result = (TextView) findViewById(R.id.result);
        result2 = (TextView) findViewById(R.id.result2);
        result3 = (TextView) findViewById(R.id.result3);
        arrayAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, buildings);

        locate.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(getApplicationContext(), Scan.class);
                intent.putExtra("isLearning", false);
                startActivityForResult(intent,0);

            }
        });

        arrayAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, buildings);
        // Set The Adapter
        if (buildings.size()==0) {
            Toast.makeText(this, "No building data available.", Toast.LENGTH_LONG).show();
            locate.setEnabled(false);
        }
        else{


            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setCancelable(false);
            builder.setTitle("Choose building");
            builder.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // the user clicked on colors[which]
                    building = buildings.get(which);



                }
            });
            builder.show();
        }

    }



    @Override
    protected void onActivityResult(int requestCode, int resultCode,
                                    Intent intent) {
        // TODO Auto-generated method stub
        if(resultCode==RESULT_OK){


            PositionData positionData = (PositionData) intent
                    .getSerializableExtra("PositionData");
            positionsData=db.getWifiPositions(building);

            ArrayList<Router> wifis = db.getFriendlyWifis(building);

            HashMap<String, Double> rssi = positionData.getValues();
            HashMap<String, Double> rssi1 = positionsData.get(0).getValues();
            HashMap<String, Double> rssi2 = positionsData.get(1).getValues();
            HashMap<String, Double> rssi3 = positionsData.get(2).getValues();
            double X1 = positionsData.get(0).getX();
            Double X2 = positionsData.get(1).getX();
            Double X3 = positionsData.get(2).getX();
            Double Y1 = positionsData.get(0).getY();
            Double Y2 = positionsData.get(1).getY();
            Double Y3 = positionsData.get(2).getY();
            double distance1 = 0;
            double distance2 = 0;
            double distance3 = 0;




            for (String k : rssi.keySet()) {
                for (String a : rssi1.keySet()) {
                    if (k.equals(a)) {
                        Log.d("value",((Math.pow(10, ((rssi.get(k)-rssi1.get(a))/10*2))))+"");
                        distance1 = (double) Math.pow(10, ((rssi.get(k)-rssi1.get(a))/10*2));
                    }
                }
                for (String b : rssi2.keySet()) {
                    if (k.equals(b)) {
                        Log.d("value2",((Math.pow(10, ((rssi.get(k)-rssi2.get(b))/10*2))))+"");
                        distance2  = (double) Math.pow(10, ((rssi.get(k)-rssi2.get(b))/10*2));
                    }
                }
                for (String c : rssi3.keySet()) {
                    if (k.equals(c)) {
                        Log.d("value3",((Math.pow(10, ((rssi.get(k)-rssi3.get(c))/10*2))))+"");
                        distance3 = (double) Math.pow(10, ((rssi.get(k)-rssi3.get(c))/10*2));
                    }
                }

            }


            double r1 = Math.pow(distance1,2 );
            double r2 = Math.pow(distance2,2 );
            double r3 = Math.pow(distance3,2 );
            double x1 = Math.pow(X1,2 );
            double x2 = Math.pow(X2,2 );
            double x3 = Math.pow(X3,2 );
            double y1 = Math.pow(Y1,2 );
            double y2 = Math.pow(Y2,2 );
            double y3 = Math.pow(Y3,2 );
            double A = r1 - r2 - x1+x2 - y1+y2;
            double B = r2 - r3 - x2+x3 - y2+y3;
            //double delta = 4*((X1-X2)*(Y1-Y3)-(X1-X3)*(Y1-Y2));
            //double x0 = (1/delta) * ((2*A*(y1-y3))-(2*B*(y1-y2)));
            //double y0 = (1/delta) * ((2*B*(x1-x2))-(2*A*(x1-x3)));
            double C = ((-2*X1)+(2*X2));
            double D = ((-2*Y1)+(2*Y2));
            double E = ((-2*X2)+(2*X3));
            double F = ((-2*Y2)+(2*Y3));
            double x0 = (((A*F)-(B*D))/((F*C)-(E*D)));
            double y0 = (((A*E)-(C*B))/((D*E)-(C*F)));

            Log.v("x", String.valueOf(x0));
            Log.v("y", String.valueOf(y0));

            result.setText("X:  "+ x0);
            result2.setText("Y:  "+ y0);


            super.onActivityResult(requestCode, resultCode, intent);
        }
    }


    public class CustomOnItemSelectedListener implements
            AdapterView.OnItemSelectedListener {

        public void onItemSelected(AdapterView<?> parent, View view, int pos,
                                   long id) {

            building = parent.getItemAtPosition(pos).toString();
            locate.setEnabled(true);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
            locate.setEnabled(false);
        }

    }



}