exponenta event banner

Отслеживание космического мусора с использованием модели движения Keplerian

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

Сценарий космического мусора

На низкой околоземной орбите (НОО) насчитывается более 30 000 крупных объектов мусора (диаметром более 10 см) и более 1 миллиона более мелких объектов мусора [1]. Этот мусор может быть опасен для деятельности человека в космосе, повредить эксплуатационные спутники, а также заставить время чувствительные и дорогостоящие маневры избегания. По мере роста космической деятельности решающее значение приобретает сокращение космического мусора и контроль за ним.

Вы можете использовать Sensor Fusion and Tracking Toolbox™ для моделирования траекторий обломков, создания синтетических радиолокационных обнаружений этого мусора и получения оценок положения и скорости каждого объекта.

Сначала создайте сценарий отслеживания и задайте случайное начальное значение для воспроизводимых результатов.

s = rng;
rng(2020);
scene = trackingScenario('IsEarthCentered',true,'InitialAdvance','UpdateInterval');

Используется опорная рамка Earth-Centered-Earth-Fixed (ECEF). Начало этого кадра находится в центре Земли, а ось Z указывает на северный полюс. Ось X указывает на пересечение экватора и Гринвичского меридиана. Ось Y завершает правую систему. Положения и скорости платформы определяются с использованием декартовых координат в этом кадре.

Определение модели движения мусора

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

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

Вектор ускорения объекта мусора ECEF:

a→=-μr3 r→-2Ω→×ddtr→-Ω→× (Ω→×r→),

где λ - стандартный гравитационный параметр Земли, r→ - вектор положения объекта обломков ECEF, r - норма вектора положения, а Ω→is вектор вращения Земли.

Функция keplerorbit приведенное ниже использует численное интегрирование Рунге-Кутты 4-го порядка этого уравнения для распространения положения и скорости во времени.

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

% Generate a population of debris
numDebris = 100;

range = 7e6 + 1e5*randn(numDebris,1);
ecc = 0.015 + 0.005*randn(numDebris,1);
inc = 80 + 10*rand(numDebris,1);
lan = 360*rand(numDebris,1);
w = 360*rand(numDebris,1);
nu = 360*rand(numDebris,1);

% Convert to initial position and velocity
for i = 1:numDebris
    [r,v] = oe2rv(range(i),ecc(i),inc(i),lan(i),w(i),nu(i));
    data(i).InitialPosition = r; %#ok<SAGROW>
    data(i).InitialVelocity = v; %#ok<SAGROW>
end

% Create platforms and assign them trajectories using the keplerorbit motion model
for i=1:numDebris
    debris(i) = platform(scene); %#ok<SAGROW> 
    debris(i).Trajectory = helperMotionTrajectory(@keplerorbit,...
        'SampleRate',0.1,... % integration step 10sec
        'Position',data(i).InitialPosition,...
        'Velocity',data(i).InitialVelocity); %#ok<SAGROW> 
end

Типовые РЛС космического наблюдения

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

% Create a space surveillance station in the Pacific ocean
station1 = platform(scene,'Position',[10 180 0]);

% Create a second surveillance station in the Atlantic ocean
station2 = platform(scene,'Position',[0 -20 0]);

% Near the North Pole, create a third surveillance station in Iceland
station3 = platform(scene,'Position',[65 -20 0]);

% Create a fourth surveillance station near the south pole
station4 = platform(scene,'Position',[-90 0 0]);

Каждая станция оснащена радаром, смоделированным fusionRadarSensor объект. Для обнаружения объектов мусора в диапазоне НОО РЛС предъявляет следующие требования:

  • Обнаружение объекта 10 дБсм на расстоянии до 2000 км

  • Разрешение объектов по горизонтали и вертикали с точностью 100 м при дальности 2000 км

  • Наличие веерообразного поля зрения 120 градусов по азимуту и 30 градусов по возвышению

  • Поиск в пространстве на основе его географического расположения

% Create fan-shaped monostatic radars to monitor space debris objects
radar1 = fusionRadarSensor(1,...
    'UpdateRate',0.1,... 10 sec
    'ScanMode','No scanning',...
    'MountingAngles',[0 90 0],... look up
    'FieldOfView',[120;30],... degrees
    'RangeLimits', [0 2e6], ... m
    'ReferenceRange',2e6,... m
    'ReferenceRCS', 10,... dBsm
    'HasFalseAlarms',false,...
    'HasElevation',true,...
    'AzimuthResolution',0.01,... degrees
    'ElevationResolution',0.01,... degrees
    'RangeResolution',100,... m
    'HasINS',true,...
    'DetectionCoordinates','Scenario');
station1.Sensors = radar1;

radar2 = clone(radar1);
radar2.SensorIndex = 2;
station2.Sensors = radar2;

radar3 = clone(radar1);
radar3.SensorIndex = 3;
station3.Sensors = radar3;

radar4 = clone(radar1);
radar4.SensorIndex = 4;
station4.Sensors = radar4;

Визуализация истины на виртуальном глобусе

В этом примере: helperScenarioGlobeViewer предоставляет виртуальный глобус, используемый для визуализации всех элементов, определенных в сценарии слежения: отдельных объектов мусора и их траекторий, радарных вентиляторов, радиолокационных детекторов и трасс.

globeDisplay = helperScenarioGlobeViewer;

% Show radar beams on the globe
covcon = coverageConfig(scene);
plotCoverage(globeDisplay,covcon);

% Set TargetHistoryLength to visualize the full trajectory of the debris objects
globeDisplay.TargetHistoryLength = 50;

scene.StopTime = 3600;
scene.UpdateRate = 0.1;

while advance(scene)
    time = scene.SimulationTime;
    updateDisplay(globeDisplay,time,debris);
end
snap(globeDisplay);

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

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

Имитация синтетических обнаружений и отслеживание космического мусора

Модели датчиков используют почву для создания синтетических обнаружений. Позвоните в detect способ на сценарии отслеживания для получения всех обнаружений в сцене.

Многообъектный трекер trackerJPDA используется для создания новых дорожек, связывания обнаружений с существующими дорожками, оценки их состояния и удаления расходящихся дорожек. Настройка свойства HasDetectableTrackIDsInput Значение true позволяет трекеру принимать входные данные, которые указывают, является ли отслеживаемый объект обнаруживаемым в области наблюдения. Это важно для того, чтобы не наказывать трассы, распространяемые за пределами зон радиолокационного наблюдения. Функция утилиты isDetectable вычисляет, какие дорожки можно обнаружить на каждом этапе моделирования.

Кроме того, функция утилиты deleteBadTracks используется для более быстрого удаления расходящихся дорожек.

% Define Tracker
tracker = trackerJPDA('FilterInitializationFcn',@initKeplerUKF,...
    'HasDetectableTrackIDsInput',true,...
    'ClutterDensity',1e-20,...
    'AssignmentThreshold',1e3,...
    'DeletionThreshold',[7 10]);

% Reset scenario, seed, and globe display
restart(scene);
scene.StopTime = 1800; % 30 min
clear(globeDisplay);
globeDisplay.TargetHistoryLength = 2;
% Scale up size of covariance ellipses for better visibility
globeDisplay.DetectionCovarianceSize = 10;
globeDisplay.TrackCovarianceSize = 10;
plotCoverage(globeDisplay,covcon);

% Initialize tracks
confTracks = objectTrack.empty(0,1);
while advance(scene)
    time = scene.SimulationTime;
    
    % Generate detections
    detections = detect(scene);
    
    % Generate and update tracks
    detectableInput = isDetectable(tracker,time, covcon);
    if ~isempty(detections) || isLocked(tracker)
        [confTracks, ~, allTracks,info] = tracker(detections,time,detectableInput);
        confTracks = deleteBadTracks(tracker,confTracks);
    end

    % Update globe display
    updateDisplay(globeDisplay,time,debris,detections,[],confTracks);
    
    % Move camera during simulation and take snapshots
    switch time
        case 100
            setCamera(globeDisplay,[90 150 5e6],[0 -65 345]);
            im1 = snap(globeDisplay);
        case 270
            setCamera(globeDisplay,[60 -120 2.6e6],[20 -45 20]);
        case 380
            setCamera(globeDisplay,[60 -120 2.6e6],[20 -45 20]);
            im2 = snap(globeDisplay);
        case 400
            % reset
            setCamera(globeDisplay,[17.3 -67.2 2.400e7], [360 -90 0]);
        case 1500
            setCamera(globeDisplay,[54 2.3 6.09e6], [0 -73 348]);
        case 1560
            im3 = snap(globeDisplay);
    end
        
end

% Restore random seed
rng(s);
imshow(im1);

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

imshow(im2);

Через несколько минут, как видно на снимке выше, T1 был удален, потому что неопределенность дорожки выросла слишком велика без обнаружений. С другой стороны, второй трек T2 выжил благодаря дополнительным обнаружениям.

imshow(im3)

На приведенном выше снимке экрана можно увидеть, что дорожка T15 (желтым цветом) вот-вот войдет в зону наблюдения радара. Дорожка T11 (зеленым цветом) была только что обновлена с обнаружением, что уменьшило неопределенность её оценочного положения и скорости. При конфигурации радиолокационной станции после 30 минут наблюдения были инициализированы и подтверждены 18 пути из 100 объектов мусора. Если увеличить время моделирования, радары будут накрывать 360 градусов в пространстве и в конечном итоге можно будет отслеживать больше мусора. Для увеличения числа отслеживаемых объектов можно было бы изучить различные местоположения и конфигурации радиолокационных станций.

Резюме

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

Вспомогательные функции

Модель движения, используемая в этом примере, представлена ниже. Состояние - это положения и скорости ECEF объекта [x; vx; y; vy; z; vz].

function state = keplerorbit(state,dt)
% keplerorbit performs numerical integration to predict the state of
% keplerian bodies. The state is [x;vx;y;vy;z;vz]

% Runge-Kutta 4 integration method:
k1 = kepler(state);
k2 = kepler(state + dt*k1/2);
k3 = kepler(state + dt*k2/2);
k4 = kepler(state + dt*k3);

state = state + dt*(k1+2*k2+2*k3+k4)/6;

    function dstate=kepler(state)
        x =state(1,:);
        vx = state(2,:);
        y=state(3,:);
        vy = state(4,:);
        z=state(5,:);
        vz = state(6,:);

        mu = 398600.4405*1e9; % m^3 s^-2
        omega = 7.292115e-5; % rad/s
        
        r = norm([x y z]);
        g = mu/r^2;
        
        % Coordinates are in a non-intertial frame, account for Coriolis
        % and centripetal acceleration
        ax = -g*x/r + 2*omega*vy + omega^2*x;
        ay = -g*y/r - 2*omega*vx + omega^2*y;
        az = -g*z/r;
        dstate = [vx;ax;vy;ay;vz;az];
    end
end

initKeplerUKF инициализирует фильтр отслеживания с помощью собственной модели движения. В этом примере мы используем ту же модель движения, которая устанавливает истинность земли, keplerorbit.

function filter = initKeplerUKF(detection)

% assumes radar returns [x y z]
measmodel= @(x,varargin) x([1 3 5],:);
detNoise = detection.MeasurementNoise;
sigpos = 0.4;% m
sigvel = 0.4;% m/s^2
meas = detection.Measurement;
initState = [meas(1); 0; meas(2); 0; meas(3);0];
filter = trackingUKF(@keplerorbit,measmodel,initState,...
    'StateCovariance', diag(repmat([10, 10000].^2,1,3)),...
    'ProcessNoise',diag(repmat([sigpos, sigvel].^2,1,3)),...
    'MeasurementNoise',detNoise);

end

oe2rv преобразует набор из 6 традиционных орбитальных элементов в векторы положения и скорости.

function [r,v] = oe2rv(a,e,i,lan,w,nu)
% Reference: Bate, Mueller & White, Fundamentals of Astrodynamics Sec 2.5

mu = 398600.4405*1e9; % m^3 s^-2

% Express r and v in perifocal system
cnu = cosd(nu);
snu = sind(nu);
p = a*(1 - e^2);
r = p/(1 + e*cnu);
r_peri = [r*cnu ; r*snu ; 0];
v_peri = sqrt(mu/p)*[-snu ; e + cnu ; 0];

% Tranform into Geocentric Equatorial frame
clan = cosd(lan);
slan = sind(lan);
cw = cosd(w);
sw = sind(w);
ci = cosd(i);
si = sind(i);
R = [ clan*cw-slan*sw*ci  ,  -clan*sw-slan*cw*ci   ,    slan*si; ...
    slan*cw+clan*sw*ci  ,   -slan*sw+clan*cw*ci  ,   -clan*si; ...
    sw*si                  ,   cw*si                   ,   ci];
r = R*r_peri;
v = R*v_peri;
end

isDetectable используется в примере для определения, какие дорожки можно обнаружить в данный момент времени.

function detectInput = isDetectable(tracker,time,covcon)

if ~isLocked(tracker)
    detectInput = zeros(0,1,'uint32');
    return
end
tracks = tracker.predictTracksToTime('all',time);
if isempty(tracks)
    detectInput = zeros(0,1,'uint32');
else
    alltrackid = [tracks.TrackID];
    isDetectable = zeros(numel(tracks),numel(covcon),'logical');
    for i = 1:numel(tracks)
        track = tracks(i);
        pos_scene = track.State([1 3 5]);
        for j=1:numel(covcon)
            config = covcon(j);
            % rotate position to sensor frame:
            d_scene = pos_scene(:) - config.Position(:);
            scene2sens = rotmat(config.Orientation,'frame');
            d_sens = scene2sens*d_scene(:);
            [az,el] = cart2sph(d_sens(1),d_sens(2),d_sens(3));
            if abs(rad2deg(az)) <= config.FieldOfView(1)/2 && abs(rad2deg(el)) < config.FieldOfView(2)/2
                isDetectable(i,j) = true;
            else
                isDetectable(i,j) = false;
            end
        end
    end
    
    detectInput = alltrackid(any(isDetectable,2))';
end
end

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

function tracks = deleteBadTracks(tracker,tracks)
% remove divergent tracks:
%   - tracks with covariance > 4*1e8 (20 km standard deviation)
%   - tracks with estimated position outside of LEO bounds
n = numel(tracks);
toDelete = zeros(1,n,'logical');
for i=1:numel(tracks)
    [pos, cov] = getTrackPositions(tracks(i),[ 1 0 0 0 0 0 ; 0 0 1 0 0 0; 0 0 0 0 1 0]);
    if norm(pos) < 6500*1e3 || norm(pos) > 8500*1e3 || max(cov,[],'all') > 4*1e8
        deleteTrack(tracker,tracks(i).TrackID);
        toDelete(i) =true;
    end
end
tracks(toDelete) = [];
end

Ссылки

[1] https://www.esa.int/Safety_Security/Space_Debris/Space_debris_by_the_numbers