سنسور تشخیص توپ

سنسور تشخیص توپ به ما جهت توپ نسبت به ربات و فاصله آن از ربات را می‌دهد. جهت توپ یک بردار نرمال با سه مولفه x و y و z می‌باشد.اندازه بردار نرمال همیشه برابر 1 است. با استفاده از یک رابطه مثلثاتی ساده می‌توان زاویه توپ را بر حسب رادیان یا درجه بدست آورد. خروجی این سنسور یک دیکشنری با دو عضو direction و strength بوده و برای خواندن خروجی سنسور از دستور self.get_new_ball_data() استفاده می‌کنیم. پیش از استفاده از این دستور باید در یک شرط بررسی کنیم که توپ توسط سنسور دیده شده یا خیر. بدین منظور از تابع self.is_new_ball_data() استفاده می‌کنیم. کد زیر نحوه خواندن سنسور و چاپ مقدار خروجی را نشان می‌دهد.

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():
                if self.is_new_ball_data():
                    ball_data = self.get_new_ball_data()
                    print(ball_data)
                else:
                    print('No Ball')

محاسبه مختصات توپ

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

robot1.py
from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP
from utils import *

class MyRobot1(RCJSoccerRobot):
    def run(self):
        xb = 0
        yb = 0
        while self.robot.step(TIME_STEP) != -1:
            if self.is_new_data():
                gps = self.get_gps_coordinates()
                heading = self.get_compass_heading()
                xr = gps[0]
                yr = gps[1]
                if self.is_new_ball_data():
                    ball_dir = self.get_new_ball_data()['direction']
                    ball_angle = degrees(atan2(ball_dir[1], ball_dir[0]))
                    ball_distance = abs(0.0166666666/(abs(ball_dir[2])/sqrt(1 - ball_dir[2]**2)))
                    xb = -sin(radians(ball_angle + heading)) * ball_distance + xr
                    yb = cos(radians(ball_angle + heading)) * ball_distance + yr
                    print(xb, yb)
                else:
                    print('No Ball')

تمرین 16: برنامه ای بنویسید که، یکی از ربات ها اگر توپ را دید به طرف آن حرکت کند و در غیر این صورت به مختصات وسط دروازه (0, -0.7) برود و در آنجا بایستد. این برنامه یک الگوریتم تعقیب توپ ساده می‌باشد و در نوشتن آن از توابعی که پیش از این در utils.py نوشتیم استفاده کنید.

تمرین 17: برنامه ای بنویسید که، یکی از ربات ها اگر توپ را دید جلوی دروازه روی یک خط فرضی هم راستا با توپ حرکت کند و در غیر این صورت بایستد. درواقع یک دروازه بان خیلی ساده باید بنویسید.

تمرین 18: برنامه ای بنویسید که، هر سه ربات به دور توپ رفته و آن را محاسره کنند اما به آن برخورد نکنند و وقتی به نزدیکی توپ رسیدند سر جای خود بایستند.

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

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