imuSensor

Имитационная модель IMU

Описание

imuSensor Система object™ модели, получающие данные из инерционного модуля измерения (IMU).

Смоделировать IMU:

  1. Создайте imuSensor объект и набор его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Описание

пример

IMU = imuSensor возвращает Системный объект, IMU, это вычисляет инерционный модуль измерения, читающий на основе инерционного входного сигнала. IMU имеет идеальный акселерометр и гироскоп.

пример

IMU = imuSensor('accel-gyro') возвращает imuSensor Системный объект с идеальным акселерометром и гироскопом. imuSensor и imuSensor('accel-gyro') эквивалентные синтаксисы создания.

пример

IMU = imuSensor('accel-mag') возвращает imuSensor Системный объект с идеальным акселерометром и магнитометром.

пример

IMU = imuSensor('accel-gyro-mag') возвращает imuSensor Системный объект с идеальным акселерометром, гироскопом и магнитометром.

IMU = imuSensor(___,'ReferenceFrame',RF) возвращает imuSensor Системный объект, который вычисляет инерционный модуль измерения, читающий относительно системы координат RF. Задайте RF как 'NED' (Северо-восток вниз) или 'ENU' (Восточный Север). Значением по умолчанию является 'NED'.

пример

IMU = imuSensor(___,Name,Value) наборы каждое свойство Name к заданному Value. Незаданные свойства имеют значения по умолчанию. Этот синтаксис может использоваться в сочетании с любым из предыдущих входных параметров.

Свойства

развернуть все

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

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).

Тип инерционного модуля измерения, заданного как 'accel-gyro', 'accel-mag', или 'accel-gyro-mag'.

Тип инерционного модуля измерения задает который показания датчика к модели:

  • 'accel-gyro' – Акселерометр и гироскоп

  • 'accel-mag' – Акселерометр и магнитометр

  • 'accel-gyro-mag' – Акселерометр, гироскоп и магнитометр

Можно задать IMUType в качестве аргумента только для значения во время создания или как Name,Value пара.

Типы данных: char | string

Частота дискретизации модели датчика в Гц, заданном как положительная скалярная величина.

Типы данных: single | double

Рабочая температура IMU, в градусах Цельсия, заданного как действительный скаляр.

Настраиваемый: да

Типы данных: single | double

Вектор магнитного поля в микротесла, заданном как трехэлементный вектор-строка в локальной системе координат навигации.

Магнитное поле по умолчанию соответствует магнитному полю в нуле широты, нуле долготы и высотном нуле.

Настраиваемый: да

Типы данных: single | double

Параметры датчика акселерометра, заданные accelparams объект.

Настраиваемый: да

Параметры датчика гироскопа, заданные gyroparams объект.

Настраиваемый: да

Параметры датчика магнитометра, заданные magparams объект.

Настраиваемый: да

Источник случайных чисел, заданный как вектор символов или строка:

  • 'Global stream' – Случайные числа сгенерированы с помощью текущего глобального потока случайных чисел.

  • 'mt19937ar with seed' – Случайные числа сгенерированы с помощью mt19937ar алгоритма с seed, заданным Seed свойство.

Типы данных: char | string

Начальный seed mt19937ar алгоритма генератора случайных чисел, заданного как действительный, неотрицательный целочисленный скаляр.

Зависимости

Чтобы включить это свойство, установите RandomStream к 'mt19937ar with seed'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Использование

Описание

[accelReadings,gyroReadings] = IMU(acc,angVel) генерирует акселерометр и показания гироскопа от входных параметров скорости вращения и ускорения.

Этот синтаксис только допустим если IMUType установлен в 'accel-gyro' или 'accel-gyro-mag'.

[accelReadings,gyroReadings] = IMU(acc,angVel,orientation) генерирует акселерометр и показания гироскопа от ускорения, скорости вращения и входных параметров ориентации.

Этот синтаксис только допустим если IMUType установлен в 'accel-gyro' или 'accel-gyro-mag'.

[accelReadings,magReadings] = IMU(acc,angVel) генерирует показания акселерометра и магнитометра от входных параметров скорости вращения и ускорения.

Этот синтаксис только допустим если IMUType установлен в 'accel-mag'.

[accelReadings,magReadings] = IMU(acc,angVel,orientation) генерирует показания акселерометра и магнитометра от ускорения, скорости вращения и входных параметров ориентации.

Этот синтаксис только допустим если IMUType установлен в 'accel-mag'.

[accelReadings,gyroReadings,magReadings] = IMU(acc,angVel) генерирует акселерометр, гироскоп и показания магнитометра от входных параметров скорости вращения и ускорения.

Этот синтаксис только допустим если IMUType установлен в 'accel-gyro-mag'.

[accelReadings,gyroReadings,magReadings] = IMU(acc,angVel,orientation) генерирует акселерометр, гироскоп и показания магнитометра от ускорения, скорости вращения и входных параметров ориентации.

Этот синтаксис только допустим если IMUType установлен в 'accel-gyro-mag'.

Входные параметры

развернуть все

Ускорение IMU в локальной системе координат навигации, заданной как действительный, конечный N-by-3 массив в метрах в секунду, придало квадратную форму. N является количеством выборок в текущей системе координат.

Типы данных: single | double

Скорость вращения IMU в локальной системе координат навигации, заданной как действительный, конечный N-by-3 массив в радианах в секунду. N является количеством выборок в текущей системе координат.

Типы данных: single | double

Ориентация IMU относительно локальной системы координат навигации, заданной как quaternion N- вектор-столбец элемента или 3 3 N матрицей вращения. Каждый quaternion или матрица вращения представляет вращение системы координат от локальной системы координат навигации до текущей системы координат корпуса датчика IMU. N является количеством выборок в текущей системе координат.

Типы данных: single | double | quaternion

Выходные аргументы

развернуть все

Измерение акселерометра IMU в системе координат корпуса датчика, заданной как действительный, конечный N-by-3 массив в метрах в секунду, придало квадратную форму. N является количеством выборок в текущей системе координат.

Типы данных: single | double

Измерение гироскопа IMU в системе координат корпуса датчика, заданной как действительный, конечный N-by-3 массив в радианах в секунду. N является количеством выборок в текущей системе координат.

Типы данных: single | double

Измерение магнитометра IMU в системе координат корпуса датчика, заданной как действительный, конечный N-by-3 массив в microtelsa. N является количеством выборок в текущей системе координат.

Типы данных: single | double

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

развернуть все

imuSensor Система object™ позволяет вам смоделировать данные, полученные от инерционного модуля измерения, состоящего из комбинации гироскопа, акселерометра и магнитометра.

Создайте imuSensor по умолчанию объект.

IMU = imuSensor
IMU = 
  imuSensor with properties:

          IMUType: 'accel-gyro'
       SampleRate: 100
      Temperature: 25
    Accelerometer: [1x1 accelparams]
        Gyroscope: [1x1 gyroparams]
     RandomStream: 'Global stream'

imuSensor объект, IMU, содержит идеализированный гироскоп и акселерометр. Используйте запись через точку, чтобы просмотреть свойства гироскопа.

IMU.Gyroscope
ans = 
  gyroparams with properties:

    MeasurementRange: Inf        rad/s      
          Resolution: 0          (rad/s)/LSB
        ConstantBias: [0 0 0]    rad/s      
    AxesMisalignment: [0 0 0]    %          

       NoiseDensity: [0 0 0]    (rad/s)/√Hz
    BiasInstability: [0 0 0]    rad/s      
         RandomWalk: [0 0 0]    (rad/s)*√Hz

           TemperatureBias: [0 0 0]    (rad/s)/°C    
    TemperatureScaleFactor: [0 0 0]    %/°C          
          AccelerationBias: [0 0 0]    (rad/s)/(m/s²)

Свойства датчика заданы соответствующими объектами параметра. Например, модель гироскопа используется imuSensor задан экземпляром gyroparams класс. Можно изменить свойства модели гироскопа, использующей запись через точку. Установите область значений измерения гироскопа на 4,3 рад/с.

IMU.Gyroscope.MeasurementRange = 4.3;

Можно также установить свойства датчика задать объекты параметра. Создайте accelparams возразите, чтобы подражать определенному оборудованию, и затем установить Accelerometer IMU свойство к accelparams объект. Отобразите Accelerometer свойство проверить свойства правильно установлено.

SpecSheet1 = accelparams( ...
    'MeasurementRange',19.62, ...
    'Resolution',0.00059875, ...
    'ConstantBias',0.4905, ...
    'AxesMisalignment',2, ...
    'NoiseDensity',0.003924, ...
    'BiasInstability',0, ...
    'TemperatureBias', [0.34335 0.34335 0.5886], ...
    'TemperatureScaleFactor', 0.02);

IMU.Accelerometer = SpecSheet1;

IMU.Accelerometer
ans = 
  accelparams with properties:

    MeasurementRange: 19.62                     m/s²      
          Resolution: 0.00059875                (m/s²)/LSB
        ConstantBias: [0.4905 0.4905 0.4905]    m/s²      
    AxesMisalignment: [2 2 2]                   %         

       NoiseDensity: [0.003924 0.003924 0.003924]    (m/s²)/√Hz
    BiasInstability: [0 0 0]                         m/s²      
         RandomWalk: [0 0 0]                         (m/s²)*√Hz

           TemperatureBias: [0.34335 0.34335 0.5886]    (m/s²)/°C
    TemperatureScaleFactor: [0.02 0.02 0.02]            %/°C     

Используйте imuSensor Система object™ к модели, получающей данные из стационарного идеального IMU, содержащего акселерометр, гироскоп и магнитометр.

Создайте идеальную модель датчика IMU, которая содержит акселерометр, гироскоп и магнитометр.

IMU = imuSensor('accel-gyro-mag')
IMU = 
  imuSensor with properties:

          IMUType: 'accel-gyro-mag'
       SampleRate: 100
      Temperature: 25
    MagneticField: [27.5550 -2.4169 -16.0849]
    Accelerometer: [1x1 accelparams]
        Gyroscope: [1x1 gyroparams]
     Magnetometer: [1x1 magparams]
     RandomStream: 'Global stream'

Задайте основную истину, базовое движение IMU, который вы моделируете. Ускорение и скорость вращения заданы относительно локальной системы координат NED.

numSamples = 1000;
acceleration = zeros(numSamples,3);
angularVelocity = zeros(numSamples,3);

Вызовите IMU с ускорением основной истины и скоростью вращения. Объектные выходные показания акселерометра, показания гироскопа и показания магнитометра, как смоделировано свойствами imuSensor Системный объект. Показания акселерометра, показания гироскопа и показания магнитометра относительно системы координат корпуса датчика IMU.

[accelReading,gyroReading,magReading] = IMU(acceleration,angularVelocity);

Постройте показания акселерометра, показания гироскопа и показания магнитометра.

t = (0:(numSamples-1))/IMU.SampleRate;
subplot(3,1,1)
plot(t,accelReading)
legend('X-axis','Y-axis','Z-axis')
title('Accelerometer Readings')
ylabel('Acceleration (m/s^2)')

subplot(3,1,2)
plot(t,gyroReading)
legend('X-axis','Y-axis','Z-axis')
title('Gyroscope Readings')
ylabel('Angular Velocity (rad/s)')

subplot(3,1,3)
plot(t,magReading)
legend('X-axis','Y-axis','Z-axis')
title('Magnetometer Readings')
xlabel('Time (s)')
ylabel('Magnetic Field (uT)')

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

  • Показания акселерометра: ось z корпуса датчика соответствует Вниз-оси. Ускорение на 9,8 м/с^2 вдоль оси z происходит из-за силы тяжести.

  • Показания гироскопа: показания гироскопа являются нулем вдоль каждой оси, как ожидалось.

  • Показания магнитометра: Поскольку система координат корпуса датчика выравнивается с локальной системой координат NED, показания магнитометра соответствуют MagneticField свойство imuSensor. MagneticField свойство задано в локальной системе координат NED.

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

Задайте движение основной истины для платформы, которая вращает 360 градусов за четыре секунды, и затем еще 360 градусов за две секунды. Используйте kinematicTrajectory выводить ориентацию, ускорение и скорость вращения в системе координат NED.

fs = 100;
firstLoopNumSamples = fs*4;
secondLoopNumSamples = fs*2;
totalNumSamples = firstLoopNumSamples + secondLoopNumSamples;

traj = kinematicTrajectory('SampleRate',fs);

accBody = zeros(totalNumSamples,3);
angVelBody = zeros(totalNumSamples,3);
angVelBody(1:firstLoopNumSamples,3) = (2*pi)/4;
angVelBody(firstLoopNumSamples+1:end,3) = (2*pi)/2;

[~,orientationNED,~,accNED,angVelNED] = traj(accBody,angVelBody);

Создайте imuSensor объект с идеальным акселерометром и идеальным магнитометром. Вызовите IMU с ускорением основной истины, скоростью вращения и ориентацией, чтобы вывести показания акселерометра и показания магнитометра. Постройте график результатов.

IMU = imuSensor('accel-mag','SampleRate',fs);

[accelReadings,magReadings] = IMU(accNED,angVelNED,orientationNED);

figure(1)
t = (0:(totalNumSamples-1))/fs;
subplot(2,1,1)
plot(t,accelReadings)
legend('X-axis','Y-axis','Z-axis')
ylabel('Acceleration (m/s^2)')
title('Accelerometer Readings')

subplot(2,1,2)
plot(t,magReadings)
legend('X-axis','Y-axis','Z-axis')
ylabel('Magnetic Field (\muT)')
xlabel('Time (s)')
title('Magnetometer Readings')

Показания акселерометра указывают, что платформа не имеет никакого перевода. Показания магнитометра указывают, что платформа вращается вокруг оси z.

Подайте показания акселерометра и магнитометра в ecompass функционируйте, чтобы оценивать ориентацию в зависимости от времени. ecompass функция возвращает ориентацию в формате кватерниона. Преобразуйте ориентацию в Углы Эйлера и постройте результаты. График ориентации показывает, что платформа вращается об оси z только.

orientation = ecompass(accelReadings,magReadings);

orientationEuler = eulerd(orientation,'ZYX','frame');

figure(2)
plot(t,orientationEuler)
legend('Z-axis','Y-axis','X-axis')
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation')

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

Задайте движение основной истины для платформы, которая вращает 360 градусов за четыре секунды, и затем еще 360 градусов за две секунды. Используйте kinematicTrajectory выводить ориентацию, ускорение и скорость вращения в системе координат NED.

fs = 100;
firstLoopNumSamples = fs*4;
secondLoopNumSamples = fs*2;
totalNumSamples = firstLoopNumSamples + secondLoopNumSamples;

traj = kinematicTrajectory('SampleRate',fs);

accBody = zeros(totalNumSamples,3);
angVelBody = zeros(totalNumSamples,3);
angVelBody(1:firstLoopNumSamples,3) = (2*pi)/4;
angVelBody(firstLoopNumSamples+1:end,3) = (2*pi)/2;

[~,orientationNED,~,accNED,angVelNED] = traj(accBody,angVelBody);

Создайте imuSensor объект с реалистическим акселерометром и реалистическим магнитометром. Вызовите IMU с ускорением основной истины, скоростью вращения и ориентацией, чтобы вывести показания акселерометра и показания магнитометра. Постройте график результатов.

IMU = imuSensor('accel-mag','SampleRate',fs);

IMU.Accelerometer = accelparams( ...
    'MeasurementRange',19.62, ...            % m/s^2
    'Resolution',0.0023936, ...              % m/s^2 / LSB
    'TemperatureScaleFactor',0.008, ...      % % / degree C
    'ConstantBias',0.1962, ...               % m/s^2
    'TemperatureBias',0.0014715, ...         % m/s^2 / degree C
    'NoiseDensity',0.0012361);               % m/s^2 / Hz^(1/2)

IMU.Magnetometer = magparams( ...
    'MeasurementRange',1200, ...             % uT
    'Resolution',0.1, ...                    % uT / LSB
    'TemperatureScaleFactor',0.1, ...        % % / degree C
    'ConstantBias',1, ...                    % uT
    'TemperatureBias',[0.8 0.8 2.4], ...     % uT / degree C
    'NoiseDensity',[0.6 0.6 0.9]/sqrt(100)); % uT / Hz^(1/2)

[accelReadings,magReadings] = IMU(accNED,angVelNED,orientationNED);

figure(1)
t = (0:(totalNumSamples-1))/fs;
subplot(2,1,1)
plot(t,accelReadings)
legend('X-axis','Y-axis','Z-axis')
ylabel('Acceleration (m/s^2)')
title('Accelerometer Readings')

subplot(2,1,2)
plot(t,magReadings)
legend('X-axis','Y-axis','Z-axis')
ylabel('Magnetic Field (\muT)')
xlabel('Time (s)')
title('Magnetometer Readings')

Показания акселерометра указывают, что платформа не имеет никакого перевода. Показания магнитометра указывают, что платформа вращается вокруг оси z.

Подайте показания акселерометра и магнитометра в ecompass функционируйте, чтобы оценивать ориентацию в зависимости от времени. ecompass функция возвращает ориентацию в формате кватерниона. Преобразуйте ориентацию в Углы Эйлера и постройте результаты. График ориентации показывает, что платформа вращается об оси z только.

orientation = ecompass(accelReadings,magReadings);

orientationEuler = eulerd(orientation,'ZYX','frame');

figure(2)
plot(t,orientationEuler)
legend('Z-axis','Y-axis','X-axis')
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation')

%

Смоделируйте наклон IMU, который содержит акселерометр и гироскоп с помощью imuSensor Система object™. Используйте идеальные и реалистические модели, чтобы сравнить результаты отслеживания ориентации с помощью imufilter Системный объект.

Загрузите struct, описывающий движение основной истины и частоту дискретизации. Struct движения описывает последовательные вращения:

  1. отклонение от курса: 120 градусов более чем две секунды

  2. подача: 60 градусов более чем одна секунда

  3. список: 30 градусов по половине второго

  4. список:-30 градусов по половине второго

  5. подача:-60 градусов более чем одна секунда

  6. отклонение от курса:-120 градусов более чем две секунды

На последней стадии struct движения комбинирует 1-е, 2-е, и 3-и вращения во вращение одно оси. Ускорение, скорость вращения и ориентация заданы в локальной системе координат NED.

load y120p60r30.mat motion fs
accNED = motion.Acceleration;
angVelNED = motion.AngularVelocity;
orientationNED = motion.Orientation;

numSamples = size(motion.Orientation,1);
t = (0:(numSamples-1)).'/fs;

Создайте идеальный объект датчика IMU и объект фильтра IMU по умолчанию.

IMU = imuSensor('accel-gyro','SampleRate',fs);

aFilter = imufilter('SampleRate',fs);

В цикле:

  1. Симулируйте IMU выход путем питания движения основной истины объект датчика IMU.

  2. Отфильтруйте IMU выход с помощью объекта фильтра IMU по умолчанию.

orientation = zeros(numSamples,1,'quaternion');
for i = 1:numSamples

    [accelBody,gyroBody] = IMU(accNED(i,:),angVelNED(i,:),orientationNED(i,:));

    orientation(i) = aFilter(accelBody,gyroBody);

end
release(aFilter)

Стройте ориентацию в зависимости от времени.

figure(1)
plot(t,eulerd(orientation,'ZYX','frame'))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation Estimation -- Ideal IMU Data, Default IMU Filter')
legend('Z-axis','Y-axis','X-axis')

Измените свойства своего imuSensor смоделировать реальные датчики. Запустите цикл снова и стройте оценку ориентации в зависимости от времени.

IMU.Accelerometer = accelparams( ...
    'MeasurementRange',19.62, ...
    'Resolution',0.00059875, ...
    'ConstantBias',0.4905, ...
    'AxesMisalignment',2, ...
    'NoiseDensity',0.003924, ...
    'BiasInstability',0, ...
    'TemperatureBias', [0.34335 0.34335 0.5886], ...
    'TemperatureScaleFactor',0.02);
IMU.Gyroscope = gyroparams( ...
    'MeasurementRange',4.3633, ...
    'Resolution',0.00013323, ...
    'AxesMisalignment',2, ...
    'NoiseDensity',8.7266e-05, ...
    'TemperatureBias',0.34907, ...
    'TemperatureScaleFactor',0.02, ...
    'AccelerationBias',0.00017809, ...
    'ConstantBias',[0.3491,0.5,0]);

orientationDefault = zeros(numSamples,1,'quaternion');
for i = 1:numSamples

    [accelBody,gyroBody] = IMU(accNED(i,:),angVelNED(i,:),orientationNED(i,:));

    orientationDefault(i) = aFilter(accelBody,gyroBody);

end
release(aFilter)

figure(2)
plot(t,eulerd(orientationDefault,'ZYX','frame'))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation Estimation -- Realistic IMU Data, Default IMU Filter')
legend('Z-axis','Y-axis','X-axis')

Способность imufilter отслеживать достоверные данные значительно уменьшается при моделировании реалистического IMU. Чтобы улучшать производительность, измените свойства своего imufilter объект. Эти значения были определены опытным путем. Запустите цикл снова и стройте оценку ориентации в зависимости от времени.

aFilter.GyroscopeNoise          = 7.6154e-7;
aFilter.AccelerometerNoise      = 0.0015398;
aFilter.GyroscopeDriftNoise     = 3.0462e-12;
aFilter.LinearAccelerationNoise = 0.00096236;
aFilter.InitialProcessNoise     = aFilter.InitialProcessNoise*10;

orientationNondefault = zeros(numSamples,1,'quaternion');
for i = 1:numSamples
    [accelBody,gyroBody] = IMU(accNED(i,:),angVelNED(i,:),orientationNED(i,:));

    orientationNondefault(i) = aFilter(accelBody,gyroBody);
end
release(aFilter)

figure(3)
plot(t,eulerd(orientationNondefault,'ZYX','frame'))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation Estimation -- Realistic IMU Data, Nondefault IMU Filter')
legend('Z-axis','Y-axis','X-axis')

Определить количество улучшенной производительности модифицированного imufilter, постройте расстояние кватерниона между движением основной истины и ориентацией, как возвращено imufilter со свойствами не по умолчанию и по умолчанию.

qDistDefault = rad2deg(dist(orientationNED,orientationDefault));
qDistNondefault = rad2deg(dist(orientationNED,orientationNondefault));

figure(4)
plot(t,[qDistDefault,qDistNondefault])
title('Quaternion Distance from True Orientation')
legend('Realistic IMU Data, Default IMU Filter', ...
       'Realistic IMU Data, Nondefault IMU Filter')
xlabel('Time (s)')
ylabel('Quaternion Distance (degrees)')

Алгоритмы

развернуть все

Расширенные возможности

Смотрите также

Классы

Системные объекты

Введенный в R2018b

Для просмотра документации необходимо авторизоваться на сайте