roboforum.ru

Технический форум по робототехнике.

Робот балансер

Робот балансер

Spin7ion » 06 авг 2012, 13:35

Здравствуйте!

Сделал робота балансера, использующего комплементарный фильтр и пид регулятор.
Ездит он пока так:


Собственно вопрос, как можно улучшить стабильность?

Я предполагаю следующие варианты:
-поднять центр тяжести
-поиграться еще с PID
-изменить программно угол на который он выравнивается

Re: Робот балансер

Myp » 06 авг 2012, 14:20

чем ниже центр тяжести тем более неустойчивая система.

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

удлиннить робота и аккумулятор поднять повыше, или болтов железных на макушку добавить))

Re: Робот балансер

Angel71 » 06 авг 2012, 14:35

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

http://uarobots.com/build_robot/simple_robots/662-diy_wobblybot_a_simple_balancing_robot_step_by_step_instructions_on_creating

Re: Робот балансер

boez » 06 авг 2012, 18:39

Такое впечатление, что ни скорость, ни позиция у него не стабилизируются, так? Только держит равновесие, а скорость какая получится? В принципе, устойчивость неплохая, совсем небольшое перерегулирование чувствуется и все - но надо как-то дополнительно застабилизировать скорость. Я так понимаю, нужен регулятор, который по рассогласованию скорости меняет угол нулевого баланса (задание регулятору баланса) и на порядок медленнее самого регулятора баланса, чтоб процессу балансирования не мешать.

Re: Робот балансер

Spin7ion » 06 авг 2012, 18:51

WobblyBot это не перевернутый маятник. Wobbly работает как неваляшка ванька-встанька.

Добавлено спустя 2 минуты 15 секунд:
boez писал(а):Такое впечатление, что ни скорость, ни позиция у него не стабилизируются, так? Только держит равновесие, а скорость какая получится? В принципе, устойчивость неплохая, совсем небольшое перерегулирование чувствуется и все - но надо как-то дополнительно застабилизировать скорость. Я так понимаю, нужен регулятор, который по рассогласованию скорости меняет угол нулевого баланса (задание регулятору баланса) и на порядок медленнее самого регулятора баланса, чтоб процессу балансирования не мешать.


Скорость регулируется PID регулятором, зависит от отклонения от положения равновесия. Разве не так надо?

Re: Робот балансер

Angel71 » 06 авг 2012, 19:04

ой, и вправду не перевёрнутый. какая печалько. :sorry: а самое неприятное, что он при этом умудряется балансировать.
Последний раз редактировалось Angel71 06 авг 2012, 19:27, всего редактировалось 1 раз.

Re: Робот балансер

legion » 06 авг 2012, 19:27

Angel71, тогда и вкопанный в землю столб - балансер. Ваще равномерный! И умудряется балансировать.

Re: Робот балансер

Angel71 » 06 авг 2012, 19:37

не угадал. садись, двоечко.

Re: Робот балансер

Spin7ion » 06 авг 2012, 22:24

Кто-нибудь делал балансеры здесь?

Добавлено спустя 1 час 24 минуты 38 секунд:
Я сейчас добился подкруткой pid того, что робот стал лучше стоять, но он колеблется вокруг положения равновесия. Как можно улучшить это?

Re: Робот балансер

Angel71 » 06 авг 2012, 23:31

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

Re: Робот балансер

Spin7ion » 07 авг 2012, 00:15

Angel71 писал(а):вам не приходило в голову, что кроме вас никто не знает, что там за схема и какой код? гиро/аксель есть? мотором управляется с шим или без? а скорость регулируется? и т.д. или вы считаете, что все с отличием закончили курсы гадалок и на бис вам сейчас подскажут где чего как минимум в коде поменять?

Да, конечно вы не очень-то хорошо угадываете, как мы заметили :) . Все же настройка pid регулятора вроде имеет закономерности. Как я уже говорил, я добился некоторой стабилизации, но робот сильно осциллирует.

Может код, относящийся к пид и вправду поможет:

Код: Выделить всёРазвернуть
double balanceAt=1.31;//radians
float coeffP=5,coeffI=1,coeffD=2,coeffPID=10;
float lastError=0;
float integral=0;

void loop() {
readAverangeAcc();
 
double actualAngle=comp_filter(getAccAngle(),readAverangeGyroYRate()); 

long pid=updatePID(actualAngle,balanceAt);
lMotorSpeed=-pid;
rMotorSpeed=-pid; 
updateMotors();
lastTime=millis();

delay(10);
}

float updatePID(float current, float target){
   float dt=millis()-lastTime;
 
   float error=target-current;
     
        integral+=error*dt;
        integral=constrain(integral,-10,10);
   float derivative = (error - lastError)*1000/dt;
   Serial.print("D:");
   Serial.println(derivative);
   float output=coeffP*error+coeffI*integral+coeffD*derivative;

   lastError=error;
   
   return constrain(coeffPID*output, -255, 255);
}


Заранее спасибо

Re: Робот балансер

Dmitry__ » 07 авг 2012, 00:37

:ROFL:
Датчики-то кто? Может это лучшее что они могут дать :)
Судя по звуку шим, драйвер двигателей - что-то хреново-дешевое

Re: Робот балансер

Spin7ion » 07 авг 2012, 00:47

шим от arduino Mega(atmega2560) идет на драйвер L293D
Гироскоп: L3G4200D(цифра)
Акселерометер: MMA7361(аналог)

Добавлено спустя 51 секунду:
Моторы: http://amperka.ru/collection/Mehanika/product/Motorchik
Последний раз редактировалось Spin7ion 07 авг 2012, 01:01, всего редактировалось 1 раз.

Re: Робот балансер

Angel71 » 07 авг 2012, 00:57

Spin7ion писал(а):Да, конечно вы не очень-то хорошо угадываете, как мы заметили

пруф в студию.
Последний раз редактировалось Angel71 07 авг 2012, 00:58, всего редактировалось 1 раз.

Re: Робот балансер

Spin7ion » 07 авг 2012, 00:59

Вот код фильтра.
Код: Выделить всёРазвернуть
/********************************************************************
* Complimentary Filter
********************************************************************/
double filterAngle=1.50;
double dt=0.005;//0.002

double comp_filter(double newAngle, double newRate) {

double filterTerm0;
double filterTerm1;
double filterTerm2;
double timeConstant;

timeConstant=1; // default 1.0

filterTerm0 = (newAngle - filterAngle) * timeConstant * timeConstant;
filterTerm2 += filterTerm0 * dt;
filterTerm1 = filterTerm2 + ((newAngle - filterAngle) * 2 * timeConstant) + newRate;
filterAngle = (filterTerm1 * dt) + filterAngle;

return filterAngle; // This is actually the current angle, but is stored for the next iteration
}


Добавлено спустя 47 секунд:
Angel71 писал(а):
Spin7ion писал(а):Да, конечно вы не очень-то хорошо угадываете, как мы заметили

пруф в студию, где я угадывал?

Я про неваляшку. Извините, если обидел.


Rambler\'s Top100 Mail.ru counter