짧은 대답; 아니, 당신은 정말로 약간 다르게 행동 할 필요가 있습니다.
긴 불완전한 답변; robotC에 적합한 의사 코드를 제공하면 더 나은 경로를 찾을 수 있습니다. 먼저, 작업을 사용하지 마십시오. 이것은 robotC 작업이 아닙니다. 그들은 아마도 작동하지 않을 수도 있습니다 (아마도 시도하지 않으려면 약간의 변경이 필요합니다).
// global variables
int distance;
int light;
main() {
while (true) {
distance = read_distance;
light = read_light;
if (task1_wantsToRun())
task1_run();
if (task2_wantsToRun())
task2_run();
}
}
여기 몇 가지가 있습니다. 우선 순위는 관련이 없습니다. 우선 순위가있는 robotC에 작업이있는 것처럼 좋지만 내 경험에 따라 Subsumption 구현에 적합하지 않습니다. 같은 이유로 우선 순위가 항상 존중되는 것은 아니며 작업을 중단 할 수 없으므로 (때로는) 우선 순위가 더 높은 이벤트가 발생할 때 예상대로 반응하지 않으며 robotC는 최근에 다시 진입 한 것이므로 센서 액세스와 같은 것들 둘 이상의 작업에서 위험이 발생할 수 있으며 (I2C 타이밍 문제) 경우에 따라 (자동 폴링 센서) 그렇지 않습니다.
작업을 수행함에 따라 위의 루프에 자신의 우선 순위 구현을 추가 할 수 있지만 실제로는 시작에 필요하지 않습니다.
귀하의 의견 "// 상자 방해물"은 탄도 행동을 설명합니다. 멀티 태스킹을 사용하여 구현하기에는 약간 까다 롭습니다. 내가 사용한 간단한 루프는 초보자 / 학습에 훨씬 쉽고 편리합니다.
내가 당신에게 남겨줄 또 다른 것은, 많은 것들에 깔끔하고 적절하면서도 포섭이 전통적으로 더 잘 수행되는 것을 구현하는 좋은 방법이 아니라는 것입니다. 실제로 '피하다'부분은 추정에 대한 좋은 후보가 될 수 있지만 솔직히 다른 작업은 'GoOnAboutYourBusiness'라고합니다. 나는 당신이 아마도 하위 추정으로 검색에서 다음으로 변경하고 싶지 않기 때문에 이것을 말합니다. 전통적인 프로그래밍 루프로 처리하십시오. 단일 센서를 사용하면 빛이 마지막 루프보다 어둡거나 밝습니까? 어두워 진 경우 (검은 색 선으로 가정) 같은 방향으로 계속 돌리고, 반대로 반대 방향으로 돌리면 동일하게 유지되면 똑바로 가십시오. 더 부드럽게하려면 왼쪽과 오른쪽으로 돌리는 대신 PID를 추가하고 조향 곡선을 사용해야합니다.
그리고 여러 센서가 도움이됩니다. http://www.mindsensors.com/- 예, 현재 영화에서 나입니다 (2012 년 11 월 10 일)
업데이트 : 실제 코드
나는 이것을 잠시 후에 시도 할 것이지만, 위에서 쓴 것을 컴파일하고 보여줍니다.
#pragma config(Sensor, S1, S_LIGHT, sensorLightActive)
#pragma config(Sensor, S2, S_DISTANCE, sensorSONAR)
#pragma config(Motor, motorB, LEFT, tmotorNXT, PIDControl, encoder)
#pragma config(Motor, motorC, RIGHT, tmotorNXT, PIDControl, encoder)
//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
int distance_value, light_value;
bool evade_wantsToRun()
{
return distance_value < 30;
}
void evade_task()
{
// full stop
motor[LEFT] = 0;
// evade the object ballistically (ie in full control)
// turn left, drive
nSyncedTurnRatio = 0;
motor[LEFT] = -20;
Sleep(500);
nSyncedTurnRatio = 100;
Sleep(1000);
// turn right, drive
nSyncedTurnRatio = 0;
motor[LEFT] = 20;
Sleep(500);
nSyncedTurnRatio = 100;
Sleep(1000);
// turn right, drive
nSyncedTurnRatio = 0;
motor[LEFT] = 20;
Sleep(500);
nSyncedTurnRatio = 100;
Sleep(1000);
// turn left, resume
nSyncedTurnRatio = 0;
motor[LEFT] = 20;
Sleep(500);
motor[LEFT] = 0;
}
///////////////////////////////
void TurnBySteer(int d)
{
// normalize -100 100 to 0 200
nSyncedTurnRatio = d + 100;
}
///////////////////////////////
typedef enum programPhase { starting, searching, following, finished };
programPhase phase = starting;
// these 'tasks' are called from a loop, thus do not need to loop themselves
void initialize()
{
nSyncedTurnRatio = 50;
nSyncedMotors = synchBC;
motor[LEFT] = 30; // start a spiral drive
phase = searching;
}
void search()
{
if (light_value < 24)
{
nSyncedTurnRatio = 100;
phase = following;
}
}
int lastLight = -1;
int currentSteer = 0;
void follow()
{
// if it is solid white we have lost the line and must stop
// if lightSensors detects dark, we are on line
// if it got lighter, we are going more off line
// if it got darker we are headed in a good direction, slow down turn in anticipation
// +++PID will be even smoother
if (light_value > 64)
{
motor[LEFT] = 0;
phase = finished;
return;
}
if (light_value < 24)
currentSteer = 0;
else if (light_value > lastLight)
currentSteer += sgn(currentSteer) * 1;
else // implied (light_value < lastLight)
currentSteer -= sgn(currentSteer) * 1;
TurnBySteer(currentSteer);
}
bool regularProcessing_wantsToRun()
{
return phase != finished;
}
void regularProcessing_task()
{
switch (phase)
{
case starting:
initialize();
break;
case searching:
search();
break;
case following:
follow();
}
}
task main()
{
// subsumption tasks in priority oder
while (true)
{
// read sensors once per loop
distance_value = SensorValue[S_DISTANCE];
light_value = SensorValue[S_LIGHT];
if (evade_wantsToRun())
evade_task();
if (regularProcessing_wantsToRun())
regularProcessing_task();
else
StopAllTasks();
EndTimeSlice(); // give others a chance, but make it as short as possible
}
}
StartTask
는 작업의 우선 순위입니까? 9가 최우선 순위가됩니까? 이 경우 ?find
보다 우선 순위가 높아서는 안됩니다track
. 실제로 조건find
과else
조건은track
동일합니다. 따라서 사람으로서 센서 값이 임계 값보다 크면 어떻게해야합니까? 나선형으로 가거나 선을 조정하기 위해 돌리시겠습니까?