Вертолеты на Марсе жужжат и не отбрасывают тень

Добро пожаловать в наше уютное конспирологическое логово. Сегодня мы будем рассматривать тени на фотографиях с Марса, округлять числа и писать отвратительный код.

Автор (справа) и предмет исследования (слева)Автор (справа) и предмет исследования (слева)

В этом выпуске: астрономические наблюдения теней в пустыне, аугментация ушей, заглядывание за левый край видео, гадание по фотографиям и особенности работы GSCMOS матриц семилетней давности.

Лифт (предположительно работает):

  1. Вертолеты на Марсе
    1.1 Оценка расстояния до Марса
    1.2 Ошибки?

  2. Вертолеты жужжат
    2.1 Blade Passage Frequency
    2.2 Эффект Доплера
    2.3 Оцениваем скорость вертолета
    2.4…расстояние до марсохода
    2.5…точки взлета и посадки
    2.6…дальность полета
    2.7…план полета
    2.8 Симуляция эффекта Доплера и сравнение
    2.9 Ошибки?
    2.10 Всякое
    2.11 Оффтоп 1: Пассивный Доплер-радар
    2.12 Оффтоп 2: Марсианская аэродинамика

  3. Вертолеты не отбрасывают тень
    3.1 Оценка характеристик камеры и оптики
    3.2 Почему лопасти прозрачные?
    3.3…они прозрачные в ИК?
    3.4 Оффтоп 3: ИК-фотография для бедных
    3.5…они путешествуют во времени?
    3.6 Оценка эффективности затвора
    3.7 Откуда на фото градиент яркости?
    3.8 Передний край
    3.9 Ground truth
    3.10 Симуляция глобального затвора

  4. Постскриптум

  5. Ссылкография

1. Вертолеты на Марсе

Маленький вертолет летает на Марсе, но где летает Марс? Насколько он дальше от Солнца чем Земля? Насколько меньше света достается камерам и солнечной батарейке?

У меня нет фотографии солнечной батарейки, чтобы по ней гадать, зато есть фотография тени от солнечной батарейки:

https://mars.nasa.gov/mars2020/multimedia/raw-images/HSF_0048_0671201703_000ECM_N0000001HELI00000_000085Jhttps://mars.nasa.gov/mars2020/multimedia/raw-images/HSF_0048_0671201703_000ECM_N0000001HELI00000_000085J

Тень должна быть шириной с саму батарейку (165 мм), ведь лучи от солнца параллельны. Можно взять ширину тени на фото и пересчитать пиксели в миллиметры.

2086 пикселей = 165 мм. 0.079 мм/пиксель.

Зачем нам это, и почему где-то в середине тени, а не по её верхней границе? Потому что перспектива заваливает размеры, а именно на этой линии слева нет особо крупных камней.

Как раз там, где тень переходит в свет.

image-loader.svg

Солнце, хоть и находится очень далеко, имеет заметный угловой размер на небе и границы теней от него не идеально резкие. Хуже того, ширина полутени (L) очень просто зависит от расстояния до предмета отбрасывающего тень (h), и углового размера Солнца (a)

Вооружившись этим знанием, а так-же тем, что высота Ingenuity составляет 49 см, а солнечная батарея находится на самой его макушке, мы можем прикинуть, насколько далеко находится Марс.

Для начала измерим полутень. Песок и камни мешают это сделать вручную, но их можно усреднить. Повернем фотографию так, чтобы граница тени была строго вертикальна, берем кусок без камней, и сохраняем.

5bf5e198f3deee58e41cfa91111aa9c7.jpg

Дальше надо преобразовать картинку в Ч/Б, усреднить все строки и построить график яркости от координаты X. 10 строчек на питоне:

import sys 
import numpy as np 
from PIL import Image 
import matplotlib.pyplot as plt

im = Image.open(sys.argv[1]).convert('L') 
im.resize((im.size[0],1), Image.ANTIALIAS)

plt.plot(np.arange(im.size[0]), np.array(im).mean(axis=0)) 
plt.show()

image-loader.svg

Яркость начинает падать примерно на x=43 и перестает на x=80. Ширина полутени получается 37 пикселей, или ~3 мм.

Теперь, проведем такой-же эксперимент на Земле. Тень от предмета на расстоянии 49 см:

Рядом нарисован один стандартный нарисованный сантиметрРядом нарисован один стандартный нарисованный сантиметр


Ширина полутени получилась 4.56 мм. Делим одно на другое и узнаем, насколько Марс дальше от Солнца, чем Земля: 4.56/3 = 1.52. А значит света на Марсе в 1.52^2 ≈ 2.3 раза меньше (без учета особенностей атмосфер обоих планет).

Теперь, расстояние от Солнца до Марса: отношение полутени к высоте солнечной батареи 3/490 = 0.00612. Диаметр солнца 1.3927 миллионов километров, значит расстояние 1.3927/0.00612 = 227.5 миллионов километров.

1.2 Ошибки?

На самом деле расстояние от Марса до Солнца меняется от 249.2 до 206.7 миллионов км в течении года. А в день когда было сделано фото (9 апреля 2021), оно составляло 242.8 (подсмотрено в Stellarium). А соотношение расстояний Марс/Земля было не 1.52, а 1.623. Ошибка в 6.3%, неплохо для разминки.

Ошибка в 1 px при измерения полутени от Ingenuity даст погрешность в 1/37 ≈ 3%, а ошибка в 1 см в высоте батарейки над тенью (земля под вертолетом не идеально ровная) — погрешность в 2%. Я так-же не исправлял искажения объектива и перспективу, наивно надеясь, что если всё достаточно хорошо центрировать, то ошибки друг-друга скомпенсируют. Дуракам, очевидно, везет.

С количеством света интереснее. У Марса почти нет атмосферы, а вот у Земли есть. И она поглощает заметную часть энергии приходящей от Солнца. Из 1350 Вт/м2, которые получает Земля от Солнца, до поверхности долетает только 1040. А до поверхности Марса ~530 Вт/м2 из 586. Разница в 1.9 раза, а не в 2.3.

2. Вертолеты жужжат

Вертолет, летающий на Марсе, работает на солнечной батарейке, 18650 аккумуляторах, процессоре от смартфона и камерах от Raspberry Pi. Ну разве не потрясающе? Смотрите, как летает:

И на видео даже слышно жужжание винтов! Perseverance, снимающий видео, смотрит на пропеллеры сборку (т.е. находится примерно в плоскости вращения), а значит в спектре звука должна быть очень заметна Blade Passage Frequency. Этот компонент зависит от скорости вращения винта и количества лопастей, а его главная гармоника:

BPF1 = n*\frac{PRM}{60}

Где n — количество лопастей пропеллера, RPM — обороты в минуту.

3f7ddcf2b23825050406c08ca6971e73.JPG


Можно собрать пропеллер и проверить как должна выглядеть BPF. Хватаем моторчик от мелкого квадрика и винт от него же. За неимением референсного тахометра, собираем его из спичек и желудей: светодиод воткнутый в микрофонный вход компа и фонарик.

Для получения спектра берем первое попавшееся по запросу «microphone FFT online»

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

Тени от лопастей проходят мимо светодиода каждые 2.94ms, перекрывая поток света от фонарика, что вызывает изменение фотоэлектрического тока, и уровня сигнала на микрофонном входе. За каждый оборот мимо датчика проходят обе лопасти, так что период вращения винта получается 6ms. А обороты — 10'000 RPM.

Вооружившись этим знанием, берем приложение-спектроанализатор и смотрим на спектр пропеллера:

Не обращайте внимания на красную линию, она показывает максимумы и я забыл её отключитьНе обращайте внимания на красную линию, она показывает максимумы и я забыл её отключить


337Гц — та-самая BPF, и разные её гармоники. Убедившись, что всё сходится, посмотрим на BPF вертолета.

Качаем видео, пихаем его в ffmpeg:

ffmpeg -i ./6015_20210507_HelicopterFliesOnMars-1280.m4v \
-lavfi showspectrumpic=s=3000x3000:fscale=log spectrogram.jpg

2d12efe7bcb1bfef2a17609deed9845b.jpg

Картинка получается возмутительно большой, но зато разрешение по частоте и времени позволяет всё разглядеть.

BPF на 84HzBPF на 84Hz

Видно, что пик находится примерно на 84Гц.

Но у ведь Ingenuity не простой винт, а два соосных. Это 2 лопасти или 4?

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

А можно собрать модель соосного пропеллера из двух обычных и проверить:

23402e045eb7f905777d08cacae384dd.jpg

Моторы соединены вместе, но повернуты лицом друг к другу, так что винты вращаются в противоположные стороны. RPM (измеренный всё тем-же светодиодом) получился примерно 6000 у каждого.

А спектры шума выглядят вот так:

В плоскости вращенияВ плоскости вращения


Пик на ~200Гц как раз соответствует BPF1 для двухлопастного винта на 6000RPM. Обратите внимание что пик двойной — обороты у винтов всё-же немного различаются, и BPF тоже.

А если слушать винты сверху, BPF1 уже не так заметна:

Над винтами (не под потоком воздуха)Над винтами (не под потоком воздуха)

В видео гораздо меньше гармоник BPF. Потому, что звук отфильтровали, заглушив всё лишнее. Но если присмотреться, на спектрограмме видны остатки высших гармоник:

6d07b8e0cd072b783c3a7817f49599e7.jpg

BPF1 на ~84Гц, а значит пропеллеры вращаются примерно на 60*(84/2) = 2520RPM.

Фраза «You can also hear the sound change as the helicopter leaves the area and then returns. That«s called the Doppler effect» которая появляется в видео, меня очень расстроила, потому что я никакого Доплера не слышал. Придется прибегнуть к помощи Машины.

2.2 Эффект Доплера

Вытащим звук из видео в WAV и скормим его numpy. Тон BPF самый громкий (спасибо неизвестному звукорежиссеру из JPL), поэтому мы можем просто выбирать самый высокий пик на FFT и, двигаясь по файлу скользящим окном, построить график его частоты по времени.

Важно выбрать достаточно большое окно, чтобы получить хорошее разрешение по частоте. Если мы хотим (а мы хотим!) разрешение в 0.1Гц, окно должно быть 1/0.1 = 10 секунд.

Почему 10?

Представьте что у вас есть запись длительностью 1 сек, в которой только одна частота. Пусть будет 10Гц. Вы можете посчитать сколько периодов помещается в 1 секунду — 10 штук.

Если частота будет 11Гц, вы насчитаете 11 периодов. Но вот если она будет 10.5Гц, вы уже не сможете уверенно сказать количество. У FFT такие-же проблемы.

Разрешение по частоте определяется как Fs/N где Fs это частота дискретизации, а N количество семплов в выборке. Или, если выборка задана в секундах, как 1/T.

Мой слух аугментирован!Мой слух аугментирован!

Максимальный сдвиг частоты от центра ~1Гц, или 1.2% от 84Гц. Гугл сообщает что человек различает на слух разницу частот в 0.5%. Ну и пусть различает, а мы посмотрим график:

  1. Сразу после взлета вертолет неподвижен. При этом BPF звучит на 84.36Гц, что уточняет обороты до 2531 RPM.

  2. Примерно на 32 секунде BPF начинает увеличиваться. А на видео в это же время вертолет начинает разгон. Задержки между видео и звуком не видно, что при скорости звука в 250 м/c дает расстояние до вертолета не более 250 метров.

Скорость звука на Марсе

Сильно зависит от времени суток из-за больших перепадов температуры. Она меняется от 216 (при -95°С) до 270 (+5°С) м/c. Вот тут рассказывают как её измерять, стреляя лазером в камни и слушая задержку. Кстати, тем-же самым микрофоном, через который мы слушаем вертолет. 250 м/c я взял практически по-памяти и это отлично совпало со скоростью при текущей погоде. -27°C дают 247 м/c.

Раз мы знаем скорость звука, сдвиг частоты можно пересчитать в скорость. Наблюдатель неподвижен, поэтому:

v = vs*\frac{f}{fo-1}

Где v скорость вертолета (вдоль луча зрения), vs скорость звука, f частота для нулевой скорости (84.36Гц), fo — наблюдаемая частота.

При разрешении по частоте в 0.1Гц, разрешение по скорости выходит ~0.3 м/c. Неплохо.

Я отметил некоторые интересные точки и их тайминги. Об этом нижеЯ отметил некоторые интересные точки и их тайминги. Об этом ниже

Видно, что график симметричный относительно центра, значит вертолет летал примерно одинаково туда и обратно. В центре есть 3 секунды, когда скорость была нулевой: на взлет и посадку нужно больше, значит он просто потупил в дальней точке и полетел домой.

image-loader.svg

Относительная скорость в начале отрицательная (он приближается!), а на 44 сек резко переходит через 0 и продолжает расти. Вертолет летел по прямой, поэтому путь должен пролегать примерно так

2.3 С какой скоростью он летал?

На 42й секунде видно, как Ingenuity завершает разгон и возвращается в вертикальное положение. Эффект Доплера дает нам лучевую скорость ~1 м/c в этот момент. Скорость в проекции можно оценить взяв два кадра из видео с разницей в пару секунд:

image-loader.svg

347/2 = 173 пикселя за секунду. Высота от дна корпуса до верхушки вертолета ~36 см, а на картинке ~17.5 пикселей: скорость в проекции 173*(0.36/17.5) = 3.56 м/c.

А полная скорость из этих двух компонентов: 3.7 м/c.

2.4 Можем ли мы уточнить расстояние от ровера до вертолета?

Возьмем два фрейма в начале полета: тот на котором Ingenuity еще не начал разгон, и тот на котором он уже почти вылетел из кадра.

327143983aad7e47fb3c4cbd20bf7e06.jpg

Можно измерить размер вертолета на обоих фреймах (лучше всего измерять высоту от дна корпуса до верхушки) и узнать, что он увеличился примерно с 16.5 до 17.5 пикселей, или на 6%.

Между фреймами прошло 10 секунд, в течении которых вертолет разгонялся, и его максимальная скорость вдоль луча зрения составила ~1 м/c. При равномерном ускорении это дает (½)*10 = 5 метров на которые вертолет приблизился к камере.

За 5 метров угловой размер вертолета вырос на 6%. Что дает нам 5/0.06 = 83 метра дистанции на момент старта.

Но этот метод очень грубый: Если бы размер изменился не на 1 пиксель, а на 2, дистанция получилась бы 43 метра. Да и лучевая скорость у нас с разрешением 0.3 м/c.

Попробуем прикинуть расстояние еще одним способом. Можно сделать очень смелое предположение, что вертолет летает какой-нибудь из сторон ланчбокса вперед, и посмотреть как он ориентирован в начале полета.

4ab60f9248689943051cb33b2275a38f.jpg


3D модельку можно покрутить тут

Выглядит как 22.5°.

А значит,

image-loader.svg


Разгон начинается в 32 секунды, а в 44 секунды скорость на графике переходит через 0 — в этот момент он летит перпендикулярно лучу зрения. 10 секунд ускорения и 2 секунды полета на 3.7 м/с дают 26 метров от начала полета до ближайшей к камере точки. Отсюда,

L = \frac{26}{sin(22.5°)} = 68\ метров

Правда наверняка где-то между, поэтому возьмем среднее от 83 и 68 — 75 метров.

Кстати, можно представить поле зрения камеры: за время пролета вертолета через весь кадр, направление изменилось на 22.5°. Горизонтальный FOV в 24° дает 55 мм объектив кроп-факторе 1.5. То есть буквально как китовый 18–55 на камере с APS-C выкрученный на самый большой зум.

2.5 Места взлета и посадки отличаются

Сравним два кадра:

image-loader.svg


Картинка увеличена в 10 раз, смещение на 85.5 и 5.5 пикселя. Место посадки было правее и ближе, чем место взлета.

Высота вертолета от дна ланчбокса до верхушки — 36 см и 16 пикселей на фото, значит он сместился на 85.5*(36/16) = 186 сантиметров вправо в проекции.

5.5 пикселя вниз, дают 12 см в проекции. Предположим, что поверхность ровная и плоская, и что высота мачты с камерой на ровере 2 метра. Тогда, смещение по поверхности вдоль луча зрения 0.12*(75/2) = 4.5 метра.

image-loader.svg

Что дает:

2.6 Как далеко летал Ingenuity?

Мы знаем, что места взлета и посадки различались, поэтому считаем по-отдельности:

По графику видно, что он начал движение в 32сек, а закончил в 79: 47 секунд полета, из которых 20 на разгон и торможение: 273.6+203.6/2 = 134,7 метра для первой части маршрута.

Обратный путь начался на 82 и закончился на 129 секундах, что тоже дает 47 секунд.

image-loader.svg

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

Действительно, arctan (1.86/4.5) ~ 22.5°. А угол a очень мал, потому что длина пути гораздо больше расстояния между точками.

Суммарная дальность полета получилась 269.4 метра.

2.7 Теперь можно нарисовать план полета

Мы знаем все нужные расстояния и углы:

image-loader.svg

2.8 Симуляция жужжания

Перед тем как сравнивать всё это безобразие с реальными данными, маленькое отступление. Спектрограмма выглядит страшно, на ней видны порывы ветра, которые почти заглушают гудение мотора. Разрешение в 0.3 м/c и окно в 10 секунд не внушают доверия. Можем ли мы вообще говорить о точности в 1 секунду, когда окно такое большое?

Давайте набросаем симулятор жужжащего вертолета. Отсюда можно взять относительные координаты ровера, и точек в которых садился вертолет:

e3aeebf66878fe97a25cdedf59f0d2e6.jpg

Смотрим координаты на скриншоте и измеряем полоску с масштабом:

meters_per_pixel = 50/167

rover = np.array([740, 274])*meters_per_pixel
heli_p1 = np.array([501,209])*meters_per_pixel
heli_p2 = np.array([573, 653])*meters_per_pixel
heli_p3 = np.array([520, 210])*meters_per_pixel

Добавим разные параметры по-вкусу:

dt = 0.1

hover_time_at_liftoff = 10
hover_time_at_p2 = 3
hover_time_at_landing = 10

accel_time = 10
max_speed = 3.7

center_freq = 84.36
speed_of_sound = 250

И составим план полета:

hover(hover_time_at_liftoff) # Hovering at p1

set_target(heli_p2)
accelerate(max_speed, accel_time) # Accelerating at p1

free_flight(accel_time) # Flying to p2

decelerate(0, accel_time) # Decelerating at p2
hover(hover_time_at_p2) # Hovering at p2

set_target(heli_p3) # Going home
accelerate(max_speed, accel_time) # Accelerating at p2
	
free_flight(accel_time) # Flying to p3	

decelerate(0, accel_time) # Decelerating at p3
hover(hover_time_at_landing) # Hovering at p3

Чо творится?

Каждая из функций апдейтит положение вертолета и, с шагом dt заполняет массив значениями BPF с учетом скорости.

hover (t) не меняет скорость и завершается через t секунд

set_target (p) меняет вектор направления вертолета, чтобы он двигался к p

accelerate (s, t) увеличивает скорость до s в течение t секунд

free_flight (t) сохраняет текущую скорость и завершается, когда время до цели будет < t

decelerate (t) — как accelerate только с другим знаком и s = 0.

Получилась вот такая красота:

image-loader.svg

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

Допустим, дальняя точка была расположена на том-же удалении, но так, что вертолет улетает под углом 10° (а не 22.5°) к проекции камеры:

heli_p2 = np.array([457, 653, 5])*meters_per_pixel

image-loader.svg

Скорость приближения в начале и конце полета гораздо ниже, а сдвиг частоты всего 0.05Гц. Мы бы даже не заметили этого на графике.

Теперь сложнее. Пусть вертолет, после того как вылетит из кадра, поворачивает немного в сторону, а потом тем-же путем возвращается обратно:

Синие линии — старый путь, зеленые — новый.Синие линии — старый путь, зеленые — новый.

Получатся так:

image-loader.svg

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

2.9 Ошибки?

1) Реальное значение RPM было 2537, а не 2531. Ошибка около 0.2% или 0.2Гц для BPF. Вполне близко к пределу точности измерений.

3) Скорость полета, по данным в википедии, 3.5 м/c, а не 3.7 м/c. Ошибка в 6%. Неплохо, учитывая то, как мы её измеряли.

Можно наложить график симуляции на реальные данные и сравнить:

image-loader.svg

Видно что симуляция (со скоростью 3.7 м/с) немного спешит.

Еще стоит заметить, что в симуляции я не учел задержку звука. Но она составляла всего пол секунды в дальней точке:

Rover-Heli dist @ start: 74.2 meters, sound lag 0.30 sec
Rover-Heli dist max: 124.0 meters, sound lag 0.50 sec

4) Расстояние от камеры до Ingenuity на старте, измеренное по карте, получилось 74 метра, а не 75. 1.3% и наглядное подтверждение того, что измерять вещи разными способами и усреднять полученное — полезно. Но вообще, скорее повезло.

6) Дальность полета, по данным из википедии, составляла 268.5 метров в обе стороны. У нас вышло 269.4 метра. Ошибка в 0.3%. На удивление, гораздо меньше ошибки в скорости. Видимо какие-то из предположений (одинаковое время разгона-торможения, равномерное ускорение, одинаковая длина путей) оказались ложными, но ошибки скомпенсировали друг-друга.

5,7) Можно наложить наш план полета на реальную карту:

image-loader.svg

Я выбрал в качестве опорной точки положение марсохода, а в качестве опорного направления — линию между ним и точкой старта. Совпало хорошо. Чуть-чуть ошиблись в точке посадки, и на пару градусов по направлению. В обоих случаях мы разглядывали 2,5 пикселя, так что ошибки можно понять.

2.10 Всякое

Последняя интересная вещь в видео — посадка вертолета. Коснувшись земли, он немного подпрыгивает и окончательно приземляется на 136 секунде. А на спектрограмме из ffmpeg виден момент когда винт начинает резко сбрасывать обороты:

d219c9efee2bbce656a11ee0493c27ba.jpg

Разница между приземлением и отключением пропеллера 3 секунды. Ingenuity, коснувшись песка, медленно и осторожно уменьшает угол атаки винтов, постепенно увеличивая нагрузку на грунт. И только когда убедится, что опора надежная — выключает моторы. А в эти 3 секунды он готов взлететь и повторить попытку, если датчики заметят что-то неладное.

А вот видео, где вся движуха собрана на один экран:

Вертолеты на Марсе действительно жужжат, и жужжат занимательно.

2.11 Оффтоп 1: Пассивный Доплер-радар

Вернемся к симулятору жужжания:

meters_per_pixel=1.0
rover = np.array([0, 0, 0])*meters_per_pixel
heli_p1 = np.array([5000.0, 200, 200])*meters_per_pixel
heli_p2 = np.array([-3000.0, 200, 200])*meters_per_pixel

. . . 

set_target(heli_p2)
accelerate(200, 1) 
free_flight(1)

Тут вертолет быстро разгоняется до 200 метров в секунду, и пролетает мимо ровера:

image-loader.svg

Скажем, мы хотим по этой записи найти скорость вертолета, но не знаем даже BPF для нулевой скорости.

Но лучевая скорость становится нулевой в тот момент, когда он пролетает ближайшую точку. И ее можно найти, если принять, что скорости до и после пролета были одинаковыми, но с разным знаком:

v1 = -v2vs*(\frac{f}{f1} - 1) = -vs*(\frac{f}{f2} - 1)f = 2\frac{f1*f2}{f1+f2}

Действительно, если взять f1 = 417Гц, а f2 = 45Гц (я взял точки в противоположных концах графика), получается 81.2 Гц. Ошибка в 2.5%, но это не так важно, потому что:

v1 = 250*(81.2/417–1) = -201.3 m/s
v2 = 250*(81.2/45–1) = 201.11 m/s

В тех точках где я измерял частоты, вертолет находился достаточно далеко (порядка 3 км), так что я пренебрег поправкой на направление. Но если вам интересно, на 3 км угол к лучу зрения получается 5.5°, а cos (5.5°) = 0.995. Погоды не делает.

Ошибка получилась меньше 0.5%. Круто? Попробуем в деле:

Возьмем видео с самым красивым самолетом. 20и-метровый кусок металла с аэродинамикой шлакоблока и радарной сигнатурой маленькой птички, не падающий с неба только благодаря хитрой управляющей электронике. Да, я про F-117:

Можем ли мы измерить его скорость?

Посмотрим на спектрограмму:

bc6445eba876cd48d353292f8112d056.jpg

Кривая перехода сразу бросается в глаза. Возьмем две частоты и посчитаем:

296adbcca831f98008593178be346fa9.jpg

Частота для нулевой скорости получилась 422Гц.

А скорость вдоль луча зрения в начале видео:

350*(422/898 — 1) = -185.5 м/c

Но летел он не прямо на камеру, а под углом градусов в 15. Так что реальная скорость:

-185.5/cos (15) = -192 м/c

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

456bf3aa13222023a7303f47787c1423.jpg

F-117 в длину 20.1 метр. Но это до края хвостового оперения. А до заднего края корпуса — 17.1 метр. Скорость получается 43*(17.1/110)*30 ≈ 200 м/с. Мы ошиблись на 4%. Наверняка из-за кривой оценки угла, или скорости по фреймам.

2.12 Оффтоп 2: Марсианская аэродинамика

Как известно, у летательного аппарата два врага: сила тяжести и сопротивление атмосферы. Мне было интересно оценить, насколько на вертолет влияет второе (может ему и правда надо летать углом вперед?).

Fd = \frac{p*v^2*k*A}{2}

Где Fd сила сопротивления атмосферы, p — плотность, v — скорость вертолета, A — площадь сечения, а k — аэродинамический коэффициент.

  • Плотность атмосферы на Марсе около 0.02 kg/m3

  • Скорость 3.5 м/c

  • k считать сложно, скажем, вертолет имеет форму куба (k = 1).

Осталось узнать площадь сечения. Это просто. Открываем 3д модельку и крутим ее до тех пор пока не будет похоже на на вертолет летящий прямо на нас:

e3becc9be57ecb4f9ac880a65e00939f.JPG

Закрашиваем тень, потому что она темнее чем коробка вертолета, и двигаем белый маркер на гистограмме влево, чтобы он стал левее пика светлого фона:

4a817a04c37129cb1ce5dc31afa0a816.JPG

Теперь гистограмма показывает количество пикселей темнее фона. Что, фактически, площадь сечения вертолета с этого ракурса. Правда она в пикселях. Но высота от дна до верхушки тут 100 пикселей, что дает 3.6 мм на пиксель. Значит один пиксель это 13 мм2, а 8051 пикселей — 104341 мм2. Или 0.1 м2.

(0.023.5^20.5×0.1)/2 = 0.01225 Ньютона

F = m*a

0.01225 = 1.8*a

a = 0.007 м/с2

То-есть, за 27 секунд полета вертолет теряет всего 0.2 м/c скорости.

3. Вертолеты не отбрасывают тени

Вернемся к заглавной картинке (наконец-то!)

https://mars.nasa.gov/mars2020/multimedia/raw-images/HNM_0064_0672622254_092ECM_N0030001HELI02888_0000A0Jhttps://mars.nasa.gov/mars2020/multimedia/raw-images/HNM_0064_0672622254_092ECM_N0030001HELI02888_0000A0J

Четыре вещи на ней выглядят подозрительно:

  1. Вертолет явно в воздухе, значит лопасти вращаются на 2500 RPM, а выглядят они очень четкими. Какая же там должна быть выдержка, диафрагма и ISO чтобы получить такую картинку с хорошей экспозицией и не утонуть в шумах и красивом бокэ?

  2. Лопасти кажутся полупрозрачными. Странности добавляет и тень от ноги поверх тени пропеллера, которая прозрачной не выглядит.

  3. Сверху лопасти более темные, чем снизу.

  4. На переднем (более прямом) крае лопасти тень выглядит темнее. Причем на некоторых фото это заметно, а на других — нет:

11ca54093a236e0450783b95ef18a2c3.jpg

Что за камера помогает Ingenuity ориентироваться на местности? Это OV7251. 640×480, отсутствие фильтра Байера, глобальный электронный затвор и до 120FPS в максимальном разрешении. Размер матрицы 1/7.5», а размер пикселя 3×3 мкм. Эта камера бывает в двух исполнениях — для видимого света (с hotmirror, который отсекает ИК излучение), и для ближнего ИК (с полосовым фильтром на 830нм).

Надо заметить, что мне так и не удалось найти (или понять по фото) какая из двух версий камеры используется на Марсе. Далее я буду предполагать что обычная.

3.1 Гадание по фотографии

Попробуем оценить выдержку. Ищем какое-нибудь прямое место на лопасти и измеряем ширину полутени. Заодно, измеряем и ширину полутени от солнечной батарейки.

Пересечение синих линий — моя скромная попытка найти ось вращенияПересечение синих линий — моя скромная попытка найти ось вращения

15 пикселей для винта и 10 пикселей для батарейки. Значит винт смазался вращением на 5 пикселей, что на таком расстоянии от оси вращения дает 1.5°. Но мы не учли искажения оптики: вещи на поверхности, ближе к краю кадра выглядят меньше, чем на самом деле. Пусть будет угол в ~2°, или 1/180 от полной окружности. Полную окружность лопасть проходит за 60000/2500RPM = 24 мс, а 1/180 за 133 мкс. Это и есть длительность выдержки. Ну или 1/7500, если вы фотограф.

Ошибка на 0.5° при измерении угла, дает примерно 33 мкс разницы. К примеру если бы угол был в 1.5°, выдержка получилась бы 100 мкс или 1/10000.

Теперь ISO. Хоть светочувствительность по ISO-12232 и не используется в этих камерах, её хорошо знать для сравнения с обычными фотоаппаратами. Когда камеры были большими, а экспонометры отдельными и дорогими, люди пользовались правилом «Sunny 16» чтобы подбирать выдержку. Правило гласит:

On a sunny day set aperture to f/16 and shutter speed to the [reciprocal of the] ISO film speed for a subject in direct sunlight

Сделаем поправку на то, что Марс дальше от Солнца и на него попадает в 2 раза меньше света. Делим 16 на \sqrt2и получаем Mars 11 rule. С диафрагмой f/11 и выдержкой 1/7500 матрице нужна будет чувствительность ISO 7500 чтобы получить нормальную экспозицию. Звучит как высокое и шумное ISO, но подождите.

Размер пикселя слишком мал, чтобы позволить диафрагму f/11: дифракционный предел размажет картинку.

d ≈ 2.44*N*λ

Где d — минимальный размер пятна, N — диафрагма, а λ — длина волны света.

При диафрагме f/11 и λ = 550нм, d получается ~15 мкм, целых 5 пикселей (размер пикселя у OV7251 — 3 мкм).

Но на кадрах с камеры можно разглядеть отдельные детали в пару пикселей размером, значит d не сильно больше размера пикселя. Пусть будет как-раз 3 мкм. Тогда:

3 = 2.44*N*0.55

N = 2.23

Чтобы дифракция не влияла на картинку, диаметр диафрагмы нужно увеличить в 11/2.23 = 5 раз. Поток света увеличится в 5^2= 25 раз, и ISO нужно уменьшить до 7500/25 = ISO 300. Хорошее, низкое ISO. И совсем не шумное.

Но хватит ли, при такой большой диафрагме, глубины резкости, чтобы без автофокуса снимать объекты на расстоянии от 15 сантиметров (когда вертолет приземлился) до десятков метров? Мы можем прикинуть гиперфокальное расстояние. Это расстояние H от камеры до точки фокуса, при котором в поле резкости попадает всё от H/2 до бесконечности:

H ≈ \frac{f^2}{Nc}

Где H — гиперфокальное расстояние, f — фокусное расстояние объектива, N — диафрагменное число, а c — диаметр круга нерезкости. Круг нерезкости имеет тот-же смысл что и пятно в дифракционном пределе: мы не хотим чтобы он был больше пикселя.

Не хватает фокусного расстояния объектива. Но мы знаем, что размер матрицы 1/7.5», а угол зрения сильно больше 90°, но меньше 180°. Пусть будет середина — 135°. Из справочных табличек (или опыта общения с зеркалками), можно узнать что для full frame матрицы угол в 130° получается при 10 мм объективе. Диагональ full frame 1.7», а значит кроп-фактор для 1/7.5» матрицы 12.75. Фокусное расстояние получается 10/12.75 = 0.8 мм.

Гиперфокальное расстояние:

H = 0.8^2/(2.23×0.003) = 95.6 мм
0.003 — это 3 мкм, размер круга нерезкости

Если сфокусировать объектив на 95 мм, то резким будет всё от 47 мм до бесконечности. Так что глубины резкости хватит с запасом.

Можно поискать модули с этой матрицей чтобы убедиться, что мы не сильно ошиблись. Вот модуль с фокусным расстоянием 1.3 мм (и углом зрения в 86°), диафрагмой f/2.2 и фиксированным фокусом от 65mm до бесконечности. В целом сходится.

1/7500», ISO300, диафрагма f/2.2 и объектив с фокусным расстоянием 0.8mm. Странная конфигурация, если вы привыкли к большой фототехнике.

А если бы камера работала в ИК (λ = 850нм), то получилось бы: ISO120, диафрагма f/1.4 и гиперфокальное расстояние в 15 сантиметров.

3.2 Прозрачные лопасти

У этой части проблема с экспериментальными данными: проснувшись однажды утром после беспокойного сна, я обнаружил, что в доме нет ни одной камеры с глобальным электронным затвором, годной для переделки в ИК. Да и негодных нет. В конце мы компенсируем недостаток реальности численным моделированием (отвратительный код на питоне, да).

3.3 Потому, что прозрачные.

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

Ведь OV7251 может работать в диапазоне ближнего ИК, где вещи выглядят неожиданно. Знаменитые примеры:

  • Тёмное, почти черное, небо. И чем дальше в ИК — тем темнее.

  • Яркие листья на деревьях, благодаря эффекту Вуда (не от слова «wood», а от слова Robert Wood)

  • Прозрачност

    © Habrahabr.ru