Я новичок в использовании 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);
}
}
Любые мысли о том, как я могу улучшить это? Было бы лучше использовать подпрограммы вместо задач и в чем преимущество использования подпрограмм или задач?
Создайте самую маленькую программу, в которой вы можете использовать мьютексы и с которыми вы столкнулись. Затем отправьте код. Без кода трудно дать хороший ответ. –
Вы видели [эту страницу] (http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/mutex.html)? Он дает четкое объяснение того, когда следует использовать мьютексы, и дает пример. – shea
Спасибо за ваши ответы! Да, я видел эту страницу, но я хочу точно знать, как работает мьютекс, и преимущества использования мьютексов над подпрограммами и наоборот. Я редактировал мой код вверху! –