Objetivo
Decisão
Problemas Encontrados
Montagem
Gráficos
Demonstração
Exercícios
Seção 3.6.5
Seção 5.1.3
1 - Three-State:
while(1) {
sensor_l = analog(5);
if (sensor_l < limiar_perto) {
motor(0,100);
motor(2,50);
}
else if (sensor_l > limiar_longe) {
motor(0,70);
motor(2,70);
}
else {
motor(0,100);
motor(2,70);
}
}
2 - Hard-Turn X Gentle-Turn:
Hard-Turn:
while(1) {
sensor_l = analog(5);
if (sensor_l < limiar) {
motor(0,100);
motor(2,0);
}
else {
motor(0,0);
motor(2,100);
}
}
Gentle:
while(1) {
sensor_l = analog(5);
if (sensor_l < limiar) {
motor(0,80);
motor(2,0);
}
else {
motor(0,0);
motor(2,50);
}
}
3 - Three-State X Gentle-Turn X Hard-Turn
Descobrimos, pelos testes, que o método Three-State é o melhor dos três. Com os dois limiares ele conseguiu andar de forma mais suave entre os limiares, não chegando muito próximo ou muito distante da parede.
4 - Progressive
while(1) {
sensor_l = analog(5);
if (sensor_l < limiar) {
int pow_l = pow_l + (int)((limiar - sensor_l)*p_gain);
if (pow_l > 100) pow_l = 100;
if (pow_l < 50) pow_l = 50;
motor(0,pow_l);
motor(2,40);
}
else {
motor(0,70);
pow_r = pow_r + (int)((sensor_l - limiar)*p_gain);
if (pow_r > 100) pow_r = 100;
if (pow_r < 20) pow_r = 20;
motor(2, pow_r);
}
}
Seção 5.2.3
1 - Utilizamos dois Pgain em nosso PD, um para a roda esquerda e outro para a direita. Pgain_left = 5.0 e Pgain_right = 1.0. Tivemos de fazer isso pois nosso motor esquerdo é terrivelmente inferior ao nosso motor direito. Já o Dgain foi de 0.05 para ambos. Para chegar nestes valores apenas testamos o robô em linha errata e jogamos valores diferentes para então descobrir os melhores nos experimentos.
4 -
while (1) {
v_left = analog(2);
v_right = analog(3);
current_time = mseconds();
if (count_l >= count_goal) {
motor(0,0);
}
if (count_r >= count_goal) {
motor(2,0);
}
if (count_r >= count_goal && count_l >= count_goal){
kill_process(pid);
beep();
break;
}
if (v_left_old){
if (v_left < threshold - hysteresis){
count_l = count_l + 1;
current_time = mseconds();
speed_l = 1000.0 /(float)(current_time - msec_l);
msec_l = current_time;
pow_l = (int)(p_gain_l*(float)(count_goal - count_l) - d_gain*speed_l);
if (pow_l > 100) pow_l = 100;
if (pow_l < 65) pow_l = 65;
if (turn == -1) motor(0, -pow_l);
else motor(0, pow_l);
v_left_old = 0;
}
}
else {
if (v_left > threshold + hysteresis){
v_left_old = 1;
}
}
if (v_right_old){
if (v_right < threshold - hysteresis){
count_r = count_r + 1;
current_time = mseconds();
speed_r = 1000.0 /(float)(current_time - msec_r);
msec_r = current_time;
pow_r = pow_r + (int)((speed_l - speed_r)*p_gain_r);
if (pow_r > 100) pow_r = 100;
if (pow_r < 15) pow_r = 15;
if (turn == 1) motor(2, -pow_r);
else motor(2, pow_r);
v_right_old = 0;
}
}
else {
if (v_right > threshold + hysteresis){
v_right_old = 1;
}
}
}
Documentação
1 - Documentação tp3