2016-09-23 17 views
-1

ライブラリなしでISSトラッカーを構築しようとしています...これまでのところとても良いです。しかし、私はこのサイトを使用してissの座標を得ました: 角度1は、サーボの地上0-180°の仰角です。 角度2はステッピングモータの北極(0-360°)の回転です。デカルト座標系または極座標系の2つの位置の間の角度を計算する

私はすでに試してみるためにいくつかのJavaコードを持っていますが、動作しません。私は奇妙な結果を得ています。例:ISSは私の真上にあります(400km;同じ経度と緯度)。角度は、141.68°と135.28°です。

Ps:したがって、これはライブラリを使用した学校プロジェクトです

public class Main { 
public static void main(String[] args) { 
    //double issR = 6371 + 410.92521771305; 
    double issR = 6741; 
    double issLat = 58.190897; 
    double issLong = -30.585309; 

    //posR = height in km + earth radius 
    //posLat = position latitude in °(deg) 
    //posLong = position longitude in °(deg) 
    double posR = 6365.092; 
    double posLat = 58.190897; 
    double posLong = -30.585309; 

    //Convert to cartesian 
    double issX = issR * Math.sin(issLat) * Math.cos(issLong); 
    double issY = issR * Math.sin(issLat) * Math.sin(issLong); 
    double issZ = issR * Math.cos(issLat); 

    System.out.println("ISS\nx: " + issX); 
    System.out.println("y: " + issY); 
    System.out.println("z: " + issZ); 

    //Convert to cartesian 
    double posX = posR * Math.sin(posLat) * Math.cos(posLong); 
    double posY = posR * Math.sin(posLat) * Math.sin(posLong); 
    double posZ = posR * Math.cos(posLat); 

    System.out.println("\nPOS\nx: " + posX); 
    System.out.println("y: " + posY); 
    System.out.println("z: " + posZ); 

    //Calculate angle (I'm not sure which angle is which :D) 
    double angleYZ = Math.atan2(issY - posY, issZ - posZ)*180/Math.PI; 
    double angleYX = Math.atan2(issY - posY, issX - posX)*180/Math.PI; 

    //Another try to calculate the angle... 
    double angle = Math.toDegrees(Math.atan2(Math.sqrt(Math.pow(issX - posX, 2) + Math.pow(issY - posY, 2)), issZ - posZ))+90d; 
    double angle2 = Math.toDegrees(Math.atan2(Math.sqrt(Math.pow(issX - posX, 2) + Math.pow(issY - posY, 2)), issX - posX))+90d; 

    System.out.println(); 
    System.out.println("Angle X: " + angleYZ); 
    System.out.println("Angle Z: " + angleYX); 
    System.out.println(angle); 
    System.out.println(angle2); 
} 
} 

class Math { 
final static double PI = java.lang.Math.PI; 

public static double cos(double x) { 
    return java.lang.Math.cos(x * Math.PI/180.0); 
} 

public static double sin(double x) { 
    return java.lang.Math.sin(x * Math.PI/180.0); 
} 

public static double atan2(double x, double y) { 
    return java.lang.Math.atan2(x, y); 
} 

public static double toDegrees(double angrad) { 
    return java.lang.Math.toDegrees(angrad); 
} 

public static double pow(double a, double b) { 
    return java.lang.Math.pow(a, b); 
} 

public static double sqrt(double a) { 
    return java.lang.Math.sqrt(a); 
} 
} 
+1

あなたは自分の罪とし、機能cosを同じ角度単位を使用するようにはatan2を変更すると仮定すると、私は(傾斜角が 'ATAN2だと思いますissR * cos(issLat - posLat) - posR、issR * sin(issLat - posLat)) '(0は北の水平線、90度は上、180 degre (0は北、90度は東、南向きは-90度)、パン角は 'atan2(issR * sin(issLong - posLong)、issR * cos(issLong - posLong) 180度は南、-90度は西)。私は間違っている可能性があります。 –

+1

あなたは私のヒーローです!それは完璧にあなたにそんなに感謝します! – LsHallo

答えて

1

イアン・アボットにより示唆されるようにこれは私の作品:

double tilt = Math.toDegrees(Math.atan2(issR * Math.cos(issLat - posLat) - posR, issR * Math.sin(issLat - posLat))); 
double pan = Math.toDegrees(Math.atan2(issR * Math.sin(issLong - posLong), issR * Math.cos(issLong - posLong) - posR)); 
関連する問題