2015-05-12 2 views
2

Допустим, у меня есть гудок и мой телефон. Я посмотрел на СЕВЕР и положил дрон на 4 метра на моем фронте. Я должен посмотреть на радар и посмотреть на гул в северном положении.Радиолокационная станция «Подводная лодка» Другое местоположение

Мой радар имеет размер 256x256 пикселей, а максимальное расстояние до беспилотника - 200 м. Приблизительно 0,002 лата/долгота.

Итак, ive сделал простой тестовый класс, чтобы проверить этот гудок на моем севере.

public static void main(String[] args) { 

    BigDecimal droneLat = new BigDecimal(-22.811468333334087077446383773349225521087646484375); 
    BigDecimal droneLong = new BigDecimal(-47.0474650000); 

    BigDecimal phoneLat = new BigDecimal(-22.81129370000000022855601855553686618804931640625); 
    BigDecimal phoneLong = new BigDecimal(-47.04832809999999909678081166930496692657470703125); 

    BigDecimal latDiff = phoneLat.subtract(droneLat); 
    BigDecimal longDiff = phoneLong.subtract(droneLong); 

    int pixelsLat = degreesToPixels265x265(latDiff.abs()); 
    int pixelsLong = degreesToPixels265x265(longDiff.abs()); 

    if (latDiff.compareTo(new BigDecimal(0)) < 0) { // drone > phone means phone is farther to north, phone lat will be lower, it will show lower in radar 
      pixelsLat = -pixelsLat; 
    } 
    if (longDiff.compareTo(new BigDecimal(0)) > 0) { // drone > phone means phone is farther to north, phone lat will be lower, it will show lower in radar 
      pixelsLong = -pixelsLong; 
    } 

    System.out.println("DiffLat "+latDiff); 
    System.out.println("DiffLong "+longDiff); 

    System.out.println("Pixels lat = "+pixelsLat); 
    System.out.println("Pixels long = "+pixelsLong); 
} 

public static int degreesToPixels265x265(BigDecimal n) { 
    BigDecimal p1 = n.multiply(new BigDecimal(256/2)); 
    return p1.divide(new BigDecimal(0.002d),2,BigDecimal.ROUND_CEILING).intValue(); 
} 

Pixels Lat будет суммировать до 128, чтобы нарисовать положение дронов, а также пикселей. Как беспилотник находится на моем севере, должны ли пиксели лат быть более положительными?

Я делаю неправильную математику здесь, чтобы обнаружить истинные координаты, чтобы нарисовать это?

Спасибо большое за внимание!

ответ

0

Когда вы идете на север, широта увеличивается на 90 градусов на северном полюсе. Так что да, вы правы. Пиксели должны быть более положительными. (Я полагаю?) Read This

Однако сейчас я работаю над проектом GPS, и я могу рассказать вам по опыту, что 4 метра далеко, далеко до конца. Гражданские GPS-приемники без помощи сотовых вышек могут достичь около 10 метров точности в идеальных условиях. Может быть, лучше с ГЛОНАСС.

Если вы готовы ждать, вы можете купить один из них: http://store.swiftnav.com

GPS 101: Перемещение беспилотный дальше, и учитывать результаты, которые являются точными только около 20 метров.

2

Общая проблема, которую вы пытаетесь решить, - это «проекция»: Проецирование координаты lat/lon, которая находится на сфере на плоскую поверхность (экран). Вот вопрос/ответ о том, как решить эту проблему: Converting longitude/latitude to X/Y coordinate

Но если вы не заботитесь о решении общей проблемы проекции, для любой проекции (Меркатора и т. Д.) И обработки очень больших расстояний (в тысячах миль)) и кромки (вы летите около северного или южного полюса), вы можете сделать что-то довольно простое: вычислите подшипник и расстояние от точки A (ваше местоположение) и точки B (местоположение дрона). Используя этот подшипник и расстояние, зарисуйте гудение на экране с приближением, которое должно работать нормально на несколько сотен метров.

Чтобы вычислить расстояние, используйте Haversine formula:

public static double distance(double lat1, double lon1, double lat2, double lon2) { 
    double R = 6372.8; // Radius of the earth in kilometers. 
    double dLat = Math.toRadians(lat2 - lat1); 
    double dLon = Math.toRadians(lon2 - lon1); 
    lat1 = Math.toRadians(lat1); 
    lat2 = Math.toRadians(lat2); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
    double c = 2 * Math.asin(Math.sqrt(a)); 
    return R * c; 
} 

и вычислить угол между двумя точками (на самом деле просто начальный угол - на сфере, изменения угла по мере приближения но мы повторно аппроксимирующих через короткое расстояние):

public static double bearing(double lat1, double lon1, double lat2, double lon2) { 
    double latitude1 = Math.toRadians(lat1); 
    double latitude2 = Math.toRadians(lat2); 
    double longitude1 = Math.toRadians(lon1); 
    double longitude2 = Math.toRadians(lon2); 
    double longDiff = longitude2 - longitude1; 
    double y = Math.sin(longDiff) * Math.cos(latitude2); 
    double x = Math.cos(latitude1) * Math.sin(latitude2) - Math.sin(latitude1) * Math.cos(latitude2) * Math.cos(longDiff); 
    return Math.atan2(y, x); 
} 

После того, как вы можете вычислить расстояние & подшипник, вы можете отобразить, что на экране (то, что вы делаете преобразование полярных координат в декартову/XY координаты):

public static void plotLatLon(double droneLat, double droneLon) { 
    // Get location from phone geolocation. 
    double phoneLat = -22.8112937000; 
    double phoneLon = -47.0483281000; 
    int width = 256; 
    int height = 256; 
    // 256 pixels = 400 meters; 200 meters away = edge of screen. 
    double scaleFactor = 256.0/400.0; 

    double bearing = bearing(phoneLat, phoneLon, droneLat, droneLon); 
    double distance = distance(phoneLat, phoneLon, droneLat, droneLon); 
    System.out.println("Bearing: " + (Math.toDegrees(bearing) + 360.0) % 360.0); 
    System.out.println("Distance: " + distance); 
    double angle = (Math.PI/2.0) - bearing; 
    int x = (int)(distance * scaleFactor * Math.cos(angle)); 
    int y = (int)(distance * scaleFactor * Math.sin(angle)); 
    // Assumes radar coordinate system has (0,0) at the lower left. 
    Radar.plotXY(x + width/2, y + height/2); 
} 

И вот результаты я получаю:

Bearing: 102.38029388096368 
Distance: 90.59766443003579 
X: 184 
Y: 116 

(Ваш беспилотник на самом деле не на север; Координаты вы сменились его на восток и немного южнее)

Обратите внимание, что двойная точность достаточно:. "Double precision floats give sub-millimetre precision anywhere on Earth."

Вы также можете быть заинтересованы в библиотеке, как spatial4j для выполнения географических вычислений в Java.

Смежные вопросы