...

суббота, 10 июля 2021 г.

В Airbus предложили перепрофилировать спутники связи в защиту от астероидов

Airbus предлагает перепрофилировать крупные спутники связи в дефлекторы астероидов на случай, если небесные объекты будут угрожать Земле. В компании рассчитывают, что с их помощью можно будет изменить траекторию спутников до 300 м в диаметре.

Airbus представила свою концепцию в рамках программы Fast Kinetic Deflection (FastKD), заказанной Европейским космическим агентством (ESA). Компания предлагает использовать в качестве дефлекторов спутники связи, которые находятся на геостационарной орбите на высоте 36 тыс. км. Эти аппараты могут весить от 4 до 6 тонн — достаточно, чтобы повлиять на траекторию приближающегося небольшого астероида, считают в Airbus. Как сообщил Альберт Фальке, который руководил исследованием FastKD в Airbus, потребуется около десяти таких космических аппаратов, которые за короткий промежуток времени должны столкнуться с астероидом шириной 300 метров, чтобы тот изменил свою траекторию.

По данным SpaceNews, в 2019 году спутниковые операторы по всему миру заказали 15 геостационарных спутников. Согласно сценарию Airbus, если астрономы обнаружат астероид, приближающйся к Земле, производители спутников должны будут перепрофилировать аппараты в противоастероидное оружие. Спутники должны быть запущены по направлению к астероиду в течение месяца, чтобы достичь его примерно в одно и то же время. Комбинированный эффект от столкновения спутников с небесным телом может изменить его траекторию всего на несколько сантиметров, но этого будет достаточно, чтобы сбить его с курса и предотвратить катастрофу, считают в Airbus. 

Чтобы иметь возможность выполнить миссию по защите Земли, спутники должны быть оснащены модулем связи, а также системами навигации и наведения. Эти модули еще предстоит разработать. В идеале они должны быть построены и испытаны заранее и готовы в случае возникновения чрезвычайной ситуации. Человечество, по мнению Фальке, должно быть готовым к такой ситуации. Если астероид шириной 300 м нанесет удар где-нибудь в Центральной Европе, это вызовет широкомасштабные разрушения по всему континенту.

«Такое столкновение вызовет ударную волну, а также огненные бури и землетрясения. Я думаю, что всю Европу придется эвакуировать, а вся флора и фауна будут уничтожены в течение нескольких месяцев и лет после этого удара».

Ученые не уверены, можно ли отклонить астероид диаметром более 300 м с помощью этого метода. Считается, что астероид, который привел к исчезновению динозавров около 60 миллионов лет назад, имел диаметр не менее 9,6 км. 

«Но хорошо то, что о таких больших объектах будет известно очень давно, так что у нас будет время подготовиться», — утверждают в Airbus.

Первый в мире эксперимент по отклонению астероида должен состояться в следующем году, когда аппарат НАСА под названием DART врежется в небольшой астероид Диморфос, который вращается вокруг более крупного астероида Дидимос. Цель состоит в том, чтобы изменить орбиту Дидимоса шириной 160 м с помощью космического корабля весом 600 кг.

Adblock test (Why?)

Бесплатный персональный OpenVPN-сервер на базе Oracle Cloud

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

Oracle, придя на рынок облачных сервисов, активно привлекает новых клиентов. И одним из инструментов такого привлечения являются Always Free сервисы - зарегистрировавшийся клиент может пользоваться каким-то достаточно ограниченным набором ресурсов, как это следует из названия, бесплатно и неограниченно во времени. В список этих ресурсов входит два compute инстанса (каждый 2 ядра, 1GB RAM, 45GB HDD), которые можно использовать подо что угодно, но в нашем случае мы можем построить на них полностью бесплатный OpenVPN-сервер, буквально не умея практически ничего, кроме тыкания в кнопку Next. Чем мы и займемся.

Делай раз - регистрируемся

Идем на адрес https://signup.cloud.oracle.com/. Проходим крайне самоочевидный мастер регистрации, подтверждаем почту, привязываем платежную карту, доходим до дашборда, где будет написано "Your account is currently being set up, and some features will be unavailable. You will receive an email after setup completes." Дальше можно знакомиться с интерфейсом, но лучше до того, как аккаунт станет полностью подтвержденным, ничего значимого не делать. Обычно на это уходят единицы, в крайнем случае десятки минут.

Из тонких моментов - да, платежная карта нужна. На ней должен быть минимум 1 евро, который снимется при проверке карты. Но если вы будете пользоваться только always free ресурсами, никаких других денег с вас не снимут. По отзывам, далеко не все карты российских банков работают, я для подобных сервисов обычно использую карты из партнерских программ с Золотой Короной (Кукуруза от Связного, Озон.Кард - десятки их), с ними никаких проблем при регистрации в Оракле не возникало. Та же озоновская карта делается за единицы минут без изменения положения тела в пространстве.

Еще может быть непонятным момент выбора региона - тут, разумеется, вы выбираете, исходя из ваших целей, но я бы рекомендовал рассматривать наиболее географически к вам близкие регионы. Нужно помнить, что для VPN-сервиса задержка передачи пакета от клиента до сервера и назад добавляется к общей задержке, даже если вы пытаетесь подключиться к серверу в соседней с вами комнате. Также имеет смысл учитывать жесткость законодательства по авторским правам в конкретной стране - вдруг у вас торренты через этот канал польются. Вероятность проблем, конечно, невысока, но зачем потенциально усложнять ситуацию. Для себя я выбираю Нидерланды - там и AMS-IX рядом, да и в принципе страна хорошая :) Но, повторюсь, вы можете выбрать любой регион из доступных и повлияет это только на задержку.

Делай два - запускаем сервер OpenVPN

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

Идем в маркетплейс, там нажимаем на зеленую кнопку Get App справа сверху. Далее он нас попросит залогиниться - выбираем Commercial Market, логинимся. В появившемся окне нужно выбрать Compartment (он у вас пока что один) и подтвердить, что вы прочитали и приняли Terms of Use. После этого станет доступна кнопка Launch Stack, на которую мы немедленно и нажимаем.

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

На втором этапе уже есть кое-что важное. В поле Compute Shape обязательно надо выбрать VM.Standard.E2.1.Micro вариант (возможно, когда вы это читаете - там могут быть другие цифры, но важно, что Micro - только они попадают под Always Free опцию).

Ниже, в Application Configuration, нам нужно создать админские логин и пароль к сервису (их можно будет использовать и для подключения к VPN, а можно будет создать для этого дополнительные реквизиты).

В Network Configuration в принципе всё можно оставить по умолчанию, если у вас есть какие-то специальные требования к адресации внутри VPN - здесь их можно скорректировать.

И, наконец, в Additional Configuration имеет смысл вставить ваш публичный ssh-ключ, чтобы вы смогли подключиться к сервису по SSH для управления из консоли. Если вам эта возможность не требуется - то и без него всё совершенно точно будет работать.

После нажатия Next мастер позволит вам обозреть ваши настройки в последний раз и нажать Create, после чего задача встанет в очередь на исполнение в Terraform'е. Исполняться иногда может долго, был случай - ждало больше 15 минут, но чаще всего через десятки секунд уже можно наблюдать радующее "Выполняется" в состоянии инстанса в списке. Провалившись в инстанс, можно в разделе "Доступ к экземпляру" посмотреть "Общедоступный IP-адрес", который и будет адресом вашего VPN-сервера.

Делай три - заходим в интерфейс управления

На самом деле необязательный шаг, но для понимания нюансов.

Интерфейс управления доступен на https://<IP-адрес>. К сожалению, он использует самоподписанный сертификат, поэтому через свежие версии Chrome, например, достучаться будет нелегко - в хроме постоянно выпиливаются обходные пути для подключения к небезопасным сайтам и сейчас, кроме варианта через экспорт в файл и импорт в хранилище, я и не знаю способа открыть такой сайт в хроме. Но мне гораздо проще для подключения использовать браузер с меньшим уровнем паранойи, в частности - Safari, который хоть и ругается, но открыть сайт позволяет.

Логин и пароль для админки - те, которые вы ввели в настройках на шаге №2. На том конце - классический веб-интерфейс OpenVPN Access Server, так что в рамках непревращения статьи в "100500я статья про OpenVPN в интернете" описывать какие-то настройки здесь я не буду, тем более, что работать будет и с настройками по умолчанию.

Делай четыре - подключаемся к VPN

Тут, опять же, не буду плодить сущности и отсылаю за описанием подключения вашего конкретного OpenVPN-клиента к стандартному OpenVPN-серверу в великий интернет. Хочу при этом заметить, что большинство ПК-клиентов для OpenVPN умеют самостоятельно стягивать на себя профиль - т.е. в них достаточно указать адрес админки (https://<IP-адрес>) и логин с паролем, упомянутые выше. И всё заработает само.

Проблемы и ограничения

1) Не у всех поднимается доступ по SSH. Тут, к сожалению, ничего сказать не могу, потому что мне такой кейс отлаживать не приходилось. Рекомендовать могу только на втором этапе выше тщательно проверить, что вставился правильный публичный ключ. Имя пользователя при этом выводится в том же разделе "Доступ к экземпляру".

2) Нужно помнить, что это не просто виртуальная машина, а инстанс в облаке, закрытый сетевыми настройками не только внутри инстанса (чаще всего там уже заточенный iptables), но и снаружи его - в NetworkSecurityGroup, назначенной на виртуальную облачную сеть (VCN) инстанса. Поэтому если нужно открыть какие-то нестандартные порты - это может потребоваться делать в нескольких местах.

3) OpenVPN Access Server без лицензии позволяет не более двух одновременных подключений. Поэтому решение подходит для персонального VPN. Но в целом, конечно, ничто не мешает не ставить его из маркетплейса, а поднять пустой инстанс в Оракле (или не Оракле) и установить OpenVPN (или не OpenVPN) на этот инстанс самостоятельно из консоли. Это уже просто будет другая история.

4) Важный апдейт от @osipov_dv - в сервисе бесплатны только 10 ТБ исходящего трафика в месяц (в случае VPN получается суммирование вашего входящего и исходящего), а потом он будет вам стоить $0.0085/GB. Впрочем, на практике дотянуться до 10 ТБ потребления - это надо очень, очень постараться. По моим логам более 2 ТБ за месяц общего потребления моя семья никогда не осиливала, несмотря на немаленькую домашнюю ферму виртуализации. Но никогда не помешает оценить свои объемы потребления, прежде чем подписываться.

Заключение

Понимаю, что большинство читателей способны самостоятельно настроить VPN-сервер, поэтому не претендую на техническую полезность статьи. Скорее это просто рассказ о существующей возможности, про которую слышали далеко не все. Теперь, надеюсь, знающих будет больше.

Adblock test (Why?)

[Перевод] Собираем квантовый генератор случайных чисел


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

Введение


Квантовая механика – это удивительная наука, выделяющаяся тем, что вносит поистине случайные процессы. К сравнению, в классической механике все перемещения определяются строго. Поэтому, хоть мы и не можем на практике предсказать итог броска монеты или игровых кубиков, теоретически можно в точности вычислить этот итог, если знать все задействованные в процессе силы. С другой стороны, результат единичных измерений в квантовой механике (насколько нам известно) наперед знать невозможно. В этом случае нам доступно лишь прогнозирование вероятности.

Задача проекта состоит в использовании этого свойства для создания настоящего квантового генератора случайных чисел. В качестве источника квантовой случайности я выбрал радиоактивный распад америция-241. Этот элемент используется в виде источника ионизации в ионизационных камерах пожарных извещателей. По факту ионизационные камеры можно использовать непосредственно.

Принцип действия


Идея проста:
  1. Подать на ионизационную камеру напряжение и усилить ток.
  2. Измерить колебания тока, вызванные случайными флуктуациями радиоактивного распада.
  3. Преобразовать колебания тока в поток битов.

Дьявол же, как обычно, кроется в деталях. Мне потребовалось провести немало экспериментов, чтобы эта схема заработала.

Ионизационная камера


Такую камеру с Am-241 оказалось несложно достать на eBay всего за несколько долларов. Она состоит из металлического корпуса (1), центрального электрода (2) и электрода с америцием (3):

Америций-241 является источником альфа-излучения. Альфа-частицы (показаны зеленым) ионизируют воздух в камере и делают его слабопроводящим. При подаче напряжения между электродами и/или корпусом начинает протекать слабый ток. Его сила зависит от количества ионов в воздухе, которое, в свою очередь, зависит от количества распадов Am-241 в секунду. Радиоактивный распад – это lдействительно случайный процесс, в связи с чем ток должен иметь соответствующие колебания.

Предусилитель


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

Для получения высокого тока транзисторы Q1 и Q2 сконфигурированы как пара Дарлингтона. Q3 привносит дополнительный этап усиления и вместе с R4 преобразует сигнал тока в напряжение относительно земли. R2 ограничивает максимум протекающего через Q1, Q2 и Q3 тока, поскольку даже небольшое его количество может привести к тому, что пара Дарлингтона станет полностью проводящей.

Эта схема очень чувствительна. Без экранирования она улавливает от всех окружающих устройств шум в 50 Гц:

А с должным экранированием производит сигнал со средним значением около 1.5В и колебанием порядка 100мВ:

Фильтр низких частот


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

Компаратор


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

Выход повышается, если входной сигнал (приходящий слева) оказывается выше опорного напряжения (поступающего снизу слева) и понижается, если ниже. Переключатель SW1 служит для запуска генерации опорного напряжения при запитывании цепи. Перемычка JP2 также, как R10, R11 и R12 используется для тонкой настройки генератора опорного напряжения. Все это я объясню подробнее чуть позже.

Журнал проекта


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

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

Канал 1 показывает цифровой выход схемы. Он генерируется путем сравнения аналогового выхода с опорным напряжением при помощи триггера Шмидта.

Теперь мне нужно задокументировать эту рабочую схему и перенести ее уже на более постоянную макетную плату.

Корпус


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

Примечание: используемый автором датчик дыма является общедоступным и вполне может быть куплен на eBay, AliExpress и некоторых отечественных ресурсах. При этом нужно учитывать, что степень активности используемого в нем америция составляет 0.9 МКи. Законом же максимально допустимое значение активности америция-241 для источников, не требующих лицензирования, установлено в пределах 0.29 МКи. Таким образом, заказ и применение подобных датчиков могут быть сочтены незаконными.

Adblock test (Why?)

Звездная зола. Чем закончится диаграмма Герцшпрунга-Рассела

Голубые карлики, потомки красных карликов

Красные карлики (звезды спектрального класса M) – самые многочисленные во Вселенной. Так, почти все звезды, находящиеся в непосредственной близости от Солнца – красные карлики (из 50 самых ближних к нам звезд Солнце является 4-й по размеру). Интерес к красным карликам значительно повысился именно в последние годы, отчасти потому, что именно в системе очень тусклого и холодного красного карлика TRAPPIST-1 находится примерно семь компактно расположенных планет, как минимум три из которых должны располагаться в зоне обитаемости этой звезды.

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

Конвекция в красном карлике может продолжаться на протяжении почти 6 триллионов лет, поэтому звезда успевает «выработать» почти весь свой водород. Боденгеймер предполагает, что самые мелкие красные карлики в конце жизни не превратятся в красные гиганты, а, оставаясь физически компактными, вновь начнут разогреваться, став голубыми карликами.

Температура такой звезды превысит солнечную, а светимость все равно останется очень низкой. Для превращения в красный гигант масса красного карлика должна составлять не менее 0,25 M (массы Солнца). Более мелкие звезды ждет превращение в голубые карлики. При этом самые мелкие из известных красных карликов имеют массу около 0,08 M и могут гореть до 12 триллионов лет.

По-видимому, примерно через 800 миллиардов лет во Вселенной не останется звезд крупнее 0,3 M, и большинство из них окажется голубыми карликами. При этом жизнь таких звезд будет дополнительно продлеваться за счет нарастания их металличности. Металл сдерживает потерю звездной энергии, играя роль своеобразной заслонки, тем самым еще немного продлевая жизнь звезды. Вероятно, к окончанию первого триллиона лет все сохранившиеся к тому времени галактики будут иметь голубоватый оттенок, так как окажутся наполнены голубыми карликами.

Черные карлики, потомки белых карликов

В нижней части диаграммы Герцшпрунга-Рассела расположена последовательность белых карликов. Такие звезды образуются на месте красного гиганта, постепенно теряющего газовую оболочку. Ядерных реакций в них не происходит, а состоят белые карлики из постепенно остывающей раскаленной плазмы. Предполагается, что в таком состоянии белый карлик просуществует около 10 триллионов лет, после чего его поверхность перестанет излучать видимый свет. В таком случае потухшую звезду станет невозможно обнаружить в телескоп, но она все равно останется целостным объектом, который будет выдавать его гравитационное воздействие.

Самым старым белым карликам, известным в настоящее время – около 12 миллиардов лет. Таким образом, до появления первых черных карликов Вселенная должна состариться еще в тысячу раз. Тем не менее, периодичность диаграммы Герцшпрунга-Рассела позволяет уверенно предположить, что черные карлики когда-нибудь возникнут.

Блицар, потомок нейтронной звезды

Звезды такого типа – гипотетические объекты, существование которых могло бы объяснить быстрые радиовсплески (FRB), первый из которых был обнаружен в 2011 году. Про блицары на Хабре уже писали, вкратце напомню суть этого явления.

В физике известен предел Оппенгеймера-Волкова, максимальная масса, при которой нейтронная звезда еще не превращается в черную дыру. При этом данный предел рассчитывается без учета вращения, присущего многим нейтронным звездам и унаследованного от родительской звезды. Центробежная сила, возникающая при таком вращении, не дает звезде «упасть» в черную дыру, поэтому нейтронная звезда может некоторое время существовать выше предела Оппенгеймера-Волкова. В этот период звезда генерирует сильное магнитное поле, из-за которого вокруг нее исчезает аккреционный диск. В результате при падении нейтронной звезды за горизонт событий от нее «отстреливается» не вещество, а только мощное магнитное поле, что и может быть зафиксировано как быстрый радиовсплеск.

Блицары также можно считать гипотетическими объектами, поскольку непосредственно они не зафиксированы. Такие небесные тела также называются «суронами», где SURON – аббревиатура, означающая "SUpramassive Rotating Neuron star" (подмассивная вращающаяся нейтронная звезда). Физика суронов подробно изложена в этой работе; также отмечается (раздел 3.3.2), что в состоянии сурона (блицара) может удерживаться примерно 3% всех нейтронных звезд — большинству из них центробежной силы все-таки не хватает, чтобы балансировать на грани горизонта событий.

Объект Торна-Житков, потомок красного гиганта и нейтронной звезды

Кип Торн совместно с Анной Житков в 1977 году описали гипотетический объект, который мог бы возникать в случае поглощения нейтронной звезды красным гигантом. В этом случае звезда могла бы наблюдаться как пекулярная и содержать повышенные дозы лития, молибдена и рубидия. Существование звезд-гигантов с нейтронным ядром еще в 1938 году предположил Лев Ландау, почему такой объект иногда называют в честь Торна-Житков-Ландау. Наиболее вероятно, что такие звезды могут возникать при слиянии двойных звездных систем, в которые входит красный гигант и нейтронная звезда. Подобный объект должен получаться нестабильным и все равно коллапсировать в черную дыру, либо в двойную звездную систему, где вокруг общего центра масс будут обращаться нейтронная звезда и пульсар.

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

Замороженная звезда

Это еще один гипотетический объект, который может возникнуть через триллионы лет. Возможно, мы наблюдаем эпоху массивных, ярких и горячих звезд именно потому, что наша Вселенная еще слишком молода, и в ней полно гелия и водорода для образования газовых звезд. Тем не менее, так будет не всегда. Как при образовании белых карликов, так и при взрывах сверхновых, «пеплом» от ядерных реакций являются металлы, а не газы. Постепенно содержание металлов во Вселенной возрастает, и через триллионы лет новые поколения звезд будут образовываться не только и не столько из водорода, сколько из металлов. Такие объекты будут гораздо меньше нашего Солнца (около 0,04 M) и гораздо тусклее звезд, известных сегодня – внешне они могут быть сопоставимы с Юпитером. Тем не менее, поскольку они будут состоять из металлов легче железа, плотность их будет огромной, а тяготение на поверхности – около 100g. Именно поэтому в их недрах сможет протекать ядерный синтез, разогревающий такую звезду примерно до 0 градусов. Замороженная звезда может быть окружена своеобразной атмосферой, в которой будут плавать куски льда и, повторюсь, может испускать некоторое количество света.   

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

Заключение

Все описанные превращения, являющиеся маленькими шагами к тепловой смерти Вселенной, являются экстраполяцией на основе диаграммы Герцшпрунга-Рассела и не учитывают еще одного гипотетического процесса. Это распад протона, спонтанное превращение протонов в более легкие субатомные частицы. Такой процесс не противоречит известной физике частиц, но также до сих пор не зафиксирован. Именно для того, чтобы засечь распад хотя бы одного протона, в Японии появился проект Камиоканде: шахты близ города Камиока были превращены в огромные резервуары с водой, оборудованные детекторами. Ни один протон во всей этой воде за минувшие сорок лет так и не распался, а Камиоканде в итоге был превращен в один из самых крупных и успешных детекторов нейтрино – но это уже совсем другая история.

Возможно, именно распадом протонов закончится существование железных звезд, которые при этом просто медленно развоплотятся. Или же на последних этапах существования Вселенная породит какие-то новые состояния вещества. Надеюсь, в этой статье мне удалось не обойти вниманием никаких интересных объектов, существование которых проистекает из диаграммы Герцшпрунга-Рассела, но пока не доказано.  

Adblock test (Why?)

За последний год Microsoft выплатила $13,6 млн в рамках программ поиска уязвимостей в своих продуктах

8 июля 2021 года Microsoft рассказала, что за последний год выплатила сторонним специалистам по безопасности и IT-экспертам около $13,6 млн в рамках 17 программ по поиску уязвимостей в своих программных продуктах и сервисах.
Microsoft пояснила, что открытое партнерство с сообществом исследователей безопасности — важная часть стратегии компании по защите пользователей от угроз безопасности.

Согласно отчету Microsoft, компания с 1 июля 2020 года по 30 июня 2021 года:

  • выплатила вознаграждения 340 ИБ-специалистам из 58 стран;
  • самая крупная награда составила $200 тыс. по программе вознаграждения Hyper-V Bounty;
  • большая часть выплат за найденные критические уязвимости были более $10 тыс.;
  • компания получила от «белых» хакеров 1261 полный отчет по обнаруженным уязвимостям.


Распределение ИБ-специалистов по странам, получивших от Microsoft награды за уязвимости. Больше всего нашли багов программисты из Китая, США и Израиля.

Microsoft планирует в этом году расширить программы по поиску уязвимостей и увеличить награды IT-экспертам за наиболее проблемные недоработки и критические ошибки в ПО.

Примечательно, что за период с 1 июля 2019 года по 30 июня 2020 года Microsoft выплатила $13,7 млн по своим программам багбаунти 327 исследователям.

Для сравнения, Mail.ru Group с 2014 года выплатила исследователям на платформе HackerOne за поиск уязвимостей в своей экосистеме, включая VK, всего $2 млн.

В июне 2013 года Microsoft начала выплачивать вознаграждения сторонним специалистам за найденные в своих продуктах баги.

Adblock test (Why?)

Фильтр Калмана: разбор навигационной системы БПЛА + исходный код

В статье я бы хотел объяснить принципиальную разницу между Фильтром Калмана (ФК) и классическими фильтрами, кратко рассмотреть преимущество выбранного ФК поделиться опытом использования данного ФК во встраиваемой системе квадрокоптера для навигации на основе инерциального и ГНСС датчиков и поделится исходным кодом с демкой для самостоятельного изучения.

Всем привет! Меня зовут Илья, я работаю программистом-инженером в компании "SID Logic", мы занимаемся разработкой электроники и сопутствующего ПО для различных применений, мои области интересов касаются систем навигации (оптические, инерциальные, ГНСС, UWB, GSM/LTE), систем управления (ПИД, MRAC, MPC) преимущественно для задач робототехники, беспилотников. Одну из важных тем в навигации занимает тема Фильтра Калмана.

На Хабре Фильтру Калману (ФК) посвящено уже много статей, но я пока не встречал объяснения (возможно плохо смотрел?:))принципиальной преимущества его использования перед например альфа-бета, различными комбинациями фильтров низкой частоты (ФНЧ), фильтров высокой частоты (ФВЧ), интеграторами, дифференциаторами и т.д... Однако даже если вы знали, то о чем я буду дальше говорить, возможно вам будет полезен код, которым я пользуюсь уже несколько лет, на основе которого было проверено множество гипотез, подтверждено их применение.

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

Для начала нужно рассмотреть такую формулировку задачи. Абстрактной задачи.

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

Или другой пример, более реальной задачи – у вас есть 2 фотографии, сделанные под разным углом (части панорамы), вы открываете фотошоп и пытаетесь сместить второе фото так, чтобы с виду обе фотографии не имели разрыва между собой, иначе говоря пытаетесь сшить панораму.

Сшивка панорамы
Сшивка панорамы

В обоих примерах вы можете регулировать переменные (крутилки и смещения фото) и смотреть как они влияют на результат, и вы можете оценить, как далеко вы от цели или близко (близка ли установленная температура к желаемой, сильно ли видно границу стыка двух фотографий). То есть у вас есть функция прямой зависимости (температура = f(крутилки) и визуальная сходимость стыка = f(смещение 2 фото)), но нет обратной зависимости.

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

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

Итак, Фильтр Калмана является частным упрощенным случаем большого семейства алгоритмов поиска оптимальных параметров и состояния системы на основе математической модели.

ФК помогает решать задачи:

  • преимущественно рассматриваемые в эволюции во времени;

  • с относительно малым количеством оптимизируемых параметров (относительно весов нейросетей например) до ~100;

  • имеющие глобальный минимум, то есть одно решение (с множеством локальных минимумов лучше справляется частичный фильтр Particle Filter например);

  • непрерывная природа величин параметров (не дискретная);

  • оптимизируемые параметры не должны иметь ограничений (например, масса не может быть отрицательной и для использования в ФК, должна быть специальная математическая модель).

Итак, основная мысль данной статьи, на которой я хотел бы акцентировать внимание:  

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

Или проще говоря, ФК подбирает такие параметры, чтобы на выходе получить тоже самое, что показывают датчики, при этом не противореча предыдущим состояниям.

Будем работать с более применительным к реальности видом ФК – то есть нелинейным, так как большинство систем имеют нелинейные взаимосвязи.

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

Все нелинейные виды ФК так или иначе используют линеаризацию. Распространены 2 вида линеаризации ФК:

  • Рассчитанные человеком матрицы Якоби записанные в аналитическом виде (Extented Kalman Filter EKF). Другими словами – это линеаризация по касательной.

  • Линеаризация методом пробных точек (Sigma Point Kalman Filter, Unscented Kalman Filter UKF). Другими словами – это линеаризация по секущей.

EKF и UKF линеаризации
EKF и UKF линеаризации

В инженерном контексте для нас можно выделить следующие особенности:

В первом случае из преимуществ – быстрая скорость работы. Из недостатков – ручная запись в аналитическом виде матрицы Якоби, меньшая стабильность и точность на сильных нелинейных взаимосвязях, функции эволюции и модели датчика должны быть дифференцируемы. 

Во втором случае из преимуществ – лучшая стабильность и точность на сильных нелинейных взаимосвязях, отсутствие необходимости записи матриц Якоби, нужна лишь запись в прямом виде эволюции и модели датчика.

Согласно целям статьи, понизить порог вхождения в тему, дать универсальный алгоритм для быстрого прототипирования и проверки гипотез в условиях слабой вычислительной базы и малого кол-ва памяти лучшим выбором будет являться второй вид ФК – UKF.

Помимо UKF, существуют следующие вариации сигма-точечного фильтра Калмана: CDKF (central difference Kalman filter – фильтр Калмана центральной разности), SRUKF (square-root unscented Kalman filter – ансцентный фильтр Калмана квадратного корня), SRCDKF (square-root central difference Kalman filter – фильтр Калмана квадратного корня центральной разности) и их итеративные модификации IUKF, ICDKF, ISRUKF, ISRCDKF, которые рассматриваются в работах [1, 2].

В инженерном контексте задачи оптимальным выбором я считаю т.н. Square Root Central Difference Kalman Filter (SRCDKF). Выбор сигма точек осуществляется согласно центральной разности (в отрицательное направление от линеаризуемой точки и в положительное направление) пропорционально матрице квадратного корня ковариации. При этом не используется разложение Холецкого для матрицы ковариации, которое может быть не стабильным в условиях с присутствием одновременно малых и больших значений в матрице.  

Я решил не загромождать статью лишними формулами, кому будет интересно может почитать литературу в списке.

Это универсальное ядро SRCDKF, которое можно использовать в разных приложениях, реализуя разные математические модели.

Исходный код ядра можно скачать:

Ядро SRCDKF

С Теорией пока всё. Теперь практика.

Пример, иллюстрирующий суть ФК

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

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

Нам для управления квадрокоптером нужно знать положение и ориентацию в пространстве в каждый момент времени.

Раз уж я сказал, что задача из реального мира, а реальный мир трехмерный, то мы будем рассматривать математическую модель описания вращения и положения в трехмерном пространстве. Для описания вращения в трехмерном пространстве воспользуемся кватернионом, можно сказать стандартом для таких случаев. А для описания положения – обычным 3-х мерным вектором.

Q=[q_w\ q_x\ q_y\ q_z]^T\\ \\ P=[p_x\ p_y\ p_z]^T

Кто работал с дешевыми MEMS IMU знает о необходимости калибровки для нивелирования масштабных искажений, межосевых взаимосвязей, а также смещений (biases).

Так выглядят данные с акселерометра, при вращении по всем осям. Центр эллипсоида смещен на некоторый вектор (bias). Сам эллипсоид масштабно искажен.
Так выглядят данные с акселерометра, при вращении по всем осям. Центр эллипсоида смещен на некоторый вектор (bias). Сам эллипсоид масштабно искажен.

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

A_{raw}=A_{true}+A_{bias}\\W_{raw}=W_{true}+W_{bias}

Где A_{raw} \ W_{raw}- 3-х мерный вектор данных непосредственно с сенсора (ускорения и угловой скорости соответственно), A_{true} \ W_{true} - истинный 3-х мерный вектор данных, A_{bias} \ W_{bias}- 3-х мерный вектор смещения (bias).

Модель IMU у нас есть.

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

Для более-менее достаточной для нашей точности математической модели нужно 3 параметра для описания смещения (bias) акселерометра (в СК IMU), 3 параметра для описания смещения (bias) датчика угловой скорости (в СК IMU), 3 параметра описания положения (3-х мерный вектор в глобальной СК), 4 параметра для описания кватерниона ориентации ( кватернион, выражающий вектор из СК коптера в глобальную СК), дополнительно включим 3-х мерный вектор скорости (в глобальной СК). Итого 16 параметров. Это называется вектор состояния системы, так как он описывает полное состояние (в контексте нашей задачи) нашего квадрокоптера в конкретный момент времени, то есть какое он имеет положение, ориентацию, скорость и т.д.

X=[A_{bias}^T \ W_{bias}^T \ P^T \ Q^T \ V^T]A_{bias}=[a_{bx} \ a_{by} \ a_{bz}]^T\\W_{bias}=[w_{bx} \ w_{by} \ w_{bz}]^T\\Q=[q_w\ q_x\ q_y\ q_z]^T\\ \\ P=[p_x\ p_y\ p_z]^T\\V=[v_x \ v_y \ v_z]^T

Эволюция системы описывается тем, как будет меняться вектор состояния во времени, то есть зависимость нынешнего момента времени от прошлого, еще этот этап называется прогнозом. (t) - текущий момент времени, (t-1) - прошлый момент времени.

P(t)=P(t-1)+V(t-1)dt

Здесь просто интегрируется по времени положение по скорости dt- шаг дискретизации.

A_{temp}=Q(t-1)*(A_{raw}-A_{bias}(t-1))\\V(t)=V(t-1)+A_{temp}dt+S_{v_{vel}}

A_{temp}- временный вектор ускорений, состоящий из A_{raw}- вектора непосредственно из акселерометра A_{bias}(t-1)- смещение акселерометра в прошлый прогноз, * - операция вращения вектора кватернионом, в данном случае выражает локальный вектора ускорения в глобальную СК. Q(t-1) - кватернион в прошлый прогноз.

S_{v_{vel}} - вектор стандартных отклонений шумов прогноза для линейной скорости.

W_{temp}=W_{raw}-W_{bias}(t-1)+S_{w_{rate}}dt\\Q(t)=Q(t-1)\otimes \textrm{exp}(W_{temp}dt)

W_{temp}- вектор угловой скорости, состоящий из W_{raw}- вектора данных непосредственно с ДУСа, W_{bias}(t-1)- рассчитанный на предыдущем шаге вектор смещения, S_{w_{bias}}- вектор стандартных отклонений шумов прогноза для угловой скорости.

\otimes- символ, обозначающий перемножение кватернионов, exp()- это функция перевода 3-х мерного вектора вращения, находящегося в касательной плоскости относительно сферы кватерниона в пространство кватерниона, подробнее распишу попозже.

A_{bias}(t) = A_{bias}(t-1)+S_{a_{bias}}dt\\W_{bias}(t) = W_{bias}(t-1)+S_{w_{bias}}dt

Смещения IMU не зависят от других переменных в векторе состояния, поэтому в нынешнем моменте времени они почти равны прошлым значениям. Почти, потому что все-таки они немного меняются со временем (температура может меняться), нужно чтобы ФК понимал, что это не константы и имел некоторую неопределенность в значении, для этого есть два параметра S_{a_{bias}} \ S_{g_{bias}} - которые являются векторами стандартных отклонений шумов прогноза для смещений IMU.

Код этапа прогноза
void TimeUpdate(float *in, float *noise, float *out, float *u, float dt, int n) {
        float tmp[3], acc[3];
        float rate[3];
        float mat3x3[3 * 3];
        float q[4];
        int i;
        float qRate[4], qRes[4];

        // assume out == in
        out = in;

        for (i = 0; i < n; i++) 
        {
                // create rot matrix from current quat
                q[0] = in[UKF_STATE_Q1*n + i];
                q[1] = in[UKF_STATE_Q2*n + i];
                q[2] = in[UKF_STATE_Q3*n + i];
                q[3] = in[UKF_STATE_Q4*n + i];
                quatToMatrix(mat3x3, q, 1);

                // pos
                out[UKF_STATE_POSX*n + i] = in[UKF_STATE_POSX*n + i] + in[UKF_STATE_VELX*n + i] * dt;
                out[UKF_STATE_POSY*n + i] = in[UKF_STATE_POSY*n + i] + in[UKF_STATE_VELY*n + i] * dt;
                out[UKF_STATE_POSZ*n + i] = in[UKF_STATE_POSZ*n + i] + in[UKF_STATE_VELZ*n + i] * dt;

                // acc
                tmp[0] = u[0] + in[UKF_STATE_ACC_BIAS_X*n + i];
                tmp[1] = u[1] + in[UKF_STATE_ACC_BIAS_Y*n + i];
                tmp[2] = u[2] + in[UKF_STATE_ACC_BIAS_Z*n + i];

                // rotate acc to world frame
                rotateVecByMatrix(acc, tmp, mat3x3);
                acc[1] -= GRAVITY;


                out[UKF_STATE_VELX*n + i] = in[UKF_STATE_VELX*n + i] + acc[0] * dt + noise[UKF_V_NOISE_VEL_X*n + i];
                out[UKF_STATE_VELY*n + i] = in[UKF_STATE_VELY*n + i] + acc[1] * dt + noise[UKF_V_NOISE_VEL_Y*n + i];
                out[UKF_STATE_VELZ*n + i] = in[UKF_STATE_VELZ*n + i] + acc[2] * dt + noise[UKF_V_NOISE_VEL_Z*n + i];


                // rate = rate + bias + noise
                rate[0] = (u[3] + in[UKF_STATE_GYO_BIAS_X*n + i] + noise[UKF_V_NOISE_RATE_X*n + i]) * dt;
                rate[1] = (u[4] + in[UKF_STATE_GYO_BIAS_Y*n + i] + noise[UKF_V_NOISE_RATE_Y*n + i]) * dt;
                rate[2] = (u[5] + in[UKF_STATE_GYO_BIAS_Z*n + i] + noise[UKF_V_NOISE_RATE_Z*n + i]) * dt;

                // rotate quat
                exp_mapQuat(rate, qRate);
                quatMultiply(qRes, q, qRate);

                out[UKF_STATE_Q1*n + i] = qRes[0];
                out[UKF_STATE_Q2*n + i] = qRes[1];
                out[UKF_STATE_Q3*n + i] = qRes[2];
                out[UKF_STATE_Q4*n + i] = qRes[3];

                // acc bias
                out[UKF_STATE_ACC_BIAS_X*n + i] = in[UKF_STATE_ACC_BIAS_X*n + i] + noise[UKF_V_NOISE_ACC_BIAS_X*n + i] * dt;
                out[UKF_STATE_ACC_BIAS_Y*n + i] = in[UKF_STATE_ACC_BIAS_Y*n + i] + noise[UKF_V_NOISE_ACC_BIAS_Y*n + i] * dt;
                out[UKF_STATE_ACC_BIAS_Z*n + i] = in[UKF_STATE_ACC_BIAS_Z*n + i] + noise[UKF_V_NOISE_ACC_BIAS_Z*n + i] * dt;

                // gbias
                out[UKF_STATE_GYO_BIAS_X*n + i] = in[UKF_STATE_GYO_BIAS_X*n + i] + noise[UKF_V_NOISE_GYO_BIAS_X*n + i] * dt;
                out[UKF_STATE_GYO_BIAS_Y*n + i] = in[UKF_STATE_GYO_BIAS_Y*n + i] + noise[UKF_V_NOISE_GYO_BIAS_Y*n + i] * dt;
                out[UKF_STATE_GYO_BIAS_Z*n + i] = in[UKF_STATE_GYO_BIAS_Z*n + i] + noise[UKF_V_NOISE_GYO_BIAS_Z*n + i] * dt;
        }
}

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

Также стоит отметить, что в отличие от других видов ФК модель шума (как процесса, так и датчика) может быть не аддитивной, и данный вид ФК сможет учесть и нелинейную природу шума. Это преимущество обеспечено способом линеаризации с помощью сигма-точек, которые пропускаются в том, числе и через модель шума.

По поводу \textrm{exp()}. Кватернион - это гиперпараметризированная модель вращения, так как имеет 4 параметра в пространстве вращения с 3 степенями свободы. Так как полноценно описать вращение 3 параметрами не получается (Gimbal lock), приходится прибегать к таким математическим конструкциям, как кватернионы. Для перехода из 4-х мерного пространства в 3-х мерное пространство и обратно есть специальные операции \textrm{exp()} \ \textrm{log()}. Это можно представить как сферу (кватернион) и касательную плоскость (3-х мерный вектор вращения).

Отсюда же проистекает проблема, которую я описывал выше (ФК не умеет работать с параметрами, у которых есть ограничения), у кватерниона должна быть единичная длина. В таком случае можно пойти на небольшую хитрость и после каждой итерации прогноза нормализовывать кватернион. Для нашей мат модели такой способ сгодится, однако для более нелинейных систем, придется использовать специальную арифметику и операции с кватернионами внутри ФК. Подробнее про касательные пространства и фильтрацию с кватернионами в [3, 4].

В нашем случае есть только 2 датчика IMU и GNSS. IMU - используется непосредственно в модели прогноза как априорные значения и не моделируются.

GNSS моделируется так:

P_{gnss}=Q*P_{loc}+P+S_{p}

Q - кватернион из вектора состояния, P_{loc}- вектор из IMU в GNSS в СК IMU, P- вектор позиции из вектора состояния, S_p- вектор стандартного отклонения шума GNSS.

Чем выше S_p тем меньше доверие GNSS, данную величину можно варьировать в зависимости от качества данных с датчика.

Код, модели GNSS
void navUkfPosUpdate(float *u, float *x, float *noise, float *y) {       
        float vglov[3]; 

        rotateVectorByQuat(vglov, &u[0], &x[UKF_STATE_Q1]);
        
        y[0] = x[UKF_STATE_POSX] + vglov[0] + noise[0]; // return position
        y[1] = x[UKF_STATE_POSY] + vglov[1] + noise[1];
        y[2] = x[UKF_STATE_POSZ] + vglov[2] + noise[2];
}

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

Кроме настоящих реальных датчиков, можно моделировать псевдодатчики. Например при старте, когда коптер еще не взлетел и мы точно уверены, что он не движется, можно использовать псевдоизмерения угловой и линейной скоростей, которые равны нулю. Тем самым сообщая ФК, что сейчас движения нет и эта информация в свою очередь поможет в уточнении вектора состояния.

Итак, для демонстрации данного ФК был написана демка на Unity.

Кратко расскажу подробности симулятора:

Сам ФК в Unity используется как динамическая библиотека, для WebGL - сырые исходники. Коптер не управляется по физическим законам, используются просто силы и моменты для имитации полета коптера в скрипте Control.cs. Для имитации IMU и GNSS созданы 2 скрипта IMUModel.cs и GNSSModel.cs. Обертка и взаимодействие с Unity ФК реализована в KalmanFilter.cs. Для графиков использовался открытый Asset.

Для физики используется внутренний движок PhysX. Для демонстрации 60 Гц - достаточно.

Вот видео демки и графики вектора состояния.

Вектор смещений ДУСа
Вектор смещений ДУСа
Вектор смещений акселерометра
Вектор смещений акселерометра
График углов Эйлера
График углов Эйлера
Вектор положения
Вектор положения
Вектор скоростей
Вектор скоростей

Пояснение по графикам: Estimate - это оценка ФК, Reference - это фактическая величина, Uncertainty - дисперсия из матрицы ковариации *100.

В центре графиком видно, что ошибка возросла, это произошло из-за уменьшения влияния GNSS данных (на видео видно, где я увеличил дисперсию GNSS corr).

Демку, что на видео можно скачать из репа:

Исходный код демки

А также можно поиграть интерактивно.

Можно заметить, что не использовался магнитометр для коррекции курса. Если применять обычный фильтр Magwick или Mahony тангаж и крен более менее наблюдаемы, когда нет линейных ускорений, то угол курса будет плыть и взять его неоткуда. А если постоянно присутствуют линейные, центростремительные ускорения, то все углы уплывут при коррекции акселерометром, это актуально для самолетов например.

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

В этом и заключается преимущество ФК - нахождении неявных полезных обратных зависимостей между вектором состояния и датчиками.

Вот график и видео иллюстрирующие коррекцию курсового угла, даже при начальном неправильном значении в 45 градусов.

Угол курса с начальной ошибкой в 45 градусов
Угол курса с начальной ошибкой в 45 градусов

В интерактивной демке, много чего нет, с чем можно поиграть непосредственно в Unity Edior, а именно: различные значения bias IMU, их изменения во времени, различные величины стандартных отклонений шумов прогноза и датчика GNSS, задержки между датчиками, неверные начальные условия и т.д. Так что советую скачать исходник и непосредственно в Unity Editor поиграть с различными условиями.

Самое полезное, это то, что тот же самый C++ код, который работает в демке (kalman lib), можно целиком без переделок запустить на микроконтроллере, на реальном железе в реальных условиях.

Вот например коптер, который я собрал, который летает почти с таким же ФК:

Суть ФК можно расширить на оптимизацию не только текущего вектора состояния в конкретный момент времени, но и оптимизацию, например, целого набора состояний, включенных в разные моменты времени (Sliding-Window Optimization, bundle adjustment/graph optimization). Такой подход требует гораздо большей вычислительной мощности и реализуется другими методами, однако гораздо более точен и стабилен.

За рамками статьи остались такие темы, как:

  • моделирование других различных датчиков, например видеокамеры, лидаров, колесных одометров;

  • учет задержки в ФК между получением данных с различных датчиков;

  • применение параметров с ограничениями (вектора единичной длины, кватернионы) в ФК с высоко нелинейными моделями;

  • Регистрация некачественных данных с датчика на основе мат. модели;

  • Алгоритмы нелинейной оптимизации во временном окне (Sliding-Window Optimization)

Если вам будет интересно можно продолжить цикл статей по практическому применению ФК.

Список литературы:

  1. Van Der Merwe, R. Sigma-point Kalman filters for probabilistic inference in dynamic state-space models

  2. Chaabane, M. Nonlinear State and Parameter Estimation Using Iterated Sigma Point Kalman Filter: Comparative Studies

  3. Christoph Hertzberga, Integrating Generic Sensor Fusion Algorithms with Sound State Representations through Encapsulation of Manifolds

  4. Joan Sol`, Quaternion kinematics for the error-state Kalman filter

Adblock test (Why?)