feat: add bot class
This commit is contained in:
40
scripts/example_bot.py
Normal file
40
scripts/example_bot.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from PyQt6.QtWidgets import QApplication
|
||||||
|
|
||||||
|
from src.bot import Bot
|
||||||
|
from src.command import CarControl
|
||||||
|
from src.recorder import RecorderWindow
|
||||||
|
from src.snapshot import Snapshot
|
||||||
|
|
||||||
|
|
||||||
|
class ExampleBot(Bot):
|
||||||
|
def nn_infer(self, snapshot: Snapshot) -> list[tuple[CarControl, bool]]:
|
||||||
|
# Do smart NN inference here
|
||||||
|
return [(CarControl.FORWARD, True)]
|
||||||
|
|
||||||
|
def on_snapshot_received(self, snapshot: Snapshot):
|
||||||
|
controls: list[tuple[CarControl, bool]] = self.nn_infer(snapshot)
|
||||||
|
for control, active in controls:
|
||||||
|
self.recorder.on_car_controlled(control, active)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def except_hook(cls, exception, traceback):
|
||||||
|
sys.__excepthook__(cls, exception, traceback)
|
||||||
|
|
||||||
|
sys.excepthook = except_hook
|
||||||
|
|
||||||
|
app: QApplication = QApplication(sys.argv)
|
||||||
|
recorder: RecorderWindow = RecorderWindow("localhost", 5000)
|
||||||
|
bot: ExampleBot = ExampleBot(recorder)
|
||||||
|
|
||||||
|
app.aboutToQuit.connect(recorder.shutdown)
|
||||||
|
recorder.register_bot(bot)
|
||||||
|
recorder.show()
|
||||||
|
|
||||||
|
app.exec()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
16
src/bot.py
Normal file
16
src/bot.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from src.snapshot import Snapshot
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from src.recorder import RecorderWindow
|
||||||
|
|
||||||
|
|
||||||
|
class Bot:
|
||||||
|
def __init__(self, recorder: RecorderWindow):
|
||||||
|
self.recorder: RecorderWindow = recorder
|
||||||
|
|
||||||
|
def on_snapshot_received(self, snapshot: Snapshot):
|
||||||
|
pass
|
||||||
@@ -9,6 +9,7 @@ from PyQt6.QtCore import QObject, QThread, QTimer, pyqtSignal, pyqtSlot
|
|||||||
from PyQt6.QtGui import QKeyEvent
|
from PyQt6.QtGui import QKeyEvent
|
||||||
from PyQt6.QtWidgets import QMainWindow
|
from PyQt6.QtWidgets import QMainWindow
|
||||||
|
|
||||||
|
from src.bot import Bot
|
||||||
from src.command import ApplySnapshotCommand, CarControl, Command, ControlCommand, RecordingCommand, ResetCommand
|
from src.command import ApplySnapshotCommand, CarControl, Command, ControlCommand, RecordingCommand, ResetCommand
|
||||||
from src.record_file import RecordFile
|
from src.record_file import RecordFile
|
||||||
from src.recorder_ui import Ui_Recorder
|
from src.recorder_ui import Ui_Recorder
|
||||||
@@ -162,9 +163,11 @@ class RecorderWindow(Ui_Recorder, QMainWindow):
|
|||||||
self.recordDataButton.clicked.connect(self.toggle_record)
|
self.recordDataButton.clicked.connect(self.toggle_record)
|
||||||
self.resetButton.clicked.connect(self.rollback)
|
self.resetButton.clicked.connect(self.rollback)
|
||||||
|
|
||||||
|
self.bot: Optional[Bot] = None
|
||||||
self.autopiloting = False
|
self.autopiloting = False
|
||||||
|
|
||||||
self.autopilotButton.clicked.connect(self.toggle_autopilot)
|
self.autopilotButton.clicked.connect(self.toggle_autopilot)
|
||||||
|
self.autopilotButton.setDisabled(True)
|
||||||
|
|
||||||
self.saveRecordButton.clicked.connect(self.save_record)
|
self.saveRecordButton.clicked.connect(self.save_record)
|
||||||
|
|
||||||
@@ -263,8 +266,15 @@ class RecorderWindow(Ui_Recorder, QMainWindow):
|
|||||||
self.snapshots.append(snapshot)
|
self.snapshots.append(snapshot)
|
||||||
self.nbrSnapshotSaved.setText(str(len(self.snapshots)))
|
self.nbrSnapshotSaved.setText(str(len(self.snapshots)))
|
||||||
|
|
||||||
|
if self.autopiloting and self.bot is not None:
|
||||||
|
self.bot.on_snapshot_received(snapshot)
|
||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
self.close_signal.emit()
|
self.close_signal.emit()
|
||||||
|
|
||||||
def send_command(self, command: Command):
|
def send_command(self, command: Command):
|
||||||
self.send_signal.emit(command)
|
self.send_signal.emit(command)
|
||||||
|
|
||||||
|
def register_bot(self, bot: Bot):
|
||||||
|
self.bot = bot
|
||||||
|
self.autopilotButton.setDisabled(False)
|
||||||
|
|||||||
Reference in New Issue
Block a user