فهرست مطالب:

تبدیل اتاق خود به یک مریخ نورد: 5 قدم
تبدیل اتاق خود به یک مریخ نورد: 5 قدم

تصویری: تبدیل اتاق خود به یک مریخ نورد: 5 قدم

تصویری: تبدیل اتاق خود به یک مریخ نورد: 5 قدم
تصویری: گوز زدن پریانکا چوپرا هنرپیشه بالیوود در یکی از برنامه های لایف تلویزیونی |C&C 2024, دسامبر
Anonim
تبدیل Roomba خود به یک مریخ نورد
تبدیل Roomba خود به یک مریخ نورد

مرحله 1: مواد خود را جمع آوری کنید

برای تکمیل این پروژه ، باید مواد زیر را جمع آوری کنید:

1 ربات Roomba

1 کیت تمشک پای

1 دوربین فیلمبرداری

دسترسی به MATLAB

مرحله 2: جعبه ابزار Roomba را برای MATLAB بارگیری کنید

جعبه ابزار Roomba را برای MATLAB بارگیری کنید
جعبه ابزار Roomba را برای MATLAB بارگیری کنید
جعبه ابزار Roomba را برای MATLAB بارگیری کنید
جعبه ابزار Roomba را برای MATLAB بارگیری کنید

کد زیر را برای نصب جعبه ابزارهای لازم برای تکمیل این پروژه اجرا کنید.

تابع roombaInstall

clc؛

٪ لیست فایل ها برای نصب

files = {'roomba.m'، 'roombaSim.m'، 'roombaSimGUI.m'، 'roombaSimGUI.fig'}؛

٪ محل نصب از

options = weboptions ('CertificateFilename'، '')؛ ٪ به آن می گویند که الزامات گواهی را نادیده می گیرد

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/' ؛

dlgTitle = 'نصب/بروزرسانی Roomba'؛

٪ نمایش هدف و دریافت تأیید

سریع = {

"این برنامه این فایل های EF 230 Roomba را بارگیری می کند:"

''

strjoin (فایل ها ، '')

''

'به این پوشه:'

''

سی دی

''

'می خواهید ادامه دهید؟ '

};

بوق ؛

yn = questdlg (سریع ،…

dlg عنوان ،…

"بله" ، "نه" ، "بله") ؛

if ~ strcmp (yn ، 'Yes') ، return؛ پایان

٪ لیست پرونده های موجود را دریافت کنید

فایلهای موجود = فایلها (cellfun (exist، files)> 0) ؛

if ~ isempty (فایلهای موجود)

٪ مطمئن شوید که جایگزینی آنها واقعاً مناسب است

prompt = {'شما این فایلها را جایگزین می کنید:'

''

strjoin (فایلهای موجود ، '')

''

"خوب است جایگزین شود؟"

};

بوق ؛

yn = questdlg (سریع ،…

dlg عنوان ،…

"بله" ، "نه" ، "بله") ؛

if ~ strcmp (yn، 'Yes')، return؛ پایان

پایان

٪ بارگیری فایل ها

cnt = 0؛

برای i = 1: length (فایل ها)

f = فایل {i} ؛

disp (['' بارگیری 'f])؛

تلاش كردن

url = [سرور f]؛

websave (f، url، options)؛ ٪ گزینه برای جلوگیری از خطاهای امنیتی اضافه شده است

cnt = cnt + 1؛

گرفتن

disp (['خطا در بارگیری' f])؛

ساختگی = [f '.html']؛

در صورت وجود (ساختگی ، 'فایل') == 2

حذف (ساختگی)

پایان

پایان

پایان

اگر cnt == طول (فایل ها)

msg = 'نصب با موفقیت انجام شد'؛

waitfor (msgbox (msg، dlgTitle))؛

دیگری

msg = 'خطای نصب - برای جزئیات به پنجره فرمان مراجعه کنید'؛

waitfor (errordlg (msg، dlgTitle))؛

پایان

پایان٪ roombaInstall

مرحله 3: به Roomba خود متصل شوید

اکنون زمان آن رسیده است که با استفاده از WiFi به Roomba خود متصل شوید. با استفاده از 2 انگشت ، دکمه های Dock و Spot را همزمان فشار دهید تا Roomba شما روشن یا بازنشانی شود. سپس ، کد r = roomba (# Roomba خود) را در پنجره فرمان MATLAB اجرا کنید تا به ربات خود متصل شوید. پس از اجرای این دستور ، Roomba شما باید آماده حرکت باشد.

مرحله 4: نحوه کنترل اتاق خود را انتخاب کنید

انتخاب کنید چگونه می خواهید اتاق خود را کنترل کنید
انتخاب کنید چگونه می خواهید اتاق خود را کنترل کنید
انتخاب کنید چگونه می خواهید اتاق خود را کنترل کنید
انتخاب کنید چگونه می خواهید اتاق خود را کنترل کنید

به دو روش می توانید Roomba خود را کنترل کنید: به صورت خودکار یا استفاده از تلفن هوشمند به عنوان کنترل کننده.

اگر رانندگی رومبا را به صورت خودکار انتخاب می کنید ، باید از سه سنسور داخلی استفاده کنید: سنسورهای صخره ای ، سنسورهای برخورد و سنسورهای نور.

برای استفاده از تلفن هوشمند ، ابتدا باید با دنبال کردن مراحل زیر تلفن هوشمند خود را به رایانه وصل کنید.

توجه: برای اتصال صحیح ، رایانه و تلفن هوشمند شما باید در یک شبکه WiFi باشند!

1. برنامه MATLAB را از فروشگاه برنامه دستگاه خود بارگیری کنید.

2. "connector on" را در پنجره فرمان خود تایپ کرده و گذرواژه ای را تنظیم کنید که باید در هر دو دستگاه وارد شود.

3. پس از انجام این کار ، MATLAB آدرس IP رایانه های خود را به شما می دهد. باید به صفحه تنظیمات در برنامه MATLAB در تلفن هوشمند خود بروید و با استفاده از آدرس IP داده شده و گذرواژه ای که قبلاً وارد کرده اید ، یک رایانه اضافه کنید.

4. در پنجره فرمان رایانه خود ، کد m = mobiledev را تایپ کنید و این امر باعث می شود تلفن هوشمند شما به عنوان کنترل کننده Roomba شما راه اندازی شود.

5. رایانه و تلفن هوشمند شما باید آماده کار باشد.

مرحله 5: Roomba خود را رانندگی کنید

اکنون که همه ابزارهای لازم برای ایجاد Mars Rover خود را دارید ، آماده ایجاد کد خود هستید. ما کد زیر را برای رانندگی خودکار و رانندگی با تلفن هوشمند ضمیمه کرده ایم.

رانندگی مستقل

تابع Explore_modified (r)

٪ آرگومان های ورودی: 1 object roomba ، r

٪ آرگومان خروجی: هیچ

٪شرح:

تابع٪ از حلقه نامحدود در حالی که اجازه می دهد تا خودکار باشد استفاده می کند

٪ کاوش در اطراف ربات.

%

٪ funciton همچنین دستوراتی را به roomba ارائه می دهد که در آن باید چه کار کرد

٪ موارد زیر: تماس (ها) چرخ با زمین قطع می شود

object شیء در مقابل یا در دو طرف ربات تشخیص داده می شود ، و a

٪ افت ناگهانی در مقابل یا در هر دو طرف ربات تشخیص داده می شود.

%

instructions دستورالعمل های معمولی شامل دستورات حرکتی است که برای به حداکثر رساندن استفاده شده است

٪ اکتشاف یا اجتناب از خطر شناسایی شده و دستورات برقراری ارتباط

٪ اطلاعات مربوط به کشفیات ربات ها (تصاویر) ، موقعیت (نمودار) ،

٪ و وضعیت (هشدار گیر افتاده) با کاربر از طریق matlab و/یا ایمیل. چند

٪ دستورات صوتی برای لذت اضافه می شوند.

٪ راه اندازی قابلیت های ایمیل

mail = '[email protected]

رمز عبور = 'EF230Roomba'؛

setpref ("اینترنت" ، "SMTP_Server" ، "smtp.gmail.com") ؛

setpref ("اینترنت" ، "E_mail" ، نامه) ؛

setpref ("اینترنت" ، "SMTP_Username" ، نامه) ؛

setpref ('اینترنت' ، 'SMTP_Password' ، رمز عبور) ؛

props = java.lang. System.getProperties؛

props.setProperty ('mail.smtp.starttls.enable' ، 'true') ؛

props.setProperty ('mail.smtp.auth' ، 'true') ؛

props.setProperty ('mail.smtp.socketFactory.class' ، 'javax.net.ssl. SSLSocketFactory') ؛

props.setProperty ('mail.smtp.socketFactory.port' ، '465') ؛

٪ r = roomba (19)

r.epep ('G2 ^^ ، G2 ^^ ، G2 ^^ ، G2 ^^ ، A2 ^^ ، A2 ^^ ، G1 ^^ ، E1 ^^ ، C2 ^^ ، C2 ^^ ، C1 ^^ ، C1 ^^ ، D1 ^^ ، C1 ^^ ، D2 ^^ ، E4 ^^ ، G2 ^^ ، G2 ^^ ، G2 ^^ ، G2 ^^ ، A2 ^^ ، A2 ^^ ، G1 ^^ ، E1 ^^ ، C2 ^^ ، C2 ^^ ، C2 ^^ ، E1 ^^ ، E1 ^^ ، E1 ^^ ، D1 ^^ ، C4 ^^ ') ؛

v =.1 ؛

reflect_datum = 2700 ؛ ٪ مقدار مرجع سنسورهای صخره ای را تنظیم کنید

lightBumper_datum = 200 ؛ ٪ مقدار مرجع سنسورهای سپر نور تنظیم شده است

pos = [0، 0]؛ variable متغیر برای ذخیره موقعیت با مقداردهی اولیه

زاویه = 0 ؛ ٪ تنظیم زاویه مرجع

netangle = 0 ؛ درصد جابجایی زاویه خالص

i = 2 ؛ ٪ iterator برای افزودن سطر به متغیر ذخیره سازی موقعیت

dist = 0؛

r.setDriveVelocity (v ، v) ؛ ٪ start roomba حرکت به جلو

در حالی که حقیقت دارد

Cliff = r.getCliffSensors؛

Bump = r.getBumpers؛

Light = r.getLightBumpers؛

RandAngle = رندی ([20 ، 60] ، 1) ؛ ٪ 1 زاویه تصادفی بین 20 تا 60 درجه ایجاد می کند. برای جلوگیری از گیر افتادن ربات در یک حلقه استفاده می شود

٪ اگر یک یا چند چرخ تماس خود را با زمین قطع کرد ، چه باید کرد:

٪ توقف حرکت ، ارسال یک ایمیل هشداردهنده با تصویر محیط اطراف ،

٪ و از کاربر بخواهید که ادامه دهد یا منتظر کمک باشد

if Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r. توقف

dist = r.getDistance؛

pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = pos (i-1 ، 2) + dist * cosd (netangle) ؛ ٪ دریافت y مختصات

i = i+1 ؛

r.beep ('F#1 ^^، C1 ^^، F#1 ^^، C1 ^^، F#1 ^^، C1 ^^، F#1 ^^، C1 ^^، F#1 ^^ ، C1 ^^ ، F#1 ^^ ، C1 ^^ ، F#1 ^^ ، C1 ^^ ، F#1 ^^ ، C1 ^^ ')

img = r.getImage؛

imwrite (img، 'stuck.png')؛

%--------------------------

imfile = 'stuck.png'؛

موقعیت = savepos (pos) ؛

%---------------------------

sendmail (نامه ، "HELP!" ، "من روی صخره گیر کرده ام!" ، {imfile ، position})

list = {'ادامه' ، 'توقف'}؛

idx = menu ("چکار باید بکنم؟" ، لیست) ؛

اگر idx == 2

زنگ تفريح

پایان

٪ اگر شیئی در جلوی ربات تشخیص داده شود چه باید کرد:

٪ توقف ، حرکت به عقب ، عکس گرفتن ، کاربر را از کشف مطلع کنید

٪ از طریق ایمیل ، 90 درجه بپیچید و به کاوش ادامه دهید

elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1

r.stop ؛

dist = r.getDistance؛

pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = pos (i-1 ، 2) + dist * cosd (netangle) ؛ ٪ دریافت y مختصات

i = i+1 ؛

r.moveDistance (-. 125) ؛

dist = r.getDistance؛

pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = pos (i-1 ، 2) + dist * cosd (netangle) ؛ ٪ دریافت y مختصات

i = i+1 ؛

r.epep ('A1^، A1^، A4^، A2^، G2^، G2^، G4^، Bb2^، Bb2^، Bb3.5^، G1^، A8^')

img = r.getImage؛

imwrite (img ، 'FrontBump.png')

%--------------------------

imfile = 'FrontBump.png'؛

موقعیت = savepos (pos) ؛

%---------------------------

sendmail (نامه ، "هشدار!" ، "من چیزی پیدا کردم!" ، {imfile ، position})

زاویه = 90 ؛

netangle = netangle+angle؛

r.turnAngle (زاویه) ؛

r.setDriveVelocity (v ، v) ؛

٪ اگر شی در سمت چپ ربات تشخیص داده شود ، چه باید کرد:

٪ توقف ، چرخاندن به سمت شی ، پشتیبان گیری ، عکس گرفتن ، هشدار

٪ کاربر کشف شده از طریق ایمیل ، 90 درجه بپیچید و به کاوش ادامه دهید

elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1

r.stop ؛

dist = r.getDistance؛

pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = pos (i-1 ، 2) + dist * cosd (netangle) ؛ ٪ دریافت y مختصات

i = i+1 ؛

زاویه = 30 ؛

netangle = netangle+angle؛

r.turnAngle (زاویه) ؛

r.moveDistance (-. 125) ؛

dist = r.getDistance؛

pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = pos (i-1 ، 2) + dist * cosd (netangle) ؛ ٪ دریافت y مختصات

i = i+1 ؛

r.epep ('A4^، A4^، G1^، E1^، C3.5^، C2 ^^، C1^، C1^، C2^، D2^، D2^، E8^')

img = r.getImage؛

imwrite (img ، 'LeftBump.png')

%--------------------------

imfile = 'LeftBump.png'؛

موقعیت = savepos (pos) ؛

%---------------------------

sendmail (نامه ، "هشدار!" ، "من چیزی پیدا کردم!" ، {imfile ، position})

زاویه = -90 ؛

netangle = netangle+angle؛

r.turnAngle (زاویه) ؛

r.setDriveVelocity (v ، v) ؛

٪ اگر شی در سمت راست ربات تشخیص داده شود ، چه باید کرد:

٪ توقف ، چرخاندن به سمت شی ، پشتیبان گیری ، عکس گرفتن ، هشدار

٪ کاربر کشف شده از طریق ایمیل ، 90 درجه بپیچید و به کاوش ادامه دهید

elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1

r.stop ؛

dist = r.getDistance؛

pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = pos (i-1 ، 2) + dist * cosd (netangle) ؛ ٪ دریافت y مختصات

i = i+1 ؛

زاویه = -30 ؛

netangle = netangle+angle؛

r.turnAngle (زاویه) ؛

r.moveDistance (-. 125) ؛

dist = r.getDistance؛

pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = pos (i-1 ، 2) + dist * cosd (netangle) ؛ ٪ دریافت y مختصات

i = i+1 ؛

مکث (1.5) ؛

r.epep ('C1^، C1^، C2^، D2^، D2^، C8^')

img = r.getImage؛

imwrite (img ، 'RightBump.png')

%--------------------------

imfile = 'RightBump.png'؛

موقعیت = savepos (pos) ؛

%---------------------------

sendmail (نامه ، "هشدار!" ، "من چیزی پیدا کردم!" ، {imfile ، position}) ؛

زاویه = 90 ؛

netangle = netangle+angle؛

r.turnAngle (زاویه) ؛

r.setDriveVelocity (v ، v) ؛

٪ اگر صخره در سمت چپ ربات تشخیص داده شود ، چه باید کرد:

٪ توقف ، حرکت به عقب ، گردش به راست ، ادامه کاوش

elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum

r.stop ؛

dist = r.getDistance؛

pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = pos (i-1 ، 2) + dist * cosd (netangle) ؛ ٪ دریافت y مختصات

i = i+1 ؛

r.moveDistance (-. 125) ؛

dist = r.getDistance؛

pos (i، 1) = pos (i-1، 1) + dist * sind (netangle) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = pos (i-1 ، 2) + dist * cosd (netangle) ؛ ٪ دریافت y مختصات

i = i+1 ؛

زاویه = -RandAngle؛

netangle = netangle+angle؛

r.turnAngle (زاویه) ؛

r.setDriveVelocity (v ، v) ؛

٪ اگر صخره در سمت راست ربات تشخیص داده شود ، چه باید کرد:

٪ توقف ، حرکت به عقب ، گردش به چپ ، ادامه کاوش

elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum

r.stop ؛

dist = r.getDistance؛

pos (i ، 1) = dist * sind (زاویه) ؛ ٪ مختصات x را دریافت کنید

pos (i ، 2) = dist * cosd (زاویه) ؛ ٪ دریافت y مختصات

i = i+1 ؛

r.moveDistance (-. 125) ؛

angle = RandAngle؛

netangle = netangle+angle؛

r.turnAngle (زاویه) ؛

r.setDriveVelocity (v ، v) ؛

پایان

پایان

کنترل کننده گوشی های هوشمند

گزینه ها = {'خودکار "،" کنترل دستی "}

Prompt = menu ("چگونه می خواهید مریخ نورد را کنترل کنید؟" ، گزینه ها)

m = mobiledev

r = roomba (19)

اگر سریع == 1

کاوش (r)

دیگری

در حالی که حقیقت دارد

مکث (.5)

PhoneData = m. جهت

Azi = PhoneData (1) ؛

پیچ = PhoneData (2) ؛

سمت = PhoneData (3) ؛

اگر طرف> 130 || در صورت ورق خوردن تلفن به طرف پایین -130 the ، roomba را متوقف کرده و حلقه خروج را قطع کنید

r. توقف

r.epep ('C، C، C، C')

زنگ تفريح

elseif Side> 25 && Side <40٪ اگر تلفن بین 25 تا 40 درجه به طرف دیگر بچرخد ، 5 درجه به چپ بپیچید

r.turnAngle (-5) ؛

elseif Side> 40٪ اگر تلفن بیش از 40 درجه به طرف دیگر بچرخد ، 45 درجه به چپ بپیچید

r.turnAngle (-45)

elseif Side -40٪ اگر تلفن بین -25 تا -40 درجه به طرف دیگر بچرخد 5 درجه به راست بپیچید

r.turnAngle (5) ؛

elseif <-40٪ اگر تلفن کمتر از -40 درجه به طرف دیگر بچرخد 45 درجه به چپ بپیچید

r.turnAngle (45)

پایان

If اگر تلفن در نزدیکی عمود نگه داشته شود ، تصویری بگیرید و آن را رسم کنید

اگر پیچ <-60 && تصویر <= 9

r.epep

img = r.getImage؛

فرع فرعی (3 ، 3 ، تصویر)

نمایش (img)

پایان

٪ بر اساس جهت جلو و عقب به جلو و عقب حرکت می کند

اگر Pitch> 15 && Pitch <35٪ اگر گام بین 15 تا 35 درجه به جلو حرکت می کند مسافت کوتاه

٪ قبل از حرکت داده های سپر نور را دریافت کنید

litBump = r.getLightBumpers؛

if litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> اگر چیزی در جلوی اتاق باشد و اگر به جلو حرکت کند صدا ایجاد می کند و پیام را نمایش می دهد 500٪

r.beep ('C ^^، F#^، C ^^، F#^')

else٪ move

r.moveDistance (.03) ؛

data دریافت اطلاعات سپر پس از حرکت

Bump = r.getBumpers؛

اگر Bump.right == 1 || Bump.left == 1 || Bump.front == 1

r.epep ('A، C، E')

r.moveDistance (-. 01)

پایان

٪ دریافت اطلاعات سنسور صخره

Cliff = r.getCliffSensors؛

اگر Cliff.left> 1500 || Cliff.left جلو> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 if اگر چیزی باعث ایجاد حسگر صخره شود ، آن را مانند گدازه و پشتیبان بگیرید

r.epep ('C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C')

r.moveDistance (-. 031)

پایان

پایان

elseif Pitch> 35٪ اگر گام بیشتر از 35 درجه بیشتر مسافت طولانی تری را به جلو حرکت دهید

٪ قبل از حرکت داده های سپر نور را دریافت کنید

litBump = r.getLightBumpers؛

if litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> اگر چیزی در جلوی اتاق باشد و اگر به جلو حرکت کند صدا ایجاد می کند و پیام را نمایش می دهد

r.beep ('C ^^، F#^، C ^^، F#^')

else٪ move

r.moveDistance (.3)

data دریافت اطلاعات سپر پس از حرکت

Bump = r.getBumpers؛

اگر Bump.right == 1 || Bump.left == 1 || Bump.front == 1٪ در صورت ضربه زدن به چیزی باعث ایجاد سر و صدا ، نمایش پیام و پشتیبان گیری می شود

r.epep ('A، C، E')

r.moveDistance (-. 01)

پایان

٪ پس از حرکت داده های سنسور صخره را دریافت می کنند

Cliff = r.getCliffSensors؛

اگر Cliff.left> 1500 || Cliff.left جلو> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 if اگر چیزی باعث ایجاد حسگر صخره شود ، آن را مانند گدازه و پشتیبان بگیرید

r.epep ('C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C')

r.moveDistance (-. 31)

پایان

پایان

elseif Pitch -35٪ اگر گام بین -15 تا -35 درجه سانتیگراد به مسافت کوتاه برمی گردد

r.moveDistance (-. 03) ؛

٪ پس از حرکت داده های سنسور صخره را دریافت می کنند

Cliff = r.getCliffSensors؛

اگر Cliff.left> 1500 || Cliff.left جلو> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 if اگر چیزی باعث ایجاد حسگر صخره شود ، آن را مانند گدازه و پشتیبان بگیرید

r.epep ('C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C')

r.moveDistance (.04)

پایان

elseif Pitch -60٪ اگر گام بین -35 تا -60 درجه سانتیگراد به مسافت طولانی تری حرکت کند

r.moveDistance (-. 3)

٪ پس از حرکت داده های سنسور صخره را دریافت می کنند

Cliff = r.getCliffSensors؛

اگر Cliff.left> 1500 || Cliff.left جلو> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 if اگر چیزی باعث ایجاد حسگر صخره شود ، آن را مانند گدازه و پشتیبان بگیرید

r.epep ('C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C، C ^^، C')

r.moveDistance (.31)

پایان

پایان

پایان

پایان

توصیه شده: