2015-09-21 2 views
0

Я новичок в использовании nXc для кодирования моего робота NXT 2.0, и мне нужно, чтобы он следил за другими роботами и одновременно проверял препятствия. Однако две задачи иногда конфликтуют друг с другом, и когда я встречаю препятствие, оно рассматривает его как объект и продолжает двигаться вперед, а не останавливаться.Использование мьютексов для вызова отдельных задач nXc

Цель моего проекта: Следуйте за лидером-роботом, остановитесь, когда он встретит препятствие, и после того, как препятствие будет очищено, продолжайте следовать за лидером-роботом, который находится перед ним.

Ниже мой код:

#define NEAR 50 
    #define TURNTIME 540 
    #define MOVETIME 1000 

    mutex moveMutex; 

    //check for robot in front of it 
    task check_robot(void) 
    { 
     while(true) 
     { 
      if (SensorUS(IN_2)<=NEAR) 
      { 
       Acquire(moveMutex); 
       OnFwd(OUT_BC,50); //if it is within range of 50cm, move 
       Release(moveMutex); 
      } 
      if (SensorUS(IN_2)>NEAR) 
      { 
       Acquire(moveMutex); //this section allows the robot to turn 
       OnFwd(OUT_C,50);  //left and right to look for the 
       Wait(TURNTIME);  //leader 
       OnRev(OUT_B,50); 
       Wait(TURNTIME); 
       OnRev(OUT_C,50); 
       Wait(TURNTIME); 
       OnFwd(OUT_B,50); 
       Wait(TURNTIME); 
       if (SensorUS(IN_2)<=NEAR) 
       { 
         Acquire(moveMutex); 
         OnFwd(OUT_BC,50); //if it finds the leader, it moves 
         Release(moveMutex); 
       } 
       else 
       { 
         Acquire(moveMutex); 
         OnFwd(OUT_C,50);  //repeats the search process 
         Wait(TURNTIME); 
         OnRev(OUT_B,50); 
         Wait(TURNTIME); 
         OnRev(OUT_C,50); 
         Wait(TURNTIME); 
         OnFwd(OUT_B,50); 
         Wait(TURNTIME); 
         Release(moveMutex); 
       } 
      } 
      Release(moveMutex); 
     } 
    } 

    task check_obstacles(void) 
    { 
     Acquire(moveMutex); 
     until(((SENSOR_1)==1)||((SENSOR_3)==1)); //when any one of the 
     OnRev(OUT_BC,50);       //touch sensors are 
     Wait(1000);        //pressed, it is supposed 
     Off(OUT_BC);        //to stop until both 
     until(((SENSOR_1)==0)&&((SENSOR_3)==0)); //are released, then 
     OnFwd(OUT_BC,50);       //continue moving 
     Release(moveMutex); 
    } 

    task main(void) 
    { 
     SetSensorTouch(IN_1); 
     SetSensorUltrasonic(IN_2); 
     SetSensorTouch(IN_3); 
     SetSensorColorFull(IN_4); 

     while(true) 
     { 
      Precedes(check_robot,check_obstacles); 
     } 
    } 

Любые мысли о том, как я могу улучшить это? Было бы лучше использовать подпрограммы вместо задач и в чем преимущество использования подпрограмм или задач?

+2

Создайте самую маленькую программу, в которой вы можете использовать мьютексы и с которыми вы столкнулись. Затем отправьте код. Без кода трудно дать хороший ответ. –

+0

Вы видели [эту страницу] (http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/mutex.html)? Он дает четкое объяснение того, когда следует использовать мьютексы, и дает пример. – shea

+0

Спасибо за ваши ответы! Да, я видел эту страницу, но я хочу точно знать, как работает мьютекс, и преимущества использования мьютексов над подпрограммами и наоборот. Я редактировал мой код вверху! –

ответ

0

Вы не можете использовать вложенную функцию для получения той же самой переменной мьютекса, которая вызывает сбой в их задаче. Функция Acquire приостанавливает задачу до тех пор, пока переменная mutex не будет освобождена от этого link, чтобы прочитать, как вы понимаете, как работает инструмент. Извините, мой английский использовал goan tranlate. :)

+0

Спасибо, Лукас! Означает ли это, что я должен определять разные переменные мьютекса для каждой задачи? Кроме того, если я хочу, чтобы робот выполнял две вещи одновременно (в этом случае проверить лидера и проверить черную линию) было бы лучше использовать подпрограммы или мьютексы, если я не хочу, чтобы задачи столкнулись? –

Смежные вопросы