From c6645e6431cd22b46dc3500dce7cf058d1e8a6ca Mon Sep 17 00:00:00 2001 From: len0rd Date: Sun, 2 Feb 2025 14:02:10 -0500 Subject: [PATCH] finish adaping messaging presentation --- .../Pasted image 20231101103627.png | Bin 76017 -> 0 bytes ...102911.png => cmd_node_race_condition.png} | Bin ...20231101102237.png => high_level_arch.png} | Bin ...2257.png => high_level_arch_orb_nodes.png} | Bin ...103230.png => high_level_arch_routing.png} | Bin ...4403.png => high_level_arch_transport.png} | Bin ...101104040.png => mavlink_channel_arch.png} | Bin ...02710.png => mavlink_cmd_microservice.png} | Bin ... 20231101103552.png => mavlink_packet.png} | Bin ...e 20231101103247.png => mavlink_usage.png} | Bin ...20231101103123.png => param_node_tree.png} | Bin ...1102442.png => topic_node_sub_process.png} | Bin ...e 20231101104414.png => transport_uml.png} | Bin posts/docker_intro.rst | 8 +- posts/unified_uas_messaging.rst | 378 ++++++++++++++++++ 15 files changed, 382 insertions(+), 4 deletions(-) delete mode 100644 assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103627.png rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101102911.png => cmd_node_race_condition.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101102237.png => high_level_arch.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101102257.png => high_level_arch_orb_nodes.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101103230.png => high_level_arch_routing.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101104403.png => high_level_arch_transport.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101104040.png => mavlink_channel_arch.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101102710.png => mavlink_cmd_microservice.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101103552.png => mavlink_packet.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101103247.png => mavlink_usage.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101103123.png => param_node_tree.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101102442.png => topic_node_sub_process.png} (100%) rename assets/img/writeup/unified_messaging_small_uas/{Pasted image 20231101104414.png => transport_uml.png} (100%) diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103627.png b/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103627.png deleted file mode 100644 index 9be3f93a3495e044188f25f8624153f91f210f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76017 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

HjuJeWBB>5Vqd^5K5M2meE0% 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 diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102911.png b/assets/img/writeup/unified_messaging_small_uas/cmd_node_race_condition.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102911.png rename to assets/img/writeup/unified_messaging_small_uas/cmd_node_race_condition.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102237.png b/assets/img/writeup/unified_messaging_small_uas/high_level_arch.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102237.png rename to assets/img/writeup/unified_messaging_small_uas/high_level_arch.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102257.png b/assets/img/writeup/unified_messaging_small_uas/high_level_arch_orb_nodes.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102257.png rename to assets/img/writeup/unified_messaging_small_uas/high_level_arch_orb_nodes.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103230.png b/assets/img/writeup/unified_messaging_small_uas/high_level_arch_routing.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103230.png rename to assets/img/writeup/unified_messaging_small_uas/high_level_arch_routing.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101104403.png b/assets/img/writeup/unified_messaging_small_uas/high_level_arch_transport.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101104403.png rename to assets/img/writeup/unified_messaging_small_uas/high_level_arch_transport.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101104040.png b/assets/img/writeup/unified_messaging_small_uas/mavlink_channel_arch.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101104040.png rename to assets/img/writeup/unified_messaging_small_uas/mavlink_channel_arch.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102710.png b/assets/img/writeup/unified_messaging_small_uas/mavlink_cmd_microservice.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102710.png rename to assets/img/writeup/unified_messaging_small_uas/mavlink_cmd_microservice.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103552.png b/assets/img/writeup/unified_messaging_small_uas/mavlink_packet.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103552.png rename to assets/img/writeup/unified_messaging_small_uas/mavlink_packet.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103247.png b/assets/img/writeup/unified_messaging_small_uas/mavlink_usage.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103247.png rename to assets/img/writeup/unified_messaging_small_uas/mavlink_usage.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103123.png b/assets/img/writeup/unified_messaging_small_uas/param_node_tree.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101103123.png rename to assets/img/writeup/unified_messaging_small_uas/param_node_tree.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102442.png b/assets/img/writeup/unified_messaging_small_uas/topic_node_sub_process.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101102442.png rename to assets/img/writeup/unified_messaging_small_uas/topic_node_sub_process.png diff --git a/assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101104414.png b/assets/img/writeup/unified_messaging_small_uas/transport_uml.png similarity index 100% rename from assets/img/writeup/unified_messaging_small_uas/Pasted image 20231101104414.png rename to assets/img/writeup/unified_messaging_small_uas/transport_uml.png diff --git a/posts/docker_intro.rst b/posts/docker_intro.rst index 490ff05..4e08a75 100644 --- a/posts/docker_intro.rst +++ b/posts/docker_intro.rst @@ -1,8 +1,8 @@ Docker for SW Development ========================= -.. post:: 31, January 2025 - :tags: development, infrastructure, tools, lunch-n-learn +.. post:: 01, February 2025 + :tags: development, infrastructure, tools, lunch-n-learn :category: Projects :author: len0rd @@ -33,7 +33,7 @@ Why docker? - documented and repeatable dependency installation in a living (version-controlled) file -- "containerize once and run everywhere" +- "containerize once and run everywhere" - No more "it works on my machine" @@ -161,7 +161,7 @@ DevContainers: an additional layer on top of docker - https://containers.dev/ -- Now multiple IDEs (IntelliJ, Visual Studio, NeoVim) have support for the standard +- Now multiple IDEs (IntelliJ, Visual Studio, NeoVim) have support for the standard .. image:: https://code.visualstudio.com/assets/docs/devcontainers/containers/architecture-containers.png :class: dark-light diff --git a/posts/unified_uas_messaging.rst b/posts/unified_uas_messaging.rst index 8d90f38..f9504a9 100644 --- a/posts/unified_uas_messaging.rst +++ b/posts/unified_uas_messaging.rst @@ -74,6 +74,8 @@ System Challenges Software Challenges ^^^^^^^^^^^^^^^^^^^ +Besides the expected system challenges, our team was also aware of a number of future software challenges that would arrive based on prior experience: + - Maintainability of separate messaging frameworks - Maintaining even more than one messaging framework in a project quickly becomes tedious. From past experience I knew that this scenario can make projects difficult to understand and work in. Maintainable code should be the highest priority when architecting software solutions @@ -91,3 +93,379 @@ Software Challenges .. image:: ../assets/img/writeup/unified_messaging_small_uas/module_portability_problem.png :class: dark-light +Motivation +---------- + +With all these challenges in mind, it was decided that we would expand on an available open-source messaging system to address our needs. + +Why make yet another messaging service? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is no shortage of open-source messaging platforms/services/implementations available for use today. The decision to roll our own was not made in a vacuum and many of these libraries were experiemented with and compared to our requirements before we determined to build our own. A major piece of this was our requirement to have a single messaging service used across the entire UAS system: + +- A single messaging system implementation reduces code complexity and maintenance cost + + - Lessons learned from previous projects: multiple systems can create a version management nightmare + +- Single system increases module portability + +- Bring the convenience of modern messaging frameworks down to the embedded space + + What about protobuf, flatbuf, ROS, etc? + +- Most open-source messaging protocols are not bare-metal friendly and require a networking stack + +- Protocols are typically not transport-agnostic: they make no attempt to decouple transport mechanism from the overall protocol + +- Open-source protocols utilize C++ language concepts that are not bare-metal friendly (exceptions, large templates, STL containers, dynamic allocation) + +- If the protocol can run without a network stack, it has a large object and/or runtime cost (memory, processor utilization) + +(ROS2 does address many of these issues with micro-ROS) + +After internal reviews, it was decided that we would build our messaging service on top of the open-source `MAVLink `_ protocol. More on MAVLink, its pros/cons and why it was chosen later. + +Solution Architecture +--------------------- + +From here I began designing the architecture of our UAS messaging service. The service borrows most of its ideas from existing messaging systems but with an emphasis on portability and embedded-friendly design. Here's the high-level architecture: + +.. image:: ../assets/img/writeup/unified_messaging_small_uas/high_level_arch.png + :class: dark-light + +Lets break this down and talk about each component: + +Object Request Broker Nodes (ORBs) +---------------------------------- + +Lets first look at the object request brokers. That's this top portion, the main API for all higher-level library/application code: + +.. image:: ../assets/img/writeup/unified_messaging_small_uas/high_level_arch_orb_nodes.png + :class: dark-light + +- ORB Nodes define the core protocols supported by the messaging library + +- Each ORB Node provides a convenient interface for user code to accomplish common tasks + + - Topic Node: Your typical pub/sub data stream + + - Command Node: RPC with ACK + + - Param Node: Get/Set system parameters + +ORB Nodes can be thought of as simplified `ROS protocols `_. Or as amplified `MAVLink microservices `_ + + +ORB: Topic Node +^^^^^^^^^^^^^^^ + +Topic Node handles a number of common tasks: + +- Allow anyone to subscribe to a datastream, informing subscribers via callback when a new message has arrived in that stream + + - Number of customization options: specify data rate, subscribe to multiple producers (ie: logging topic) + +- Abstracts the source of the data. Same API is used to subscribe to a local and remote topic. Eases adapting the system to architecture challenges + +.. admonition:: Challenge: Topic Multicasting + + The largest challenge I encountered when implementing the topic node was what I call "topic multicasting". That is, getting a topic routed to multiple subscribers in a network that has a 1+ star topology. ie: + + .. image:: ../assets/img/writeup/unified_messaging_small_uas/small_uas_setup_d.png + :class: dark-light + :width: 500 + + In this sytem, if "Battery Controller" and "Companion Computer" want to subscribe to a topic produced by the "Gimbal Controller", that topic data needs to be routed through the "Navigation Controller". To keep routing and message traffic to a minimum, the "Navigation Controller" needs to keep track of the potentially multiple endpoints that topic data needs to go. This is the "multicasting" problem: having the gimbal controller send a single message that the navigation compter then seamlessly sends to only the interested parties. + + This routing/multicasting problem is all handled internally by the messaging system. + +ORB: Command Node +^^^^^^^^^^^^^^^^^ + +The command node is meant to function as a Remote Procedure Call (RPC) service. A node on the network issues a command and that command is responded to with an acknowledgement. + +MAVLink already has a `Command microservice `_ which implements a basic RPC. Unfortunately this service fell short for us since it only functions with 2 message types as commands. The meaning of the contents in these messages changes based on a command enum. There were a lot of features added on to MAVLink to support this design decision. + +.. figure:: ../assets/img/writeup/unified_messaging_small_uas/mavlink_cmd_microservice.png + :class: dark-light + + MAVLinks Command microservice. + +We wanted the ability for many message definitions to be treated as commands. This helps the code handling commands be self-documenting: you are no longer working with the abstract message fields that in the core MAVLink ``COMMAND`` message. It also helps reduce on-the-wire overhead since all commands dont have to use the same message. + +Our command ORB implements a few key features: + +- Automatic retry and timeout. + +- Callback on acknowledgement received + +- Handles local or remote command routing for maximum portability + +.. admonition:: Challenge: Handle exactly once + + In a lot of cases, the command node's automatic retry feature is helpful. However sometimes there are critical commands that must be run exactly once. Automatic retries can cause trouble in this circumstance: + + .. figure:: ../assets/img/writeup/unified_messaging_small_uas/cmd_node_race_condition.png + :class: dark-light + + Example of a feasible (but somewhat unlikely) scenario of a command ack race condition. A remote node finishes and sends an ACK for a command, but it is note received before the automatic-retry timeout occurs on the sender, causing the sender to emit the already-completed command again. + + - This problem was never solved in my first implementation of this architecture. + + - Remote ACK and Command retry logic race condition + + - Could be a problem for any state-based command. + + - Commands are required to be handled in a non-blocking way, so chances of this are low but still a risk + + - Solution ideas + + - Messaging command node should keep track of handled commands in an identifiable/reproducible way (CRC?) + + - Commands that want to be handled exactly once mark a flag in their message header so the remote command node is aware. + + +ORB Param Node +^^^^^^^^^^^^^^ + +Parameters operating conditions that you want saved on a per-unit basis in a non-volatile way. + +For this node, I used `MsgPack `_ as the underlying non-volatile storage method for keeping track of parameters. MsgPack is great since its essentially compact JSON. This means at the cost of some memory, parameters could be stored in NVM such that it was easy to add/remove parameters in future releases without requiring any complex NVM migration/versioning code. + +The core concept of the parmeter node was to organize parameters into a tree structure. In C++ this would essentially translate into the very natural struct containing structs model. + +.. figure:: ../assets/img/writeup/unified_messaging_small_uas/param_node_tree.png + :class: dark-light + + Example of a parameter node tree + +With MsgPack, the Param node would store and reference parameters via a path-like string. + +So to get or set the gimbals roll proportional gain, you would use the path ``/gimbal/roll/kp``. In C++ code the parameters would accessible like this: + +.. code-block:: c++ + + struct GimbalAxisGain { + float kp; + float kd; + }; + + struct GimbalParams { + GimbalAxisGain roll; + GimbalAxisGain pitch; + GimbalAxisGain yaw; + uint16_t imu; + }; + +I was pleasantly surprised with how easily this node came together. No major challenges encountered. Its easy to work with both from a factory user, and a development maintenance standpoint. + +Routing and MAVLink +------------------- + +.. image:: ../assets/img/writeup/unified_messaging_small_uas/high_level_arch_routing.png + :class: dark-light + +This messaging system utilizes the MAVLink protocol for its messaging de/serialization capabilities. While MAVLink advertises itself as a full messaging system, with a defined set of common messages, it also makes it easy to define and generate your own custom set of MAVLink messsages. This was our primary approach: Define a large set of appication-specific messages and use MAVLinks generated code to serial/deserialize them off the wire: + +.. image:: ../assets/img/writeup/unified_messaging_small_uas/mavlink_usage.png + :class: dark-light + +MAVLink: Message and Packets +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Here's MAVLinks packet definition: + +.. image:: ../assets/img/writeup/unified_messaging_small_uas/mavlink_packet.png + :class: dark-light + +You can see it has a relatively small header, followed by a message payload and finally a message checksum. +The header also includes the message id, payload length, and the address of the source/sender of the message. + +XML is used to define what goes into a payload. For instance: + +.. code-block:: XML + + + + + Cancel a long running command. The target system should respond with a COMMAND_ACK to the original command with result=MAV_RESULT_CANCELLED if the long running process was cancelled. If it has already completed, the cancel action can be ignored. The cancel action can be retried until some sort of acknowledgement to the original command has been received. The command microservice is documented at https://mavlink.io/en/services/command.html + System executing long running command. Should not be broadcast (0). + Component executing long running command. + Command ID (of command to cancel). + + +A generator like `pymavlink `_ can then be used to generate code in multiple languages from this XML. + +MAVLink Advantages +^^^^^^^^^^^^^^^^^^ + +- open-source protocol + +- Community familiarity (easier support of 3rd-party hardware) + +- Message generation into multiple languages + +- Efficient serialization: 12 bytes of over-the-wire overhead per message + +- Efficient library size and serialization compute overhead + +- Already used as the offboard transport of our chosen autopilot (Pixhawk) + + +MAVLink Challenges +^^^^^^^^^^^^^^^^^^ + +- Message destination (routing info) is not part of packet header, but we need it to be in every message + +- Simple message definitions: no nested structs or custom types beyond enums + +- No built-in way to define message visibility (public API vs internal message) + +- Open source generator is difficult to extend/customize + +MAVLink Routing +^^^^^^^^^^^^^^^ + +Routing in MAVLink is conceptually very simple. Each message has a system and component ID. The System ID is a uint8 that addresses a full UAS system, while the component ID addresses a single mcu/component in a system. `MAVLinks site `_ explains in more detail. Here are the basic routing rules: + ++-------------------+----------------------+------------------------------------------+ +| ``target_system`` | ``target_component`` | description | ++===================+======================+==========================================+ +| X ( >0) | X ( >0) | Targetting a single 'concrete' component | ++-------------------+----------------------+------------------------------------------+ +| X | 0 | System Broadcast | ++-------------------+----------------------+------------------------------------------+ +| 0 | X | Component broadcast | ++-------------------+----------------------+------------------------------------------+ +| 0 | 0 | Broadcast | ++-------------------+----------------------+------------------------------------------+ + + +Message Routing: Modularity +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As menitoned early on, being flexible to system architecture/network topology changes is a core philosophy of this library. To that end, the message routing system was intentionally designed such that the network could be easily adjusted with little to no impact on application code. + +Core definitions: + +``MavlinkChannel`` Handles sending a receiving MAVLink messages over a single 'transport' ie: a single UART + +``MavlinkHub`` Handles routing logic and moving messages around between multiple ``MavlinkChannel`` s. + +As show in prior examples, we commonly employed a star or multi-star `network topology `_. Meaning, most network nodes would only need a single ``MavlinkChannel``, while only a couple nodes would need to be a ``MavlinkHub``. In C++, these components were designed to inherit from the same base class. This means to change a MCU from a single channel node to a hub node only required passing in a differently constructed reference on startup of the messaging system! The flexibility of this was very exciting for me. + +.. image:: ../assets/img/writeup/unified_messaging_small_uas/mavlink_channel_arch.png + :class: dark-light + +To summarize: + +- Hubs can be transparently inserted without awareness of higher-level modules + +- Channel-to-Channel routing rules handled by a Hub + +- Result: system network topology can be changed with little to no code changes + +Transport interface +------------------- + +Finally, lets end with an overview of the messaging systems transport interface: + +.. image:: ../assets/img/writeup/unified_messaging_small_uas/high_level_arch_transport.png + :class: dark-light + +One of our key requirements was that the messaging library must be transport agnostic: it will work whether you're communicating via UDP or UART. + +To that end, a simple interface was defined and then implemented for all our needed transports + +.. image:: ../assets/img/writeup/unified_messaging_small_uas/transport_uml.png + :class: dark-light + +Transport: advantages +^^^^^^^^^^^^^^^^^^^^^ + +- Messaging library only requires IIOStream references + +- Messaging library protocols are transport agnostic + +- porting to new transports/architectures is much easier + +Transport: challenges +^^^^^^^^^^^^^^^^^^^^^ + +- User has to implement logic to create/remove transports during runtime (non-issue on bare-metal) +- abstraction can cause transport inefficiencies: Rely on lower driver to work that out (UDP/TCP packet size) +- Abstraction makes it difficult to introspect transport performance at messaging-level + +Review +------ + +Thats a brief summary of the architecure I implemented for a UAS messaging system. Lets go into the good, bad and lessons I learned from this. + +Advantages +^^^^^^^^^^ + +- The Object Request Brokers are easy-to-use interfaces for the most common user tasks + +- ORBs allow our entire codebase can share the same implementation for common tasks + +- Proper routing system on top of MAVLink increases transport efficiency + + - minimizes messages sent over channels to those requested (base MAVLink chooses to broadcast messages everywhere too often) + + - reduces messages moving over lossy radio link + +- Ability to transparently make a component a "Hub" allows flexible network topology (minimal code impact) + +Motivation/Requirement fullfillment +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Did this implementation address all the requirements I discussed at the beginning? + +- Maintainability of separate messaging frameworks + - Single framework eases maintenance and versioning burden. Decreases complexity and developer onboarding time (don't need to learn nuances of 2 systems) + +- Efficiency of separate messaging frameworks + - Unified framework means no message translation boilerplate necessary + +- Convenient data sharing between modules + - Topic Object Request Broker makes it easy to decouple data producers from consumers + +- Portability of modules + - All modules in the project use a unified messaging framework that facilitates onboard and offboard comm. Modules have freedom to move to different portions of the network with minimal effort. + +Unresolved challenges +^^^^^^^^^^^^^^^^^^^^^ + +Overall I was really happy with this overall architecture. However, by the time I left this company there were still a number of unresolved challenges with the architecture which I would have like to eventually address: + +- On a network of multiple systems, how do vehicles de-conflict system-id assignment? + + - Internal arbitration protocol is needed + +- Allowing for nuances in implementation across target architectures + + - Big issue: thread safety on OS targets which isn't a concern on bare metal + + - Need proper levels of abstraction, even within the library itself (OSAL) + + - Thread-safe wrappers of user-facing interfaces + +- Traffic shaping + + - Some messages are more important than others + + - How to prioritize messages being emitted over a channel in a memory-efficient way? + +- Running as an OS-service + + - Running messaging as a service that multiple distinct applications can interact with + + - Need proper levels of abstraction, even within the library itself (OSAL) + +- Filling statically allocated containers + + - To be bare-metal friendly, I built this library to be 100% statically allocated. The drawback is of course the possibility of one or more of its many static containers becoming full, inhibiting or breaking additional functionality. + + - I developed a number of introspection tools to help us know when this happens + + - Still inconvenient, can always use more tooling and introspection into complex and critical libraries