Skip to content
Open
175 changes: 152 additions & 23 deletions bootcamp_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,15 @@
# =================================================================================================
# ↓ BOOTCAMPERS MODIFY BELOW THIS COMMENT ↓
# =================================================================================================
# Set queue max sizes (<= 0 for infinity)

# Set worker counts

# Any other constants
HEARTBEAT_MAX = 10
TELEMETRY_MAX = 10
REPORT_MAX = 10
HEARTBEAT_SEND_WORKER = 1
HEARTBEAT_REC_WORKER = 1
TELEMETRY_WORKER = 1
COMMAND_WORKER = 1
TARGET = command.Position(1.0, 1.0, 1.0)
RUNTIME = 100

# =================================================================================================
# ↑ BOOTCAMPERS MODIFY ABOVE THIS COMMENT ↑
Expand Down Expand Up @@ -73,44 +77,169 @@ def main() -> int:
# =============================================================================================
# ↓ BOOTCAMPERS MODIFY BELOW THIS COMMENT ↓
# =============================================================================================
# Create a worker controller
# 1) Controller
controller = (
worker_controller.WorkerController()
) # or WorkerController(main_logger) if required

# 2) MP manager
mp_manager = mp.Manager()

# 3) Queues (QueueProxyWrapper)
heartbeat_queue = queue_proxy_wrapper.QueueProxyWrapper(mp_manager, HEARTBEAT_MAX)
telemetry_queue = queue_proxy_wrapper.QueueProxyWrapper(mp_manager, TELEMETRY_MAX)
report_queue = queue_proxy_wrapper.QueueProxyWrapper(mp_manager, REPORT_MAX)

# 4) WorkerProperties.create(...) for each worker

ok, hb_sender_props = worker_manager.WorkerProperties.create(
controller=controller,
count=HEARTBEAT_SEND_WORKER,
target=heartbeat_sender_worker.heartbeat_sender_worker,
work_arguments={
"connection": connection,
"controller": controller,
},
input_queues=[],
output_queues=[],
local_logger=main_logger,
)
if not ok:
main_logger.error("Failed to create HeartbeatSender properties")
return -1

# Create a multiprocess manager for synchronized queues
ok, hb_recv_props = worker_manager.WorkerProperties.create(
controller=controller,
count=HEARTBEAT_REC_WORKER,
target=heartbeat_receiver_worker.heartbeat_receiver_worker,
work_arguments={
"connection": connection,
"heartbeat_queue": heartbeat_queue,
"controller": controller,
},
input_queues=[],
output_queues=[heartbeat_queue],
local_logger=main_logger,
)
if not ok:
main_logger.error("Failed to create HeartbeatReceiver properties")
return -1

# Create queues
ok, telem_props = worker_manager.WorkerProperties.create(
controller=controller,
count=TELEMETRY_WORKER,
target=telemetry_worker.telemetry_worker,
work_arguments={
"connection": connection,
"telemetry_queue": telemetry_queue,
"controller": controller,
},
input_queues=[],
output_queues=[telemetry_queue],
local_logger=main_logger,
)
if not ok:
main_logger.error("Failed to create Telemetry properties")
return -1

# Create worker properties for each worker type (what inputs it takes, how many workers)
# Heartbeat sender
ok, cmd_props = worker_manager.WorkerProperties.create(
controller=controller,
count=COMMAND_WORKER,
target=command_worker.command_worker,
work_arguments={
"connection": connection,
"target": TARGET,
"telemetry_queue": telemetry_queue,
"report_queue": report_queue,
"controller": controller,
},
input_queues=[telemetry_queue],
output_queues=[report_queue],
local_logger=main_logger,
)
if not ok:
main_logger.error("Failed to create Command properties")
return -1

# Heartbeat receiver
# 5) WorkerManager.create(...) for each
ok, hb_sender_mgr = worker_manager.WorkerManager.create(
worker_properties=hb_sender_props, local_logger=main_logger
)
if not ok:
main_logger.error("Failed to create HeartbeatSender manager")
return -1

# Telemetry
ok, hb_recv_mgr = worker_manager.WorkerManager.create(
worker_properties=hb_recv_props, local_logger=main_logger
)
if not ok:
main_logger.error("Failed to create HeartbeatReceiver manager")
return -1

# Command
ok, telem_mgr = worker_manager.WorkerManager.create(
worker_properties=telem_props, local_logger=main_logger
)
if not ok:
main_logger.error("Failed to create Telemetry manager")
return -1

# Create the workers (processes) and obtain their managers
ok, cmd_mgr = worker_manager.WorkerManager.create(
worker_properties=cmd_props, local_logger=main_logger
)
if not ok:
main_logger.error("Failed to create Command manager")
return -1

# Start worker processes
# 6) start workers
hb_sender_mgr.start_workers()
hb_recv_mgr.start_workers()
telem_mgr.start_workers()
cmd_mgr.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
# 7) Main loop: read outputs
start_time = time.time()
while (time.time() - start_time) < RUNTIME:

# Stop the processes
try:
hb_status = heartbeat_queue.queue.get_nowait()
main_logger.info(f"Heartbeat status: {hb_status}", True)

main_logger.info("Requested exit")
if hb_status == "Disconnected":
main_logger.warning("Drone disconnected, exiting", True)
break
except queue.Empty:
pass

# Fill and drain queues from END TO START
try:
report = report_queue.queue.get_nowait()
main_logger.info(f"Command report: {report}", True)
except queue.Empty:
pass
Copy link
Contributor

Choose a reason for hiding this comment

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

you can include this in the same try and except block from above


time.sleep(0.1)

# 8) Stop
controller.request_exit()
main_logger.info("Requested exit")

# 9) Fill & drain queues
report_queue.fill_and_drain_queue()
telemetry_queue.fill_and_drain_queue()
heartbeat_queue.fill_and_drain_queue()
main_logger.info("Queues cleared")

# Clean up worker processes
# 10) Join workers (either direction is usually ok after drain+exit)
cmd_mgr.join_workers()
telem_mgr.join_workers()
hb_recv_mgr.join_workers()
hb_sender_mgr.join_workers()

main_logger.info("Stopped")

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

# =============================================================================================
# ↑ BOOTCAMPERS MODIFY ABOVE THIS COMMENT ↑
Expand Down
28 changes: 28 additions & 0 deletions logs/command/command_drone_29508.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
14:16:23: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 45] Logger initialized
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:27: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:28: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:28: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:29: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:29: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:30: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:30: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:31: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:31: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:32: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:32: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:33: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:33: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:34: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:34: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:35: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:35: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:36: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:36: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:37: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:37: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:38: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:38: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:39: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 76] Received a valid command
14:16:42: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\tests\integration\mock_drones\command_drone.py | main | 83] Passed!
32 changes: 32 additions & 0 deletions logs/command/command_worker_31860.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command_worker.py | command_worker | 47] Logger initialized
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 4.00)
14:16:24: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 1.00)
14:16:25: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.67)
14:16:25: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.50)
14:16:26: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.40)
14:16:26: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.33)
14:16:27: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.29)
14:16:27: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 2.50, 0.25)
14:16:28: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 4.44, 0.22)
14:16:28: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 6.00, 0.20)
14:16:29: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (1.82, 5.45, 0.18)
14:16:29: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (3.33, 5.00, 0.17)
14:16:30: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (4.62, 4.62, 0.15)
14:16:30: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (4.29, 2.86, 0.14)
14:16:31: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (4.00, 1.33, 0.13)
14:16:31: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (3.75, 0.00, 0.12)
14:16:32: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.35, 0.00, 0.12)
14:16:32: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (1.11, 0.00, 0.11)
14:16:33: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.11)
14:16:33: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 1.00, 0.10)
14:16:34: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 1.90, 0.10)
14:16:34: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 2.73, 0.09)
14:16:35: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.87, 2.61, 0.09)
14:16:35: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (1.67, 2.50, 0.08)
14:16:36: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.40, 2.40, 0.08)
14:16:36: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.31, 1.54, 0.08)
14:16:37: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.22, 0.74, 0.07)
14:16:37: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (2.14, 0.00, 0.07)
14:16:38: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (1.38, 0.00, 0.07)
14:16:38: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.67, 0.00, 0.07)
14:16:39: [INFO] [C:\Users\1makk\OneDrive\Documents\JavaProjects\autonomy-bootcamp-2025-p2\modules\command\command.py | run | 102] Average velocity so far: (0.00, 0.00, 0.06)
Loading