In my blog post which was kind of a hey surprise! I’m alive bit .. I reflected on software control architecture that I’ve settled on and I’ve been working on. It’s half working on hardware, half still in design.

I’ve been working on three (5-sh) separate robots over the last couple years and every tine I switch to working on another I have to remember what kind of code and strategies I was using. Well, enough of that.. I now have could which is flexible enough to run on 4 different robots. Now when I work on some code, it’s for 4 robots… PHEW! That takes a lot more effort it seems and better, more flexible, structure. Anyhow back to the meat a potatoes.. I started with the end in mind.. from the bottom up through the first 3.5 layers.. and then determined it was time to switch sides or I’d overload the more semantic layers. I have done a lot of reading and spent a lot of time on YouTube watching older applied robotics videos (applied robots seems like it’s no longer hot, well it is for me).
Here is my ChatGPT-ified version of my layered system.. which is based on a couple different types of layered systems from basically ~87 or so up through the mid 2000s.
Mission Layer
- Declares which competition (SBC3, SBC5, PopCan, RoboMagellan, etc.)
- Supplies parameters:
- distances
- zones
- object classes
- time limits
- Feeds the Strategy Selector
✅ Mission defines context and success, not behavior.
Strategy Selector
- Largely determined by Mission
- May be modulated by:
- battery
- confidence
- previous failures
- time remaining
- Produces bias, not commands
Examples:
- conservative vs aggressive
- bonus-seeking vs completion-first
- manipulation-cautious vs speed-focused
✅ Strategy shapes how hard and how risky, never what.
Rule Engine
- Large set (30–40 is reasonable)
- Mostly always enabled
- Each rule:
- observes context
- votes or biases
- constrains feasibility
- Strategy biases rule weights
✅ Rules are the physics of intent — they constrain, veto, or soften options.
Goal Selection
- Outcome of rule voting
- Produces a single active Goal (or none)
- Goal is:
- high-level
- semantic
- competition-relevant
- contextual
Examples:
REACH_LOCATIONDELIVER_OBJECTRETURN_TO_ZONE
✅ This is the pivot point of the system.
Context Goal Layer (Goal Interpretation / Decomposition)
This is a really important layer
Responsibilities:
- Interpret Goal semantics
- Expand into:
- planning intent
- waypoint sequences
- perception needs
- interaction requirements
- Decide what kind of planning is needed, not how to move
This layer answers:
“Given this goal, what must be true before I can claim success?”
✅ This is where “open fridge”, “hallway traversal”, etc. emerge — not because the goal says so, but because reality demands it.
(Optional / Transparent) Global Map Layer
- Sometimes active, sometimes bypassed
- Holds:
- partial maps
- known waypoints
- semantic zones
- Informs feasibility and routing
Important:
It does not own intent — it only informs it.
✅ Transparency here is a feature, not a flaw.
Local Goal Generator
- Final distillation
- Converts abstract intent into:
- immediate objectives
- local sub-goals
- headings, distances, approach modes
- Operates in real-time
- Hands off to motion authority
✅ This is where deliberative intent becomes executable.
Motion Authority
- Consumes intent
- Obeys Sentinel and safety overrides
- Does not question why
✅ Correctly dumb, correctly constrained.

The bottom three layers are covered under the term motion authority in the above description and my sentinel layer isn’t spelled out at all; but if you’ve seen one reactive layer, you have seen them all and it was my comfort zone.
So far my favorite part has been testing the Heuristic Layer (Strategy->Voting->Goal) which I wrote as a test in NodeRED .. for fun, but I’m thinking that’s probably where it’ll live now and traverse my MQTT-> CAN Bridge. More on the juice hardware details some other time; but it’s a flexible multi-node (5-node) system on a CAN network with ODrives (CAN) and a Pi Zero W which is there mostly for logging and dashboarding now.











