GithubHelp home page GithubHelp logo

satellite-collision-avoidance's Introduction

Satellite Collision Avoidance

Motivation

Since 2004 the number of space launches has been gradually increasing. Currently, there are more than 100 satellites launched into space every year. This number could grow rapidly due to such projects as the constellation providing worldwide internet access internet by OneWeb. The increasing amount of objects in space leads to a higher probability of their collision.

Most conjunction events are currently processed manually. In this project, we employ state-of-the-art reinforcement learning methods to create a system for automatic maneuver optimization in order to avoid collisions.

Space debris reconstrucion from Stuffin Space project

Flow overview

1 and 2: Space objects are monitored by ROSCOSMOS
3: ROSCOSMOS computes conjunction events
4: Space Navigator gets data from ROSCOSMOS
5: Environment is solved with RL
6: Space Navigator returns optimal collision avoidance maneuver

Installation

Step 1

To set up the project first copy the repo to your local machine:

git clone https://github.com/yandexdataschool/satellite-collision-avoidance.git

Step 2

After cloning the repo, install requirements:

 pip install -r requirements.txt

We use Python 3.6.5 and following libraries:

  • Pykep
  • Pandas
  • Matplotlib
  • Numpy
  • Scipy
  • Torch
  • tqdm

If you have problems with Pykep installation, you could use this link.

Step 3

Install the package:

python setup.py install

or use for development:

python setup.py develop

Run Examples

Now you can run examples of space simulator.

Example 1: test fight

Run following code:

python examples/test_flight.py -p true

If evereything is correct, you should get such plot:

And output:

Start time: 6000.0   End time: 6000.01   Simulation step:1e-06

...
Space objects description
...

Simulation ended in 0.0050948 sec.

Maneuvers table:
no maneuvers.

Collisions (distance <= 2000 meters):
    no collisions without maneuvers.

Parameters table:
...

Example 2: maneuvers for random generated collision situation

Run following code to generate collision situation environment with 5 dangerous debris objects in the time interval from 6601 to 6601.1 (mjd2000) and save it to data/environments/generated_collision_5_debr.env:

python generation/generate_collision.py \
-save_path data/environments/generated_collision_5_debr.env \
-n_d 5 -start 6601 -end 6601.1 -before 0.1

Then, to calculate the maneuvers using the Cross Entropy method and save them to training/agents_tables/CE/action_table_CE_for_generated_collision_5_debr.csv, run:

python training/CE/CE_train_for_collision.py \
-env data/environments/generated_collision_5_debr.env -print true \
-save_path training/agents_tables/CE/action_table_CE_for_generated_collision_5_debr.csv \
-r false -n_m 1

Finally, to run the simulator for generated environment and obtained maneuvers:

python  examples/collision.py -env data/environments/generated_collision_5_debr.env \
-model training/agents_tables/CE/action_table_CE_for_generated_collision_5_debr.csv

Running the tests

Currently there are only tests for api module. Run it with command:

python tests/test_api.py

Documentation and tutorials

Tutorial on environment setup and simulator:

Tutorial on learning an agent:

RL Methods description

  1. Baseline
  2. Collinear Grid Search
  3. Cross-Entropy method

Analysis and Experiments

Useful links

satellite-collision-avoidance's People

Contributors

bamasa avatar dsdubov avatar kazeevn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

satellite-collision-avoidance's Issues

Baseline

@IrinaPonomareva

Правильно ли, что за baseline мы примимаем следующий набор маневров

  1. оптимальный маневр компланарный скорости в момент за 0.5, 1.5, ... витка до столкновения с ближайшим debris (оптимальный по reward. просматриваем по сетке все возможные маневры с учетом ограничений топлива)

  2. обратный маневр через 1, 2, ... витков после первого

Global code review

Что стоит улучшить в архитектуре проекта, чтобы минимизировать вероятности багов, его было удобно развивать и его было не стыдно показывать людям?

Profiling and accelerating learning

Пробежался профайлером (результаты в profiling_results.ipynb). Вот какие идеи появились (+некоторые мелкие вещи исправил):

  • "cdf" will go away with replacement "normal" approach by "Hutor" one. So we reduce time approximately by half.
  • we could gain some time by optional exceptions using in api, like this:
    if using_excetions == True:
        test_sth
    
    end disable testing during ML.

Useful links

Code style

Давайте выберем и будем следовать какому-нибудь конкретному code style? @bamasa @Dsdubov что думаете?

Formulate simulation stop conditions

Необходимо решить, когда останавливать симуляцию. Далее, моё IMHO.

В первом приближении. Чтобы задача походила на реальную, надо начинать симуляцию за ~1-7 дней до опасного сближения, останавливать после ещё недели. Так как дальше не получается IRL прогнозировать траектории с требуемой точностью.

Оптимизация алгоритма поиска ближайших объектов

Есть следующее предложение.
Сейчас мы считаем reward и check_collision вычисляя Евклидово расстояние до всех объектов и беря минимальные. Используется следующая функция:

def euclidean_distance(xyz_main, xyz_other, rev_sort=True):
    """ Return array of (reverse sorted) Euclidean distances between main object and other
    Args:
        xyz_main: np.array shape (1, 3) - coordinates of main object
        xyz_other: np.array shape (n_objects, 3) - coordinates of other object
    Returns:
        np.array shape (n_objects)
    """
    # distances array
    distances = np.sum(
        (xyz_main - xyz_other) ** 2,
        axis=1) ** 0.5
    if rev_sort:
        distances = np.sort(distances)[::-1]
    return distances

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

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

Make reward speed-independent

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

  1. Если делать, как в #2 - то reward надо будет интегрировать по времени.
  2. Если по тикам, то надо интегрировать по тикам

Скользящий максимум и останов

Залил скользящий максимум - сейчас он работает как словарь:
{debris: "максимальная вероятность столкновения за всю сессию")
можно считать максимальную вероятность столкновения с каждого сближения и потом складывать.
@kazeevn , как ты думаешь, нужно ли? кажется, что да.
следующее предложение - если мы останавливаем сессию (сейчас она останавливается при сближении спутника с любым debris меньше чем на пороговое расстояние), то давайте её останавливать при превышении некоторой пороговой вероятности столкновения.

Ускорение симуляции

Можно сделать так #18

есть предложение создать fast_propagate_forward и fast_simulator, в которых

  • не будет визуализации и графиков
  • шаг будет делать до ближайшего максимального сближения или маневра

тогда в симуляции будет 5-10 степов

если вероятность будет считаться некорректно, то можно делать сколько-то степов в окрестности максимального сближения

Задание на практику [Леонид]

У магистрантов он же тоже есть? Для бакалавриата:

До 16 февраля необходимо сделать Project Proposal.

"Правила подготовки и представления письменной сдачи Project Proposal описаны в Правилах подготовки и защиты проекта ВКР на английском языке (Project Proposal) для студентов 4 курса ПМИ ФКН , размещенных на сайте программы: https://www.hse.ru/ba/ami/krvkr"

"До 16 февраля каждый студент сдает (1) письменный Проект ВКР в бумажном виде, (2) отчет о проверке Проекта на плагиат из LMS; отсылает (3) Проект в электронном формате на электронный адрес одного из преподавателей факультатива Академическое письмо (отсылается финальная версия, загруженная в LMS)."

Space literature review

  1. Какие используются методы для расчёта уклонений?
  2. Как методы уклонения оцениваются?
  3. Как мы можем их превзойти? Множественные сближения? Целевая задача?
  4. Где можно будет опубликовать нашу работу? Каким требованиям надо будет удволетворить?

Единицы измерения

Прописать в коде в комментариях или docstrings единицы измерения - с ними была путаница.

Target and Reward

Предлагаю рассчитывать reward только в конце сессии.

Это позволит удобно учитывать выполнение целевой задачи (сравнивать итогувую орбиту с нужной/начальной). По сути, расчитывать reward в любой точке нужно было для "недоигрывания" сессий с плохоми стратегиями, у которых reward в самом начале уже ниже чем нужно (что позволило бы ускорить обучение). Но т.к. мы не можем знать в процессе сессии насколько будет удобно возвращаться на орбиту (в особенности когда несколько объектов мусора), то недоигрывать сессии до конца и так неправильно.

Baselines

@IrinaPonomareva ,

Из телеграмма:

@IPonomareva , привет, у меня тоже есть вопрос.
У нас есть несколько простых рабочих подходов RL, они предлагают какие-то маневры. С чем их сравнивать?
Выше мы уже это обсуждали как-то, но все равно не совсем понятно. Например, для collision ты сможешь какой-то оптимальный маневр переложить? И что считать baseline для всего проекта- набор опасных ситуаций, для которых сравниваются результаты, полученные при использовании маневров a) посчитанных вручную и b) предложенных RL?

Irina Ponomareva, [29.03.18 22:22]
Леонид, это опять больной вопрос. Я могу предложить буквально пару стандартных у нас подходов, и они не претендуют на оптимальность, мы про них уже говорили немного. Они не оптимальные, они просто простые и привычные. Поэтому говорить, что я могу на любую collision выдать "посчитанный вручную" маневр очень самонадеянно.

Irina Ponomareva, [29.03.18 22:24]
У нас недавно напечатали статью про прошлогоднее уклонение Канопуса, завтра посмотрю. Спрошу, могут ли дать тестовые данные для расчета. Но там проблема в том, что была пара маневров, как обсуждалось выше, - один поднял орбиту, другой через небольшое время опустил, чтобы сохранить устойчивость параметров орбиты (у ДЗЗ жесткие требования к этому).

Irina Ponomareva, [29.03.18 22:22]
Леонид, это опять больной вопрос. Я могу предложить буквально пару стандартных у нас подходов, и они не претендуют на оптимальность, мы про них уже говорили немного. Они не оптимальные, они просто простые и привычные. Поэтому говорить, что я могу на любую collision выдать "посчитанный вручную" маневр очень самонадеянно.

Irina Ponomareva, [29.03.18 22:24]
У нас недавно напечатали статью про прошлогоднее уклонение Канопуса, завтра посмотрю. Спрошу, могут ли дать тестовые данные для расчета. Но там проблема в том, что была пара маневров, как обсуждалось выше, - один поднял орбиту, другой через небольшое время опустил, чтобы сохранить устойчивость параметров орбиты (у ДЗЗ жесткие требования к этому).

Генератор

От Ирины:

Safe_radius в принципе считается как сумма радиусов двух сближающихся объектов. Т.к. столкновение состоится, если расстояние между центрами объектов меньше этого суммарного радиуса.
Эксцентриситет можно выбирать от 0 включительно (в random)

Conjunction event generator

If we are to train an RL agent, we'll need to play many different "games", aka conjunction events. Thus an automated way to generate them is needed.

Project proposal [Митя]

До 16 февраля необходимо сделать Project Proposal.

"Правила подготовки и представления письменной сдачи Project Proposal описаны в Правилах подготовки и защиты проекта ВКР на английском языке (Project Proposal) для студентов 4 курса ПМИ ФКН , размещенных на сайте программы: https://www.hse.ru/ba/ami/krvkr"

"До 16 февраля каждый студент сдает (1) письменный Проект ВКР в бумажном виде, (2) отчет о проверке Проекта на плагиат из LMS; отсылает (3) Проект в электронном формате на электронный адрес одного из преподавателей факультатива Академическое письмо (отсылается финальная версия, загруженная в LMS)."

Reward-distance dependence and collision risk

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

P. S.
Моя физическая интуиция говорит, что с формулой для reward'а 1/x есть проблема: стремление к бесконечности при x->0 некорректно. Координаты КА известны с погрешностью, превышающей их размер, то что траектории строго пересекается не гарантирует столкновение.

Как вести себя Космическому Навигатору, если об опасной ситуации известно за неделю?

Текущая (26.06.18) версия ищет лучшие манёвр на ~3 витках ~40 секунд на одном ядре. Если об опасной ситуации будет известно за неделю, то просто запустить текущий код будет очень долго. Что мы можем предложить пользователю в этом ситуации?

Учёт нескольких опасных сближений за сессию

Как правильно участь несколько опасных сближений за сессию? Пока сделано так:

  1. Сближения с разными объектами мусора всегда независимы.
  2. Для сближений с одним объектом мусора вводится пороговое расстояние. До тех пор, пока расстояние между КА и объектом мусора меньше, чем пороговое расстояние, считается, что идёт одно сближение. Когда оно становится больше, считается, что сближение закончилось. Если они снова сблизятся, считается, что началось новое независимое сближение.
  3. В модели выше, каким стоит взять это пороговое расстояние?

Switch action to (ΔV, time_to_next_action)

Мы сильно ускорим обучение, если действия будут, кроме ΔV, содержать время, через которое надо снова обратиться к алгоритму за указаниями. Иначе ему придётся долго учить много "пропусков хода". Так говорил Саша Панин.

RL literature review

  1. Какие есть похожие задачи?
  2. Какие в них используются методы?
  3. Где можно будет опубликовать нашу работу? Каким требованиям надо будет удволетворить?

Штраф за отклонение от орбиты

@IrinaPonomareva

сейчас мы штрафуем следующим образом

  • берем разницу между параметрами орбиты в начале и в конце сессии (Кеплер)

  • умножаем на коэффициенты значимости (significance)

  • складываем все что получилось и получаем штраф (deviation)

def update_trajectory_deviation(self, significance=(0.01, 1, 1, 1, 1, 0)):
    """Update trajectory deviation from init the trajectory.

    Note:
        six osculating keplerian elements (a,e,i,W,w,M):
            a (semi-major axis): meters,
            e (eccentricity): greater than 0,
            i (inclination), W (Longitude of the ascending node): radians,
            w (Argument of periapsis), M (mean anomaly): radians.

    Args:
        significance (tuple): multipliers for orbital parameter differences.
    """
    diff = np.abs(
        np.array(self.protected.osculating_elements(self.state["epoch"])) - np.array(self.init_orbital_elements))
    deviation = np.sum(diff * np.array(significance))

        self.trajectory_deviation = deviation

Вопросы:

  • хороший ли это подход

  • какие коэфициенты значимости примерно брать

Installation error

error: Could not find suitable distribution for Requirement.parse('pykep==2.1')

расшифровка .env (параметры среды)

На примере:

6599.95, 6600.05 # время начала и конца симуляции в формате mjd2000
osc # тип параметров - в этом примере формат osc, с другими можно в первом приближении не разбираться

# параметры защищаемого объекта - того который будет маневрировать и для котого мы считаем вероятности и пр
PROTECTED # название
6600 # время t=6600 в которое мы задаем параметры
7800000, 0.001, 0.017453292519943295, 0, 0, 0 # параметры орбиты (ссылка ниже), которые мы задаем во время t=6600
398600800000000, 0.1, 100, 100 # гравитационный параметр земли, гравитационный параметр объекта, радиус объекта, безопасный радиус объекта (в первом приближении радиус =  безопасный радиус)
10 # кол-во топлива защищаемого объекта

# параметры объекта мусора (объектов мусора может быть много)
# параметры такие же как у защищаемого объекта
DEBRIS
6600
7800000, 0.001, 1.5707963267948966, 0, 0, 0
398600800000000, 0.1, 0.1, 0.1
0

Ссылки:

параметры орбиты

Open source

Открытие кода согласовано с остальными участниками "Космического Навигатора".

  1. Предлагаю открыть код, когда будет, что открывать; milestone "Первый полёт": https://github.com/yandexdataschool/satellite-collision-avoidance/milestone/1
  2. Лицензия. Предлагаю BSD - чтобы сделать максимально широким возможный круг участников проекта.

Вывод результатов

Добавить в вывод симулятора (пожелание Дениса):

  1. Таблицу маневров
  2. Сравнение результатов с маневрами/без

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.