সংক্ষিপ্ত উত্তর; না আপনাকে কিছুটা আলাদাভাবে করা দরকার।
দীর্ঘ অপূর্ণ উত্তর; আমি আপনাকে রোবটসির জন্য উপযুক্ত কিছু স্যুইডো কোড দেব যা এটি আপনাকে আরও ভাল পথে চালিত করে। প্রথমত, টাস্কগুলি ব্যবহার করবেন না - এটি রোবটসি কাজের জন্য নয়। এগুলি কাজ করার জন্য তৈরি হতে পারে, সম্ভবত নাও হতে পারে (এবং চেষ্টা করার জন্য আপনার বেশ কয়েকটি পরিবর্তন দরকার)।
// 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();
}
}
এখানে বেশ কয়েকটি জিনিস রয়েছে; অগ্রাধিকার অপ্রাসঙ্গিক হয়ে যায়। অগ্রাধিকার সহ রোবটসিতে কাজগুলি যেমন মনে হয় ঠিক তত সুন্দর, তারা আমার অভিজ্ঞতায় সাবস্ক্রিপশন বাস্তবায়নের জন্য ভাল পছন্দ নয়। এর মতো কারণে, অগ্রাধিকার সর্বদা সম্মানিত হয় না, কার্যগুলিতে বাধা দেওয়া যায় না (কখনও কখনও) সুতরাং যখন কোনও উচ্চ অগ্রাধিকারের ঘটনাটি ঘটে তখন এটি আপনার প্রত্যাশা মতো প্রতিক্রিয়া করে না, রোবটসি সম্প্রতি সম্প্রতি পুনরায় প্রবেশকারী হয়ে ওঠে, সুতরাং সেন্সর অ্যাক্সেস করার মতো জিনিসগুলি 1 টিরও বেশি টাস্ক থেকে ঝুঁকিপূর্ণ (আই 2 সি টাইমিং ইস্যু) হতে পারে এবং কিছু ক্ষেত্রে এটি (স্বয়ংক্রিয়ভাবে সেন্সর পোলড) হয় না।
জিনিসগুলি কাজ করতে করতে আপনি উপরের লুপটিতে আপনার নিজের অগ্রাধিকার বাস্তবায়ন যুক্ত করতে পারেন তবে এটি শুরু করার জন্য সত্যই প্রয়োজন হয় না।
আপনার মন্তব্য "// বক্স বাধা" একটি ব্যালিস্টিক আচরণ বর্ণনা করে। এগুলি মাল্টি-টাস্কিং ব্যবহার করে প্রয়োগ করা কিছুটা জটিল। আমি যে সাধারণ লুপটি ব্যবহার করেছি এটি এটিকে অনেক সহজ এবং প্রারম্ভিক / শেখার জন্য আরও ভাল করে তোলে।
আমি আপনাকে অন্য যে জিনিসটি রেখে যাচ্ছি, তা হ'ল পরিচ্ছন্নতা এবং অনেক কিছুর জন্য উপযুক্ত হওয়ার পরেও, traditionতিহ্যগতভাবে আরও ভালভাবে কী করা হয় তা কার্যকর করার কোনও ভাল উপায় নয়। প্রকৃতপক্ষে 'এ্যাডে' অংশটি গ্রাহকের পক্ষে ভাল প্রার্থী হতে পারে তবে সত্যই আপনার অন্য কাজটিকে 'GoOnAboutYourBusiness' বলা উচিত। আমি এটি বলছি কারণ আপনি সম্ভবত অনুসন্ধান থেকে সাবস্ক্রিপশন অনুসরণ করে পরিবর্তন করতে চান না। Traditionalতিহ্যবাহী প্রোগ্রামিং লুপগুলি সহ তাদের পরিচালনা করুন। একটি একক সেন্সর সহ, - শেষ লুপের চেয়ে হালকা সংবেদকটি আরও গাer় বা হালকা হয়? যদি এটি গাer় হয়ে যায় (কৃষ্ণরেখাকে ধরে নিচ্ছে) একই দিকে ঘুরতে থাকুন, যদি এটি হালকা হয়ে যায় অন্যভাবে, যদি একই থাকে তবে সোজা হয়ে যান। আপনার সম্ভবত কিছু পিআইডি যুক্ত করতে হবে এবং মসৃণ হওয়ার জন্য কেবল বাম এবং ডানদিকে ঘোরার পরিবর্তে একটি স্টিয়ারিং বক্র ব্যবহার করতে হবে।
এবং হ্যাঁ, একাধিক সেন্সর সহায়তা করে। 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
একই। সুতরাং, একটি মানুষ হিসাবে, সেন্সর মান যদি প্রান্তিকের চেয়ে বড় হয়, আপনি কি করবেন? সর্পিল যেতে বা লাইন সামঞ্জস্য করতে চালু?