ساختار برنامه ربات‌ها

بازی فوتبال بین دو تیم آبی و زرد اجرا می‌شود. هر تیم 3 ربات با سه برنامه متفاوت خواهد داشت. در این بازی یک برنامه هوش مصنوعی داوری را بر عهده دارد. در پوشه rcj-soccersim-master پوشه ای به نام controllers وجود دارد که حاوی تمام فایل های پایتون از جمله کد تیم های آبی و زرد و همچنین کد داور و توپ وجود دارد. همانطور که در تصویر زیر مشاهده می‌کنید چهار فولدر با نام‌های مشخص وجود دارد.

دو پوشه اول شامل کد های توپ و داور هستند و نیازی به ویرایش یا تغییر آنها نخواهیم داشت. گرچه در آینده جهت طراحی الگوریتم های مختلف نیاز است که نحوه تصمیم گیری داور را مورد بررسی قرار دهی. پوشه های rcj_soccer_team_yellow و rcj_soccer_team_blue شامل کد های تیم زرد و آبی هستند. به عنوان مثال پوشه تیم زرد شامل سه فایل robot1.py ، robot2.py و robot3.py می‌باشد که هرکدام برنامه یکی از ربات ها را مشخص میکند. فایل utils.py نیز حاوی برنامه هایی است که در برنامه سه ربات به صورت مشترک استفاده می‌شود.

برنامه ربات 1 را باز کنید. این برنامه یک کد نمونه برای دنبال کردن توپ است. در این برنامه تمام سنسورها و دستورات لازم استفاده شده است. در ادامه خواهیم آموخت که چطور از هرکدام از این دستورات استفاده کنیم و الگوریتم های مختلف را پیاده سازی کنیم. برنامه هر ربات شامل یک کلاس به نام MyRobot1,2,3 است و نرم افزار Webots تابعی به نام def run() را برای هر ربات اجرا می‌کند. در این تابع یک حلقه while نوشته می‌شود تا برنامه را تا پایان بازی تکرار کند.

robot1.py
# rcj_soccer_player controller - ROBOT Y1

# Feel free to import built-in libraries
import math  # noqa: F401

# You can also import scripts that you put into the folder with controller
import utils
from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP


class MyRobot1(RCJSoccerRobot):
    def run(self):
        while self.robot.step(TIME_STEP) != -1:
            if self.is_new_data():
                data = self.get_new_data()  # noqa: F841

                while self.is_new_team_data():
                    team_data = self.get_new_team_data()  # noqa: F841
                    # Do something with team data

                if self.is_new_ball_data():
                    ball_data = self.get_new_ball_data()
                else:
                    # If the robot does not see the ball, stop motors
                    self.left_motor.setVelocity(0)
                    self.right_motor.setVelocity(0)
                    continue

                # Get data from compass
                heading = self.get_compass_heading()  # noqa: F841

                # Get GPS coordinates of the robot
                robot_pos = self.get_gps_coordinates()  # noqa: F841

                # Get data from sonars
                sonar_values = self.get_sonar_values()  # noqa: F841

                # Compute the speed for motors
                direction = utils.get_direction(ball_data["direction"])

                # If the robot has the ball right in front of it, go forward,
                # rotate otherwise
                if direction == 0:
                    left_speed = 7
                    right_speed = 7
                else:
                    left_speed = direction * 4
                    right_speed = direction * -4

                # Set the speed to motors
                self.left_motor.setVelocity(left_speed)
                self.right_motor.setVelocity(right_speed)

                # Send message to team robots
                self.send_data_to_team(self.player_id)

کنترل سرعت موتورها

هر ربات دو موتور و چرخ دارد که می‌توان سرعت آنها را با اسفتاده از دو دستور self.left_motor.setVelocity(0) و self.right_motor.setVelocity(0) کنترل کرد. حداکثر سرعتی که می‌توان به هر موتور داد برابر 10 بوده و علامت مثبت یا منفی نشان دهنده جهت چرخش موتور می‌باشد. در برنامه زیر سرعت دو موتور معادل 10 قرار گرفته و این کار باعث حرکت ربات به سمت جلو می‌شود.

robot1.py
# rcj_soccer_player controller - ROBOT Y1
from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP

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

تمرین 1: با استفاده از دستورات self.left_motor.setVelocity(0) و self.right_motor.setVelocity(0) برنامه ای بنویسید که، همه ربات ها به دور خود بچرخند.

تمرین 2: برنامه ای بنویسید که، همه ربات ها به طرف جلو حرکت کنند.

تمرین 3: برنامه ای بنویسید که، یکی از ربات ها روی محیط یک دایره فرضی حول یک نقطه بچرخد.

تمرین 4: برنامه ای بنویسید که، یکی از ربات ها به مدت 2 ثانیه به جلو و سپس 2 ثانیه به عقب حرکت کند و این کار را تکرار کند.

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

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