Перейти к содержанию
    

коррекция корявого sin/cos энкодера, самокалибровка

Пусть у вас искомые массивы из n точек
\(f_i, i=1,...,n\)
\(g_i, i=1,...,n\)

Пусть сдвиг d, и сами измеренные значения
с несдвинутого сенсора \(a_i, i=1,...,n\)
со сдвинутого сенсора \(b_i, i=1,...,n\)

Пусть f(x) - линейная интерполяция по \(f_i, i=1,...,n\), тогда

\( \displaystyle \min_{f,g} \sum_i ||f(g_i) - a_i||_2^2 + ||f(g_i + d) - b_i||_2^2 + \alpha \sum_i ||g_{i+1}-g_i-h||_2^2 \)

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

Чтобы решить такую минимизацию надо использовать покомпонентную минимизацию, то есть у вас есть три шага
1. фиксируем \(g_i\) и записываем формулы для наименьших квадратов по \(f_i\), они однозначно определяются и надо решить систему уравнений с трехдиагональной матри
цей методом прогонки,
2. фиксируем \(f_i\) и четные \(g_i\), и записываем формулы для наименьших квадратов по нечетным \(g_i\) - формулы с ифами, но простые и однозначные,
3. фиксируем \(f_i\) и нечетные \(g_i\), и записываем формулы для наименьших квадратов по четным \(g_i\) - формулы с ифами, но простые и однозначные.

Повторяем эти три шага попеременно до наступления сходимости.

Метод будет сходиться, если между любыми \(f_i\) и \(f_{i+1}\) будет существенно меньше четверти периода.

 

EDIT: h - шаг сетки, можно положить единицей. Для первой итерации выбрать \(g_i=i\).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я всё-таки математически туповат немного для честного решения наименьших квадратов в таком виде с линейной интерполяцией.

но смогу заставить mathematica сделать интерполяцию сплайнами \(S_a = S(a_i==f(g_i))\) и \(S_b=S(b_i==f(g_i+d))\), для ресэмплирования \(a_i\) в точках \(g_i + d\) и начать просто численно подкручивать потихоньку методом Ньютона все значения \(a_i\) и \(g_i\) при вычислении \(A_i=S_a(g_i+d)\) и \(B_i=S_b(g_i)\) (\(S_a\) каждый раз заново интерполировать из подкрученных \(a_i\)) так, чтобы минимизировать разницу \(A_i\) и \(B_i\), вроде бы то же самое получится только численно и небыстро.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Не пугайтесь, наименьшие квадраты там простые, там реально формулы простые, просто длинные и занудные, иногда проще сразу в виде программы писать.

 

Итак, первый шаг. Фиксируем g. Значит, у нас есть набор координат для первого и второго набора, в которых надо фиттить нашу линейную интерполяцию. Что мы имеем:

по набору g выискиваем куда на какой отрезок в линейной интерполяции для \(a\) по f мы попали (пусть это был отрезок \( (f_i, f_{i+1})\) ), и с соответствующим коэффициентом аппроксимируем эти \( f_i \) и \( f_{i+1} \) и записываем матричные коэффициенты и правую часть. Теперь то же самое для \( b \). Да, тут матрица может слегка расползтись из трехдиагональной, но, то, что она все равно останется положительно определенной - это факт, то есть всяко ее решать не сложно.

Далее.

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

 

Наверное непонятно написал..., если так, то постараюсь выложить на днях код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, _pv сказал:

от точности измерений зависит

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

А сколько выборок на период (между датчиками), если достаточно и есть возможность измерять скорость, то можно считать расстояние между датчиками за эталон и проити по линейке при этом считая корреляцию между датчиками и тем самым откалибровать линейку?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, iiv said:

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

Наверное непонятно написал...,

по этим граблям надо пройтись самому 🙂

а так впринципе понятно.

 

6 hours ago, vervs said:

А сколько выборок на период (между датчиками), если достаточно и есть возможность измерять скорость, то можно считать расстояние между датчиками за эталон и проити по линейке при этом считая корреляцию между датчиками и тем самым откалибровать линейку?

для этой "калибровки" можно проехать очень медленно и точек на период сделать сколько угодно много.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Enc Acc reni.png

A2_Circulo_encoder_angle_errors2.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, khach said:

Только ральные ошибки энкодеров  без всякой математики обрабатываются, по таблицам. 

вопрос собственно про построение этой таблицы (только энкодер линейный, "многооборотный") используя только известное откалиброванное расстояние между датчиками (то что Pi/4) по самим измерениям, без возможности прицепить дополнительный референсный измеритель положения снаружи.

1 hour ago, Plain said:

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

пусть будет магнитный

а можно по-подробнее что именно надо модулировать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, _pv сказал:

что именно надо модулировать?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...