ساختار برنامه رباتها
بازی فوتبال بین دو تیم آبی و زرد اجرا میشود. هر تیم 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 نوشته میشود تا برنامه را تا پایان بازی تکرار کند.
# 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 قرار گرفته و این کار باعث حرکت ربات به سمت جلو میشود.
# 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 ثانیه به عقب حرکت کند و این کار را تکرار کند.




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