Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 142 additions & 1 deletion bootcamp_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,20 @@
# ↓ BOOTCAMPERS MODIFY BELOW THIS COMMENT ↓
# =================================================================================================
# Set queue max sizes (<= 0 for infinity)
STATUS_QUEUE_MAX_SIZE = 5
TELEMETRY_QUEUE_MAX_SIZE = 5
COMMAND_QUEUE_MAX_SIZE = 5

# Set worker counts
HEARTBEAT_SENDER_WORKER_COUNT = 1
HEARTBEAT_RECEIVER_WORKER_COUNT = 1
TELEMETRY_WORKER_COUNT = 1
COMMAND_WORKER_COUNT = 1

# Any other constants
HEARTBEAT_PERIOD = 1.0
TELEMETRY_TIMEOUT = 1.0
TARGET = command.Position(10, 20, 30)

# =================================================================================================
# ↑ BOOTCAMPERS MODIFY ABOVE THIS COMMENT ↑
Expand Down Expand Up @@ -74,43 +84,174 @@ def main() -> int:
# ↓ BOOTCAMPERS MODIFY BELOW THIS COMMENT ↓
# =============================================================================================
# Create a worker controller
controller = worker_controller.WorkerController()

# Create a multiprocess manager for synchronized queues
manager = mp.Manager()

# Create queues
status_queue = queue_proxy_wrapper.QueueProxyWrapper(manager, STATUS_QUEUE_MAX_SIZE)
telemetry_queue = queue_proxy_wrapper.QueueProxyWrapper(manager, TELEMETRY_QUEUE_MAX_SIZE)
command_queue = queue_proxy_wrapper.QueueProxyWrapper(manager, COMMAND_QUEUE_MAX_SIZE)

# Create worker properties for each worker type (what inputs it takes, how many workers)
# Heartbeat sender
result, heartbeat_sender_properties = worker_manager.WorkerProperties.create(
count=HEARTBEAT_SENDER_WORKER_COUNT,
target=heartbeat_sender_worker.heartbeat_sender_worker,
work_arguments=(connection, HEARTBEAT_PERIOD),
input_queues=[],
output_queues=[],
controller=controller,
local_logger=main_logger,
)

if not result:
print("Failed to create properties for HeartbeatSender")
return -1

assert heartbeat_sender_properties is not None

# Heartbeat receiver
result, heartbeat_receiver_properties = worker_manager.WorkerProperties.create(
count=HEARTBEAT_RECEIVER_WORKER_COUNT,
target=heartbeat_receiver_worker.heartbeat_receiver_worker,
work_arguments=(connection, HEARTBEAT_PERIOD),
input_queues=[],
output_queues=[status_queue],
controller=controller,
local_logger=main_logger,
)

if not result:
print("Failed to create properties for HeartbeatRececiver")
return -1

assert heartbeat_receiver_properties is not None

# Telemetry
result, telemetry_properties = worker_manager.WorkerProperties.create(
count=TELEMETRY_WORKER_COUNT,
target=telemetry_worker.telemetry_worker,
work_arguments=(connection, TELEMETRY_TIMEOUT),
input_queues=[],
output_queues=[telemetry_queue],
controller=controller,
local_logger=main_logger,
)

if not result:
print("Failed to create properties for Telemetry")
return -1

assert telemetry_properties is not None

# Command
result, command_properties = worker_manager.WorkerProperties.create(
count=COMMAND_WORKER_COUNT,
target=command_worker.command_worker,
work_arguments=(connection, TARGET),
input_queues=[telemetry_queue],
output_queues=[command_queue],
controller=controller,
local_logger=main_logger,
)

if not result:
print("Failed to create properties for Command")
return -1

assert command_properties is not None

# Create the workers (processes) and obtain their managers
worker_managers = []

# Start worker processes
result, heartbeat_sender_manager = worker_manager.WorkerManager.create(
worker_properties=heartbeat_sender_properties,
local_logger=main_logger,
)
if not result:
print("Failed to create manager for HeartbeatSender")
return -1

assert heartbeat_sender_manager is not None
worker_managers.append(heartbeat_sender_manager)

result, heartbeat_receiver_manager = worker_manager.WorkerManager.create(
worker_properties=heartbeat_receiver_properties,
local_logger=main_logger,
)
if not result:
print("Failed to create manager for HeartbeatReceiver")
return -1

assert heartbeat_receiver_manager is not None
worker_managers.append(heartbeat_receiver_manager)

result, telemetry_manager = worker_manager.WorkerManager.create(
worker_properties=telemetry_properties,
local_logger=main_logger,
)
if not result:
print("Failed to create manager for Telemetry")
return -1

assert telemetry_manager is not None
worker_managers.append(telemetry_manager)

result, command_manager = worker_manager.WorkerManager.create(
worker_properties=command_properties,
local_logger=main_logger,
)
if not result:
print("Failed to create manager for Command")
return -1

assert command_manager is not None
worker_managers.append(command_manager)

# Start worker processes
for manager in worker_managers:
manager.start_workers()
main_logger.info("Started")

# Main's work: read from all queues that output to main, and log any commands that we make
# Continue running for 100 seconds or until the drone disconnects
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need to check for drone disconnecting

start_time = time.time()
while time.time() - start_time < 100:
try:
status = status_queue.queue.get(timeout=0.1)
main_logger.info(f"Heartbeat status: {status}")
except queue.Empty:
pass

try:
command_string = command_queue.queue.get(timeout=0.1)
main_logger.info(f"Command: {command_string}")
except queue.Empty:
pass
Comment on lines +228 to +232
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can go in the same try and except block


# Stop the processes
controller.request_exit()

main_logger.info("Requested exit")

# Fill and drain queues from END TO START
telemetry_queue.fill_and_drain_queue()
status_queue.fill_and_drain_queue()
command_queue.fill_and_drain_queue()

main_logger.info("Queues cleared")

# Clean up worker processes
for manager in worker_managers:
manager.join_workers()

main_logger.info("Stopped")

# We can reset controller in case we want to reuse it
# Alternatively, create a new WorkerController instance
controller.clear_exit()

# =============================================================================================
# ↑ BOOTCAMPERS MODIFY ABOVE THIS COMMENT ↑
Expand Down
28 changes: 28 additions & 0 deletions logs/command/command_drone_31992.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 45] Logger initialized
23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:51: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:52: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:52: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:53: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:53: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:54: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:54: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:55: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:55: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:56: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:56: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:57: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:57: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:58: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:58: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:59: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:37:59: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:38:00: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:38:00: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:38:01: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:38:01: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:38:02: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:38:02: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:38:03: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 76] Received a valid command
23:38:06: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/mock_drones/command_drone.py | main | 83] Passed!
27 changes: 27 additions & 0 deletions logs/command/command_worker_31997.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 46] Logger initialized
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

your average velocity should be here

23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE ALTITUDE: 1
23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE ALTITUDE: -1
23:37:51: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 63.43494882292201
23:37:52: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 90.0
23:37:52: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 116.56505117707799
23:37:53: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 45.0
23:37:53: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 63.43494882292201
23:37:54: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 90.0
23:37:54: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 26.565051177077976
23:37:55: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 45.0
23:37:55: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 90.0
23:37:56: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 45.0
23:37:56: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 90.0
23:37:57: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: 135.0
23:37:57: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -26.565051177077994
23:37:58: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -45.0
23:37:58: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -90.0
23:37:59: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -45.0
23:37:59: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -90.0
23:38:00: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -135.0
23:38:00: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -63.43494882292201
23:38:01: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -90.0
23:38:01: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -116.565051177078
23:38:02: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -45.0
23:38:02: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -63.43494882292201
23:38:03: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/command/command_worker.py | command_worker | 64] Command: CHANGE YAW: -90.0
28 changes: 28 additions & 0 deletions logs/command/main.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/modules/common/modules/logger/logger_main_setup.py | setup_main_logger | 62] main logger initialized
23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | main | 124] Connected!
23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE ALTITUDE: 1
23:37:48: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE ALTITUDE: -1
23:37:51: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 63.43494882292201
23:37:52: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 90.0
23:37:52: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 116.56505117707799
23:37:53: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 45.0
23:37:53: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 63.43494882292201
23:37:54: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 90.0
23:37:54: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 26.565051177077976
23:37:55: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 45.0
23:37:55: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 90.0
23:37:56: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 45.0
23:37:56: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 90.0
23:37:57: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: 135.0
23:37:57: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -26.565051177077994
23:37:58: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -45.0
23:37:58: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -90.0
23:37:59: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -45.0
23:37:59: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -90.0
23:38:00: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -135.0
23:38:00: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -63.43494882292201
23:38:01: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -90.0
23:38:01: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -116.565051177078
23:38:02: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -45.0
23:38:02: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -63.43494882292201
23:38:03: [INFO] [/Users/sahij/Desktop/autonomy/autonomy-bootcamp-2025-p2/tests/integration/test_command.py | read_queue | 72] Main: CHANGE YAW: -90.0
Loading