diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1f20186 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..64db8e1 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/robot-library-python.iml b/.idea/robot-library-python.iml new file mode 100644 index 0000000..ea6edcf --- /dev/null +++ b/.idea/robot-library-python.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/robot_emulator/__init__.py b/src/robot_emulator/__init__.py index e69de29..8f03e21 100644 --- a/src/robot_emulator/__init__.py +++ b/src/robot_emulator/__init__.py @@ -0,0 +1,2 @@ +#main API +from .base import RobotState \ No newline at end of file diff --git a/src/robot_emulator/base.py b/src/robot_emulator/base.py new file mode 100644 index 0000000..3752e70 --- /dev/null +++ b/src/robot_emulator/base.py @@ -0,0 +1,88 @@ +# Robot emulator base class +# This file holds core framework for robot emulation +# RobotState - define robot state +# Motion - send move/ rotate command over mqtt +# Virtual Robot - base class for robot emulation + +import time +import threading +import paho.mqtt.client as mqtt + +class RobotState: + """Define robot states""" + + BEGIN = "BEGIN" + RUN = "RUN" + WAIT ="WAIT" + +class Motion: + """Handle movement""" + def __init__(self,mqtt_client,robot_id): + self.client = mqtt_client + self.robot_id = robot_id + + def move_distance(self, speed, distance): + """Move forward a fixed distance""" + self.client.publish(f"robots/{self.robot_id}/motion", f"MOVE {speed} {distance}") + + def rotate_degree(self, speed, angle): + """Rotate by an angle""" + self.client.publish(f"robots/{self.robot_id}/motion", f"ROTATE {speed} {angle}") + + def stop(self): + """Stop movement""" + self.client.publish(f"robots/{self.robot_id}/motion", "STOP") + + def move(self, left_speed, right_speed, duration): + """Move with differential speeds for a duration""" + self.client.publish(f"robots/{self.robot_id}/motion", f"DRIVE {left_speed} {right_speed} {duration}") + +class VirtualRobot(threading.Thread): + """Base class for virtual robot emulation""" + """ + Extend this class and implement 'setup()' and 'loop()' + """ + + def __init__(self, robot_id, x=0, y=0, heading=0, mqtt_config = None): + super().__init__() + self.robot_id = robot_id + self.x = x + self.y = y + self.heading = heading + self.state = RobotState.BEGIN + self.client = mqtt.Client() + self.motion = Motion(self.client, self.robot_id) + + #configure mqtt + if mqtt_config: + self.client.username_pw_set( + mqtt_config.get("username"), + mqtt_config.get("password") + ) + self.client.connect( + mqtt_config.get("server","127.0.0.1"), + mqtt_config.get("port",1883), + mqtt_config.get("keepalive",60) + ) + + def setup(self): + """Run once when the robot starts""" + print(f"Robot {self.robot_id} setup complete") + self.state = RobotState.RUN + + def loop(self): + """Main loop, override this method""" + print(f"Robot {self.robot_id} running at position ({self.x}, {self.y}) heading {self.heading}") + pass + + def run(self): + """Mian execution loop""" + self.setup() + while True: + try: + self.loop() + time.sleep(0.1) # Small delay to prevent CPU overload + + except Exception as e: + print(f"Error in robot {self.robot_id}: {e}") + break \ No newline at end of file diff --git a/src/robot_emulator/maze_following.py b/src/robot_emulator/maze_following.py new file mode 100644 index 0000000..e69de29 diff --git a/src/robot_emulator/mqtt_client.py b/src/robot_emulator/mqtt_client.py new file mode 100644 index 0000000..e69de29 diff --git a/src/robot_emulator/obstacle_avoid.py b/src/robot_emulator/obstacle_avoid.py new file mode 100644 index 0000000..e69de29 diff --git a/src/robot_emulator/sample_robot.py b/src/robot_emulator/sample_robot.py new file mode 100644 index 0000000..e69de29 diff --git a/src/robot_emulator/sensors.py b/src/robot_emulator/sensors.py new file mode 100644 index 0000000..e69de29