March–April 2026 — ArduPilot SITL bring-up + ROS 2 Jazzy workspace
The bootstrap dev-log entries 01–02 are nearly identical to Aleks’s own simulation/notes_*.txt notes — those have been broken out separately under Aleks’s notes. What follows below are the agent’s unique findings.
2026-04-15 → 2026-05-06 — takeoff_node v1–v5: iterative debugging walkthrough
Five versions of the takeoff-control node, debugged through observing failures, not by reading documentation. Full breakdown:
- Takeoff node evolution v1–v5 — ROS 2 theory (topics/services/MAVLink), four failed approaches plus the final one, four rules for setpoint↔takeoff↔arm sequencing
- Setpoint vs takeoff — rules — short cheatsheet of the extracted rules (without the long history)
2026-05-07 → 2026-05-08 — TASK-021 21a: “Waiting for heartbeat” — layered debug
Three overlapping causes of the same MAVProxy symptom “Waiting for heartbeat”:
- Orphan UDP 9002 race (dev-log/04) — two
gz simprocesses bound to the same port after an incompletedaemon.sh stop. - Cyrillic comments in
indoor.parm(dev-log/05) —fgets100-byte buffer inAP_Param.cpp; UTF-8 splits comment lines across the boundary → unknown-parameter → infinite reload loop. --consoleflag (dev-log/06) —sim_vehicle.py --consolelaunches matplotlib through MAVProxy, which hangs on an import warning.
Full writeup: SITL “Waiting for heartbeat” — three causes.
Additional parameter breakdown: ArduCopter indoor.parm — line by line.
2026-05-09 — TASK-021 21a closed: takeoff_node v7 event-driven FSM
After the heartbeat fix, the old tick-based FSM broke under --mavros: the tick incremented before state.connected settled, accumulating 60+ ticks during the ~6 s MAVROS bring-up, so every state transition fired back-to-back without confirmation. v7 is event-driven: every phase waits for confirmed state.mode == 'GUIDED', state.armed == True, and retries with a 2 s throttle.
Details: Takeoff node — final v7 event-driven.
2026-05-09 — TASK-033 parallel smoke
Isolation (MAVLink port / GZ_PARTITION / ROS_DOMAIN_ID / SITL -I N) works. What doesn’t work: the iris SDF plugin hard-codes <fdm_port_in>9002</fdm_port_in>, so two Gazebo instances compete for the same UDP port via SO_REUSEADDR. Acceptance criteria closed on the infra side; FDM-port templating split out into a separate follow-up ticket.
Details: Parallel SITL instances + SDF FDM port.
Media sources
~/drone_media/sim/TASK-021/{21a_mavros.log, 21a_sitl.log, 21a_smoke_topics.txt, 21a_takeoff_node.log}— evidence fortakeoff_nodev7 and the heartbeat fix.~/drone_media/sim/TASK-033/{parallel_smoke_evidence.txt, sim{0,1}_{gz,sitl}.log}— two parallel SITL instances.- Orphan screenshots
Screenshot_2026{0413,0425,0426}_*.png— candidates for07_media_assets/images/architecture/after manual review by Aleks.