Реализация интегрирования данных с акселерометра

o0yo1
Offline
Зарегистрирован: 10.06.2022

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

#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
#include "GyverButton.h"

#define BTN_PIN 3        

GButton butt1(BTN_PIN);
MPU6050 shagom;

int16_t ax,ay,az,gx,gy,gz;
uint32_t tmr1, tmr2,tmr3,tmr4;
float cax,cay,caz,cgx,cgy,cgz,a,cax1,cay1,caz1,cgx1,cgy1,cgz1,a1,s=0;
int b=0,x,y,z;

void setup()
{
  Serial.begin(9600);
  butt1.setDebounce(50);        
  //butt1.setTimeout(300);        
  butt1.setClickTimeout(300);   
  butt1.setDirection(NORM_OPEN);
  Wire.begin();
  Serial.begin(9600);
  shagom.initialize();

  shagom.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  
  
 
}
 
 
float rast()
{ 
  butt1.tick();  

 if (butt1.hasClicks()){
  if (millis() - tmr1 >= 100) {  
    tmr1 = millis();
  shagom.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);
  cax=(ax/ 4096.0 * 2.0);
  cay=(ay/ 4096.0 * 2.0);
  caz=(az/ 4096.0 * 2.0);
  a = sqrt(sq(cax)+ sq(cay)+sq(caz));
  delay(200);
}
 }
   if (millis() - tmr2 >= 500) {  
    tmr2 = millis();
    shagom.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);
  cax1=(ax/ 4096.0 * 2.0);
  cay1=(ay/ 4096.0 * 2.0);
  caz1=(az/ 4096.0 * 2.0);
  a1 = (sqrt(sq(cax1)+ sq(cay1)+sq(caz1)))-a;
 //Serial.print("a= ");Serial.print(a1);Serial.print("\n");
   
   }
   return a1;
}

void loop(){
  float *sum;
      sum=(float*)malloc(millis()*sizeof(float));
  float A= rast();
  float u0=0,u1=0,h1=0,h=0;
  for(int n=0;n!= millis();n++){
    if (millis() - tmr3 >= 500) {
      
    tmr3 = millis();
   u1=u0+A*1.2;
  
 h1=u0*1.2+(A*1.2*1.2)/2;
  sum[n]= h1;
  u0=u0+u1;
    }
  }
   for(int i=0; i!=millis() ;i++){
//Serial.print("t= ");Serial.print(time);Serial.print("\n");
//Serial.print("u= ");Serial.print(v2XP);Serial.print("\n");
if (millis() - tmr4 >= 100) {
  tmr4=millis();
   s=s+sum[i];
Serial.print("s= ");Serial.print(s);Serial.print("\n");
}
   }
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

o0yo1 пишет:

sum=(float*)malloc(millis()*sizeof(float));

o0yo1
Offline
Зарегистрирован: 10.06.2022

в это строке я хотел динамически выделять память под масив в котором я храню расстояния для их суммирования. моя запись не верна?

 

 

mixail844
Offline
Зарегистрирован: 30.04.2012

o0yo1 пишет:

в это строке я хотел динамически выделять память под масив в котором я храню расстояния для их суммирования. моя запись не верна?

функция millis() возвращает количество миллисекунд с начала включения устройства. o0yo1, что из этого и 
sum=(float*)malloc(millis()*sizeof(float));

следует ? 

при этом динамически выделяемую память , вы никогда не освобождаете
o0yo1
Offline
Зарегистрирован: 10.06.2022

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

сколько тебе данных нужно для суммирования?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

o0yo1 пишет:

в это строке я хотел динамически выделять память 

А в какой строке Вы хотели её динамически освобождать?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

А в какой строке Вы хотели её динамически освобождать?

а как же эффект ''курицы" - грести под себя )))

rkit
Offline
Зарегистрирован: 23.11.2016

Интеграл это просто сумма. Если ты написал этот фарш, пытаясь посчитать сумму, то тебе нужно просто научиться программировать. По любой книге. Только изучать ее по порядку, а не ждать в ней главы о том, как посчитать интеграл.

o0yo1
Offline
Зарегистрирован: 10.06.2022

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

o0yo1
Offline
Зарегистрирован: 10.06.2022

rkit пишет:

Интеграл это просто сумма. Если ты написал этот фарш, пытаясь посчитать сумму, то тебе нужно просто научиться программировать. По любой книге. Только изучать ее по порядку, а не ждать в ней главы о том, как посчитать интеграл.

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

o0yo1 пишет:

наверное я тут скорее не понял как суммировать от времени

В гугле не забанены? Ищите, например, "метод трапеций".

Если нужен пример, то вот в этом проекте интеграл считается именно этим методом.

o0yo1
Offline
Зарегистрирован: 10.06.2022

[quote=ЕвгенийП]

Вы не ответили на мой вопрос про освобождение памяти. 

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

Про интегрирование по времени я озадачен не математической составляющей,а более программной  реализацией. 

За пример спасибо! Постараюсь теперь эмпирическим путем дойти до желаймого мной результата.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

o0yo1 пишет:

Про интегрирование по времени я озадачен не математической составляющей,а более программной  реализацией. 

Вы точно сделали то, что я Вам сказал? 

ЕвгенийП пишет:
Ищите, например, "метод трапеций".

Боюсь, что как всегда проигнорировали. Иначе Вы бы там увидели 100500 готовых реализация на всех языках.

Зачем обращаться на форум, если потом не делать что говорят?

o0yo1
Offline
Зарегистрирован: 10.06.2022

ЕвгенийП пишет:

Вы точно сделали то, что я Вам сказал? 

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

o0yo1 пишет:

Я точно не сделал то что вы сказали ... поэтому считаю, что писал не зря..  

А я, выходит, зря. Ладно, больше не буду :-(

nik182
Offline
Зарегистрирован: 04.05.2015

А Вы читали про точности и ошибки акселерометра и необходимость привязки интегрированного значения? Учёт ошибок при небольших колебаниях курса?

o0yo1
Offline
Зарегистрирован: 10.06.2022

ЕвгенийП пишет:

А я, выходит, зря. Ладно, больше не буду :-(

Извините, я наверное  не точно выразился, тем я хотел сказать, что изначально не понял вас,  и по итогу я всё таки понял что и с математической точки зрения, я не совсем прав... Извините не хотел показаться грубым и не слушающим советы ибо ведь за ними я на данный форум и пришёл..

 

o0yo1
Offline
Зарегистрирован: 10.06.2022

nik182 пишет:
А Вы читали про точности и ошибки акселерометра и необходимость привязки интегрированного значения? Учёт ошибок при небольших колебаниях курса?

В данной системе я на самом деле беру, очень условную точность. Про привязку интегрированного значения не слышал, было бы интересно узнать что это... Из погрешностей я очевидным образом сталкиваюсь с дрейфом нуля, но с учетом, что система не должна работать долго это тоже как кажется не страшны. Но вообще я заметил также осознал большую ошибку, в том что я беру за вектор ускорения модуль результирующего по трем осям, и из за этого я по сути вообще не понимал куда движется мой объект. Сейчас попробовал то, что у меня кое как считает моё перемещение, через условие таймера, но там выходит,что мне очень сильно мешает ускорение свободного падения. ибо оно всегда так или иначе попадает на ось. Попытался его устранить вычитанием из всех значений ускорения, начальное ускорение, те то которое у меня появляется при включении.Вроде становиться по лучше, но как только теряется начальная ореинтация становиться всё снова совсем худо.Дрейф я также попытался устранить дрейф нуля, обычным отсечением слишком маленьких значений, но так мне кажется я в "шуме" теряю слишком много полезного.. Так что... Было бы правда интересно где можно узнать об устранении такого рода погрешностей. Да и вообще, насколько актуально может быть нахождение пройденного пути по одной оси акселя, если тело движеться по не очень прямой поверхности..

 

nik182
Offline
Зарегистрирован: 04.05.2015

Эх. А задать гуглю вопрос типа вычисление скорости через ускорение акселерометр? Даже здесь на форуме несколько раз поднимали этот вопрос. Выводы обычно неутешительные. Одним акселерометром не обойтись. Да и в этом случае наростание ошибки таково, что без периодической привязки расчитанной скорости к реальной, полученной другими способами, типа спидометром машины, не даст получить реальную скорость уже через несколько секунд после начала измерений и расчётов.
Идея хорошая. Реализация невозможна из за отсутствия датчиков с приемлимой точностью за вменяемые деньги. Как пример- самолёты. На них не используют такой метод измерения скорости как основной, не смотря на огромные бюджеты на разработку систем навигации.

o0yo1
Offline
Зарегистрирован: 10.06.2022

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

А с примерами, всё таки есть подлодки которые без инерционалки, очевидно выжить не могут..

nik182
Offline
Зарегистрирован: 04.05.2015

Подводные лодки имеют скорость относительно воды с помощью лага. Им интегрировать не надо.