PDA

View Full Version : روبات مسیر یاب



system32
جمعه 05 تیر 1388, 07:14 صبح
گفتم سوالم را تو تاپیک قبلی مطرح کنم به خودم گفتم سوالم با موضوع تاپیک جور در نمی یاد. در ضمن بگم سرچم کردم یه سری مباحث هوش مصنوعی اومد. به همین خاطر این تاپیک را ایجاد کردم. بریم سر اصل مطلب:

دوستان چطور می شه کاری کرد که اگه یه باتن داشته باشین و یه مسیر (به فرض خط)، این باتن روی این خط شروع به حرکت کنه. (به صورت اتوماتیک یا دستی)


http://barnamenevis.org/forum/attachment.php?attachmentid=32349&stc=1&d=1245985994

dehghanimeh
جمعه 05 تیر 1388, 09:16 صبح
سلام
روبات مسیر یاب به صورت عملی به این گونه عمل می کنه
ابتدا چشم یا همان سنسور اصلی روبات روی ابتدای مسیر قرار می گیره
چرخ عقب روبات دو موتور جدا داره به این معنی که برای چرخش به یک سمت
کافیه یکی از موتورها کمی کند تر یا تند تر از دیگری بچرخه که در نهایت باعث
چرخیدن روبات میشه دقیقا مثل تانک
موقعی که روبات روشن میشه سرعت هر دو چرخ عقب یکیه تا زمانی که سنسور
پیام بده که خط داره مثلا به سمت چپ سنسور هدایت می شه و به این معنی هست که
خط به سمت چپ پیچش دارد درنتیحه روبات برای پرخش به چپ ،باید چرخ سمت چپ عقب
اون کمی کند تر بچرخه و تا اونجا که سنسور پیام بده تماما روی خط قرار دارد
و تمام این فعالیت برای سمت راست
موفق باشید

vandermond
جمعه 05 تیر 1388, 10:09 صبح
فكر ميكنم اينكه به اين صورت يك خط مشخص كنيد و بخواهيد كه روي اون حركت كنه نميشه(البته با امكانات عادي VS) ولي شما ميتونيد براي اون شرط بزاريد كه مثلا فاصله از چپ رو يكي يكي زياد كن تا وقتي كه مثلا به عدد 500 رسيدي. اگه به 500 (يا بزرگتر از 500 (براي وقتي كه چند تا چندتا فاصله رو تغيير ميدي))، مثلا فاصله از بالا رو زياد كن و ... . اگه ميخواي كه مثلا كاربر يك خط بكشه و باتن روي اون راه بره، هم ميتوني معادله هر تكه خط رو بدست بياري و طبق اون حركتش رو مشخص كني.
اگه توضيح بيشتري ميخواي بگو.

system32
جمعه 05 تیر 1388, 10:09 صبح
دوست عزیز ممنون از توضیحاتتون. ولی منظور من ربات مسیریاب واقعی نیست. بلکه من می خواهم این مورد را شبیه سازی کنم. دلیل نامگذاری تاپیک به این نام این بود که می خواهم کاری شبیه به ربات مسیریاب انجام دهم. در واقع می خواهم به فرض یک باتن (یا هر شی دیگری) را در مسیر یک خط حرکت بدهم.

system32
جمعه 05 تیر 1388, 10:12 صبح
لطفا توضیح بیشتر همراه با کد ارائه دهید. ممنون.

vandermond
جمعه 05 تیر 1388, 10:50 صبح
اين كد يه چيزي شبيه اون شكلي كه شما گذاشتين رو طي ميكنه. (البته براي كم كردن سرعت هم ميتونيد از كد هاي مخصوص خودش استفاده كنيد)

private void btnRobot_Click_1(object sender, EventArgs e)
{
//Go right while Robot.Left <=500
do
{
btnRobot.Left++;
} while (btnRobot.Left <= 500);

//Go down while Robot.Top <=300
do
{
btnRobot.Top++;
} while (btnRobot.Top <= 300);
}
براي اينكه كاربر خط بكشه هم زياد سخت نيست. معادله هر تكه خط رو كه به راحتي بدست مياري و بعد مثل كد بالا كار ميكني. (ميتوني همزمان هم فاصله از چپ و هم از بالا رو تغيير بدي)

system32
جمعه 05 تیر 1388, 11:37 صبح
دوست عزیز کد بالا واقعا جالبه. ولی من می خواهم اون روی یه خط حرکت کنه. بنده منظور شما را از این جمله: معادله هر تكه خط رو كه به راحتي بدست مياري و بعد مثل كد بالا كار ميكني. متوجه نمی شوم. اگه یه مثال لطف کنی و بزاری ممنون می شم.

mirage041
جمعه 05 تیر 1388, 12:22 عصر
با فرض اینکه میز ما شبیه به یک ماتریس دو بعدی هستش و ما نقطه شروع مثلا صفر و صفر داریم با جستجویه فعال بودن 3 نقطه بالا پایین جلو فکر کنم بشه به هدف رسید ( از لحاظ تئوری )

vandermond
جمعه 05 تیر 1388, 12:41 عصر
دوباره سلام.
اين كد رو ببين. هرضريبي كه براي معادله خط بهش بدي a0,a1,... بر اساس اون حركت ميكنه. براش Sleep هم گذاشتم كه حركتش رو بهتر ببيني:

private void btnRobot_Click_1(object sender, EventArgs e)
{
int X;
double a0=5,a1=5,a2=1,a3=0/* ,...,an */; //معادله خط: Y=a(n)*X^n + a(n-1)*X^(n-1)+...+a0
do
{
System.Threading.Thread.Sleep(1);
btnRobot.Left++;
X=btnRobot.Left/20;
btnRobot.Top = Convert.ToInt32( a0+ a1 * X + a2 * Math.Pow(X,2) + a3 * Math.Pow(X,3));
} while (btnRobot.Left <= 700);
}
درباره بدست آوردن معادله هم ميتوني با روش هاي رياضي از دو نقطه از قطعه خط ها (هر تكه اي كه يك خط راست باشه) رو بدست بياري و بزاري توي معادلات بالا.
اگه باز هم مشكلي بود در خدمت هستم.

system32
جمعه 05 تیر 1388, 14:58 عصر
سلام.

دوست عزیز ببین به فرض کاربر با وارد کردن مختصات x و y عرض و طول مانند زیر خطی را رسم می کند:




Graphics graph;
graph = Form1.ActiveForm.CreateGraphics();
Pen pen1 = new Pen(Color.Blue, 3);
graph.DrawLine(pen1, 300, 200, 100, 100);


حالا طبق گفته شما با توجه به این مثال، چطوری می توانم مختصات مربوطه را بهش بدم و شی روی این خط حرکت کند. حالا a0 و ... در این مثال چندند؟ لطفا روی این مثال توضیح دهید. ممنون

vandermond
جمعه 05 تیر 1388, 17:48 عصر
a0وa1,... ضرايب به ترتيب X^0 و X^1 و... هستند كه تو كدي كه گفتم يك مقدار فرضي بهشون دادم ولي شما هر مقداري كه بديد باتن طبق اون معادله حركت ميكنه.
براي اينكه روي اين خط كه من نقطه اولش رو (x1,y1) و نقطه دومش رو (x2,y2) گرفتم ، حركت كنه ميتوني از كد زير استفاده كني.(البته من وسط باتن رو روي خط قرار دادم) (اگه خودتون يه خورده رو الگوريتم كار كنيد حتما اينو خودتون هم ميتونيد بنويسيد): (البته يه خورده از خط جدا ميشه و احتمالا به خاطر تبديل عدد صحيح و اعشاري و اينا هستش كه خودتون ميتونيد درستش كنيد):

int x1 = 2, //طول نقطه اول
y1 = 4, //عرض نقطه اول
x2 = 500, //طول نقطه دوم
y2 = 546; //عرض نقطه دوم
double y; // عرض نقطه وسط باتن
btnRobot.Left = x1 - btnRobot.Width / 2;
btnRobot.Top = y1 - btnRobot.Height / 2;

Graphics graph;
graph = Form1.ActiveForm.CreateGraphics();
Pen pen1 = new Pen(Color.Blue, 1);
graph.DrawLine(pen1, x1, y1, x2, y2);
double m = (y1 - y2) / (x1 - x2);

do
{
System.Threading.Thread.Sleep(10);
btnRobot.Left++;
y = m * (btnRobot.Left + (double) (btnRobot.Width / 2) - x1) + y1;
btnRobot.Top = Convert.ToInt32( y - btnRobot.Height / 2);

} while (btnRobot.Left <= 400);

system32
جمعه 05 تیر 1388, 18:05 عصر
ممنون از شما. واقعا کد عالیه. فقط یه سوالی چرا وقتی باتن حرکت می کنه خط را نیز با خودش پاک می کنه.

vandermond
جمعه 05 تیر 1388, 19:56 عصر
راستش خودم هم نميدونم چرا . البته ميدونم چرا (چون خط روي فرم ست نشده و با گذشتن باتن قاعدتا اينطوري ميشه) ولي نميدونم چه طور درست ميشه(البته اين رو هم ميشه هر دفعه(تو Do-While)ميگي دوباره خط رو هم بكشه) يعني منظورم اين هستش كه تو VB يك پراپرتي براي فرم داره به نام AutoRedraw كه به راحتي اين مشكل رو حل ميكنه(True ميكنيش حل ميشه) ولي نميدونم توي سي شارپ همچين چيزي هست؟ (اينو ديگه واقعا نميدونم:گریه:)
ببخشيد. اگه پيدا كردم حتما اينجا ميگم.