Технический форум по робототехнике.
SkyStorm » 07 авг 2012, 01:01
Датчики на какой чувствительности работают?
Задержка в цикле 10мсек сильно нужна?
Angel71 » 07 авг 2012, 01:02
шутка про неваляшку? хм.
Spin7ion » 07 авг 2012, 01:03
SkyStorm писал(а):Датчики на какой чувствительности работают?
Задержка в цикле 10мсек сильно нужна?
Гироскоп на низкой, аксель пробовал на высокой и низкой, не помогает. Задержка для серийного вывода
Dmitry__ » 07 авг 2012, 01:04
Какой отклик всей системы со всеми этими флоатами и "Serial.print("D:");" в цикле подсчета?
Ардуина ни разу не комп на 1000 мипс.
Spin7ion » 07 авг 2012, 01:11
Не замерял к сожалению. На что заменить флоат? И действительно ли сильно это на стаб льности скажется?
Dmitry__ » 07 авг 2012, 01:19
Так замерь
оставь только "Serial.print("D") и осциллом замерь время между пачками на serial out.
Если задержка больше 100 мс. так и не будет нормально балансировать
Spin7ion » 07 авг 2012, 01:27
Понятно, осцила нету,придется компом. Есть ли у вас общие советы по оптимизации?
Dmitry__ » 07 авг 2012, 01:39
Пока совет один: убрать все задержки и принты, соотв. подкрутить пид и посмотреть что стало
Spin7ion » 07 авг 2012, 12:40
Скажите, а код pid вообще правильный?
- Код: Выделить всё • Развернуть
float lastError=0;
float integral=0;
float updatePID(float current, float target){
float dt=millis()-lastTime;
float error=target-current;
if(error>0.01){
integral+=error*dt/1000;
}
integral=constrain(integral,-255,255);
float derivative = (error - lastError)*1000/dt;
float output=coeffP*error+coeffI*integral+coeffD*derivative;
lastError=error;
return constrain(coeffPID*output, -255, 255);
}
vvk » 07 авг 2012, 14:56
Spin7ion писал(а):Скажите, а код pid вообще правильный?
- Код: Выделить всё • Развернуть
float lastError=0;
float integral=0;
float updatePID(float current, float target){
float dt=millis()-lastTime;
float error=target-current;
if(error>0.01){
integral+=error*dt/1000;
}
integral=constrain(integral,-255,255);
float derivative = (error - lastError)*1000/dt;
float output=coeffP*error+coeffI*integral+coeffD*derivative;
lastError=error;
return constrain(coeffPID*output, -255, 255);
}
Тут должно быть два ПИД-регулятора: один для удержания равновесия, другой для удержания робота в заданной точке (что бы не укатывался). Результаты обоих ПИД суммируются. Разумеется, на колесах должны быть энкодеры.
Spin7ion » 07 авг 2012, 15:04
vvk писал(а):Тут должно быть два ПИД-регулятора: один для удержания равновесия, другой для удержания робота в заданной точке (что бы не укатывался). Результаты обоих ПИД суммируются. Разумеется, на колесах должны быть энкодеры.
К сожалению в конструкции не заложено использование энкодеров. Неужели без них нельзя балансировать? Пока только балансировать, без удержания точки.
vvk » 07 авг 2012, 15:28
vvk писал(а):Тут должно быть два ПИД-регулятора: один для удержания равновесия, другой для удержания робота в заданной точке (что бы не укатывался). Результаты обоих ПИД суммируются. Разумеется, на колесах должны быть энкодеры.
Да, и интегральная составляющая тут не нужна, она используется для доведения управляемой величины до требуемой точки, а здесь через эту точку робот и так все время проскакивает.
Radist » 07 авг 2012, 18:52
За моторчики переплатили вдвое. Реклама вроде запрещена, намекну: внизу главной страницы есть список интернет-магазинов. А по настройке сказать мне нечего. Но видел я на ютубе ролик: два колеса, один мотор, аккум на шесте, а в качестве датчика - микрик с грузиком. Он инвертировал питание моторчика.
Spin7ion » 07 авг 2012, 19:41
Я заменил фильтр на калмана, убрал задержки и поигрался с пид, не получается, что-то стоять. Может действительно на шесте груз повесить?
Angel71 » 07 авг 2012, 19:49
врямя замеряли?