Java RobotC VEX/Lego编程:如何让机器人并行运行多个反应?

Java RobotC VEX/Lego编程:如何让机器人并行运行多个反应?,java,robot,nxt,mindstorms,Java,Robot,Nxt,Mindstorms,我需要让我的机器人能够使用通气开关,以便按下任何一个通气开关,并且只要按下通气开关,与该通气开关对应的电机就会运行。我遇到的问题是让LED正确点亮。当通气开关代码块运行时,我需要LED亮起并熄灭七次,每次光传感器值高于400,持续一秒钟。我该怎么做?请帮忙! 我的代码发布在下面: #pragma config(Sensor, in2, lightSensor, sensorReflection) #pragma config(Sensor, dgtl3, bumpSwitch,

我需要让我的机器人能够使用通气开关,以便按下任何一个通气开关,并且只要按下通气开关,与该通气开关对应的电机就会运行。我遇到的问题是让LED正确点亮。当通气开关代码块运行时,我需要LED亮起并熄灭七次,每次光传感器值高于400,持续一秒钟。我该怎么做?请帮忙! 我的代码发布在下面:

#pragma config(Sensor, in2,    lightSensor,    sensorReflection)
#pragma config(Sensor, dgtl3,  bumpSwitch,     sensorTouch)
#pragma config(Sensor, dgtl4,  bumpSwitch2,    sensorTouch)
#pragma config(Sensor, dgtl10, ledGreen,       sensorLEDtoVCC)
#pragma config(Sensor, dgtl11, ledRed,         sensorLEDtoVCC)
#pragma config(Motor,  port1,           leftMotor,     tmotorVex269, openLoop)
#pragma config(Motor,  port10,          rightMotor,    tmotorVex269, openLoop)

task main() {

while(true) {

    if (SensorValue(lightSensor) > 400) {
        int count = 0;
        while (count < 7) {
            turnLEDOn(ledGreen);
            turnLEDOn(ledRed);
            wait(1);
            turnLEDOff(ledGreen);
            turnLEDOff(ledRed);
            count++;
        }
    }

    while (SensorValue(bumpSwitch) == 0 && SensorValue(bumpSwitch2) == 0) {
        stopMotor(rightMotor);
        stopMotor(leftMotor);
    }

    while (SensorValue(bumpSwitch2) == 1) {
        startMotor(rightMotor, 55);
        startMotor(leftMotor, 55);
    }

    while (SensorValue(bumpSwitch) == 1){
        startMotor(rightMotor, -55);
        startMotor(leftMotor, -55);
    }
}
}
pragma配置(传感器、in2、光传感器、传感器反射) #pragma配置(传感器、dgtl3、bumpSwitch、sensorTouch) #pragma配置(传感器、dgtl4、bumpSwitch2、传感器触摸) #pragma配置(传感器、dgtl10、LED绿色、传感器LED至VCC) #pragma配置(传感器,dgtl11,发光二极管,传感器发光二极管VCC) #pragma配置(马达、端口1、左马达、tmotorVex269、openLoop) #pragma配置(马达,端口10,右马达,tmotorVex269,开环) 主要任务(){ while(true){ if(传感器值(光传感器)>400){ 整数计数=0; 而(计数<7){ 特纳顿(莱德格林); 特恩莱顿(莱德); 等待(1); 关闭LED(绿色LED); 关闭(LED红色); 计数++; } } while(传感器值(bumpSwitch)==0&&SensorValue(bumpSwitch2)==0){ 停止电机(右电机); 停止电机(左电机); } while(传感器值(开关2)==1){ 起动马达(右马达,55); 起动马达(左马达,55); } while(传感器值(开关)==1){ 起动马达(右马达,-55); 起动马达(左马达,-55); } } }
机器人编程的经验(尽管我没有使用机器人C)表明,要使机器人并行运行两个或多个传感器反应,必须以与仅一个反应截然不同的方式构造程序。Robot C教程没有介绍这一点,甚至没有介绍实现这一点所需的语言和库功能

在这种情况下,您希望灯光传感器触发持续1秒的LED开/关序列,而碰撞传感器触发电机动作,直到这些传感器不再碰撞为止

这里的问题是电机控制的内部
,而
回路阻塞了线程,主要是阻止它运行LED控制回路。LED控制回路同样会将线程阻塞7秒钟,从而使其无法运行电机控制回路

一般来说,机器人控制回路的每次迭代都应该读取传感器,发送输出命令,记住它以后需要处理的任何状态,然后再次循环,以便控制回路的所有部分都可以运行每个循环(尽可能频繁或以受控速率)。在传感器发生变化之前,不要停留在内部
回路中,而阻止控制流

第一步是解锁电机控制回路:

while (true) {

  // Light sensor LED control code ...

  // Bumper/motor control
  if (SensorValue(bumpSwitch) == 1) {
    startMotor(rightMotor, -55);
    startMotor(leftMotor, -55);
  } else if (SensorValue(bumpSwitch2) == 1){
    startMotor(rightMotor, 55);
    startMotor(leftMotor, 55);
  } else {
    stopMotor(rightMotor);
    stopMotor(leftMotor);
  }
}
现在,您当前的LED控制代码仍会调用
wait(1)
7次。根据
wait(1)
等待1.0秒,因此这部分代码当前需要7秒才能运行。检查通气开关之间需要很长时间

此外,您的代码在关闭指示灯和再次打开指示灯之间没有明显的延迟,因此在该序列结束之前,您不会注意到指示灯关闭

因此,第二步是修复LED控制代码,防止阻塞控制回路。基本上有两种方法(我不知道Robot C是否支持第一种选择,但它更简单):

  • 当光传感器在上一次迭代中高于阈值且低于阈值时,即它刚刚转换,然后启动[或“fork”]线程(或任务)以运行LED开/关循环。该线程应该循环7次:{打开LED,
    wait(1.0/14.0)
    seconds,关闭LED,然后
    wait(1.0/14.0)
    seconds}。这样,循环7周需要7*(1/14+1/14)=1.0秒。我把它写成
    1.0/14.0
    而不是
    1/14
    ,因为许多编程语言用整数数学计算
    1/14
    ,产生
    0
    ,而
    1.0/14.0
    使用浮点数学。我不知道机器人C。或者,你可以使用
    wait1Msec(71)
    等待71毫秒,也就是大约1/14秒
  • 使用变量通过闪烁LED回路跟踪序列。在主循环的每个循环中,使用
    if
    语句检查这些变量,如果是时间,则在闪烁LED循环中执行下一步,并更新这些变量。步骤是:当处于初始状态且光传感器高于阈值时打开LED,当1/14秒后关闭LED,当1/14秒后打开LED。。。在这些步骤中的14个之后,关闭并将跟踪变量设置回初始状态。最简单的跟踪变量是从0(初始状态)到14(执行最后一个LED“关闭”阶段)的计数器和上次更改的系统时钟值,以便让您检测时钟何时晚于该值71毫秒。完成步骤14后,返回0。跟踪变量有其他选择,例如3个单独的变量,用于确定当前是否闪烁、当前正在进行的7个闪烁周期中的哪一个、是否处于该周期的开启或关闭阶段以及时钟读数
  • 方法2更为棘手,因为同时做两件事很棘手。(那些认为自己可以在开车时发短信同时完成多项任务的人是危险的错误。)

    如果机器人不需要在LED闪烁时运行保险杠/电机控制回路,也就是说,如果它不介意在LED闪烁1秒时对保险杠无响应,则更简单的方法可以工作。如果那些保险杠传感器阻止机器人跑出桌子的末端,那么1秒钟内没有反应是个坏消息。但是
    while (true) {
      // Light sensor LED control code
      if (SensorValue(lightSensor) > 400) {
        for (int i = 0; i < 7; ++i) {
          turnLEDOn(ledGreen);
          turnLEDOn(ledRed);
          wait1Msec(71); // 1/14 second
          turnLEDOff(ledGreen);
          turnLEDOff(ledRed);
          wait1Msec(71);
        }
      }
    
      // Bumper/motor control code ...
    }
    
    //*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//
    
    task blink()
    {
    // Light sensor LED control code
    if (SensorValue(lightSensor) > 400) 
        {
        for (int i = 0; i < 7; ++i) {
            turnLEDOn(ledGreen);
            turnLEDOn(ledRed);
            wait1Msec(71); // 1/14 second
            turnLEDOff(ledGreen);
            turnLEDOff(ledRed);
            wait1Msec(71);
        }
    
    }
    
    
        task main()
        {
            startTask(blink);
            while (true)
                {
    
                // Light sensor LED control code ...
    
                // Bumper/motor control
                if (SensorValue(bumpSwitch) == 1) {
                    startMotor(rightMotor, -55);
                    startMotor(leftMotor, -55);
                    } else if (SensorValue(bumpSwitch2) == 1){
                    startMotor(rightMotor, 55);
                    startMotor(leftMotor, 55);
                    } else {
                    stopMotor(rightMotor);
                    stopMotor(leftMotor);
                }
            }
        }