คำตอบสั้น ๆ ไม่จริงคุณต้องทำสิ่งต่าง ๆ ค่อนข้างแตกต่างกันเล็กน้อย
คำตอบที่ไม่สมบูรณ์ยาว ให้ฉันให้รหัส psuedo ที่เหมาะสมสำหรับ 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 เพิ่งจะเข้าใหม่เมื่อไม่นานมานี้ จากงานมากกว่า 1 งานอาจมีความเสี่ยง (ปัญหาเรื่องเวลาของ I2C) และในบางกรณีมันไม่ใช่ (เซ็นเซอร์แบบสำรวจโดยอัตโนมัติ)
คุณสามารถเพิ่มการใช้งานลำดับความสำคัญของคุณเองไปยังลูปด้านบนตามที่คุณได้รับสิ่งที่ทำงาน แต่มันไม่จำเป็นสำหรับการเริ่มต้น
ความคิดเห็นของคุณ "// กล่องสิ่งกีดขวาง" อธิบายพฤติกรรมขีปนาวุธ สิ่งเหล่านี้เป็นเรื่องยุ่งยากเล็กน้อยที่จะนำมาใช้โดยใช้การทำงานแบบมัลติทาสกิ้ง การวนรอบที่เรียบง่ายที่ฉันใช้ทำให้ง่ายขึ้นมากและดีกว่าสำหรับการเริ่ม / การเรียนรู้
อีกสิ่งหนึ่งที่ฉันจะทิ้งไว้ให้คุณคือการสมัครสมาชิกในขณะที่เรียบร้อยและเหมาะสมกับสิ่งต่าง ๆ มากมายไม่ใช่วิธีที่ดีที่จะใช้สิ่งที่ทำได้ดีกว่าแบบดั้งเดิม แน่นอนส่วน 'หลีกเลี่ยง' อาจเป็นผู้สมัครที่ดีสำหรับการสมัครเข้าทำงาน แต่งานอื่น ๆ ของคุณควรถูกเรียกว่า 'GoOnAboutYourBusiness' ฉันพูดแบบนี้เพราะคุณอาจไม่ต้องการเปลี่ยนจากการค้นหาเป็นการติดตามด้วยการบอกรับสมาชิก จัดการกับผู้ที่มีลูปการเขียนโปรแกรมแบบดั้งเดิม ด้วยเซ็นเซอร์เดียว - แสงมีความรู้สึกเข้มหรือเบากว่าลูปสุดท้ายหรือไม่? ถ้ามันเข้มขึ้น (สมมติว่าเส้นสีดำ) เปลี่ยนทิศทางไปเรื่อย ๆ ถ้ามันเบาลงให้เลี้ยวไปทางอื่นถ้ามันยังคงอยู่เหมือนเดิมให้ตรงไป คุณอาจต้องเพิ่ม PID และใช้โค้งพวงมาลัยแทนการเลี้ยวซ้ายและขวาเพื่อให้นุ่มนวลขึ้น
และใช่เซ็นเซอร์หลายตัวช่วย http://www.mindsensors.com/ - ใช่นั่นคือฉันในภาพยนตร์ปัจจุบัน (11/10/2012)
อัปเดต: รหัสจริง
ฉันจะลองใช้เวลาซักครู่ แต่มันจะรวบรวมและอธิบายสิ่งที่ฉันเขียนไว้ด้านบน:
#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
เหมือนกัน ในฐานะมนุษย์ถ้าค่าเซ็นเซอร์สูงกว่าขีด จำกัด คุณจะทำอย่างไร หมุนวนหรือหมุนเพื่อปรับแต่งเส้น?