2014-12-10 59 views
0

我有编码器反馈的机器人,以及i希望使用移动机器人一定距离的功能,并把它在一定的角度,因此,例如:如何将机器人移动一定距离并仍然管理传感器?

void loop(){ 

    if (Obstacle==false){ // if no obstacles 

     forward(1000); // move forward 1000 mm 
     backward(1000); // move backward 1000 mm 

     //... 
    } 
} 

正向功能:

void forward(int distance){ // distance in mm 

    int desiredRotationNumber= round(distance/circumference) ; 

    int desiredTicks = encoderResolution * desiredRotationNumber; 

    if (counter < desiredTicks) // variable counter counts the pulses from the encoder 
    { 
     analogWrite(motor,255); 
    } 
    else 
    { 
     analogWrite (motor,0); 
    } 

} 

问题是,如果我使用条件“如果”我的转发功能将只执行一次,然后程序跳转到下一个功能,但如果我使用“while循环”我的移动功能将正确执行,但我不会能够管理传感器或任何东西。

回答

2

你可能想要的是削减你的动作在递增,并检查传感器在这些增量之间:

while (distance > 0 && !Obstacle){ 
    forward(step); 
    distance-=step; 
    check_sensors(); 
} 

多线程,你可以把这些操作(移动和传感)异步工作,并使用某种事件发布来警告每个线程的变化。在这里,我们通过interwinding任务来模拟这个功能(你也可以查看协程来获得类似的,但更有效的想法)。

+0

美丽的谢谢你,如果我发现一个障碍比从我的移动功能将无法运行,但如果障碍走了路?我怎么能恢复从我停在最后一个移动功能的移动方向集? – Apastrix 2014-12-10 23:18:35

+0

我想你会需要一个机制来存储正在进行的移动列表(一个链接列表可能?),然后逐个拿出来。然后您可以从列表中轻松恢复。 – didierc 2014-12-10 23:22:35

+0

我会试一试,再次感谢。 – Apastrix 2014-12-10 23:25:11