|
|
  |
два сигнала разного разрешения объединить в один |
|
|
|
May 28 2015, 09:15
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
надо взять расстояние по 100 метровому X и по 5 метровому Y и посчитать X - X%5 + Y, а лучше X - X%5 + (Y + X%5)/2, так поглаже будет... Цитата Вот это псп Можно и такой способ использовать, только вычисление будет занимать наверно секунду.. Почему? оно будет непрерывно давать значение, прям каждый такт... Да время выхода на режим будет какое-то, но секунда - это много...
|
|
|
|
|
May 30 2015, 18:38
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Изменил схему для 10м и 100м дистанции, так точнее. по вашей формуле работает, но есть в момент перехода 360-0гр небольшой скачок (зеленная линия). 10м и 100м это условно. Сильно зависит от частоты pll. например 10м или 5м туда обратно, реально получается 7,4 или по 3,7м. туда обратно. Основная цель сейчас сделать переменную которая будет иметь пропорциональную зависимость от расстояния. А расстояние потом можно будет привязать калибровкой. Наверно буду вычислять зависимость двух переменных. Мысль такая: устанавливаю объект нажимаю кнопку, передвигаю на 2м и снова нажимаю кнопку. Когда нажимаю вторую кнопку рассчитается множитель. Цитата uint32t tempA10,tempA100; float mulA; if(button1) { tempA10 = A10; tempA100=A100;
}else if(button2){ mulA = (A10 - tempA10)/(A100 - tempA100); }
а потом вот так, как вы порекомендовали. DBRAM.StructurData.reservuint32[3]% только вместо 10 использовать mulA. Если еще есть мысли у кого, как еще можно сделать скажите плз. По вашей формуле, только рассчитываю в мк. Код //DBRAM.StructurData.reservuint32[3] 100м // DBRAM.StructurData.reservuint32[1] 10м DBRAM.StructurData.reservfloat[1] = (float) ((DBRAM.StructurData.reservuint32[3]*10) - (DBRAM.StructurData.reservuint32[3]*10) %10)+(DBRAM.StructurData.reservuint32[3]%10 + DBRAM.StructurData.reservuint32[1])/2;
|
|
|
|
|
Jun 1 2015, 07:28
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
да ничего вы не сделаете, у вас 2 линейных датчика со сдвигом, один периодический со скачком, их суперпозицию не сровнять, только если коэффициент плавающий который нулит 10 метровый вблизи границы. Но это все так....
то есть считать Z = K1(x) * x + k2 * y; z - расстояние, x - 10 метровый, y - 100 метровый. 100 - метров без скачка, его берем линейно то есть получаем базис функций X, Y, X^2, тогда имеем
z = k1*x^2 + k2 *x + k3 * y + k4; теперь проводить измерения, чем больше тем лучше, получаете тройки (Zi , Xi, Yi)
дальше метод наименьших квадратов
sum(zi - (k1*xi^2 + k2 *xi + k3 * yi + k4))^2 - сумма по всем i, чем больше точек тем лучше
минимизируем, то есть приравниваем производную 0, берете частные производные по коэффициентам и ровняете 0, сумма выродиться в систему уравнений, решив которую вы получите K1, K2, K3, K4 - дальше измеряя X и Y и подставляя их в k1*x^2 + k2 *x + k3 * y + k4 вы будите получать значение расстояния.
Прелесть метода в том что вы получаете гладкую функцию. Она не пройдет точно через измеренный точки, но пройдет максимально близко. Это позволяет функции не пойти горбами как при интерполяции, а также позволяет оценить ошибку, сравнив рассчитанное значение с реально измеренным в точках калибровки. Добавление точек будет улучшать функцию....
как то так...
|
|
|
|
|
Jun 1 2015, 13:30
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Можно я еще поспрашиваю )) Здесь измеряем. Коэффициенты пока ==1 Цитата z = k1*x^2 + k2 *x + k3 * y + k4; к примеру подвинули мишень 5 раз по 2м, взяли 5 точек. поместили их в эти массивы Z[0-4] X[0-4] Y[0-4]. Цитата дальше метод наименьших квадратов sum(zi - (k1*xi^2 + k2 *xi + k3 * yi + k4))^2 Код uint32 summ = 0; for(int i = 0; i< 5; i++) { summ = pow (z[i] - (k1*pow(x[i],2) + k2 *x[i] + k3 * y[i] + k4),2); // всегда будет равен нулю? } Цитата K1, K2, K3, K4 - дальше измеряя X и Y и подставляя их в k1*x^2 + k2 *x + k3 * y + k4 вы будите получать значение расстояния. K1 K2 K3 K4 вычисляются один раз при калибровке ?
|
|
|
|
|
Jun 1 2015, 18:28
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Да вы решаете задачу, найти такие к1, к2, и т.д При которых вычисленное значение х*х*к1 + х*к2 и т.д (пишу с телефона одним пальцем, дико не удобно) так вот это значение должно максимально близко ложиться к измеренному
Во время калибровки вы не знаете чемумравны к1, к2... Потому сумма не может быть равной нулю. Более того всегда есть погрешность съема данных, потому опять сумма не будет ноль, мы стримим значение суммы к минимому. Для нахождения экстремума производную ровняем нулю. У нас 4 коэффициента, потому берем 4 частные производные и получаем 4 уравнения системы
Коэффициенты нельзя ничемуиравнять для начала. Вы снимаете только показания ставите z измеряете x, y Много раз в разных местах, чем плотнее помериете тем лучше пойдет. А потом получаете большую сумму квадратов отклонения с неизвестными коэффициентами. Возьмите частные производные в общем виде, там сразу видна закономерность, я не готов с телефона ее описать)
Это обобщенный ряд, кажеться лагранжа, уже стал забывать. Метод дико удобный когда есть многомерные измерения. Температура и вольтаж, показания по 2 датчикам и так далее. Сложность одна, система что получиться плохообусловленная, и решать ее в лоб не выйдет. Метод ньютона, только с выбором главеого элемента, а лучше псевдоинверсией. Я в свое время взял решение из матлаба, pinv очень удобно даете матрицу, получаете такую, умножив на которую матрица уйдет в 1 с минимальеой нормой. Фактически это итеррационное обращение матрицы, в 1 шаг получаете решение
|
|
|
|
|
Jun 7 2015, 17:39
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Пробовал, для вычисления нужно много точек >10. После всех усреднений в плиз максимум что получается передавать в контроллер 10-15 гц. Сделал совсем просто но результат правильный, проверил рулеткой +-5мм. Подсчитываю так : Код //------------------------------------------------------------------------------------// void getdistancefrommeter(void){ uint32_t low1temp,low2temp,hight1temp,hight2temp; float calculatehight;
spi_upd_data(datafromfpga,datatofpga,FPGABUFSIZE);
low1temp = (((256*datafromfpga[1])+datafromfpga[2])&0xffff); //mixer 1 low2temp = (((256*datafromfpga[4])+datafromfpga[5])&0xffff); //mixer 2 DistenceCounterStruct.DistanceLow = (low1temp+low2temp)/2;
hight1temp = (((256*datafromfpga[7])+datafromfpga[8])&0xffff); hight2temp = (((256*datafromfpga[10])+datafromfpga[11])&0xffff); DistenceCounterStruct.DistanceHight = (hight1temp+hight2temp)/2;
DistenceCounterStruct.TimeGetVal = SYS_GetTick();//for calculate velos.
if(DistenceCounterStruct.DistanceHight < POINT_5M){ calculatehight = 0.5 * DistenceCounterStruct.DistanceLow;
}else if((DistenceCounterStruct.DistanceHight > POINT_5M)&&(DistenceCounterStruct.DistanceHight < (POINT_5M+POINT_DELTA) )){ calculatehight = 3.28 * DistenceCounterStruct.DistanceHight * 0.5;
}else if((DistenceCounterStruct.DistanceHight >= (POINT_5M+POINT_DELTA)&&(DistenceCounterStruct.DistanceHight<POINT_10M))){ calculatehight = 0.5 * DistenceCounterStruct.DistanceLow + 5000.0;
}
DistenceCounterStruct.Distance_mm = calculatehight;
} //------------------------------------------------------------------------------------// Не очень удобно нужно точки вносить, и вместе перехода 360-0 градусов точность меньше. Что можно еще сделать? Результат
|
|
|
|
|
Jun 7 2015, 18:28
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Пробовал, для вычисления нужно много точек >10 если сделать все правильно, можно получить результат по 1 точке. Правда он будет мало соответствовать сигналу, ну в этой точке все получиться... по 2 точкам будет прямая, по 3 ее начнет гнуть и так далее... еще зависит от базовых функций.... но только они определяют порядок кривой аппроксимации, число точек влияет только на точность. можно сделать мертвые зоны в районе перехода 5 метрового через 0. По 100 метровому оценивать где находитесь, если далеко от перехода брать данные от 5 метрового, если близко то оставлять 100 метровые... то есть что-то типа того можно попробовать...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|