diff --git a/controllers/rcj_soccer_ball/rcj_soccer_ball.py b/controllers/rcj_soccer_ball/rcj_soccer_ball.py index ee08ed6c..d8f52d00 100644 --- a/controllers/rcj_soccer_ball/rcj_soccer_ball.py +++ b/controllers/rcj_soccer_ball/rcj_soccer_ball.py @@ -8,5 +8,5 @@ data = [True] # Packet cannot be empty packet = struct.pack("?", *data) -while robot.step(32) != -1: +while robot.step(8) != -1: ball_emitter.send(packet) diff --git a/controllers/rcj_soccer_referee_supervisor/referee/consts.py b/controllers/rcj_soccer_referee_supervisor/referee/consts.py index 839befce..4f5733c5 100644 --- a/controllers/rcj_soccer_referee_supervisor/referee/consts.py +++ b/controllers/rcj_soccer_referee_supervisor/referee/consts.py @@ -14,7 +14,7 @@ FIELD_X_UPPER_LIMIT = 0.655 FIELD_X_LOWER_LIMIT = -0.655 -TIME_STEP = 32 +TIME_STEP = 8 ROBOT_NAMES = ["B1", "B2", "B3", "Y1", "Y2", "Y3"] N_ROBOTS = len(ROBOT_NAMES) @@ -38,7 +38,7 @@ BLUE_RIGHT_NS: (-0.3, 0.3), } -OBJECT_DEPTH = 0.042 +OBJECT_DEPTH = 0.0380918 ROBOT_INITIAL_TRANSLATION = { "B1": [0.3, 0.3, OBJECT_DEPTH], diff --git a/controllers/rcj_soccer_referee_supervisor/referee/progress_checker.py b/controllers/rcj_soccer_referee_supervisor/referee/progress_checker.py index 971ea13b..e481733b 100644 --- a/controllers/rcj_soccer_referee_supervisor/referee/progress_checker.py +++ b/controllers/rcj_soccer_referee_supervisor/referee/progress_checker.py @@ -53,7 +53,7 @@ def is_progress(self) -> bool: """ s = sum(self.samples) - # We we haven't tracked at least as many samples as the number of + # We haven't tracked at least as many samples as the number of # steps, our default position is "benefit of doubt": we assume enough # progress has been made. if self.iterator < self.steps: diff --git a/controllers/rcj_soccer_team_blue/rcj_soccer_robot.py b/controllers/rcj_soccer_team_blue/rcj_soccer_robot.py index 741b1ee9..389a7f6a 100644 --- a/controllers/rcj_soccer_team_blue/rcj_soccer_robot.py +++ b/controllers/rcj_soccer_team_blue/rcj_soccer_robot.py @@ -1,7 +1,7 @@ import math import struct -TIME_STEP = 32 +TIME_STEP = 8 ROBOT_NAMES = ["B1", "B2", "B3", "Y1", "Y2", "Y3"] N_ROBOTS = len(ROBOT_NAMES) @@ -38,14 +38,26 @@ def __init__(self, robot): self.sonar_back = self.robot.getDevice("distancesensor back") self.sonar_back.enable(TIME_STEP) - self.left_motor = self.robot.getDevice("left wheel motor") - self.right_motor = self.robot.getDevice("right wheel motor") - - self.left_motor.setPosition(float("+inf")) - self.right_motor.setPosition(float("+inf")) - - self.left_motor.setVelocity(0.0) - self.right_motor.setVelocity(0.0) + self.front_left_motor = self.robot.getDevice("front left motor") + self.front_right_motor = self.robot.getDevice("front right motor") + self.rear_left_motor = self.robot.getDevice("rear left motor") + self.rear_right_motor = self.robot.getDevice("rear right motor") + self.dribbler_motor = self.robot.getDevice("dribbler motor") + self.kicker_motor = self.robot.getDevice("kicker motor") + + self.front_left_motor.setPosition(float("+inf")) + self.front_right_motor.setPosition(float("+inf")) + self.rear_left_motor.setPosition(float("+inf")) + self.rear_right_motor.setPosition(float("+inf")) + self.dribbler_motor.setPosition(float("+inf")) + self.kicker_motor.setPosition(0) + + self.front_left_motor.setVelocity(0.0) + self.front_right_motor.setVelocity(0.0) + self.rear_left_motor.setVelocity(0.0) + self.rear_right_motor.setVelocity(0.0) + self.dribbler_motor.setVelocity(0.0) + self.kicker_motor.setVelocity(5.0) def parse_supervisor_msg(self, packet: str) -> dict: """Parse message received from supervisor @@ -139,6 +151,7 @@ def get_new_ball_data(self) -> dict: } """ _ = self.ball_receiver.getData() + data = { "direction": self.ball_receiver.getEmitterDirection(), "strength": self.ball_receiver.getSignalStrength(), @@ -191,5 +204,14 @@ def get_sonar_values(self) -> dict: "back": self.sonar_back.getValue(), } + + def kick_ball(self, state, velocity=20): + if state == 1: + self.kicker_motor.setVelocity(velocity) + self.kicker_motor.setPosition(0.042) + elif state == 0: + self.kicker_motor.setVelocity(velocity) + self.kicker_motor.setPosition(0) + def run(self): raise NotImplementedError diff --git a/controllers/rcj_soccer_team_blue/robot1.py b/controllers/rcj_soccer_team_blue/robot1.py index 8368686d..a6950ac9 100644 --- a/controllers/rcj_soccer_team_blue/robot1.py +++ b/controllers/rcj_soccer_team_blue/robot1.py @@ -7,10 +7,11 @@ import utils from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP - class MyRobot1(RCJSoccerRobot): def run(self): + kick_time = 0 while self.robot.step(TIME_STEP) != -1: + kick_time += TIME_STEP # Time in milliseconds if self.is_new_data(): data = self.get_new_data() # noqa: F841 @@ -22,8 +23,10 @@ def run(self): 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) + self.front_left_motor.setVelocity(0.0) + self.front_right_motor.setVelocity(0.0) + self.rear_left_motor.setVelocity(0.0) + self.rear_right_motor.setVelocity(0.0) continue # Get data from compass @@ -38,18 +41,37 @@ def run(self): # 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 + """ + Wheel motors (max velocity: 40, +: counterclockwise, -: clockwise) + Dribbler motor (max velocity: 50, +: hold, -: release) + Kicker motor (max velocity: 20, state 1: out, state 0: in, call kickBall function) + """ + + # If the robot has the ball right in front of it, go forward, rotate otherwise + # Set the speed to motors if direction == 0: - left_speed = 7 - right_speed = 7 + move_speed = 40 + self.front_left_motor.setVelocity(move_speed) + self.rear_left_motor.setVelocity(move_speed) + self.front_right_motor.setVelocity(-move_speed) + self.rear_right_motor.setVelocity(-move_speed) else: - left_speed = direction * 4 - right_speed = direction * -4 + turn_speed = -direction * 20 + self.front_left_motor.setVelocity(turn_speed) + self.rear_left_motor.setVelocity(turn_speed) + self.front_right_motor.setVelocity(turn_speed) + self.rear_right_motor.setVelocity(turn_speed) - # Set the speed to motors - self.left_motor.setVelocity(left_speed) - self.right_motor.setVelocity(right_speed) + # Dribble the ball at a velocity of 50 + self.dribbler_motor.setVelocity(50) + + # Kick the ball for 0.5 seconds every 5 seconds + if 5000 < kick_time < 5500: + self.kick_ball(1, 20) + elif kick_time > 5500: + kick_time = 0 + else: + self.kick_ball(0, 20) # Send message to team robots self.send_data_to_team(self.player_id) diff --git a/controllers/rcj_soccer_team_blue/robot2.py b/controllers/rcj_soccer_team_blue/robot2.py index 28371fd5..6edc0b6b 100644 --- a/controllers/rcj_soccer_team_blue/robot2.py +++ b/controllers/rcj_soccer_team_blue/robot2.py @@ -7,10 +7,11 @@ import utils from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP - class MyRobot2(RCJSoccerRobot): def run(self): + kick_time = 0 while self.robot.step(TIME_STEP) != -1: + kick_time += TIME_STEP # Time in milliseconds if self.is_new_data(): data = self.get_new_data() # noqa: F841 @@ -22,8 +23,10 @@ def run(self): 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) + self.front_left_motor.setVelocity(0.0) + self.front_right_motor.setVelocity(0.0) + self.rear_left_motor.setVelocity(0.0) + self.rear_right_motor.setVelocity(0.0) continue # Get data from compass @@ -32,21 +35,43 @@ def run(self): # 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 + """ + Wheel motors (max velocity: 40, +: counterclockwise, -: clockwise) + Dribbler motor (max velocity: 50, +: hold, -: release) + Kicker motor (max velocity: 20, state 1: out, state 0: in, call kickBall function) + """ + + # If the robot has the ball right in front of it, go forward, rotate otherwise + # Set the speed to motors if direction == 0: - left_speed = 7 - right_speed = 7 + move_speed = 40 + self.front_left_motor.setVelocity(move_speed) + self.rear_left_motor.setVelocity(move_speed) + self.front_right_motor.setVelocity(-move_speed) + self.rear_right_motor.setVelocity(-move_speed) else: - left_speed = direction * 4 - right_speed = direction * -4 + turn_speed = -direction * 20 + self.front_left_motor.setVelocity(turn_speed) + self.rear_left_motor.setVelocity(turn_speed) + self.front_right_motor.setVelocity(turn_speed) + self.rear_right_motor.setVelocity(turn_speed) - # Set the speed to motors - self.left_motor.setVelocity(left_speed) - self.right_motor.setVelocity(right_speed) + # Dribble the ball at a velocity of 50 + self.dribbler_motor.setVelocity(50) + + # Kick the ball for 0.5 seconds every 5 seconds + if 5000 < kick_time < 5500: + self.kick_ball(1, 20) + elif kick_time > 5500: + kick_time = 0 + else: + self.kick_ball(0, 20) # Send message to team robots self.send_data_to_team(self.player_id) diff --git a/controllers/rcj_soccer_team_blue/robot3.py b/controllers/rcj_soccer_team_blue/robot3.py index c1680572..300a5948 100644 --- a/controllers/rcj_soccer_team_blue/robot3.py +++ b/controllers/rcj_soccer_team_blue/robot3.py @@ -7,10 +7,11 @@ import utils from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP - class MyRobot3(RCJSoccerRobot): def run(self): + kick_time = 0 while self.robot.step(TIME_STEP) != -1: + kick_time += TIME_STEP # Time in milliseconds if self.is_new_data(): data = self.get_new_data() # noqa: F841 @@ -22,8 +23,10 @@ def run(self): 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) + self.front_left_motor.setVelocity(0.0) + self.front_right_motor.setVelocity(0.0) + self.rear_left_motor.setVelocity(0.0) + self.rear_right_motor.setVelocity(0.0) continue # Get data from compass @@ -38,18 +41,37 @@ def run(self): # 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 + """ + Wheel motors (max velocity: 40, +: counterclockwise, -: clockwise) + Dribbler motor (max velocity: 50, +: hold, -: release) + Kicker motor (max velocity: 20, state 1: out, state 0: in, call kickBall function) + """ + + # If the robot has the ball right in front of it, go forward, rotate otherwise + # Set the speed to motors if direction == 0: - left_speed = 7 - right_speed = 7 + move_speed = 40 + self.front_left_motor.setVelocity(move_speed) + self.rear_left_motor.setVelocity(move_speed) + self.front_right_motor.setVelocity(-move_speed) + self.rear_right_motor.setVelocity(-move_speed) else: - left_speed = direction * 4 - right_speed = direction * -4 + turn_speed = -direction * 20 + self.front_left_motor.setVelocity(turn_speed) + self.rear_left_motor.setVelocity(turn_speed) + self.front_right_motor.setVelocity(turn_speed) + self.rear_right_motor.setVelocity(turn_speed) - # Set the speed to motors - self.left_motor.setVelocity(left_speed) - self.right_motor.setVelocity(right_speed) + # Dribble the ball at a velocity of 50 + self.dribbler_motor.setVelocity(50) + + # Kick the ball for 0.5 seconds every 5 seconds + if 5000 < kick_time < 5500: + self.kick_ball(1, 20) + elif kick_time > 5500: + kick_time = 0 + else: + self.kick_ball(0, 20) # Send message to team robots self.send_data_to_team(self.player_id) diff --git a/controllers/rcj_soccer_team_yellow/rcj_soccer_robot.py b/controllers/rcj_soccer_team_yellow/rcj_soccer_robot.py index 417ca09d..389a7f6a 100644 --- a/controllers/rcj_soccer_team_yellow/rcj_soccer_robot.py +++ b/controllers/rcj_soccer_team_yellow/rcj_soccer_robot.py @@ -1,7 +1,7 @@ import math import struct -TIME_STEP = 32 +TIME_STEP = 8 ROBOT_NAMES = ["B1", "B2", "B3", "Y1", "Y2", "Y3"] N_ROBOTS = len(ROBOT_NAMES) @@ -38,14 +38,26 @@ def __init__(self, robot): self.sonar_back = self.robot.getDevice("distancesensor back") self.sonar_back.enable(TIME_STEP) - self.left_motor = self.robot.getDevice("left wheel motor") - self.right_motor = self.robot.getDevice("right wheel motor") - - self.left_motor.setPosition(float("+inf")) - self.right_motor.setPosition(float("+inf")) - - self.left_motor.setVelocity(0.0) - self.right_motor.setVelocity(0.0) + self.front_left_motor = self.robot.getDevice("front left motor") + self.front_right_motor = self.robot.getDevice("front right motor") + self.rear_left_motor = self.robot.getDevice("rear left motor") + self.rear_right_motor = self.robot.getDevice("rear right motor") + self.dribbler_motor = self.robot.getDevice("dribbler motor") + self.kicker_motor = self.robot.getDevice("kicker motor") + + self.front_left_motor.setPosition(float("+inf")) + self.front_right_motor.setPosition(float("+inf")) + self.rear_left_motor.setPosition(float("+inf")) + self.rear_right_motor.setPosition(float("+inf")) + self.dribbler_motor.setPosition(float("+inf")) + self.kicker_motor.setPosition(0) + + self.front_left_motor.setVelocity(0.0) + self.front_right_motor.setVelocity(0.0) + self.rear_left_motor.setVelocity(0.0) + self.rear_right_motor.setVelocity(0.0) + self.dribbler_motor.setVelocity(0.0) + self.kicker_motor.setVelocity(5.0) def parse_supervisor_msg(self, packet: str) -> dict: """Parse message received from supervisor @@ -72,6 +84,7 @@ def get_new_data(self) -> dict: """ packet = self.receiver.getData() self.receiver.nextPacket() + return self.parse_supervisor_msg(packet) def is_new_data(self) -> bool: @@ -138,6 +151,7 @@ def get_new_ball_data(self) -> dict: } """ _ = self.ball_receiver.getData() + data = { "direction": self.ball_receiver.getEmitterDirection(), "strength": self.ball_receiver.getSignalStrength(), @@ -170,9 +184,8 @@ def get_compass_heading(self) -> float: """ compass_values = self.compass.getValues() - # Subtract math.pi/2 (90) so that the heading 0 means that - # robot is facing opponent's goal - rad = math.atan2(compass_values[0], compass_values[1]) - (math.pi / 2) + # Add math.pi/2 (90) so that the heading 0 is facing opponent's goal + rad = math.atan2(compass_values[0], compass_values[1]) + (math.pi / 2) if rad < -math.pi: rad = rad + (2 * math.pi) @@ -191,5 +204,14 @@ def get_sonar_values(self) -> dict: "back": self.sonar_back.getValue(), } + + def kick_ball(self, state, velocity=20): + if state == 1: + self.kicker_motor.setVelocity(velocity) + self.kicker_motor.setPosition(0.042) + elif state == 0: + self.kicker_motor.setVelocity(velocity) + self.kicker_motor.setPosition(0) + def run(self): raise NotImplementedError diff --git a/controllers/rcj_soccer_team_yellow/robot1.py b/controllers/rcj_soccer_team_yellow/robot1.py index d423f472..d2f40baa 100644 --- a/controllers/rcj_soccer_team_yellow/robot1.py +++ b/controllers/rcj_soccer_team_yellow/robot1.py @@ -7,10 +7,11 @@ import utils from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP - class MyRobot1(RCJSoccerRobot): def run(self): + kick_time = 0 while self.robot.step(TIME_STEP) != -1: + kick_time += TIME_STEP # Time in milliseconds if self.is_new_data(): data = self.get_new_data() # noqa: F841 @@ -22,8 +23,10 @@ def run(self): 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) + self.front_left_motor.setVelocity(0.0) + self.front_right_motor.setVelocity(0.0) + self.rear_left_motor.setVelocity(0.0) + self.rear_right_motor.setVelocity(0.0) continue # Get data from compass @@ -38,18 +41,37 @@ def run(self): # 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 + """ + Wheel motors (max velocity: 40, +: counterclockwise, -: clockwise) + Dribbler motor (max velocity: 50, +: hold, -: release) + Kicker motor (max velocity: 20, state 1: out, state 0: in, call kickBall function) + """ + + # If the robot has the ball right in front of it, go forward, rotate otherwise + # Set the speed to motors if direction == 0: - left_speed = 7 - right_speed = 7 + move_speed = 40 + self.front_left_motor.setVelocity(move_speed) + self.rear_left_motor.setVelocity(move_speed) + self.front_right_motor.setVelocity(-move_speed) + self.rear_right_motor.setVelocity(-move_speed) else: - left_speed = direction * 4 - right_speed = direction * -4 + turn_speed = -direction * 20 + self.front_left_motor.setVelocity(turn_speed) + self.rear_left_motor.setVelocity(turn_speed) + self.front_right_motor.setVelocity(turn_speed) + self.rear_right_motor.setVelocity(turn_speed) - # Set the speed to motors - self.left_motor.setVelocity(left_speed) - self.right_motor.setVelocity(right_speed) + # Dribble the ball at a velocity of 50 + self.dribbler_motor.setVelocity(50) + + # Kick the ball for 0.5 seconds every 5 seconds + if 5000 < kick_time < 5500: + self.kick_ball(1, 20) + elif kick_time > 5500: + kick_time = 0 + else: + self.kick_ball(0, 20) # Send message to team robots self.send_data_to_team(self.player_id) diff --git a/controllers/rcj_soccer_team_yellow/robot2.py b/controllers/rcj_soccer_team_yellow/robot2.py index 323ecf3e..b5d507ac 100644 --- a/controllers/rcj_soccer_team_yellow/robot2.py +++ b/controllers/rcj_soccer_team_yellow/robot2.py @@ -7,10 +7,11 @@ import utils from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP - class MyRobot2(RCJSoccerRobot): def run(self): + kick_time = 0 while self.robot.step(TIME_STEP) != -1: + kick_time += TIME_STEP # Time in milliseconds if self.is_new_data(): data = self.get_new_data() # noqa: F841 @@ -22,8 +23,10 @@ def run(self): 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) + self.front_left_motor.setVelocity(0.0) + self.front_right_motor.setVelocity(0.0) + self.rear_left_motor.setVelocity(0.0) + self.rear_right_motor.setVelocity(0.0) continue # Get data from compass @@ -38,18 +41,37 @@ def run(self): # 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 + """ + Wheel motors (max velocity: 40, +: counterclockwise, -: clockwise) + Dribbler motor (max velocity: 50, +: hold, -: release) + Kicker motor (max velocity: 20, state 1: out, state 0: in, call kickBall function) + """ + + # If the robot has the ball right in front of it, go forward, rotate otherwise + # Set the speed to motors if direction == 0: - left_speed = 7 - right_speed = 7 + move_speed = 40 + self.front_left_motor.setVelocity(move_speed) + self.rear_left_motor.setVelocity(move_speed) + self.front_right_motor.setVelocity(-move_speed) + self.rear_right_motor.setVelocity(-move_speed) else: - left_speed = direction * 4 - right_speed = direction * -4 + turn_speed = -direction * 20 + self.front_left_motor.setVelocity(turn_speed) + self.rear_left_motor.setVelocity(turn_speed) + self.front_right_motor.setVelocity(turn_speed) + self.rear_right_motor.setVelocity(turn_speed) - # Set the speed to motors - self.left_motor.setVelocity(left_speed) - self.right_motor.setVelocity(right_speed) + # Dribble the ball at a velocity of 50 + self.dribbler_motor.setVelocity(50) + + # Kick the ball for 0.5 seconds every 5 seconds + if 5000 < kick_time < 5500: + self.kick_ball(1, 20) + elif kick_time > 5500: + kick_time = 0 + else: + self.kick_ball(0, 20) # Send message to team robots self.send_data_to_team(self.player_id) diff --git a/controllers/rcj_soccer_team_yellow/robot3.py b/controllers/rcj_soccer_team_yellow/robot3.py index 746c46ea..fc1b8d74 100644 --- a/controllers/rcj_soccer_team_yellow/robot3.py +++ b/controllers/rcj_soccer_team_yellow/robot3.py @@ -7,10 +7,11 @@ import utils from rcj_soccer_robot import RCJSoccerRobot, TIME_STEP - class MyRobot3(RCJSoccerRobot): def run(self): + kick_time = 0 while self.robot.step(TIME_STEP) != -1: + kick_time += TIME_STEP # Time in milliseconds if self.is_new_data(): data = self.get_new_data() # noqa: F841 @@ -22,8 +23,10 @@ def run(self): 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) + self.front_left_motor.setVelocity(0.0) + self.front_right_motor.setVelocity(0.0) + self.rear_left_motor.setVelocity(0.0) + self.rear_right_motor.setVelocity(0.0) continue # Get data from compass @@ -38,18 +41,37 @@ def run(self): # 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 + """ + Wheel motors (max velocity: 40, +: counterclockwise, -: clockwise) + Dribbler motor (max velocity: 50, +: hold, -: release) + Kicker motor (max velocity: 20, state 1: out, state 0: in, call kickBall function) + """ + + # If the robot has the ball right in front of it, go forward, rotate otherwise + # Set the speed to motors if direction == 0: - left_speed = 7 - right_speed = 7 + move_speed = 40 + self.front_left_motor.setVelocity(move_speed) + self.rear_left_motor.setVelocity(move_speed) + self.front_right_motor.setVelocity(-move_speed) + self.rear_right_motor.setVelocity(-move_speed) else: - left_speed = direction * 4 - right_speed = direction * -4 + turn_speed = -direction * 20 + self.front_left_motor.setVelocity(turn_speed) + self.rear_left_motor.setVelocity(turn_speed) + self.front_right_motor.setVelocity(turn_speed) + self.rear_right_motor.setVelocity(turn_speed) - # Set the speed to motors - self.left_motor.setVelocity(left_speed) - self.right_motor.setVelocity(right_speed) + # Dribble the ball at a velocity of 50 + self.dribbler_motor.setVelocity(50) + + # Kick the ball for 0.5 seconds every 5 seconds + if 5000 < kick_time < 5500: + self.kick_ball(1, 20) + elif kick_time > 5500: + kick_time = 0 + else: + self.kick_ball(0, 20) # Send message to team robots self.send_data_to_team(self.player_id) diff --git a/docs/docs/how_to_robot.md b/docs/docs/how_to_robot.md index 9d63ac11..c58fc1b3 100644 --- a/docs/docs/how_to_robot.md +++ b/docs/docs/how_to_robot.md @@ -102,7 +102,7 @@ Let's put together a simple program to showcase how you can go about programming ```python import struct -TIME_STEP = 32 +TIME_STEP = 8 ROBOT_NAMES = ["B1", "B2", "B3", "Y1", "Y2", "Y3"] N_ROBOTS = len(ROBOT_NAMES) @@ -111,10 +111,16 @@ class MyRobot: def __init__(self, robot): self.robot = robot self.name = self.robot.getName() + self.team = self.name[0] + self.player_id = int(self.name[1]) self.receiver = self.robot.getDevice("supervisor receiver") self.receiver.enable(TIME_STEP) + self.team_emitter = self.robot.getDevice("team emitter") + self.team_receiver = self.robot.getDevice("team receiver") + self.team_receiver.enable(TIME_STEP) + self.ball_receiver = self.robot.getDevice("ball receiver") self.ball_receiver.enable(TIME_STEP) @@ -133,14 +139,26 @@ class MyRobot: self.sonar_back = self.robot.getDevice("distancesensor back") self.sonar_back.enable(TIME_STEP) - self.left_motor = self.robot.getDevice("left wheel motor") - self.right_motor = self.robot.getDevice("right wheel motor") - - self.left_motor.setPosition(float('+inf')) - self.right_motor.setPosition(float('+inf')) - - self.left_motor.setVelocity(0.0) - self.right_motor.setVelocity(0.0) + self.front_left_motor = self.robot.getDevice("front left motor") + self.front_right_motor = self.robot.getDevice("front right motor") + self.rear_left_motor = self.robot.getDevice("rear left motor") + self.rear_right_motor = self.robot.getDevice("rear right motor") + self.dribbler_motor = self.robot.getDevice("dribbler motor") + self.kicker_motor = self.robot.getDevice("kicker motor") + + self.front_left_motor.setPosition(float("+inf")) + self.front_right_motor.setPosition(float("+inf")) + self.rear_left_motor.setPosition(float("+inf")) + self.rear_right_motor.setPosition(float("+inf")) + self.dribbler_motor.setPosition(float("+inf")) + self.kicker_motor.setPosition(0) + + self.front_left_motor.setVelocity(0.0) + self.front_right_motor.setVelocity(0.0) + self.rear_left_motor.setVelocity(0.0) + self.rear_right_motor.setVelocity(0.0) + self.dribbler_motor.setVelocity(0.0) + self.kicker_motor.setVelocity(5.0) def get_new_data(self): packet = self.receiver.getData() @@ -172,8 +190,10 @@ class MyRobot: if self.is_new_ball_data(): ball_data = self.get_new_ball_data() - self.left_motor.setVelocity(1) - self.right_motor.setVelocity(-1) + self.front_left_motor.setVelocity(10) + self.rear_left_motor.setVelocity(10) + self.front_right_motor.setVelocity(-10) + self.rear_right_motor.setVelocity(-10) ``` Let's explain the code in detail: @@ -186,7 +206,7 @@ This library is a [built-in Python library](https://docs.python.org/3/library/st which is required to unpack the data sent by the supervisor. ```python -TIME_STEP = 32 +TIME_STEP = 8 ROBOT_NAMES = ["B1", "B2", "B3", "Y1", "Y2", "Y3"] N_ROBOTS = len(ROBOT_NAMES) ``` @@ -262,8 +282,10 @@ sonar_values = self.get_sonar_values() if self.is_new_ball_data(): ball_data = self.get_new_ball_data() -self.left_motor.setVelocity(1) -self.right_motor.setVelocity(-1) +self.front_left_motor.setVelocity(10) +self.rear_left_motor.setVelocity(10) +self.front_right_motor.setVelocity(-10) +self.rear_right_motor.setVelocity(-10) ``` And finally, after reading the new data received from supervisor as well as data diff --git a/run-in-docker.sh b/run-in-docker.sh old mode 100755 new mode 100644 diff --git a/worlds/soccer.wbt b/worlds/soccer.wbt index 335807cf..0cd49e78 100644 --- a/worlds/soccer.wbt +++ b/worlds/soccer.wbt @@ -1,14 +1,45 @@ -#VRML_SIM R2022a utf8 +#VRML_SIM R2022b utf8 + +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023a/projects/objects/backgrounds/protos/TexturedBackground.proto" +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023a/projects/objects/backgrounds/protos/TexturedBackgroundLight.proto" + WorldInfo { info [ "A simple RCJ Soccer game simulated using Webots." ] title "RCJ Soccer Sim" - optimalThreadCount 8 + basicTimeStep 8 + contactProperties [ + ContactProperties { + material1 "ball" + material2 "field" + } + ContactProperties { + material1 "dribbler" + material2 "ball" + coulombFriction [ + -1 + ] + bounce 0 + bounceVelocity 0 + } + ContactProperties { + material1 "field" + material2 "wheel" + coulombFriction [ + 5000 + ] + bounce 0 + bounceVelocity 0 + forceDependentSlip [ + 1 + ] + } + ] } Viewpoint { - orientation -0.3718171524084895 -0.11726675761807528 0.920869433053669 3.706903255785043 - position 1.7483931840718845 1.2701664687979481 1.965968373123659 + orientation 0.7128275532730471 -0.0002870894638722765 -0.7013392879872061 3.1421565475318576 + position -0.08984100000000017 7.541420000006793e-05 4.400000000000001 } TexturedBackground { } @@ -248,6 +279,7 @@ DEF SOCCER_FIELD Solid { } ] name "soccer field" + contactMaterial "field" boundingObject Group { children [ USE GROUND @@ -388,8 +420,7 @@ DEF SOCCER_FIELD Solid { locked TRUE } DEF BALL Robot { - translation -0.00878554 0.0770576 0.0208079 - rotation 0.7071067811865474 0.7071067811865475 0 -2.62318 + rotation -0.2668107316298671 0.9277349714423769 0.26099780889874713 -2.412528199579081 children [ DEF FOOTBALL_SHAPE Shape { appearance PBRAppearance { @@ -407,7 +438,7 @@ DEF BALL Robot { } } geometry Sphere { - radius 0.021 + radius 0.015 subdivision 3 } } @@ -424,10 +455,11 @@ DEF BALL Robot { ] name "soccer ball" model "soccer ball" + contactMaterial "ball" boundingObject USE FOOTBALL_SHAPE physics Physics { density -1 - mass 0.05 + mass 0.08 } recognitionColors [ 1 1 1 @@ -437,29 +469,29 @@ DEF BALL Robot { synchronization FALSE } DEF B1 Robot { - translation 0.369438 0.409009 0.0374016 - rotation 1.0823634158639528e-06 1.0483773613787562e-06 -0.9999999999988647 1.6026953071807208 + translation 0.30348334291402934 0.26429752545093194 0.0380918 + rotation 0 0 -1 1.5699999999999998 children [ - HingeJoint { + DEF FRONT_LEFT_WHEEL HingeJoint { jointParameters HingeJointParameters { - position -7.771629997904354e-09 - axis 0 1 0 - anchor 0 -0.045 -0.0176 + axis 0.785398 0.785398 0 + anchor 0.0304039 0.0304039 -0.032 } device [ RotationalMotor { - name "left wheel motor" + name "front left motor" + maxVelocity 40 } PositionSensor { - name "left wheel sensor" + name "front left sensor" } ] endPoint Solid { - translation 0 -0.045 -0.0176 - rotation -3.337240149329015e-15 -6.254334002834076e-15 1 1.5707999999999998 + translation 0.03040390000000004 0.030403899999999984 -0.032 + rotation 0 0 1 -2.3561900000000002 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF FRONT_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ DEF WHEEL_SHAPE Shape { appearance PBRAppearance { @@ -467,80 +499,188 @@ DEF B1 Robot { metalness 0 } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.006 + radius 0.0065 } } ] } ] - name "right wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - USE WHEEL_SHAPE - ] - } + name "front left wheel" + contactMaterial "wheel" + boundingObject USE FRONT_LEFT_TRANSFORM physics DEF WHEEL_PHYSICS Physics { - density -1 - mass 0.005 } } } - HingeJoint { + DEF REAR_LEFT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 0.785398 0 + anchor -0.0304039 0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear left motor" + maxVelocity 40 + } + PositionSensor { + name "rear left sensor" + } + ] + endPoint Solid { + translation -0.030403899999999984 0.030403899999999984 -0.032 + rotation 0 0 1 -0.785395307179586 + children [ + DEF REAR_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear left wheel" + contactMaterial "wheel" + boundingObject USE REAR_LEFT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF REAR_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 -0.785398 0 + anchor -0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear right motor" + maxVelocity 40 + } + PositionSensor { + name "rear right sensor" + } + ] + endPoint Solid { + translation -0.030403899999999928 -0.030403899999999984 -0.032 + rotation 0 0 1 0.7853979999999997 + children [ + DEF REAR_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear right wheel" + contactMaterial "wheel" + boundingObject USE REAR_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF FRONT_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis 0.785398 -0.785398 0 + anchor 0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "front right motor" + maxVelocity 40 + } + PositionSensor { + name "front right sensor" + } + ] + endPoint Solid { + translation 0.030403899999999984 -0.030403899999999984 -0.032 + rotation 0 0 1 2.35619 + children [ + DEF FRONT_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "front right wheel" + contactMaterial "wheel" + boundingObject USE FRONT_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF DRIBBLER HingeJoint { jointParameters HingeJointParameters { - position -7.74663356251063e-09 + position 8873.53458988807 axis 0 1 0 - anchor 0 0.045 -0.0176 + anchor 0.026 0 -0.008 + suspensionAxis 0 0 1 } device [ RotationalMotor { - name "right wheel motor" + name "dribbler motor" + maxVelocity 50 } PositionSensor { - name "right wheel sensor" + name "dribbler sensor" } ] endPoint Solid { - translation 0 0.045 -0.0176 - rotation -6.410229215105164e-15 -3.362702725970239e-15 1 1.5707996938995745 + translation 0.025990457192025113 1.7981358380048107e-07 -0.008000095794128182 + rotation -0.26043941330881704 -0.2608143585831204 0.9295951712182214 1.643491160171936 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF DRIBBLER_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.045 + radius 0.004 } } ] } ] - name "left wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } - geometry Cylinder { - height 0.01 - radius 0.02 - } + name "dribbler" + contactMaterial "dribbler" + boundingObject USE DRIBBLER_TRANSFORM + physics Physics { + density -1 + mass 1.25 + } + } + } + DEF KICKER SliderJoint { + jointParameters JointParameters { + position -5.893445048499387e-08 + axis 1 0 0 + } + device [ + LinearMotor { + name "kicker motor" + maxVelocity 20 + minPosition -2.2419110676378706e-05 + maxPosition 0.042 + maxForce 10000 + } + PositionSensor { + name "kicker sensor" + } + ] + endPoint Solid { + translation -0.020000130667441773 -0.0004198494222769633 -0.024061894469276958 + rotation -1.1810691308402516e-06 0.9999999999985407 1.2343786774001837e-06 1.5708018510118937 + children [ + DEF KICKER_SHAPE Shape { + geometry Box { + size 0.015 0.03 0.03 } - ] + } + ] + boundingObject USE KICKER_SHAPE + physics Physics { + density 70000 } - physics USE WHEEL_PHYSICS } } - DEF BLUE_ROBOT_SHAPE Shape { + DEF ROBOT_SHAPE Shape { appearance PBRAppearance { baseColorMap ImageTexture { url [ @@ -550,12 +690,14 @@ DEF B1 Robot { roughness 1 metalness 0 } - geometry Box { - size 0.075 0.075 0.075 + geometry Mesh { + url [ + "soccer/Robot Shape.obj" + ] } } Solid { - translation 0 0.0385 0.02 + translation 0 0.043 0.02 rotation 0 0 1 1.5707903061004251 children [ Shape { @@ -580,7 +722,7 @@ DEF B1 Robot { name "left sonar" } Solid { - translation 0 -0.0385 0.02 + translation 0 -0.043 0.02 rotation 0 0 1 -1.5707996938995747 children [ Shape { @@ -605,7 +747,7 @@ DEF B1 Robot { name "right sonar" } Solid { - translation 0.0385 0 0.02 + translation 0.043 0 0.02 children [ Shape { appearance PBRAppearance { @@ -629,7 +771,7 @@ DEF B1 Robot { name "front sonar" } Solid { - translation -0.0385 0 0.02 + translation -0.043 0 0.02 rotation 0 0 1 3.141592653589793 children [ Shape { @@ -690,38 +832,42 @@ DEF B1 Robot { } ] name "B1" - boundingObject USE BLUE_ROBOT_SHAPE + boundingObject USE ROBOT_SHAPE physics DEF ROBOT_PHYSICS Physics { - density -1 - mass 0.2 + density 20000 + centerOfMass [ + 0 0 -0.1 + ] + damping Damping { + } } controller "rcj_soccer_team_blue" synchronization FALSE } DEF B2 Robot { - translation -0.227682 0.452902 0.0373044 - rotation -1.60589e-06 -5.64273e-07 1 -1.4683653071795861 + translation -0.24977097895142505 0.32718919138947045 0.0380918 + rotation 0 0 -1 1.5699999999999998 children [ - HingeJoint { + DEF FRONT_LEFT_WHEEL HingeJoint { jointParameters HingeJointParameters { - position -7.771629997904354e-09 - axis 0 1 0 - anchor 0 -0.045 -0.0176 + axis 0.785398 0.785398 0 + anchor 0.0304039 0.0304039 -0.032 } device [ RotationalMotor { - name "left wheel motor" + name "front left motor" + maxVelocity 40 } PositionSensor { - name "left wheel sensor" + name "front left sensor" } ] endPoint Solid { - translation 0 -0.045 -0.0176 - rotation -3.337240149329015e-15 -6.254334002834076e-15 1 1.5707999999999998 + translation 0.03040390000000004 0.030403899999999956 -0.032 + rotation 0 0 1 -2.3561900000000002 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF FRONT_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ DEF WHEEL_SHAPE Shape { appearance PBRAppearance { @@ -729,80 +875,188 @@ DEF B2 Robot { metalness 0 } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.006 + radius 0.0065 } } ] } ] - name "right wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - USE WHEEL_SHAPE - ] - } + name "front left wheel" + contactMaterial "wheel" + boundingObject USE FRONT_LEFT_TRANSFORM physics DEF WHEEL_PHYSICS Physics { - density -1 - mass 0.005 } } } - HingeJoint { + DEF REAR_LEFT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 0.785398 0 + anchor -0.0304039 0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear left motor" + maxVelocity 40 + } + PositionSensor { + name "rear left sensor" + } + ] + endPoint Solid { + translation -0.030403899999999928 0.030403899999999984 -0.032 + rotation 0 0 1 -0.785395307179586 + children [ + DEF REAR_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear left wheel" + contactMaterial "wheel" + boundingObject USE REAR_LEFT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF REAR_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 -0.785398 0 + anchor -0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear right motor" + maxVelocity 40 + } + PositionSensor { + name "rear right sensor" + } + ] + endPoint Solid { + translation -0.030403899999999873 -0.030403899999999984 -0.032 + rotation 0 0 1 0.7853979999999997 + children [ + DEF REAR_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear right wheel" + contactMaterial "wheel" + boundingObject USE REAR_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF FRONT_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis 0.785398 -0.785398 0 + anchor 0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "front right motor" + maxVelocity 40 + } + PositionSensor { + name "front right sensor" + } + ] + endPoint Solid { + translation 0.03040390000000004 -0.030403899999999984 -0.032 + rotation 0 0 1 2.35619 + children [ + DEF FRONT_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "front right wheel" + contactMaterial "wheel" + boundingObject USE FRONT_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF DRIBBLER HingeJoint { jointParameters HingeJointParameters { - position -7.74663356251063e-09 + position 8873.53458988807 axis 0 1 0 - anchor 0 0.045 -0.0176 + anchor 0.026 0 -0.008 + suspensionAxis 0 0 1 } device [ RotationalMotor { - name "right wheel motor" + name "dribbler motor" + maxVelocity 50 } PositionSensor { - name "right wheel sensor" + name "dribbler sensor" } ] endPoint Solid { - translation 0 0.045 -0.0176 - rotation -6.410229215105164e-15 -3.362702725970239e-15 1 1.5707996938995745 + translation 0.02599045719202514 1.798135837727255e-07 -0.008000095794128182 + rotation -0.26043941330881704 -0.2608143585831204 0.9295951712182214 1.643491160171936 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF DRIBBLER_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.045 + radius 0.004 } } ] } ] - name "left wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } - geometry Cylinder { - height 0.01 - radius 0.02 - } + name "dribbler" + contactMaterial "dribbler" + boundingObject USE DRIBBLER_TRANSFORM + physics Physics { + density -1 + mass 1.25 + } + } + } + DEF KICKER SliderJoint { + jointParameters JointParameters { + position -5.893445048499387e-08 + axis 1 0 0 + } + device [ + LinearMotor { + name "kicker motor" + maxVelocity 20 + minPosition -2.2419110676378706e-05 + maxPosition 0.042 + maxForce 10000 + } + PositionSensor { + name "kicker sensor" + } + ] + endPoint Solid { + translation -0.020000130667441718 -0.0004198494222769633 -0.024061894469276958 + rotation -1.1810691308402516e-06 0.9999999999985407 1.2343786774001837e-06 1.5708018510118937 + children [ + DEF KICKER_SHAPE Shape { + geometry Box { + size 0.015 0.03 0.03 } - ] + } + ] + boundingObject USE KICKER_SHAPE + physics Physics { + density 70000 } - physics USE WHEEL_PHYSICS } } - DEF BLUE_ROBOT_SHAPE Shape { + DEF ROBOT_SHAPE Shape { appearance PBRAppearance { baseColorMap ImageTexture { url [ @@ -812,12 +1066,14 @@ DEF B2 Robot { roughness 1 metalness 0 } - geometry Box { - size 0.075 0.075 0.075 + geometry Mesh { + url [ + "soccer/Robot Shape.obj" + ] } } Solid { - translation 0 0.0385 0.02 + translation 0 0.043 0.02 rotation 0 0 1 1.5707903061004251 children [ Shape { @@ -842,7 +1098,7 @@ DEF B2 Robot { name "left sonar" } Solid { - translation 0 -0.0385 0.02 + translation 0 -0.043 0.02 rotation 0 0 1 -1.5707996938995747 children [ Shape { @@ -867,7 +1123,7 @@ DEF B2 Robot { name "right sonar" } Solid { - translation 0.0385 0 0.02 + translation 0.043 0 0.02 children [ Shape { appearance PBRAppearance { @@ -891,7 +1147,7 @@ DEF B2 Robot { name "front sonar" } Solid { - translation -0.0385 0 0.02 + translation -0.043 0 0.02 rotation 0 0 1 3.141592653589793 children [ Shape { @@ -952,35 +1208,42 @@ DEF B2 Robot { } ] name "B2" - boundingObject USE BLUE_ROBOT_SHAPE - physics USE ROBOT_PHYSICS + boundingObject USE ROBOT_SHAPE + physics DEF ROBOT_PHYSICS Physics { + density 20000 + centerOfMass [ + 0 0 -0.1 + ] + damping Damping { + } + } controller "rcj_soccer_team_blue" synchronization FALSE } DEF B3 Robot { - translation 0.0646362 0.431265 0.0373044 - rotation -1.24817e-06 1.20797e-06 -1 1.53191 + translation 0.05877033369583943 0.33136063122172477 0.0380918 + rotation 0 0 -1 1.5699999999999998 children [ - HingeJoint { + DEF FRONT_LEFT_WHEEL HingeJoint { jointParameters HingeJointParameters { - position -7.771629997904354e-09 - axis 0 1 0 - anchor 0 -0.045 -0.0176 + axis 0.785398 0.785398 0 + anchor 0.0304039 0.0304039 -0.032 } device [ RotationalMotor { - name "left wheel motor" + name "front left motor" + maxVelocity 40 } PositionSensor { - name "left wheel sensor" + name "front left sensor" } ] endPoint Solid { - translation 0 -0.045 -0.0176 - rotation -3.337240149329015e-15 -6.254334002834076e-15 1 1.5707999999999998 + translation 0.03040390000000004 0.03040389999999999 -0.032 + rotation 0 0 1 -2.3561900000000002 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF FRONT_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ DEF WHEEL_SHAPE Shape { appearance PBRAppearance { @@ -988,80 +1251,188 @@ DEF B3 Robot { metalness 0 } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.006 + radius 0.0065 } } ] } ] - name "right wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - USE WHEEL_SHAPE - ] - } + name "front left wheel" + contactMaterial "wheel" + boundingObject USE FRONT_LEFT_TRANSFORM physics DEF WHEEL_PHYSICS Physics { - density -1 - mass 0.005 } } } - HingeJoint { + DEF REAR_LEFT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 0.785398 0 + anchor -0.0304039 0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear left motor" + maxVelocity 40 + } + PositionSensor { + name "rear left sensor" + } + ] + endPoint Solid { + translation -0.030403899999999984 0.030403900000000005 -0.032 + rotation 0 0 1 -0.785395307179586 + children [ + DEF REAR_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear left wheel" + contactMaterial "wheel" + boundingObject USE REAR_LEFT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF REAR_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 -0.785398 0 + anchor -0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear right motor" + maxVelocity 40 + } + PositionSensor { + name "rear right sensor" + } + ] + endPoint Solid { + translation -0.030403899999999928 -0.030403899999999977 -0.032 + rotation 0 0 1 0.7853979999999997 + children [ + DEF REAR_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear right wheel" + contactMaterial "wheel" + boundingObject USE REAR_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF FRONT_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis 0.785398 -0.785398 0 + anchor 0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "front right motor" + maxVelocity 40 + } + PositionSensor { + name "front right sensor" + } + ] + endPoint Solid { + translation 0.030403899999999984 -0.030403900000000005 -0.032 + rotation 0 0 1 2.35619 + children [ + DEF FRONT_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "front right wheel" + contactMaterial "wheel" + boundingObject USE FRONT_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF DRIBBLER HingeJoint { jointParameters HingeJointParameters { - position -7.74663356251063e-09 + position 8873.53458988807 axis 0 1 0 - anchor 0 0.045 -0.0176 + anchor 0.026 0 -0.008 + suspensionAxis 0 0 1 } device [ RotationalMotor { - name "right wheel motor" + name "dribbler motor" + maxVelocity 50 } PositionSensor { - name "right wheel sensor" + name "dribbler sensor" } ] endPoint Solid { - translation 0 0.045 -0.0176 - rotation -6.410229215105164e-15 -3.362702725970239e-15 1 1.5707996938995745 + translation 0.025990457192025085 1.7981358379354218e-07 -0.008000095794128182 + rotation -0.26043941330881704 -0.2608143585831204 0.9295951712182214 1.643491160171936 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF DRIBBLER_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.045 + radius 0.004 } } ] } ] - name "left wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } - geometry Cylinder { - height 0.01 - radius 0.02 - } + name "dribbler" + contactMaterial "dribbler" + boundingObject USE DRIBBLER_TRANSFORM + physics Physics { + density -1 + mass 1.25 + } + } + } + DEF KICKER SliderJoint { + jointParameters JointParameters { + position -5.8934450484999394e-08 + axis 1 0 0 + } + device [ + LinearMotor { + name "kicker motor" + maxVelocity 20 + minPosition -2.2419110676378706e-05 + maxPosition 0.042 + maxForce 10000 + } + PositionSensor { + name "kicker sensor" + } + ] + endPoint Solid { + translation -0.020000130667441773 -0.0004198494222769633 -0.024061894469276958 + rotation -1.1810691308402516e-06 0.9999999999985407 1.2343786774001837e-06 1.5708018510118937 + children [ + DEF KICKER_SHAPE Shape { + geometry Box { + size 0.015 0.03 0.03 } - ] + } + ] + boundingObject USE KICKER_SHAPE + physics Physics { + density 70000 } - physics USE WHEEL_PHYSICS } } - DEF BLUE_ROBOT_SHAPE Shape { + DEF ROBOT_SHAPE Shape { appearance PBRAppearance { baseColorMap ImageTexture { url [ @@ -1071,12 +1442,14 @@ DEF B3 Robot { roughness 1 metalness 0 } - geometry Box { - size 0.075 0.075 0.075 + geometry Mesh { + url [ + "soccer/Robot Shape.obj" + ] } } Solid { - translation 0 0.0385 0.02 + translation 0 0.043 0.02 rotation 0 0 1 1.5707903061004251 children [ Shape { @@ -1101,7 +1474,7 @@ DEF B3 Robot { name "left sonar" } Solid { - translation 0 -0.0385 0.02 + translation 0 -0.043 0.02 rotation 0 0 1 -1.5707996938995747 children [ Shape { @@ -1126,7 +1499,7 @@ DEF B3 Robot { name "right sonar" } Solid { - translation 0.0385 0 0.02 + translation 0.043 0 0.02 children [ Shape { appearance PBRAppearance { @@ -1150,7 +1523,7 @@ DEF B3 Robot { name "front sonar" } Solid { - translation -0.0385 0 0.02 + translation -0.043 0 0.02 rotation 0 0 1 3.141592653589793 children [ Shape { @@ -1211,35 +1584,42 @@ DEF B3 Robot { } ] name "B3" - boundingObject USE BLUE_ROBOT_SHAPE - physics USE ROBOT_PHYSICS + boundingObject USE ROBOT_SHAPE + physics DEF ROBOT_PHYSICS Physics { + density 20000 + centerOfMass [ + 0 0 -0.1 + ] + damping Damping { + } + } controller "rcj_soccer_team_blue" synchronization FALSE } DEF Y1 Robot { - translation -0.274383 -0.359359 0.0373044 - rotation -4.81452e-07 1.47473e-06 1 1.57 + translation -0.33289712767451507 -0.2420316680351436 0.0380918 + rotation 0 0 1 1.5699999999999998 children [ - HingeJoint { + DEF FRONT_LEFT_WHEEL HingeJoint { jointParameters HingeJointParameters { - position 8.806153362894452e-12 - axis 0 1 0 - anchor 0 -0.045 -0.0176 + axis 0.785398 0.785398 0 + anchor 0.0304039 0.0304039 -0.032 } device [ RotationalMotor { - name "left wheel motor" + name "front left motor" + maxVelocity 40 } PositionSensor { - name "left wheel sensor" + name "front left sensor" } ] endPoint Solid { - translation 0 -0.045 -0.0176 - rotation -3.9627690133025035e-11 3.9627544572658754e-11 -1 1.5708 + translation 0.030403899999999984 0.030403899999999984 -0.032 + rotation 0 0 -1 2.35619 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF FRONT_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ DEF WHEEL_SHAPE Shape { appearance PBRAppearance { @@ -1247,80 +1627,188 @@ DEF Y1 Robot { metalness 0 } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.006 + radius 0.0065 } } ] } ] - name "right wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - USE WHEEL_SHAPE - ] - } + name "front left wheel" + contactMaterial "wheel" + boundingObject USE FRONT_LEFT_TRANSFORM physics DEF WHEEL_PHYSICS Physics { - density -1 - mass 0.005 } } } - HingeJoint { + DEF REAR_LEFT_WHEEL HingeJoint { jointParameters HingeJointParameters { - position 8.614402906181159e-12 - axis 0 1 0 - anchor 0 0.045 -0.0176 + axis -0.785398 0.785398 0 + anchor -0.0304039 0.0304039 -0.032 } device [ RotationalMotor { - name "right wheel motor" + name "rear left motor" + maxVelocity 40 } PositionSensor { - name "right wheel sensor" + name "rear left sensor" } ] endPoint Solid { - translation 0 0.045 -0.0176 - rotation -3.876481307781522e-11 3.876467068696751e-11 -1 1.5708 + translation -0.03040390000000001 0.030403899999999984 -0.032 + rotation 0 0 -1 0.7853953071795856 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF REAR_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear left wheel" + contactMaterial "wheel" + boundingObject USE REAR_LEFT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF REAR_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 -0.785398 0 + anchor -0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear right motor" + maxVelocity 40 + } + PositionSensor { + name "rear right sensor" + } + ] + endPoint Solid { + translation -0.0304038999999999 -0.030403899999999984 -0.032 + rotation 0 0 0.9999999999999999 0.785398 + children [ + DEF REAR_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear right wheel" + contactMaterial "wheel" + boundingObject USE REAR_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF FRONT_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis 0.785398 -0.785398 0 + anchor 0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "front right motor" + maxVelocity 40 + } + PositionSensor { + name "front right sensor" + } + ] + endPoint Solid { + translation 0.030403899999999984 -0.030403899999999984 -0.032 + rotation 0 0 1 2.3561900000000002 + children [ + DEF FRONT_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "front right wheel" + contactMaterial "wheel" + boundingObject USE FRONT_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF DRIBBLER HingeJoint { + jointParameters HingeJointParameters { + position 8873.53458988807 + axis 0 1 0 + anchor 0.026 0 -0.008 + suspensionAxis 0 0 1 + } + device [ + RotationalMotor { + name "dribbler motor" + maxVelocity 50 + } + PositionSensor { + name "dribbler sensor" + } + ] + endPoint Solid { + translation 0.02599045719202514 1.7981358380048107e-07 -0.008000095794128182 + rotation -0.260439413308817 -0.2608143585831204 0.9295951712182215 1.6434911601719364 + children [ + DEF DRIBBLER_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.045 + radius 0.004 } } ] } ] - name "left wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } - geometry Cylinder { - height 0.01 - radius 0.02 - } + name "dribbler" + contactMaterial "dribbler" + boundingObject USE DRIBBLER_TRANSFORM + physics Physics { + density -1 + mass 1.25 + } + } + } + DEF KICKER SliderJoint { + jointParameters JointParameters { + position -5.893445048499387e-08 + axis 1 0 0 + } + device [ + LinearMotor { + name "kicker motor" + maxVelocity 20 + minPosition -2.2419110676378706e-05 + maxPosition 0.042 + maxForce 10000 + } + PositionSensor { + name "kicker sensor" + } + ] + endPoint Solid { + translation -0.0200001306674418 -0.0004198494222770188 -0.024061894469276958 + rotation -1.181069130918756e-06 0.9999999999985407 1.2343786776356968e-06 1.570801851011894 + children [ + DEF KICKER_SHAPE Shape { + geometry Box { + size 0.015 0.03 0.03 } - ] + } + ] + boundingObject USE KICKER_SHAPE + physics Physics { + density 70000 } - physics USE WHEEL_PHYSICS } } - DEF YELLOW_ROBOT_SHAPE Shape { + DEF ROBOT_SHAPE Shape { appearance PBRAppearance { baseColorMap ImageTexture { url [ @@ -1330,17 +1818,19 @@ DEF Y1 Robot { roughness 1 metalness 0 } - geometry Box { - size 0.075 0.075 0.075 + geometry Mesh { + url [ + "soccer/Robot Shape.obj" + ] } } Solid { - translation 0 0.0385 0.02 - rotation 0 0 1 1.5708 + translation 0 0.043 0.02 + rotation 0 0 1 1.5707903061004251 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1360,12 +1850,12 @@ DEF Y1 Robot { name "left sonar" } Solid { - translation 0 -0.0385 0.02 + translation 0 -0.043 0.02 rotation 0 0 1 -1.5707996938995747 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1385,11 +1875,11 @@ DEF Y1 Robot { name "right sonar" } Solid { - translation 0.0385 0 0.02 + translation 0.043 0 0.02 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1409,12 +1899,12 @@ DEF Y1 Robot { name "front sonar" } Solid { - translation -0.0385 0 0.02 + translation -0.043 0 0.02 rotation 0 0 1 3.141592653589793 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1442,9 +1932,9 @@ DEF Y1 Robot { } Receiver { name "team receiver" - channel 3 + channel 2 allowedChannels [ - 3 + 2 ] } Receiver { @@ -1458,10 +1948,10 @@ DEF Y1 Robot { Emitter { name "team emitter" range 10 - channel 3 + channel 2 baudRate 115200 allowedChannels [ - 3 + 2 ] } GPS { @@ -1470,35 +1960,42 @@ DEF Y1 Robot { } ] name "Y1" - boundingObject USE YELLOW_ROBOT_SHAPE - physics USE ROBOT_PHYSICS + boundingObject USE ROBOT_SHAPE + physics DEF ROBOT_PHYSICS Physics { + density 20000 + centerOfMass [ + 0 0 -0.1 + ] + damping Damping { + } + } controller "rcj_soccer_team_yellow" synchronization FALSE } DEF Y2 Robot { - translation 0.335061 -0.346269 0.0373044 - rotation -1.56377e-06 5.12393e-07 1 1.51127 + translation 0.36976800254147835 -0.2886410833124659 0.0380918 + rotation 0 0 1 1.5699999999999998 children [ - HingeJoint { + DEF FRONT_LEFT_WHEEL HingeJoint { jointParameters HingeJointParameters { - position 8.629983611817959e-12 - axis 0 1 0 - anchor 0 -0.045 -0.0176 + axis 0.785398 0.785398 0 + anchor 0.0304039 0.0304039 -0.032 } device [ RotationalMotor { - name "left wheel motor" + name "front left motor" + maxVelocity 40 } PositionSensor { - name "left wheel sensor" + name "front left sensor" } ] endPoint Solid { - translation 0 -0.045 -0.0176 - rotation -3.020494264136286e-11 3.020483169261717e-11 -1 1.5708 + translation 0.030403899999999984 0.030403899999999984 -0.032 + rotation 0 0 -1 2.35619 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF FRONT_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ DEF WHEEL_SHAPE Shape { appearance PBRAppearance { @@ -1506,80 +2003,188 @@ DEF Y2 Robot { metalness 0 } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.006 + radius 0.0065 } } ] } ] - name "right wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - USE WHEEL_SHAPE - ] - } + name "front left wheel" + contactMaterial "wheel" + boundingObject USE FRONT_LEFT_TRANSFORM physics DEF WHEEL_PHYSICS Physics { - density -1 - mass 0.005 } } } - HingeJoint { + DEF REAR_LEFT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 0.785398 0 + anchor -0.0304039 0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear left motor" + maxVelocity 40 + } + PositionSensor { + name "rear left sensor" + } + ] + endPoint Solid { + translation -0.030403899999999984 0.030403899999999984 -0.032 + rotation 0 0 -1 0.7853953071795856 + children [ + DEF REAR_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear left wheel" + contactMaterial "wheel" + boundingObject USE REAR_LEFT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF REAR_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 -0.785398 0 + anchor -0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear right motor" + maxVelocity 40 + } + PositionSensor { + name "rear right sensor" + } + ] + endPoint Solid { + translation -0.030403899999999928 -0.030403899999999984 -0.032 + rotation 0 0 0.9999999999999999 0.785398 + children [ + DEF REAR_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear right wheel" + contactMaterial "wheel" + boundingObject USE REAR_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF FRONT_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis 0.785398 -0.785398 0 + anchor 0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "front right motor" + maxVelocity 40 + } + PositionSensor { + name "front right sensor" + } + ] + endPoint Solid { + translation 0.030403899999999928 -0.030403899999999984 -0.032 + rotation 0 0 1 2.3561900000000002 + children [ + DEF FRONT_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "front right wheel" + contactMaterial "wheel" + boundingObject USE FRONT_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF DRIBBLER HingeJoint { jointParameters HingeJointParameters { - position 8.730131650988922e-12 + position 8873.53458988807 axis 0 1 0 - anchor 0 0.045 -0.0176 + anchor 0.026 0 -0.008 + suspensionAxis 0 0 1 } device [ RotationalMotor { - name "right wheel motor" + name "dribbler motor" + maxVelocity 50 } PositionSensor { - name "right wheel sensor" + name "dribbler sensor" } ] endPoint Solid { - translation 0 0.045 -0.0176 - rotation -3.055546077846123e-11 3.055534854219291e-11 -1 1.5708 + translation 0.025990457192025085 1.7981358385599222e-07 -0.008000095794128182 + rotation -0.260439413308817 -0.2608143585831204 0.9295951712182215 1.6434911601719364 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF DRIBBLER_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.045 + radius 0.004 } } ] } ] - name "left wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } - geometry Cylinder { - height 0.01 - radius 0.02 - } + name "dribbler" + contactMaterial "dribbler" + boundingObject USE DRIBBLER_TRANSFORM + physics Physics { + density -1 + mass 1.25 + } + } + } + DEF KICKER SliderJoint { + jointParameters JointParameters { + position -5.893445048499387e-08 + axis 1 0 0 + } + device [ + LinearMotor { + name "kicker motor" + maxVelocity 20 + minPosition -2.2419110676378706e-05 + maxPosition 0.042 + maxForce 10000 + } + PositionSensor { + name "kicker sensor" + } + ] + endPoint Solid { + translation -0.020000130667441773 -0.0004198494222769633 -0.024061894469276958 + rotation -1.181069130918756e-06 0.9999999999985407 1.2343786776356968e-06 1.570801851011894 + children [ + DEF KICKER_SHAPE Shape { + geometry Box { + size 0.015 0.03 0.03 } - ] + } + ] + boundingObject USE KICKER_SHAPE + physics Physics { + density 70000 } - physics USE WHEEL_PHYSICS } } - DEF YELLOW_ROBOT_SHAPE Shape { + DEF ROBOT_SHAPE Shape { appearance PBRAppearance { baseColorMap ImageTexture { url [ @@ -1589,17 +2194,19 @@ DEF Y2 Robot { roughness 1 metalness 0 } - geometry Box { - size 0.075 0.075 0.075 + geometry Mesh { + url [ + "soccer/Robot Shape.obj" + ] } } Solid { - translation 0 0.0385 0.02 - rotation 0 0 1 1.5708 + translation 0 0.043 0.02 + rotation 0 0 1 1.5707903061004251 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1619,12 +2226,12 @@ DEF Y2 Robot { name "left sonar" } Solid { - translation 0 -0.0385 0.02 + translation 0 -0.043 0.02 rotation 0 0 1 -1.5707996938995747 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1644,11 +2251,11 @@ DEF Y2 Robot { name "right sonar" } Solid { - translation 0.0385 0 0.02 + translation 0.043 0 0.02 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1668,12 +2275,12 @@ DEF Y2 Robot { name "front sonar" } Solid { - translation -0.0385 0 0.02 + translation -0.043 0 0.02 rotation 0 0 1 3.141592653589793 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1701,9 +2308,9 @@ DEF Y2 Robot { } Receiver { name "team receiver" - channel 3 + channel 2 allowedChannels [ - 3 + 2 ] } Receiver { @@ -1717,10 +2324,10 @@ DEF Y2 Robot { Emitter { name "team emitter" range 10 - channel 3 + channel 2 baudRate 115200 allowedChannels [ - 3 + 2 ] } GPS { @@ -1729,35 +2336,42 @@ DEF Y2 Robot { } ] name "Y2" - boundingObject USE YELLOW_ROBOT_SHAPE - physics USE ROBOT_PHYSICS + boundingObject USE ROBOT_SHAPE + physics DEF ROBOT_PHYSICS Physics { + density 20000 + centerOfMass [ + 0 0 -0.1 + ] + damping Damping { + } + } controller "rcj_soccer_team_yellow" synchronization FALSE } DEF Y3 Robot { - translation -0.0123017 -0.368377 0.0373044 - rotation 1.19416e-06 1.20388e-06 1 1.58029 + translation 0 -0.1 0.0380918 + rotation 0 0 1 1.5699999999999998 children [ - HingeJoint { + DEF FRONT_LEFT_WHEEL HingeJoint { jointParameters HingeJointParameters { - position -6.5218941358580196e-12 - axis 0 1 0 - anchor 0 -0.045 -0.0176 + axis 0.785398 0.785398 0 + anchor 0.0304039 0.0304039 -0.032 } device [ RotationalMotor { - name "left wheel motor" + name "front left motor" + maxVelocity 40 } PositionSensor { - name "left wheel sensor" + name "front left sensor" } ] endPoint Solid { - translation 0 -0.045 -0.0176 - rotation 2.2826629475503072e-11 -2.2826545628765183e-11 -1 1.5708 + translation 0.03040390000000001 0.030403900000000005 -0.032 + rotation 0 0 -1 2.35619 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF FRONT_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ DEF WHEEL_SHAPE Shape { appearance PBRAppearance { @@ -1765,80 +2379,188 @@ DEF Y3 Robot { metalness 0 } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.006 + radius 0.0065 } } ] } ] - name "right wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - USE WHEEL_SHAPE - ] - } + name "front left wheel" + contactMaterial "wheel" + boundingObject USE FRONT_LEFT_TRANSFORM physics DEF WHEEL_PHYSICS Physics { - density -1 - mass 0.005 } } } - HingeJoint { + DEF REAR_LEFT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis -0.785398 0.785398 0 + anchor -0.0304039 0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear left motor" + maxVelocity 40 + } + PositionSensor { + name "rear left sensor" + } + ] + endPoint Solid { + translation -0.030403899999999984 0.030403899999999994 -0.032 + rotation 0 0 -1 0.7853953071795856 + children [ + DEF REAR_LEFT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear left wheel" + contactMaterial "wheel" + boundingObject USE REAR_LEFT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF REAR_RIGHT_WHEEL HingeJoint { jointParameters HingeJointParameters { - position -6.5139005300807185e-12 + axis -0.785398 -0.785398 0 + anchor -0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "rear right motor" + maxVelocity 40 + } + PositionSensor { + name "rear right sensor" + } + ] + endPoint Solid { + translation -0.030403899999999928 -0.030403899999999984 -0.032 + rotation 0 0 0.9999999999999999 0.785398 + children [ + DEF REAR_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "rear right wheel" + contactMaterial "wheel" + boundingObject USE REAR_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF FRONT_RIGHT_WHEEL HingeJoint { + jointParameters HingeJointParameters { + axis 0.785398 -0.785398 0 + anchor 0.0304039 -0.0304039 -0.032 + } + device [ + RotationalMotor { + name "front right motor" + maxVelocity 40 + } + PositionSensor { + name "front right sensor" + } + ] + endPoint Solid { + translation 0.030403900000000025 -0.030403899999999994 -0.032 + rotation 0 0 1 2.3561900000000002 + children [ + DEF FRONT_RIGHT_TRANSFORM Transform { + rotation 0 1 0 1.570796327 + children [ + USE WHEEL_SHAPE + ] + } + ] + name "front right wheel" + contactMaterial "wheel" + boundingObject USE FRONT_RIGHT_TRANSFORM + physics USE WHEEL_PHYSICS + } + } + DEF DRIBBLER HingeJoint { + jointParameters HingeJointParameters { + position 8873.53458988807 axis 0 1 0 - anchor 0 0.045 -0.0176 + anchor 0.026 0 -0.008 + suspensionAxis 0 0 1 } device [ RotationalMotor { - name "right wheel motor" + name "dribbler motor" + maxVelocity 50 } PositionSensor { - name "right wheel sensor" + name "dribbler sensor" } ] endPoint Solid { - translation 0 0.045 -0.0176 - rotation 2.2798651855282515e-11 -2.2798568111311978e-11 -1 1.5708 + translation 0.025990457192025113 1.7981358380625445e-07 -0.008000095794128182 + rotation -0.260439413308817 -0.2608143585831204 0.9295951712182215 1.6434911601719364 children [ - Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 + DEF DRIBBLER_TRANSFORM Transform { + rotation 0 1 0 1.570796327 children [ Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } geometry Cylinder { - height 0.01 - radius 0.02 + height 0.045 + radius 0.004 } } ] } ] - name "left wheel" - boundingObject Transform { - rotation -0.5771969549958951 0.5776567755050862 -0.5771969549958951 2.0939354039397986 - children [ - Shape { - appearance PBRAppearance { - roughness 1 - metalness 0 - } - geometry Cylinder { - height 0.01 - radius 0.02 - } + name "dribbler" + contactMaterial "dribbler" + boundingObject USE DRIBBLER_TRANSFORM + physics Physics { + density -1 + mass 1.25 + } + } + } + DEF KICKER SliderJoint { + jointParameters JointParameters { + position -5.893445048499279e-08 + axis 1 0 0 + } + device [ + LinearMotor { + name "kicker motor" + maxVelocity 20 + minPosition -2.2419110676378706e-05 + maxPosition 0.042 + maxForce 10000 + } + PositionSensor { + name "kicker sensor" + } + ] + endPoint Solid { + translation -0.020000130667441787 -0.00041984942227696776 -0.024061894469276958 + rotation -1.181069130918756e-06 0.9999999999985407 1.2343786776356968e-06 1.570801851011894 + children [ + DEF KICKER_SHAPE Shape { + geometry Box { + size 0.015 0.03 0.03 } - ] + } + ] + boundingObject USE KICKER_SHAPE + physics Physics { + density 70000 } - physics USE WHEEL_PHYSICS } } - DEF YELLOW_ROBOT_SHAPE Shape { + DEF ROBOT_SHAPE Shape { appearance PBRAppearance { baseColorMap ImageTexture { url [ @@ -1848,17 +2570,19 @@ DEF Y3 Robot { roughness 1 metalness 0 } - geometry Box { - size 0.075 0.075 0.075 + geometry Mesh { + url [ + "soccer/Robot Shape.obj" + ] } } Solid { - translation 0 0.0385 0.02 - rotation 0 0 1 1.5708 + translation 0 0.043 0.02 + rotation 0 0 1 1.5707903061004251 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1878,12 +2602,12 @@ DEF Y3 Robot { name "left sonar" } Solid { - translation 0 -0.0385 0.02 + translation 0 -0.043 0.02 rotation 0 0 1 -1.5707996938995747 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1903,11 +2627,11 @@ DEF Y3 Robot { name "right sonar" } Solid { - translation 0.0385 0 0.02 + translation 0.043 0 0.02 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1927,12 +2651,12 @@ DEF Y3 Robot { name "front sonar" } Solid { - translation -0.0385 0 0.02 + translation -0.043 0 0.02 rotation 0 0 1 3.141592653589793 children [ Shape { appearance PBRAppearance { - baseColor 1 1 0 + baseColor 0 0 1 roughness 1 metalness 0 } @@ -1960,9 +2684,9 @@ DEF Y3 Robot { } Receiver { name "team receiver" - channel 3 + channel 2 allowedChannels [ - 3 + 2 ] } Receiver { @@ -1976,10 +2700,10 @@ DEF Y3 Robot { Emitter { name "team emitter" range 10 - channel 3 + channel 2 baudRate 115200 allowedChannels [ - 3 + 2 ] } GPS { @@ -1988,8 +2712,15 @@ DEF Y3 Robot { } ] name "Y3" - boundingObject USE YELLOW_ROBOT_SHAPE - physics USE ROBOT_PHYSICS + boundingObject USE ROBOT_SHAPE + physics DEF ROBOT_PHYSICS Physics { + density 20000 + centerOfMass [ + 0 0 -0.1 + ] + damping Damping { + } + } controller "rcj_soccer_team_yellow" synchronization FALSE } @@ -2006,5 +2737,4 @@ Robot { ] controller "rcj_soccer_referee_supervisor" supervisor TRUE - synchronization TRUE } diff --git a/worlds/soccer/Robot Shape.mtl b/worlds/soccer/Robot Shape.mtl new file mode 100644 index 00000000..0556e143 --- /dev/null +++ b/worlds/soccer/Robot Shape.mtl @@ -0,0 +1,9 @@ +# WaveFront *.mtl file (generated by Autodesk ATF) + +newmtl 191,191,191 +Ka 0.749020 0.749020 0.749020 +Kd 0.749020 0.749020 0.749020 +Ks 0.000000 0.000000 0.000000 +Ns 300.000000 +d 1.000000 + diff --git a/worlds/soccer/Robot Shape.obj b/worlds/soccer/Robot Shape.obj new file mode 100644 index 00000000..869a52b5 --- /dev/null +++ b/worlds/soccer/Robot Shape.obj @@ -0,0 +1,787 @@ +# WaveFront *.obj file (generated by Autodesk ATF) + +mtllib Robot Shape.mtl + +g Solid8 + +v -0.042432 -0.002396 -0.037500 +v -0.042432 -0.002396 0.037500 +v -0.042432 0.002396 -0.037500 +v -0.042432 0.002396 0.037500 +v -0.041893 -0.007159 -0.037500 +v -0.041893 -0.007159 0.037500 +v -0.041893 0.007159 -0.037500 +v -0.041893 0.007159 0.037500 +v -0.040820 -0.011830 -0.037500 +v -0.040820 -0.011830 0.037500 +v -0.040820 0.011830 -0.037500 +v -0.040820 0.011830 0.037500 +v -0.039229 -0.016351 -0.037500 +v -0.039229 -0.016351 0.037500 +v -0.039229 0.016351 -0.037500 +v -0.039229 0.016351 0.037500 +v -0.037138 -0.020664 -0.037500 +v -0.037138 -0.020664 0.037500 +v -0.037138 0.020664 -0.037500 +v -0.037138 0.020664 0.037500 +v -0.034575 -0.024715 -0.037500 +v -0.034575 -0.024715 0.037500 +v -0.034575 0.024715 -0.037500 +v -0.034575 0.024715 0.037500 +v -0.031572 -0.028450 -0.037500 +v -0.031572 -0.028450 0.037500 +v -0.031572 0.028450 -0.037500 +v -0.031572 0.028450 0.037500 +v -0.028168 -0.031824 -0.037500 +v -0.028168 -0.031824 0.037500 +v -0.028168 0.031824 -0.037500 +v -0.028168 0.031824 0.037500 +v -0.024406 -0.034794 -0.037500 +v -0.024406 -0.034794 0.037500 +v -0.024406 0.034794 -0.037500 +v -0.024406 0.034794 0.037500 +v -0.020333 -0.037320 -0.037500 +v -0.020333 -0.037320 0.037500 +v -0.020333 0.037320 -0.037500 +v -0.020333 0.037320 0.037500 +v -0.016002 -0.039373 -0.037500 +v -0.016002 -0.039373 0.037500 +v -0.016002 0.039373 -0.037500 +v -0.016002 0.039373 0.037500 +v -0.011467 -0.040924 -0.037500 +v -0.011467 -0.040924 0.037500 +v -0.011467 0.040924 -0.037500 +v -0.011467 0.040924 0.037500 +v -0.006786 -0.041955 -0.037500 +v -0.006786 -0.041955 0.037500 +v -0.006786 0.041955 -0.037500 +v -0.006786 0.041955 0.037500 +v -0.002019 -0.042452 -0.037500 +v -0.002019 -0.042452 0.037500 +v -0.002019 0.042452 -0.037500 +v -0.002019 0.042452 0.037500 +v 0.002774 -0.042409 -0.037500 +v 0.002774 -0.042409 0.037500 +v 0.002774 0.042409 -0.037500 +v 0.002774 0.042409 0.037500 +v 0.007532 -0.041827 -0.037500 +v 0.007532 -0.041827 0.037500 +v 0.007532 0.041827 -0.037500 +v 0.007532 0.041827 0.037500 +v 0.012193 -0.040713 -0.037500 +v 0.012193 -0.040713 0.037500 +v 0.012193 0.040713 -0.037500 +v 0.012193 0.040713 0.037500 +v 0.016700 -0.039081 -0.037500 +v 0.016700 -0.039081 0.037500 +v 0.016700 0.039081 -0.037500 +v 0.016700 0.039081 0.037500 +v 0.018500 -0.020000 -0.037500 +v 0.018500 -0.020000 0.037500 +v 0.018500 0.020000 -0.037500 +v 0.018500 0.020000 0.037500 +v 0.020994 -0.036953 -0.037500 +v 0.020994 -0.036953 0.037500 +v 0.020994 0.036953 -0.037500 +v 0.020994 0.036953 0.037500 +v 0.025021 -0.034354 -0.037500 +v 0.025021 -0.034354 0.037500 +v 0.025021 0.034354 -0.037500 +v 0.025021 0.034354 0.037500 +v 0.028730 -0.031318 -0.037500 +v 0.028730 -0.031318 0.037500 +v 0.028730 0.031318 -0.037500 +v 0.028730 0.031318 0.037500 +v 0.030519 -0.020000 0.000000 +v 0.030519 -0.020000 0.037500 +v 0.030519 0.020000 0.000000 +v 0.030519 0.020000 0.037500 +v 0.032074 -0.027884 -0.037500 +v 0.032074 -0.027884 0.037500 +v 0.032074 0.027884 -0.037500 +v 0.032074 0.027884 0.037500 +v 0.035010 -0.024095 -0.037500 +v 0.035010 -0.024095 0.037500 +v 0.035010 0.024095 -0.037500 +v 0.035010 0.024095 0.037500 +v 0.037500 -0.020000 -0.037500 +v 0.037500 -0.020000 0.000000 +v 0.037500 -0.020000 0.037500 +v 0.037500 0.020000 -0.037500 +v 0.037500 0.020000 0.000000 +v 0.037500 0.020000 0.037500 +vt -0.000000 0.000000 0.000000 +vt -3.750000 0.000000 0.000000 +vt -3.750000 -0.479551 0.000000 +vt -3.750000 -0.959102 0.000000 +vt -3.750000 -1.438653 0.000000 +vt -3.750000 -1.918204 0.000000 +vt -3.750000 -2.397755 0.000000 +vt -3.750000 -2.877306 0.000000 +vt -3.750000 -3.356857 0.000000 +vt -3.750000 -3.836409 0.000000 +vt -3.750000 -4.315959 0.000000 +vt -3.750000 -4.795511 0.000000 +vt -3.750000 -5.275062 0.000000 +vt -3.750000 -5.754613 0.000000 +vt -3.750000 -6.234164 0.000000 +vt -3.750000 -6.713715 0.000000 +vt -3.750000 -7.193266 0.000000 +vt -3.750000 -7.672817 0.000000 +vt -3.750000 -8.152369 0.000000 +vt -3.750000 -8.631919 0.000000 +vt -3.750000 -9.111470 0.000000 +vt -3.750000 -9.591022 0.000000 +vt -3.750000 -10.070572 0.000000 +vt -3.750000 -10.550124 0.000000 +vt -3.750000 -11.029675 0.000000 +vt -3.750000 -11.509226 0.000000 +vt -3.750000 -11.988777 0.000000 +vt -3.750000 -12.468328 0.000000 +vt -3.750000 -12.947879 0.000000 +vt -3.750000 -13.427429 0.000000 +vt -3.750000 -13.906981 0.000000 +vt -3.750000 -14.386532 0.000000 +vt -3.750000 -14.866083 0.000000 +vt -3.750000 -15.345634 0.000000 +vt -3.750000 -15.825185 0.000000 +vt -3.750000 -16.304737 0.000000 +vt -3.750000 -16.784286 0.000000 +vt -3.750000 -17.263838 0.000000 +vt -3.750000 -17.743389 0.000000 +vt -3.750000 -18.222940 0.000000 +vt -3.750000 -18.702492 0.000000 +vt -3.750000 -19.182043 0.000000 +vt -3.750000 -19.661594 0.000000 +vt -3.750000 -20.141144 0.000000 +vt -3.750000 -20.620695 0.000000 +vt -3.750000 -21.100248 0.000000 +vt -3.750000 -21.579798 0.000000 +vt -3.750000 -22.059349 0.000000 +vt -3.750000 -22.538900 0.000000 +vt -0.000000 -22.538900 0.000000 +vt 3.750000 -22.538900 0.000000 +vt 3.750000 -22.059349 0.000000 +vt 3.750000 -21.579798 0.000000 +vt 3.750000 -21.100248 0.000000 +vt 3.750000 -20.620695 0.000000 +vt 3.750000 -20.141144 0.000000 +vt 3.750000 -19.661594 0.000000 +vt 3.750000 -19.182043 0.000000 +vt 3.750000 -18.702492 0.000000 +vt 3.750000 -18.222940 0.000000 +vt 3.750000 -17.743389 0.000000 +vt 3.750000 -17.263838 0.000000 +vt 3.750000 -16.784286 0.000000 +vt 3.750000 -16.304737 0.000000 +vt 3.750000 -15.825185 0.000000 +vt 3.750000 -15.345634 0.000000 +vt 3.750000 -14.866083 0.000000 +vt 3.750000 -14.386532 0.000000 +vt 3.750000 -13.906981 0.000000 +vt 3.750000 -13.427429 0.000000 +vt 3.750000 -12.947879 0.000000 +vt 3.750000 -12.468328 0.000000 +vt 3.750000 -11.988777 0.000000 +vt 3.750000 -11.509226 0.000000 +vt 3.750000 -11.029675 0.000000 +vt 3.750000 -10.550124 0.000000 +vt 3.750000 -10.070572 0.000000 +vt 3.750000 -9.591022 0.000000 +vt 3.750000 -9.111470 0.000000 +vt 3.750000 -8.631919 0.000000 +vt 3.750000 -8.152369 0.000000 +vt 3.750000 -7.672817 0.000000 +vt 3.750000 -7.193266 0.000000 +vt 3.750000 -6.713715 0.000000 +vt 3.750000 -6.234164 0.000000 +vt 3.750000 -5.754613 0.000000 +vt 3.750000 -5.275062 0.000000 +vt 3.750000 -4.795511 0.000000 +vt 3.750000 -4.315959 0.000000 +vt 3.750000 -3.836409 0.000000 +vt 3.750000 -3.356857 0.000000 +vt 3.750000 -2.877306 0.000000 +vt 3.750000 -2.397755 0.000000 +vt 3.750000 -1.918204 0.000000 +vt 3.750000 -1.438653 0.000000 +vt 3.750000 -0.959102 0.000000 +vt 3.750000 -0.479551 0.000000 +vt 3.750000 0.000000 0.000000 +vt 4.000000 -3.750000 0.000000 +vt 4.000000 3.750000 0.000000 +vt 0.000000 3.750000 0.000000 +vt 0.000000 -3.750000 0.000000 +vt 1.900000 -3.750000 0.000000 +vt 1.900000 3.750000 0.000000 +vt 0.000000 3.750000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.698086 0.000000 0.000000 +vt 0.698086 -3.750000 0.000000 +vt 1.201913 0.000000 0.000000 +vt 1.900000 0.000000 0.000000 +vt 1.900000 3.750000 0.000000 +vt 0.000000 3.750000 0.000000 +vt 0.000000 -3.750000 0.000000 +vt 1.201913 -3.750000 0.000000 +vt -3.301913 -2.000000 0.000000 +vt -3.301913 2.000000 0.000000 +vt -4.000000 2.000000 0.000000 +vt -4.000000 -2.000000 0.000000 +vt -2.100000 -2.000000 0.000000 +vt -4.000000 -2.000000 0.000000 +vt -3.750961 -2.409518 0.000000 +vt -3.457395 -2.788390 0.000000 +vt -3.123036 -3.131799 0.000000 +vt -2.752137 -3.435376 0.000000 +vt -2.349415 -3.695261 0.000000 +vt -1.919992 -3.908149 0.000000 +vt -1.469329 -4.071331 0.000000 +vt -1.003158 -4.182733 0.000000 +vt -0.527409 -4.240937 0.000000 +vt -0.048131 -4.245203 0.000000 +vt 0.428579 -4.195477 0.000000 +vt 0.896659 -4.092392 0.000000 +vt 1.350155 -3.937258 0.000000 +vt 1.783300 -3.732049 0.000000 +vt 2.190585 -3.479374 0.000000 +vt 2.566829 -3.182448 0.000000 +vt 2.907248 -2.845045 0.000000 +vt 3.207512 -2.471459 0.000000 +vt 3.463802 -2.066439 0.000000 +vt 3.672859 -1.635138 0.000000 +vt 3.832023 -1.183041 0.000000 +vt 3.939271 -0.715897 0.000000 +vt 3.993238 -0.239648 0.000000 +vt 3.993238 0.239648 0.000000 +vt 3.939271 0.715897 0.000000 +vt 3.832023 1.183041 0.000000 +vt 3.672859 1.635138 0.000000 +vt 3.463802 2.066439 0.000000 +vt 3.207512 2.471459 0.000000 +vt 2.907248 2.845045 0.000000 +vt 2.566829 3.182448 0.000000 +vt 2.190585 3.479374 0.000000 +vt 1.783300 3.732049 0.000000 +vt 1.350155 3.937258 0.000000 +vt 0.896659 4.092392 0.000000 +vt 0.428579 4.195477 0.000000 +vt -0.048131 4.245203 0.000000 +vt -0.527409 4.240937 0.000000 +vt -1.003158 4.182733 0.000000 +vt -1.469329 4.071331 0.000000 +vt -1.919992 3.908149 0.000000 +vt -2.349415 3.695261 0.000000 +vt -2.752137 3.435376 0.000000 +vt -3.123036 3.131799 0.000000 +vt -3.457395 2.788390 0.000000 +vt -3.750961 2.409518 0.000000 +vt -4.000000 2.000000 0.000000 +vt -2.100000 2.000000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 4.000000 0.000000 0.000000 +vt 4.000000 3.750000 0.000000 +vt 0.000000 3.750000 0.000000 +vt 3.301913 2.000000 0.000000 +vt 3.301913 -2.000000 0.000000 +vt 2.100000 -2.000000 0.000000 +vt 2.100000 2.000000 0.000000 +vt 4.000000 2.000000 0.000000 +vt 3.750961 2.409518 0.000000 +vt 3.457395 2.788390 0.000000 +vt 3.123036 3.131799 0.000000 +vt 2.752137 3.435376 0.000000 +vt 2.349415 3.695261 0.000000 +vt 1.919992 3.908149 0.000000 +vt 1.469329 4.071331 0.000000 +vt 1.003158 4.182733 0.000000 +vt 0.527409 4.240937 0.000000 +vt 0.048131 4.245203 0.000000 +vt -0.428579 4.195477 0.000000 +vt -0.896659 4.092392 0.000000 +vt -1.350155 3.937258 0.000000 +vt -1.783300 3.732049 0.000000 +vt -2.190585 3.479374 0.000000 +vt -2.566829 3.182448 0.000000 +vt -2.907248 2.845045 0.000000 +vt -3.207512 2.471459 0.000000 +vt -3.463802 2.066439 0.000000 +vt -3.672859 1.635138 0.000000 +vt -3.832023 1.183041 0.000000 +vt -3.939271 0.715897 0.000000 +vt -3.993238 0.239648 0.000000 +vt -3.993238 -0.239648 0.000000 +vt -3.939271 -0.715897 0.000000 +vt -3.832023 -1.183041 0.000000 +vt -3.672859 -1.635138 0.000000 +vt -3.463802 -2.066439 0.000000 +vt -3.207512 -2.471459 0.000000 +vt -2.907248 -2.845045 0.000000 +vt -2.566829 -3.182448 0.000000 +vt -2.190585 -3.479374 0.000000 +vt -1.783300 -3.732049 0.000000 +vt -1.350155 -3.937258 0.000000 +vt -0.896659 -4.092392 0.000000 +vt -0.428579 -4.195477 0.000000 +vt 0.048131 -4.245203 0.000000 +vt 0.527409 -4.240937 0.000000 +vt 1.003158 -4.182733 0.000000 +vt 1.469329 -4.071331 0.000000 +vt 1.919992 -3.908149 0.000000 +vt 2.349415 -3.695261 0.000000 +vt 2.752137 -3.435376 0.000000 +vt 3.123036 -3.131799 0.000000 +vt 3.457395 -2.788390 0.000000 +vt 3.750961 -2.409518 0.000000 +vt 4.000000 -2.000000 0.000000 +vt -4.000000 0.000000 0.000000 +vt -0.000000 0.000000 0.000000 +vt -0.000000 3.750000 0.000000 +vt -4.000000 3.750000 0.000000 +vn 88.235295 47.058824 0.000000 +vn 88.235295 47.058824 0.000000 +vn 82.375544 56.694531 0.000000 +vn 75.468111 65.609181 0.000000 +vn 67.600846 73.689389 0.000000 +vn 58.873808 80.832386 0.000000 +vn 49.397996 86.947328 0.000000 +vn 39.293921 91.956443 0.000000 +vn 28.690091 95.796025 0.000000 +vn 17.721371 98.417240 0.000000 +vn 6.527265 99.786747 0.000000 +vn -4.749858 99.887133 0.000000 +vn -15.966570 98.717111 0.000000 +vn -26.980215 96.291578 0.000000 +vn -37.650713 92.641371 0.000000 +vn -47.842360 87.812918 0.000000 +vn -57.425529 81.867629 0.000000 +vn -66.278338 74.881119 0.000000 +vn -74.288195 66.942245 0.000000 +vn -81.353229 58.151972 0.000000 +vn -87.383586 48.622105 0.000000 +vn -92.302567 38.473842 0.000000 +vn -96.047610 27.836257 0.000000 +vn -98.571080 16.844638 0.000000 +vn -99.840891 5.638785 0.000000 +vn -99.840891 -5.638785 0.000000 +vn -98.571080 -16.844638 0.000000 +vn -96.047610 -27.836257 0.000000 +vn -92.302567 -38.473842 0.000000 +vn -87.383586 -48.622105 0.000000 +vn -81.353229 -58.151972 0.000000 +vn -74.288195 -66.942245 0.000000 +vn -66.278338 -74.881119 0.000000 +vn -57.425529 -81.867629 0.000000 +vn -47.842360 -87.812918 0.000000 +vn -37.650713 -92.641371 0.000000 +vn -26.980215 -96.291578 0.000000 +vn -15.966570 -98.717111 0.000000 +vn -4.749858 -99.887133 0.000000 +vn 6.527265 -99.786747 0.000000 +vn 17.721371 -98.417240 0.000000 +vn 28.690091 -95.796025 0.000000 +vn 39.293921 -91.956443 0.000000 +vn 49.397996 -86.947328 0.000000 +vn 58.873808 -80.832386 0.000000 +vn 67.600846 -73.689389 0.000000 +vn 75.468111 -65.609181 0.000000 +vn 82.375544 -56.694531 0.000000 +vn 88.235295 -47.058824 0.000000 +vn 88.235295 -47.058824 0.000000 +vn 88.235295 -47.058824 0.000000 +vn 82.375544 -56.694531 0.000000 +vn 75.468111 -65.609181 0.000000 +vn 67.600846 -73.689389 0.000000 +vn 58.873808 -80.832386 0.000000 +vn 49.397996 -86.947328 0.000000 +vn 39.293921 -91.956443 0.000000 +vn 28.690091 -95.796025 0.000000 +vn 17.721371 -98.417240 0.000000 +vn 6.527265 -99.786747 0.000000 +vn -4.749858 -99.887133 0.000000 +vn -15.966570 -98.717111 0.000000 +vn -26.980215 -96.291578 0.000000 +vn -37.650713 -92.641371 0.000000 +vn -47.842360 -87.812918 0.000000 +vn -57.425529 -81.867629 0.000000 +vn -66.278338 -74.881119 0.000000 +vn -74.288195 -66.942245 0.000000 +vn -81.353229 -58.151972 0.000000 +vn -87.383586 -48.622105 0.000000 +vn -92.302567 -38.473842 0.000000 +vn -96.047610 -27.836257 0.000000 +vn -98.571080 -16.844638 0.000000 +vn -99.840891 -5.638785 0.000000 +vn -99.840891 5.638785 0.000000 +vn -98.571080 16.844638 0.000000 +vn -96.047610 27.836257 0.000000 +vn -92.302567 38.473842 0.000000 +vn -87.383586 48.622105 0.000000 +vn -81.353229 58.151972 0.000000 +vn -74.288195 66.942245 0.000000 +vn -66.278338 74.881119 0.000000 +vn -57.425529 81.867629 0.000000 +vn -47.842360 87.812918 0.000000 +vn -37.650713 92.641371 0.000000 +vn -26.980215 96.291578 0.000000 +vn -15.966570 98.717111 0.000000 +vn -4.749858 99.887133 0.000000 +vn 6.527265 99.786747 0.000000 +vn 17.721371 98.417240 0.000000 +vn 28.690091 95.796025 0.000000 +vn 39.293921 91.956443 0.000000 +vn 49.397996 86.947328 0.000000 +vn 58.873808 80.832386 0.000000 +vn 67.600846 73.689389 0.000000 +vn 75.468111 65.609181 0.000000 +vn 82.375544 56.694531 0.000000 +vn 88.235295 47.058824 0.000000 +vn 100.000000 0.000000 0.000000 +vn 100.000000 0.000000 0.000000 +vn 100.000000 0.000000 0.000000 +vn 100.000000 0.000000 0.000000 +vn 0.000000 -100.000000 0.000000 +vn 0.000000 -100.000000 0.000000 +vn 0.000000 -100.000000 0.000000 +vn 0.000000 -100.000000 0.000000 +vn 0.000000 -100.000000 0.000000 +vn 0.000000 -100.000000 0.000000 +vn 0.000000 100.000000 0.000000 +vn 0.000000 100.000000 0.000000 +vn 0.000000 100.000000 0.000000 +vn 0.000000 100.000000 0.000000 +vn 0.000000 100.000000 0.000000 +vn 0.000000 100.000000 0.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 0.000000 0.000000 -100.000000 +vn 100.000000 0.000000 0.000000 +vn 100.000000 0.000000 0.000000 +vn 100.000000 0.000000 0.000000 +vn 100.000000 0.000000 0.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn 0.000000 0.000000 100.000000 +vn -100.000000 0.000000 0.000000 +vn -100.000000 0.000000 0.000000 +vn -100.000000 0.000000 0.000000 +vn -100.000000 0.000000 0.000000 +usemtl 191,191,191 +f 104/2/2 99/3/3 105/1/1 +f 105/1/1 99/3/3 100/97/97 +f 105/1/1 100/97/97 106/98/98 +f 100/97/97 99/3/3 96/96/96 +f 96/96/96 99/3/3 95/4/4 +f 96/96/96 95/4/4 88/95/95 +f 88/95/95 95/4/4 87/5/5 +f 88/95/95 87/5/5 84/94/94 +f 84/94/94 87/5/5 83/6/6 +f 84/94/94 83/6/6 80/93/93 +f 80/93/93 83/6/6 79/7/7 +f 80/93/93 79/7/7 72/92/92 +f 72/92/92 79/7/7 71/8/8 +f 72/92/92 71/8/8 68/91/91 +f 68/91/91 71/8/8 67/9/9 +f 68/91/91 67/9/9 64/90/90 +f 64/90/90 67/9/9 63/10/10 +f 64/90/90 63/10/10 60/89/89 +f 60/89/89 63/10/10 59/11/11 +f 60/89/89 59/11/11 56/88/88 +f 56/88/88 59/11/11 55/12/12 +f 56/88/88 55/12/12 52/87/87 +f 52/87/87 55/12/12 51/13/13 +f 52/87/87 51/13/13 48/86/86 +f 48/86/86 51/13/13 47/14/14 +f 48/86/86 47/14/14 44/85/85 +f 44/85/85 47/14/14 43/15/15 +f 44/85/85 43/15/15 40/84/84 +f 40/84/84 43/15/15 39/16/16 +f 40/84/84 39/16/16 36/83/83 +f 36/83/83 39/16/16 35/17/17 +f 36/83/83 35/17/17 32/82/82 +f 32/82/82 35/17/17 31/18/18 +f 32/82/82 31/18/18 28/81/81 +f 28/81/81 31/18/18 27/19/19 +f 28/81/81 27/19/19 24/80/80 +f 24/80/80 27/19/19 23/20/20 +f 24/80/80 23/20/20 20/79/79 +f 20/79/79 23/20/20 19/21/21 +f 20/79/79 19/21/21 16/78/78 +f 16/78/78 19/21/21 15/22/22 +f 16/78/78 15/22/22 12/77/77 +f 12/77/77 15/22/22 11/23/23 +f 12/77/77 11/23/23 8/76/76 +f 8/76/76 11/23/23 7/24/24 +f 8/76/76 7/24/24 4/75/75 +f 4/75/75 7/24/24 3/25/25 +f 4/75/75 3/25/25 2/74/74 +f 2/74/74 3/25/25 1/26/26 +f 2/74/74 1/26/26 6/73/73 +f 6/73/73 1/26/26 5/27/27 +f 6/73/73 5/27/27 10/72/72 +f 10/72/72 5/27/27 9/28/28 +f 10/72/72 9/28/28 14/71/71 +f 14/71/71 9/28/28 13/29/29 +f 14/71/71 13/29/29 18/70/70 +f 18/70/70 13/29/29 17/30/30 +f 18/70/70 17/30/30 22/69/69 +f 22/69/69 17/30/30 21/31/31 +f 22/69/69 21/31/31 26/68/68 +f 26/68/68 21/31/31 25/32/32 +f 26/68/68 25/32/32 30/67/67 +f 30/67/67 25/32/32 29/33/33 +f 30/67/67 29/33/33 34/66/66 +f 34/66/66 29/33/33 33/34/34 +f 34/66/66 33/34/34 38/65/65 +f 38/65/65 33/34/34 37/35/35 +f 38/65/65 37/35/35 42/64/64 +f 42/64/64 37/35/35 41/36/36 +f 42/64/64 41/36/36 46/63/63 +f 46/63/63 41/36/36 45/37/37 +f 46/63/63 45/37/37 50/62/62 +f 50/62/62 45/37/37 49/38/38 +f 50/62/62 49/38/38 54/61/61 +f 54/61/61 49/38/38 53/39/39 +f 54/61/61 53/39/39 58/60/60 +f 58/60/60 53/39/39 57/40/40 +f 58/60/60 57/40/40 62/59/59 +f 62/59/59 57/40/40 61/41/41 +f 62/59/59 61/41/41 66/58/58 +f 66/58/58 61/41/41 65/42/42 +f 66/58/58 65/42/42 70/57/57 +f 70/57/57 65/42/42 69/43/43 +f 70/57/57 69/43/43 78/56/56 +f 78/56/56 69/43/43 77/44/44 +f 78/56/56 77/44/44 82/55/55 +f 82/55/55 77/44/44 81/45/45 +f 82/55/55 81/45/45 86/54/54 +f 86/54/54 81/45/45 85/46/46 +f 86/54/54 85/46/46 94/53/53 +f 94/53/53 85/46/46 93/47/47 +f 94/53/53 93/47/47 98/52/52 +f 98/52/52 93/47/47 97/48/48 +f 98/52/52 97/48/48 102/50/50 +f 102/50/50 97/48/48 101/49/49 +f 102/50/50 103/51/51 98/52/52 +f 73/100/100 75/101/101 74/99/99 +f 74/99/99 75/101/101 76/102/102 +f 92/108/108 76/103/103 91/107/107 +f 91/107/107 76/103/103 75/104/104 +f 91/107/107 75/104/104 104/105/105 +f 104/105/105 105/106/106 91/107/107 +f 102/110/110 101/111/111 89/109/109 +f 89/109/109 101/111/111 73/112/112 +f 89/109/109 73/112/112 74/113/113 +f 74/113/113 90/114/114 89/109/109 +f 91/116/116 105/117/117 89/115/115 +f 89/115/115 105/117/117 102/118/118 +f 101/120/120 97/121/121 73/119/119 +f 73/119/119 97/121/121 93/122/122 +f 73/119/119 93/122/122 85/123/123 +f 85/123/123 81/124/124 73/119/119 +f 73/119/119 81/124/124 77/125/125 +f 73/119/119 77/125/125 69/126/126 +f 69/126/126 65/127/127 73/119/119 +f 73/119/119 65/127/127 61/128/128 +f 73/119/119 61/128/128 57/129/129 +f 57/129/129 53/130/130 73/119/119 +f 73/119/119 53/130/130 49/131/131 +f 73/119/119 49/131/131 45/132/132 +f 45/132/132 41/133/133 73/119/119 +f 73/119/119 41/133/133 37/134/134 +f 73/119/119 37/134/134 33/135/135 +f 33/135/135 29/136/136 73/119/119 +f 73/119/119 29/136/136 25/137/137 +f 73/119/119 25/137/137 21/138/138 +f 21/138/138 17/139/139 73/119/119 +f 73/119/119 17/139/139 13/140/140 +f 73/119/119 13/140/140 9/141/141 +f 9/141/141 5/142/142 73/119/119 +f 73/119/119 5/142/142 1/143/143 +f 73/119/119 1/143/143 3/144/144 +f 73/119/119 3/144/144 75/168/168 +f 75/168/168 3/144/144 7/145/145 +f 75/168/168 7/145/145 11/146/146 +f 11/146/146 15/147/147 75/168/168 +f 75/168/168 15/147/147 19/148/148 +f 75/168/168 19/148/148 23/149/149 +f 23/149/149 27/150/150 75/168/168 +f 75/168/168 27/150/150 31/151/151 +f 75/168/168 31/151/151 35/152/152 +f 35/152/152 39/153/153 75/168/168 +f 75/168/168 39/153/153 43/154/154 +f 75/168/168 43/154/154 47/155/155 +f 47/155/155 51/156/156 75/168/168 +f 75/168/168 51/156/156 55/157/157 +f 75/168/168 55/157/157 59/158/158 +f 59/158/158 63/159/159 75/168/168 +f 75/168/168 63/159/159 67/160/160 +f 75/168/168 67/160/160 71/161/161 +f 71/161/161 79/162/162 75/168/168 +f 75/168/168 79/162/162 83/163/163 +f 75/168/168 83/163/163 87/164/164 +f 87/164/164 95/165/165 75/168/168 +f 75/168/168 95/165/165 99/166/166 +f 75/168/168 99/166/166 104/167/167 +f 102/169/169 105/170/170 103/172/172 +f 103/172/172 105/170/170 106/171/171 +f 90/174/174 103/224/224 92/173/173 +f 92/173/173 103/224/224 106/177/177 +f 92/173/173 106/177/177 100/178/178 +f 74/175/175 86/221/221 90/174/174 +f 90/174/174 86/221/221 94/222/222 +f 90/174/174 94/222/222 98/223/223 +f 76/176/176 4/200/200 74/175/175 +f 74/175/175 4/200/200 2/201/201 +f 74/175/175 2/201/201 6/202/202 +f 92/173/173 88/180/180 76/176/176 +f 76/176/176 88/180/180 84/181/181 +f 76/176/176 84/181/181 80/182/182 +f 100/178/178 96/179/179 92/173/173 +f 92/173/173 96/179/179 88/180/180 +f 80/182/182 72/183/183 76/176/176 +f 76/176/176 72/183/183 68/184/184 +f 76/176/176 68/184/184 64/185/185 +f 64/185/185 60/186/186 76/176/176 +f 76/176/176 60/186/186 56/187/187 +f 76/176/176 56/187/187 52/188/188 +f 52/188/188 48/189/189 76/176/176 +f 76/176/176 48/189/189 44/190/190 +f 76/176/176 44/190/190 40/191/191 +f 40/191/191 36/192/192 76/176/176 +f 76/176/176 36/192/192 32/193/193 +f 76/176/176 32/193/193 28/194/194 +f 28/194/194 24/195/195 76/176/176 +f 76/176/176 24/195/195 20/196/196 +f 76/176/176 20/196/196 16/197/197 +f 16/197/197 12/198/198 76/176/176 +f 76/176/176 12/198/198 8/199/199 +f 76/176/176 8/199/199 4/200/200 +f 6/202/202 10/203/203 74/175/175 +f 74/175/175 10/203/203 14/204/204 +f 74/175/175 14/204/204 18/205/205 +f 18/205/205 22/206/206 74/175/175 +f 74/175/175 22/206/206 26/207/207 +f 74/175/175 26/207/207 30/208/208 +f 30/208/208 34/209/209 74/175/175 +f 74/175/175 34/209/209 38/210/210 +f 74/175/175 38/210/210 42/211/211 +f 42/211/211 46/212/212 74/175/175 +f 74/175/175 46/212/212 50/213/213 +f 74/175/175 50/213/213 54/214/214 +f 54/214/214 58/215/215 74/175/175 +f 74/175/175 58/215/215 62/216/216 +f 74/175/175 62/216/216 66/217/217 +f 66/217/217 70/218/218 74/175/175 +f 74/175/175 70/218/218 78/219/219 +f 74/175/175 78/219/219 82/220/220 +f 82/220/220 86/221/221 74/175/175 +f 98/223/223 103/224/224 90/174/174 +f 90/225/225 92/226/226 89/228/228 +f 89/228/228 92/226/226 91/227/227 +# 106 vertices +# 228 texture params +# 228 normals +# 212 facets + +# 1 groups