تابع حرکتی

برای اینکه بتوانیم الگوریتم‌های مختلف برای بازی فوتبال پیاده سازی کنیم باید توابعی بسازیم که به وسیله آنها ربات را کنترل کنیم. بهتر است این توابع را داخل فایل utils.py بنویسیم. زیرا این توابع بین هر سه ربات مشترک هستند و نیازی نیست سه بار این برنامه را تکرار کنیم. از طرفی دیگر اگر در آینده نیاز به تغییر یا اضافه کردن دستورات باشد به راحتی این کار در فایل utils.py صورت می‌گیرد و لازم نیست سه بار این تغییرات را برای سه ربات مختلف اعمال کنیم. وقتی تابعی در فایل utils.py تعریف می‌کنیم باید بدانیم که کدام یک از ربات‌ها مد نظرمان است. به عنوان مثال اگر تابعی به نام stop() داشته باشیم باید بدانیم که کدامیک از ربات ها باید این تابع را اجرا کند. پس باید متغیری به نام robot به عنوان اولین ورودی این تابع در نظر داشته باشیم و این متغییر را برای همه توابعی که در آینده در فایل utils.py تعریف خواهیم کرد به عنوان ورودی قرار می‌دهیم.

تابع stop

با استفاده از این تابع می‌توان به ربات دستور داد سرعت موتورهای چپ و راست را برابر صفر قرار دهد. اینکار باعث ایستادن ربات خواهد شد.

utils.py
from math import *

def stop(robot):
    robot.left_motor.setVelocity(0)
    robot.right_motor.setVelocity(0)
robot1.py
from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP
from utils import *

class MyRobot1(RCJSoccerRobot):
    def run(self):
        while self.robot.step(TIME_STEP) != -1:
            if self.is_new_data():
                stop(self)

تابع motor

پیش از این دیدیم که سرعت هر کدام از موتورها باید بین -10 و 10 باشد و اگر خارج از این محدوده باشد با هشدار حداکثر سرعت در نرم افزار webots مواجه می‌شویم. بدین منظور تابعی به صورت زیر می‌نویسیم که هم سرعت جفت موتورهای چپ و راست را باهم از ورودی دریافت کند و هم شرط محدوده مجاز سرعت را رعایت کند.

utils.py
from math import *

def stop(robot):
    robot.left_motor.setVelocity(0)
    robot.right_motor.setVelocity(0)

def motor(robot, left_speed, right_speed):
    if left_speed > 10: left_speed = 10
    if left_speed < -10: left_speed = -10
    if right_speed > 10: right_speed = 10
    if right_speed < -10: right_speed = -10
    robot.left_motor.setVelocity(left_speed)
    robot.right_motor.setVelocity(right_speed)

تابع move

در نهایت یکی از پرکاربردترین تابع هایی که در تمامی الگوریتم‌ها از آن استفاده خواهیم کرد تابع move است. این تابع دو عدد از ورودی می‌گیرد که بیانگر مختصات نقطه مقصد است. سپس سرعت موتورها را نسبت به موقعیت ربات نسبت به نقطه مقصد مشخص می‌کند. برای اینکار زاویه بین ربات و نقطه مقصد محاسبه می‌شود و سپس اختلاف زاویه فعلی ربات با زاویه مقصد به عنوان سرعت دورانی به موتورها داده می‌شود.

utils.py
from math import *

def stop(robot):
    robot.left_motor.setVelocity(0)
    robot.right_motor.setVelocity(0)

def motor(robot, left_speed, right_speed):
    if left_speed > 10: left_speed = 10
    if left_speed < -10: left_speed = -10
    if right_speed > 10: right_speed = 10
    if right_speed < -10: right_speed = -10
    robot.left_motor.setVelocity(left_speed)
    robot.right_motor.setVelocity(right_speed)

def move(robot, xt, yt):
    gps = robot.get_gps_coordinates()
    heading = degrees(robot.get_compass_heading())
    xr = gps[0] # robot x
    yr = gps[1] # robot y
    e = degrees(atan2(xr -xt, yt - yr)) - heading
    if e > 180: e -= 360
    if e <-180: e += 360
    motor(robot, 10 + e, 10 - e)
robot1.py
from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP
from utils import *

class MyRobot1(RCJSoccerRobot):
    def run(self):
        while self.robot.step(TIME_STEP) != -1:
            if self.is_new_data():
                move(self, 0, 0)

تمرین 13: برنامه ای بنویسید که، همه ربات ها به جلوی دروازه بروند و یک آرایش دفاعی مقابل دروازه خود بگیرند.

تمرین 14: برنامه ای بنویسید که، همه ربات ها در یک آرایش دفاعی جلوی دروازه قرار بگیرند و هنگامی که به جای خود رسیدند به سمت دروازه حریف نگاه کنند.

تمرین 15: برنامه ای بنویسید که، یکی از ربات ها روی محیط یک مثلث فرضی حرکت کند.

دیدگاه کاربران

1000 دیدگاه
4.7 (میانگین امتیاز کاربران)