From 19af2079e5f01f3d94c87edc06725398fde58a98 Mon Sep 17 00:00:00 2001 From: Ruixiang Du Date: Mon, 27 Jul 2026 23:03:36 +0800 Subject: [PATCH 1/2] =?UTF-8?q?brand:=20add=20xmSimulator=20icon=20(=CE=A8?= =?UTF-8?q?)=20across=20the=20icon=20set?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New family component icon, drawn to the ADR-0003 badge system: - branding/icons/xmsimulator.svg — hero: an isometric quadruped robot (legged locomotion / physics simulation), chartreuse #B0C918 - branding/icons/avatar/xmsimulator.svg + avatar/png/xmsimulator.png — Ψ glyph avatar (baked from DejaVu Serif Bold, 512px PNG like the others) Registered everywhere the set is listed: - branding/README.md — icon table + registry row (accent/symbol/depicts) - branding/preview/index.html — live-preview icon list - README.md — Components table row + icon strip + Greek-letter logo list Symbol Ψ ("sigh" = the S of Simulator; state, which a simulator propagates). Accent #B0C918 is the one open hue in the family palette. --- README.md | 6 ++++-- branding/README.md | 3 +++ branding/icons/avatar/png/xmsimulator.png | Bin 0 -> 22551 bytes branding/icons/avatar/xmsimulator.svg | 5 +++++ branding/icons/xmsimulator.svg | 21 +++++++++++++++++++++ branding/preview/index.html | 1 + 6 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 branding/icons/avatar/png/xmsimulator.png create mode 100644 branding/icons/avatar/xmsimulator.svg create mode 100644 branding/icons/xmsimulator.svg diff --git a/README.md b/README.md index f3a98e7..adee1c6 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,8 @@ xmDriver  xmNavigation  xmMessaging  -xmViewer +xmViewer  +xmSimulator @@ -33,10 +34,11 @@ This repository is the **umbrella**: a thin CMake superbuild that assembles the | **∇** | xmNavigation | motion algorithms — planning · control · estimation · mapping · *centerpiece* | [rxdu/xmNavigation](https://github.com/rxdu/xmNavigation) | | **π** | xmMessaging | application communication — typed pub/sub · request/response · zero-copy transport | [rxdu/xmMessaging](https://github.com/rxdu/xmMessaging) | | **γ** | xmViewer | visualization | [rxdu/quickviz](https://github.com/rxdu/quickviz) | +| **Ψ** | xmSimulator | physics simulation — MuJoCo world · sensors · dynamics | [rxdu/xmSimulator](https://github.com/rxdu/xmSimulator) | 1 *xmTelemetry — the production observability SDK and tooling — is privately maintained; available for production integrations.* -Component names follow [ADR 0003](docs/adr/0003-naming-and-branding.md); the Greek letters (κ ζ Σ τ μ ∇ γ π) are retained as logos only — every repo, submodule path, and icon file now carries its functional name. Everything builds on **xmBase**; dependencies point downward only. Two pairs span the boundary: **xmBase/xmDriver** on the host, **xmFirmware/xmBoard** on the embedded target — with **xmNavigation** the motion-algorithms core. +Component names follow [ADR 0003](docs/adr/0003-naming-and-branding.md); the Greek letters (κ ζ Σ τ μ ∇ γ π Ψ) are retained as logos only — every repo, submodule path, and icon file now carries its functional name. Everything builds on **xmBase**; dependencies point downward only. Two pairs span the boundary: **xmBase/xmDriver** on the host, **xmFirmware/xmBoard** on the embedded target — with **xmNavigation** the motion-algorithms core. ## Applications diff --git a/branding/README.md b/branding/README.md index a02c13b..6e1355d 100644 --- a/branding/README.md +++ b/branding/README.md @@ -20,6 +20,7 @@ A cohesive icon set for the XMotion family. Each icon shares one visual language xmFirmware xmBoard xmMessaging + xmSimulator xmBase
Σ @@ -30,6 +31,7 @@ A cohesive icon set for the XMotion family. Each icon shares one visual language xmFirmware
ζ xmBoard
κ xmMessaging
π + xmSimulator
Ψ @@ -43,6 +45,7 @@ A cohesive icon set for the XMotion family. Each icon shares one visual language | **xmFirmware** | `#46B358` green | ζ | a UART decode — logic-analyzer waveform + the decoded byte `0x5A` — firmware (Zephyr) | | **xmBoard** | `#E5604D` coral | κ | a PCB fan-out — a quad IC footprint, a structured 45° trace fan onto a via column, and short top/bottom escapes — electronics (KiCAD) | | **xmMessaging** | `#2E90FA` signal blue | π | a brokerless peer-to-peer mesh — nodes exchanging messages directly (the application communication layer) | +| **xmSimulator** | `#B0C918` chartreuse | Ψ | an isometric quadruped robot standing on the ground — legged locomotion / physics simulation (MuJoCo) | ## The family mark — xmMotion diff --git a/branding/icons/avatar/png/xmsimulator.png b/branding/icons/avatar/png/xmsimulator.png new file mode 100644 index 0000000000000000000000000000000000000000..c972654962b7461336382e989442619535efaf5a GIT binary patch literal 22551 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

|5df-mw2AyN2H^NLV|8C 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 TO0Z(!l^bNBYXU95?-=oaBWTWm literal 0 HcmV?d00001 diff --git a/branding/icons/avatar/xmsimulator.svg b/branding/icons/avatar/xmsimulator.svg new file mode 100644 index 0000000..f08aaee --- /dev/null +++ b/branding/icons/avatar/xmsimulator.svg @@ -0,0 +1,5 @@ + + xmSimulator — Ψ (avatar) + + + diff --git a/branding/icons/xmsimulator.svg b/branding/icons/xmsimulator.svg new file mode 100644 index 0000000..9e0294c --- /dev/null +++ b/branding/icons/xmsimulator.svg @@ -0,0 +1,21 @@ + + xmSimulator — quadruped robot, isometric (legged locomotion / physics simulation) + + + + + + + + + + + + + + + + + + + diff --git a/branding/preview/index.html b/branding/preview/index.html index da187cb..0a869a2 100644 --- a/branding/preview/index.html +++ b/branding/preview/index.html @@ -83,6 +83,7 @@

family strip

{ id:"xmfirmware", name:"xmFirmware · ζ", color:"#46B358" }, { id:"xmboard", name:"xmBoard · κ", color:"#E5604D" }, { id:"xmmessaging", name:"xmMessaging · π", color:"#2E90FA" }, + { id:"xmsimulator", name:"xmSimulator · Ψ", color:"#B0C918" }, { id:"xmmotion", name:"xmMotion · robot", color:"#EAEFF7" }, { id:"xmmotion-mark",name:"xmMotion · Ξ", color:"#EAEFF7" }, ]; From 351c8696b4154c6ca47747b6cc6e17e72843c1c3 Mon Sep 17 00:00:00 2001 From: Ruixiang Du Date: Mon, 27 Jul 2026 23:10:37 +0800 Subject: [PATCH 2/2] build: register xmSimulator as an umbrella component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vendors rxdu/xmSimulator at components/simulator (branch main) and adds the XMOTION_WITH_SIMULATOR option (default OFF — it pulls the MuJoCo dependency, so it is opt-in like xmViewer/xmMessaging). Assembled via xmotion_add_component in dependency order; the family roster (README Components table + icon set) already carries xmSimulator. --- .gitmodules | 4 ++++ CMakeLists.txt | 9 ++++++++- components/simulator | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) create mode 160000 components/simulator diff --git a/.gitmodules b/.gitmodules index 6dff014..774cb47 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,3 +22,7 @@ path = components/messaging url = https://github.com/rxdu/xmMessaging.git branch = main +[submodule "components/simulator"] + path = components/simulator + url = https://github.com/rxdu/xmSimulator.git + branch = main diff --git a/CMakeLists.txt b/CMakeLists.txt index cd00c66..f325e5d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ option(XMOTION_WITH_DRIVER "Build xmDriver (host hardware drivers)" ON) option(XMOTION_WITH_NAVIGATION "Build xmNavigation (motion algorithms)" ON) option(XMOTION_WITH_VIEWER "Build xmViewer (visualization)" OFF) option(XMOTION_WITH_MESSAGING "Build xmMessaging (communication layer)" OFF) +option(XMOTION_WITH_SIMULATOR "Build xmSimulator (physics simulation)" OFF) option(BUILD_TESTING "Build component tests" OFF) # -- Helper: add a component submodule if it is present --------------------- @@ -78,7 +79,13 @@ if(XMOTION_WITH_MESSAGING) xmotion_add_component(xmMessaging components/messaging) endif() +# xmSimulator: MuJoCo-backed physics simulation (world · sensors · dynamics). +# Default OFF — it pulls the MuJoCo dependency; opt-in for apps that simulate. +if(XMOTION_WITH_SIMULATOR) + xmotion_add_component(xmSimulator components/simulator) +endif() + message(STATUS "xMotion ${PROJECT_VERSION}: configured " "(TELEMETRY=${XMOTION_WITH_TELEMETRY} DRIVER=${XMOTION_WITH_DRIVER} " "NAVIGATION=${XMOTION_WITH_NAVIGATION} VIEWER=${XMOTION_WITH_VIEWER} " - "MESSAGING=${XMOTION_WITH_MESSAGING})") + "MESSAGING=${XMOTION_WITH_MESSAGING} SIMULATOR=${XMOTION_WITH_SIMULATOR})") diff --git a/components/simulator b/components/simulator new file mode 160000 index 0000000..65b6d83 --- /dev/null +++ b/components/simulator @@ -0,0 +1 @@ +Subproject commit 65b6d83883fc66cde40d82b678b708b2f31feb6f