Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[みん強]脳波でルンバを動かすためのリアルタイムデータ基盤

 [みん強]脳波でルンバを動かすためのリアルタイムデータ基盤

脳波(PiEEG)をリアルタイムに解析し、ルンバ(RoombaOpenInterface)を動かしてお茶を運ぶシステムを題材に、 「信号を意味に変換して物理世界を動かす」データ基盤の設計について発表しました

みんなの考えた最強のデータ基盤アーキテクチャ26前期〜前夜祭〜ルーキーズ
2026/5/14(木) 19:00〜
https://www.youtube.com/watch?v=7yvAfZ8vCDU

Avatar for Keita Nakata

Keita Nakata

May 14, 2026

More Decks by Keita Nakata

Other Decks in Technology

Transcript

  1. ᶃԿΛ࡞͔ͬͨ ೴೾(EEG)ͰϩϘοτ૟আػΛಈ͔͢γεςϜ • ಄ʹ෇͚ͨηϯαͰ೴೾ΛऔΓɺRoomba Λಈ͔͢ • ηϯα → ਪ࿦ →

    ੍ޚίϚϯυ͕1ඵҎ಺Ͱ1प͢Δ • ෳ਺୆ͷϚγϯΛލ͍ͩʮϦΞϧλΠϜɾσʔλύΠϓϥΠϯʯ ຊ೔͸ʮϩϘοτΛಈ͔͢࿩ʯͰ͸ͳ͘ɺͦͷཪଆͷ σʔλج൫ͷઃܭ ͷ࿩Λ͠·͢ɻ
  2. eeg_roomba σʔλύΠϓϥΠϯ ෺ཧ૚ → औಘ → సૹ → ղੳ →

    ൑ఆ → ੍ޚ → ෺ཧ૚ + Autopilot ϧʔϓ ᶃ ෺ཧ૚ (಄ൽ) • ిۃ 16ch (࣪/ס) • ALPHA_CHANNELS=6,7 • α೾ 10–100 μV • ޙ಄෦૬౰ ᶄ PiEEG-16 + Pi-A • ADS129x ×2 (8ch×2) • 24bit ΔΣ ADC • 250 Hz, SPI • acquirer.py (systemd) • LSL push + MQTT health ᶅ ingest (PC) • LSLSource / FileReplay • host network mode • TimescaleDB COPY eeg_raw(ts,ch,uv) • MQTT eeg/chunk 250Hz • MQTT eeg/live 50Hz ᶆ feature • 1ඵ૭ / 250ms hop • HPF1Hz / LPF40Hz • 50/60Hz notch • Welch PSD • θ/α/β bandpower → eeg/alpha (retain) ᶇ decision • α_avg = mean(ch6,7) • Schmitt ώεςϦγε enter=10 / exit=6 dwell=500ms • idle ⁶ active → control/state retain ᶈ Pi-B + Arduino • FastAPI :8000 • pyserial /dev/ttyACM0 • Arduino USB-CDC • 3.3V→5V TTL ม׵ • ROI state machine ᶉ Roomba (෺ཧ) • mini-DIN 7pin • 115200 bps TTL • Drive(vel, radius) opcode 137 • Ϟʔλʔۦಈ 5.5 Autopilot ϧʔϓ (3ඵपظ / 1൑அ͋ͨΓதԝ஋ ~2s) Pi-B USB Χϝϥ • /camera/stream • MJPEG (multipart) • SOI→EOI εΩϟϯ • ࠷େ 2MB/frame api (PC, asyncio) • 3 ඵ͝ͱʹ 1 frame • asyncio.Lock ೋॏىಈ๷ࢭ • mode = goal / free goal = "my feet" • finally Ͱඞͣ stop Gemini Robotics-ER 1.6 • image + prompt + tools • temperature=0.3 • thinking=LOW • google_search tool → JSON {command, reason} Parse → Dispatch • fenceണ͕͠ˠ{...}→fallback • 5୒: fwd/left/right/back/stop • HTTP → Pi-B /command/{cmd} • MQTT roomba/cmd publish • roomba_events ʹӬଓԽ ↑ ֎޲͖ HTTPS (Google API) ج൫ϨΠϠ (PC: docker compose / 7 ίϯςφ) ɾ ωοτϫʔΫ TimescaleDB • eeg_raw (250Hz×16ch) • eeg_features (~4Hz) • events (JSONB) • roomba_events (ts,cmd,ok,src,reason, Mosquitto (MQTT) • eeg/chunk 250Hz • eeg/live 50Hz • eeg/alpha (retain) • control/state (retain) • control/threshold (retain) api + frontend • FastAPI :8080 • WS /ws (શτϐοΫ fan-out) • /history/alpha, /threshold • /autopilot/{start,stop,status} Tailscale Tailnet (؅ཧ໘) • 4 ϊʔυ: ։ൃPC / PC / Pi-A / Pi-B • WireGuard mesh, 100.x.y.z • ༻్: ssh / rsync / WebUI Ӿཡ • σʔλ໘͸ ૉͷLAN Λ௨Δ E2E ϨΠςϯγ༧ࢉ (EEGύε): தԝ஋ < 500ms / p95 < 1s — SPI→LSL 5ms ɾ ingest 20ms ɾ Welch 50ms ɾ MQTT 20ms ɾ HTTP 100ms ɾ Arduino+ROI ਺ms ɾ ϞʔλʔԠ౴ ~100ms Autopilot ύε: 1 ൑அ͋ͨΓ தԝ஋ ~2s (JPEGऔಘ 200ms + Gemini API ~1.5s + dispatch 200ms) — goal="my feet" Ͱ଍ݩࣗ཯઀ۙ → ࣗൃ stop EEG औಘ సૹ / DB ৴߸ղੳ ൑ఆ / ดϧʔϓ ϩϘοτ੍ޚ Autopilot Gemini API ڥք (LAN / ిѹ / VPN) LAN ڥք ൑ఆ → ੍ޚ HTTP POST ిѹڥք 3.3V ⁶ 5V TTL ⟲ ดϧʔϓ: Roomba ૸ߦ → ։؟ → α ݮਰ (BergerޮՌ)
  3. ຊ೔ͷྲྀΕ ᶃ ੜ੒ ηϯα/σόΠε ᶄ సૹ MQTT ᶅ Ճ޻ LSL

    / લॲཧ ᶆ ஝ੵ อଘ ᶇ ൑அ autopilot ᶈ ഑৴ ϩϘοτ੍ޚ ϋʔυ΢ΣΞॱͰ͸ͳ͘ʮσʔλͷྲྀΕʯ࣠Ͱ੔ཧ͠·͢ Pi-A (ηϯαଆ) ू໿PC (MQTT + LSL + ਪ࿦ + DB) Pi-B (ϩϘοτଆ) ࣮ߦϚγϯ
  4. ᶃੜ੒ʛηϯαͱσόΠε EEG ϔουηοτ (PiEEG) — Raspberry Pi ʹ௚݁ͨ͠η ϯα •

    ಄ൽʹషΔిۃ → Ξφϩάిѹ → ADC → σδλϧ஋ͷ࣌ܥྻ • αϯϓϧ͋ͨΓ 8νϟϯωϧ × float32 (= 32 byte) Λ 250 Hz Ͱ ు͖ଓ͚Δ ੜ੒ଆϚγϯ: Pi-A • ηϯαͱʮಉ͡ϋʔυʹ৐͍ͬͯΔʯͷ͕ϙΠϯτ — ͔͜͜Β ઌ͸ී௨ͷIPωοτϫʔΫ • Pi-A ͷ໾ׂ͸ʮηϯαͷബ͍ϥούʔʯ — ਪ࿦΋อଘ΋͠ͳ͍
  5. ᶃੜ੒ʛσʔλͷܗ 1αϯϓϧ 64 byte 16ch × 24bit (಺෦දݱ 4B/ch) 1ඵ

    16 KB 250αϯϓϧ × 64B (ϖΠϩʔυ͸໿ 12 KB) 1෼ ≈ 960 KB = 1ηογϣϯ෼ (͏ͪα͸ ch 6,7 ͷΈ) αϯϓϧप೾਺250Hzͷ೴೾σόΠε͸݁ߏଟ͍ ΨϯϚप೾਺͕100લޙͷͨΊɺφΠΩετϨʔτΛߟྀͯ͠250Hz →ੜσʔλ͸ ͓Αͦɺ2.7 GB/೔ͷσʔλྔʹͳΔ
  6. ᶄసૹʛ.255ͱ͸ŠඵͰ ҰݴͰ: ܰྔͳ pub/sub ͷϝοηʔδϒϩʔΧʔ • Topic: จࣈྻͷύε ( ྫ:

    eeg/raw , roomba/cmd ) • Publisher ͕ topic ʹ౤͛ΔɺSubscriber ͕ड͚औΔ (Kafka ͱࣅͨൃ૝) • ϖΠϩʔυ͸த਎Λ໰Θͳ͍ (όΠφϦՄ) ࠓճͷ伴ͱͳΔ2ͭͷػೳ • retain : ʮ࠷ޙͷ஋ʯΛϒϩʔΧʔ͕͍֮͑ͯͯɺޙ͔Βܨ͍ͩ subscriber ʹ΋ଈ഑Δ • last-will : ΫϥΠΞϯτ͕མͪͨͱ͖ʮҨݴʯΛࣗಈ഑৴ → ঢ়ଶ؅ཧָ͕ʹͳΔ
  7. ᶄసૹʛ͜ͷγεςϜͰͷ࢖͍ํ Pi-A EEG औಘ (LSL outlet) ू໿PC LSL inlet →

    ਪ࿦ + Mosquitto (MQTT broker) Pi-B ੍ޚ (MQTT subscriber) LSL (UDP multicast + TCP) EEG_16ch_250 MQTT (TCP) roomba/cmd MQTT ΛબΜͩཧ༝ (੍ޚίϚϯυଆ) • PC ಺ίϯςφ܈ (ਪ࿦/؂ࢹ) + Pi-B ͕ʮ͓ޓ͍ͷ IP Λ௚઀஌Βͳ͍͍ͯ͘ʯ — broker ͑͞ݟ͑Ε͹ಈ͘ • ੍ޚίϚϯυ͸ retain=true → Pi-B ࠶ىಈͰ΋ʮ࠷৽ίϚϯυʯΛଈऔಘ • ਪ࿦ίϯςφ͕མͪͨΒ last-will ͰϩϘοτΛࣗಈఀࢭ → ϋʔτϏʔτ࣮૷͕ཁΒͳ͍ ※ ηϯαˠPC ଆ (ߴස౓ͷੜ೾ܗ) ͸ MQTT Ͱ͸ͳ͘ LSL Λ࢖༻ɻཧ༝͸࣍εϥΠυ (ᶅՃ޻) Ͱɻ
  8. ༨ஊ.255ͱ,BGLB͸Ͳ͏ҧ͏ ʮpub/sub ͳΒ Kafka Ͱ͍͍ͷͰ͸?ʯ MQTT — ʮܰྔͳݱࡏ஋ͷަ׵ʯ͕ಘҙ • ϖΠϩʔυখɾ௿஗ԆɾτϐοΫ͸໦ߏ଄ͷจࣈྻ

    (roomba/cmd) • retain Ͱʮ࠷৽஋ʯɺlast-will Ͱʮࢮ׆ʯ → IoT/੍ޚ޲͚ͷศརػೳ • broker ͸جຊشൃ — աڈϩά͸औΕͳ͍ Kafka — ʮશΠϕϯτΛӬଓϩάͱͯ͠࢒͢ʯ͕ಘҙ • topic ͸ ௥هܕͷϩά — աڈʹר͖໭ͯ͠࠶ੜͰ͖Δ • ύʔςΟγϣϯ + ίϯγϡʔϚάϧʔϓͰਫฏεέʔϧɺ࠶ىಈͰ΋ offset ؅ཧͰ҆શ • ͦͷ୅ΘΓ broker ͸ॏ͍ (Zookeeper ΍ KRaft ࠐΈ)ɺ࠷খ஗ԆͰ͸ MQTT ʹෛ͚Δ ࠓճͷબ୒: ʮ࠷৽஋͕෼͔Ε͹े෼ɾ௿஗Ԇɾ૊ΈࠐΈ΋ܨ͙ʯཁ݅ͳͷͰ MQTTɻϩά࠶ੜ͕ཁ݅ʹͳΕ͹ Kafka ซ༻΋ݕ౼༨஍͋Γɻ
  9. ᶅՃ޻ʛ-4-ͱ͸ ҰݴͰ: ࣌ܥྻετϦʔϜ + ࣌ࠁಉظ ͕ϫϯηοτͷதܧن֨ Lab Streaming Layer (೴೾/ੜମ৴߸ܥͰఆ൪)

    • ʮstreamʯͱ͍͏୯ҐͰ chunk + timestamp Λྲྀ͢ • αϯϓϦϯάϨʔτ / νϟϯωϧ਺ / dtype ͕ εΩʔϚͱͯ͠ݻఆ ͞ΕΔ • ࣌ࠁ߹ΘͤΛ LSL ଆ͕΍ͬͯ͘ΕΔ — ิਖ਼ΛࣗલͰॻ͔ͳ͍͍ͯ͘ • transport ͸ UDP ϚϧνΩϟετ (ݕग़) + TCP (సૹ) (Ϛγϯ಺Ͱͷ௨৴ͰΑ͘࢖ΘΕΔΈ͍ͨ)
  10. ᶅՃ޻ʛύΠϓϥΠϯͷத਎ ೴೾ղੳ LSL inlet Pi-A ͷ outlet Λ LAN ϚϧνΩϟετͰड৴

    લॲཧ όϯυύε → αଳநग़ (ch 6,7) → ૭Խ ಛ௃ྔɾਪ࿦ PSD / ᮢ஋൑ఆ → Πϕϯτੜ੒ MQTT publish PC ಺ Mosquitto → Pi-B (roomba/cmd) ໾ׂ෼୲ͷ࣮ଶ • LSL: Pi-A → PC Λ LAN ϚϧνΩϟετͰލ͙ (࣌ࠁಉظࠐΈ) • MQTT: PC ಺ίϯςφؒ + PC → Pi-B (੍ޚίϚϯυ) LSL ͸Ұൠతʹ͸Ϛγϯ಺޲͚͕ͩɺຊϓϩδΣΫτͰ͸ LAN ϚϧνΩϟ ετͰލ͍Ͱ࢖༻ • ͦͷ͓͔͛Ͱ࣌ࠁಉظ͸ LSL ʹ೚ͤΒΕΔ • ੍ޚ͸ broker ܦ༝ͳͷͰ Pi-B ͕࠶ىಈͯ͠΋ retain Ͱଈ෮ؼ
  11. ᶆ஝ੵʛͭͷ૬൓͢Δཁ݅ΛͲ͏ཱ྆͢Δ͔ ϦΞϧλΠϜܦ࿏ ʮࠓ͜ͷॠؒͷ൑அʯͷͨΊ • ࠷৽஋͕ < 50ms ͰಡΊΔ • ਪ࿦Ϟσϧ͕௚લ

    N αϯϓϧΛຖϧʔϓࢀ র • མͱ͍͍ͯ͠ (ݹ͍σʔλ͸ࣺͯΔ) ஝ੵܦ࿏ ʮ͋ͱ͔Βֶशɾ෼ੳʯͷͨΊ • શαϯϓϧΛ 1ͭ΋͚ܽͣ௕ظอଘ • ηογϣϯ୯ҐͰऔΓग़ͤΔ • ࠶ֶशɾΦϑϥΠϯ෼ੳʹ଱͑Δ vs → ʮετϦʔϜʯͱʮετΞʯΛ෼͚ɺ྆ํʹࢬ෼͔Εͤ͞Δ
  12. ᶆ஝ੵʛࢬ෼͔Εͷઃܭਤ LSL stream (લॲཧࡁΈ) Hot — Ring Buffer [ ݱࡏ࣮૷ࡁ

    ] in-memory (numpy / deque) ༻్ ᶇ ਪ࿦Ϟσϧ༻ ࢓૊Έ ௚ۙ N ඵ͚ͩอ࣋ / ࣗಈഇغ Warm — TimescaleDB [ ݱࡏ࣮૷ࡁ ] Postgres + ࣌ܥྻ֦ு ༻్ ηογϣϯ෼ੳɾՄࢹԽ ࢓૊Έ ϋΠύʔςʔϒϧ / ѹॖϙϦγ Cold — Parquet [ কདྷҊɾະ࣮૷ ] ϩʔΧϧσΟεΫ + S3 ༻్ ΦϑϥΠϯֶशɾ؂ࠪ ࢓૊Έ (Ҋ) ηογϣϯ୯ҐϑΝΠϧ + ϝλ JSON
  13. ༨ஊɿީิͭ͋ͬͨ %&4*(/NEːͰݕ౼ͨ͠୅ସҊ ϑΝΠϧ 1BSRVFU ࣌ࠁ໋໊Ͱॻ͖ஷΊɻ QBOEBT1PMBST௚݁ɻ SFUFOUJPOͱΫΤϦ͸ࣗ લɻ ࣌ܥྻઐ༻ *OGMVY%#

    MJOFQSPUPDPM 'MVY *OGMVY2-ɻ*P5ϝτϦΫ ε޲͚ɻֶशίετ  ΤίγεςϜஅઈɻ 1PTUHSFT֦ு 5JNFTDBMF%# ඪ४42- IZQFSUBCMF ѹॖ SFUFOUJPOએ ݴతɻҟछςʔϒϧΛ +0*/ɻ ࠾ ༻ ྻࢦ޲0-"1 $MJDL)PVTF େن໛ूܭͱϩάʹڧ ͍ɻѹॖ཰rYɻຊ ݅ن໛Ͱ͸PWFSLJMMɺӡ ༻ॏ͍ɻ
  14. ൺֱද ຊϓϩδΣΫτͷީิ पลͷओཁ࣌ܥྻɾ෼ੳ%# 5JNFTDBMF%# *OGMVY%# $MJDL)PVTF 1BSRVFU %VDL%# ํࣜ 1PTUHSFT֦ு

    ઐ༻Τϯδϯ ྻࢦ޲0-"1 ϑΝΠϧ ૊ࠐ ΫΤϦݴޠ ඪ४42- 'MVY*OGMVY2- 42-ํݴ ඪ४42- ѹॖ཰ DI rY rY rY Y +0*/ ˕ ˚ ˓ ˕ τϥϯβΫγϣϯ ˕"$*% ✕ ✕ ✕ ܧଓूܭ DPOUJOVPVTBHH UBTLT NBUFSJBMJ[FEWJFX ࣗલ ӡ༻ෛՙ ௿ த ߴ ۃ௿ ಘҙ෼໺ ࠞ߹0-51 ࣌ܥྻ *P5ϝτϦΫε େن໛෼ੳɾMPH ΞυϗοΫ෼ੳ ˕ڧ͍u˓Մu˚੍ݶ͋Γu✕ඇରԠ
  15. ᶇ൑அʛࣗಈӡస ύΠϓϥΠϯͷத৺: Gemini Robotics-ER 1.5 (VLA) • ೖྗʹ EEG ಛ௃ྔ

    + ը૾ + ίϯςΩετ Λ·ͱΊͯ౤͛ɺί ϚϯυΛ VLAʹܾΊͤ͞Δ • LLM ग़ྗΛ 5୒ʹεφοϓ(Լهࢀর)͔ͯ͠Β MQTT ʹ৐ͤΔ ೖग़ྗ • ೖྗ: Ring Buffer ͔Β௚ۙ N ඵͷಛ௃ྔ + पล৘ใ • ग़ྗ: લਐ / ޙୀ / ࠨટճ / ӈટճ / ఀࢭ — ཭ࢄ5஋ʹѹॖ ࣦഊ࣌ͷৼΔ෣͍ • LLM ͕஗Ԇ / λΠϜΞ΢τͨ͠Β → ʮఀࢭʯίϚϯυΛ retain (҆ શଆʹ౗͢) • ηϯα͕੾ΕͨΒ → MQTT last-will ͕ʮఀࢭʯΛࣗಈ഑৴
  16. ᶈ഑৴ʛ3PPNCBɹʢ3PPNCB0QFO*OUFSGBDF • Pi-B → Roomba: USB serial Ͱ Drive ίϚϯυΛૹΔ

    • Arduino: ిѹڥք (Roomba 5V 㱻 Pi 3.3V) Λ Arduino ʹԡ͠ࠐΜͩ • Tailscale: ՈͷWi-Fi֎Ͱ΋ϚγϯؒΛ VPN ӽ͠ʹܨ͙ (P2P ϝογϡ)
  17. ֶͼɾϋϚΓͲ͜Ζ ͏·͍ͬͨ͘͜ͱ • LSL = ηϯαܥͷ transport / MQTT =

    ੍ޚܥͷ transportɺͱʮ޲͖ෆ޲͖Ͱ࢖͍෼͚ʯ → ഑ઢ͕ҰؾʹεοΩϦ • ʮϦΞϧλΠϜܦ࿏ʯͱʮ஝ੵܦ࿏ʯΛ෼͚ͨ͜ͱͰɺยํΛࢭΊͣʹยํΛվमͰ͖Δ • MQTT ͷ retain / last-will Ͱʮࢮ׆؅ཧίʔυʯΛ΄΅ॻ͔ͣʹࡁΜͩ ϋϚΓͲ͜Ζ • Docker host network ඞਢ: LSL ͸ UDP ϚϧνΩϟετͰ stream ݕग़ → Docker bridge ωοτϫʔΫͰ͸௨Β ͳ͍ɻinlet ίϯςφ͸ --network host ඞਢ • ࣌ࠁಉظ: Ϛγϯލ͗ͩͱ LSL ͷλΠϜελϯϓ͕ʮLSL ΫϩοΫʯج४ → DB อଘ࣌ʹͲͷ࣌ࠁ࣠Λ࠾༻͢Δ ͔ཁઃܭ • Sshܨ͍Ͱ͍ΔͱͲΕ͕ͲΕ͔Θ͔Βͳ͘ͳΔ
  18. ·ͱΊ ηϯα → సૹ → Ճ޻ → ஝ੵ (ࢬ෼͔Ε) →

    ൑அ → ഑৴ ʮϋʔυ΢ΣΞͷ࿩ʯͰ͸ͳ͘ʮσʔλͷྲྀΕͷ࿩ʯͱͯ͠੔ཧ͢Δͱɺ࠶ར༻Ͱ͖Δઃܭ͕ݟ͑Δ
  19. ϓϩτίϧ໾ׂ෼୲ ೾ܗ͸-4-ɺঢ়ଶͱ੍ޚ͸.255ɺطଘࢿ࢈͸)551 -4- .255 )551 ԿΛӡͿ ੜ&&(೾ܗ DIʷ)[ ঢ়ଶ ੍ޚ

    Πϕϯτ ಛ௃ྔ 3PPNCBۦಈίϚϯυ ۩ମྫ UPQJDFOEQPJOU QJFFH@DI PVUMFUˠJOMFU QJFFHIFBMUI DPOUSPMTUBUF  DPOUSPMUISFTIPME FFHDIVOL  FFHBMQIB SPPNCBDNEʜ 'BTU"1*NPWFIBMU SPPNCBTUBUFˠ3PPNCB SFUBJO Š TUBUFZFTFWFOUOP Š ڧΈ OTUJNFTZOD૊ࠐ #$*ࣄ࣮ඪ४ NVMUJDBTUࣗಈEJTDPWFSZ SFUBJOMBTUXJMM2P4 8FC4PDLFUCSJEHF .PTRVJUUP͸1JͰ΋ܰྔ طଘ3PPNCB'BTU"1*Λ ͦͷ··׆͔ͤΔ 3&45ඪ४ ऑΈ -"/಺ͷΈೝূͳ͠ ӬଓԽͳ͠8FC6*ʹෆ޲͖ )[ͷੜσʔλൖૹ͸ ඇޮ཰ DIVOLԽඞཁ TUSFBNJOHඇରԠ ϦΫΤετඵ͕૿͑Δͱෆ ར
  20. ".255ਂ۷ΓŠ ༝དྷτϦϏΞ • 1999೥ IBM ͕ ࠭യͷ༉ాύΠϓϥΠϯ؂ࢹ ༻ʹ։ൃ — Ӵ੕ճઢ͕ࡉͯ͘ߴ͍ͷͰʮͱʹ͔͍ܰ͘ʯ͕ઃܭ໨ඪ

    • ࠷খϔομ 2 byteɻHTTP ͷϔομͰ਺ඦbyte ͔͔Δͷͱ͸ผੈք QoS 0 / 1 / 2 ͷ࢖͍෼͚ • QoS 0 (at-most-once): fire&forgetɻ࠷৽஋͕དྷΕ͹ݹ͍ͷ͸ࣺ͍͍ͯͯ༻ (ςϨϝτϦ) • QoS 1 (at-least-once): ACK ͋Γɺॏෳ OKɻίϚϯυૹ৴ͳͲͷσϑΥϧτ • QoS 2 (exactly-once): 4-way ϋϯυγΣΠΫɺॏ͍ɻຊ౰ʹඞཁͳ͚࣌ͩ (՝ۚΠϕϯτ౳) retain ͱ last-will ͷਖ਼ମ • retain: broker ͕ʮ֤ topic ͷ࠷ޙͷ஋ʯ͚ͩϝϞϦอ࣋ɻޙ͔Βܨ͍ͩ client ͕ଈऔಘ → ࣄ্࣮ͷ Key-Value Store • last-will: ઀ଓ࣌ʹʮࣗ෼͕ࢮΜͩΒ͜ΕΛ publish ͯ͠ʯͱ broker ʹ༬͚ΔҨݴϝοηʔδ
  21. #-4-ਂ۷ΓŠ ग़ࣗ • UCSD ͷ Swartz Center ൃɻEEG / EMG

    / ࢹઢɾϞʔγϣϯΩϟϓνϟΛʮಉ͡λΠϜϥΠϯʯͰه࿥͢ΔͨΊʹੜ·Εͨ • ه࿥ܗࣜͷ XDF ͸ࣄ্࣮ͷۀքσϑΝΫτ — ೴೾ɾࢹઢɾಈըΛ1ͭͷϑΝΠϧʹಥͬࠐΊΔ ࢓૊Έ: outlet ͱ inlet ͱ XML • outlet ͕ετϦʔϜΛ publishɺinlet ͕ subscribeɻMQTT ʹࣅͯΔ͕ broker ͸ແ͘ P2P • stream ͷࣗݾهड़ʹ͸ XML Λ࢖͏ — ch ໊ɾ୯Ґɾdtype ·Ͱܕ৘ใͱͯ͠ຒΊࠐΈ • UDP ϚϧνΩϟετͰ stream Λൃݟ → ࣮σʔλ͸ TCP — Docker bridge Ͱ͸ൃݟͰ͖ͳ͍᠘ ࣌ࠁಉظͷ࢓૊Έ (͕͜͜ΩϞ) • ֤Ϛγϯͷ local_clock() ಉ࢜ͷࠩΛ NTP ෩ʹਪఆ → αϯϓϧʹΦϑηοτิਖ਼Λ౰ͯΔ • ૹ৴ଆͷΫϩοΫδολΛٵऩ͢ΔͨΊɺड৴ଆ͸ ʮαϯϓϦϯάϨʔτΛ৴ͯ͡࠶ߏ੒ʯ ΋Ͱ͖Δ (dejitter)
  22. $&&(ܭଌͷجૅŠ ͦ΋ͦ΋ԿΛଌ͍ͬͯΔ͔ • େ೴ൽ࣭ͷ ਲ਼ମࡉ๔ͷಉظͨ͠ిҐมಈ ͕಄֖ࠎΛ؏௨ͯ͠಄ൽʹ࿙Εͨ΋ͷɻৼ෯͸ ਺ʙ100μV — סి஑ͷ100ສ෼ͷ1 •

    ʮిѹʯͱ͍͏ΑΓʮ2ͭͷిۃͷࠩʯΛଌΔɻϦϑΝϨϯεిۃͷஔ͖ํͰݟ͑ํ͕มΘΔ प೾਺ଳͱʮؾ࣋ͪʯͷରԠ (ͬ͘͟Γ) • δ (1–4Hz): ਂ͍ਭ຾ / θ (4–8Hz): ͏ͱ͏ͱɾهԱ / α (8–13Hz): ໨Λดͯ͡ϦϥοΫε • β (13–30Hz): ूதɾࢥߟ / γ (30Hz–): ೝ஌౷߹ (ͱ͞ΕΔɺٞ࿦͋Γ) • ຊϓϩδΣΫτͰ࢖͏ͷ͸ α೾ (ch 6, 7) — ໨Λดͯ͡ग़Δ/։͚ͯফ͑ΔɺͰ൑ఆ͠΍͍͢ ܭଌͷϦΞϧ: ϊΠζͱͷઓ͍ • ॠ͖ = ਺ඦμV → ৴߸ΑΓҰܻσΧ͍ɻEOG ͱͯ͠ผ ch ͰଌΔͷ͕ఆੴ • ঎༻ిݯ 50/60Hz ͸ඞͣ৐Δ → notch filter Ͱ͢ͺͬͱൈ͘ • ʮ24bit ΔΣ ADCʯ͕ఆ൪ͳͷ͸ɺϨϯδ͕޿͍ (μVʙmV) ϊΠζࠐΈ৴߸Λ௿ϊΠζͰर͏ͨΊ
  23. %༻ޠ ຊฤͰࡶʹྲྀͨ͠༻ޠ • ΔΣ ADC: ΦʔόʔαϯϓϦϯά + ϊΠζγΣʔϐϯάͰߴ෼ղೳΛՔ͙ AD ม׵ثɻμV

    Λૉ௚ʹर͑Δ • Tailscale: WireGuard ϕʔεͷʮձࣾ༻ VPN Έ͍ͨͳ΋ͷΛ30ඵͰཱͯΔʯαʔϏεɻ؅ཧϓϨʔϯ (伴ަ׵) ͱ σʔλϓϨʔϯ (P2P ҉߸Խτϯωϧ) ͕෼཭ — Ϋϥ΢υܦ༝͸伴͚ͩ • Mosquitto: ܰྔ MQTT broker ͷఆ൪࣮૷ɻόΠφϦ1ݸͰಈ͘ • TimescaleDB: PostgreSQL ͷ֦ுɻ࣌ܥྻʹڧ͘͢ΔʮϋΠύʔςʔϒϧʯͱѹॖػೳΛ௥Ճ • Parquet: ྻࢦ޲ͷόΠφϦϑΝΠϧܗࣜɻѹॖ཰͕ߴ͘ɺޙஈͷ෼ੳ (Spark / Polars / DuckDB) ͱͷ૬ੑ˕ • Gemini Robotics-ER 1.6: Google ͷʮ਎ମੑϩϘοτ޲͚ਪ࿦ϞσϧʯγϦʔζͷҰͭɻϚϧνϞʔμϧೖྗ (ը૾+ςΩετ+ߏ଄Խ) ͰߦಈΛग़͢ • Roomba Open Interface: iRobot ͕ެ։͍ͯ͠ΔγϦΞϧ੍ޚϓϩτίϧɻDrive ίϚϯυͰ଎౓ɾટճ൒ܘΛ௚઀ࢦఆͰ͖Δ ͍ۙྖҬͷʮ΋͏ͻͱͭͷબ୒ࢶʯ • ROS 2 / DDS: ϩϘοτքͷඪ४ɻpub/sub + αʔϏε + ܕ෇͖ IDLɻࠓճ͸Ϟσϧ୳ࡧ͕༏ઌͰݟૹΓɺ഑৴ͷ༌ૹ͚ͩ MQTT+LSL Ͱߏ੒ • OSC / Open Sound Control: ϝσΟΞΞʔτքͷ LSL తଘࡏɻϥΠϒԋग़ͱ૬ੑ͕ྑ͍ • NATS / Redis Streams: ʮKafka΄Ͳॏ͘ͳ͍ϩάత pub/subʯީิɻӬଓΩϡʔΛ଍ͨ͘͠ͳͬͨΒ͜͜
  24. ᶆ஝ੵʛͭͷઃܭ Q1. མͱ͍͍ͯ͠σʔλ vs མͱͯ͠͸μϝͳσʔλ ΛͲ͏෼͚Δ? → ܦ࿏͝ͱʹ QoS /

    transport Λม͑Δ [ ݱঢ়ͷํ਑ ] ਪ࿦ܦ࿏ (LSL) ͸ best-effort Ͱݹ͍αϯϓϧམͱ͢OK / ੍ޚܦ࿏ (MQTT) ͸ retain Ͱʮ࠷ޙͷࢦྩʯΛઈର࢒͢ɻ Q2. ϓϩηε࠶ىಈͰσʔλ͕ফ͑ͳ͍͔? → broker ͱ DB ͷؒʹӬଓΩϡʔΛڬΉ [ Ұൠ࿦ɾຊϓϩδΣΫτ͸ݕূத ] broker ͸شൃɺDB ͸ॏ͍ → ؒʹϩʔΧϧΩϡʔ (ϑΝΠϧ or ܰྔ broker ͷӬଓԽ) ΛڬΉ͜ͱͰ࠶ىಈ଱ੑΛ֬อɻ Q3. ͋ͱ͔ΒʮηογϣϯʯΛͲ͏੾Γग़͔͢? → ϝλΠϕϯτΛผ topic ͰૹΔ [ ݱঢ়ͷํ਑ ] session_start / session_end Λผνϟωϧʹ͢Δ͜ͱͰɺੜ৴߸ΛԚͣ͞ʹޙஈͰ੾Γग़ͤΔɻ
  25. ީิͭ %&4*(/NEːͰݕ౼ͨ͠୅ସҊ ϑΝΠϧ 1BSRVFU )%' ࣌ࠁ໋໊Ͱॻ͖ஷΊɻ QBOEBT1PMBST௚݁ɻ SFUFOUJPOͱΫΤϦ͸ࣗ લɻ ࣌ܥྻઐ༻

    *OGMVY%# MJOFQSPUPDPM 'MVY *OGMVY2-ɻ*P5ϝτϦΫ ε޲͚ɻֶशίετ  ΤίγεςϜஅઈɻ 1PTUHSFT֦ு 5JNFTDBMF%# ඪ४42- IZQFSUBCMF ѹॖ SFUFOUJPOએ ݴతɻҟछςʔϒϧΛ +0*/ɻ ࠾ ༻ ྻࢦ޲0-"1 $MJDL)PVTF େن໛ूܭͱϩάʹڧ ͍ɻѹॖ཰rYɻຊ ݅ن໛Ͱ͸PWFSLJMMɺӡ ༻ॏ͍ɻ
  26. ૯߹ൺֱද ຊϓϩδΣΫτͷީิ पลͷओཁ࣌ܥྻɾ෼ੳ%# 5JNFTDBMF%# *OGMVY%# $MJDL)PVTF 1BSRVFU %VDL%# 2VFTU%# ํࣜ

    1PTUHSFT֦ு ઐ༻Τϯδϯ ྻࢦ޲0-"1 ϑΝΠϧ ૊ࠐ ઐ༻Τϯδϯ ΫΤϦݴޠ ඪ४42- 'MVY*OGMVY2- 42-ํݴ ඪ४42- 42-֦ு ѹॖ཰ DI rY rY rY Y rY +0*/ ˕ ˚ ˓ ˕ ˚ τϥϯβΫγϣϯ ˕"$*% ✕ ✕ ✕ ✕ ܧଓूܭ DPOUJOVPVTBHH UBTLT NBUFSJBMJ[FEWJFX ࣗલ 4".1-&#: ӡ༻ෛՙ ௿ த ߴ ۃ௿ த ಘҙ෼໺ ࠞ߹0-51 ࣌ܥྻ *P5ϝτϦΫε େن໛෼ੳɾMPH ΞυϗοΫ෼ੳ ߴස౓UJDL ˕ڧ͍u˓Մu˚੍ݶ͋Γu✕ඇରԠ
  27. ϫʔΫϩʔυผͷ޲͖ෆ޲͖ ϢʔεέʔεˠୈҰީิ &&(SBX ಛ௃ྔ FWFOUTΛ+0*/ ˠ 5JNFTDBMF%# ҟछςʔϒϧ 42- "$*%

    ୆Ͱ*P5ϝτϦΫεΛॻ͖ཷΊ ˠ *OGMVY%# 5JNFTDBMF ͲͪΒ΋Մɻ42-೿ͳΒ5JNFTDBMF ϩά5#ڃɾूܭΫΤϦத৺ ˠ $MJDL)PVTF ѹॖ཰ͱूܭεϧʔϓοτ͕ѹ౗త ݚڀσʔλΛQBOEBT1PMBSTͰ ˠ 1BSRVFU %VDL%# ϑΝΠϧͷ··࣋ͪӡ΂Δɺθϩӡ༻ ۚ༥UJDL਺ඦສSPXT ˠ 2VFTU%# $MJDL)PVTF 4*.%࠷దԽɺ*-1Ͱߴ଎JOHFTU αʔό؂ࢹϝτϦΫε ˠ 1SPNFUIFVT TDSBQF 1SPN2- BMFSUJOHҰࣜ
  28. ຊϓϩδΣΫτͰͷબఆ )[ʷDI˺(#೔ͷจ຺Ͱ )[ʷDI˺(#೔ੜ೾ܗ ࠾༻ 5JNFTDBMF%# ˔ 1PTUHSFTͷ42-͕ͦͷ··࢖͑Δ QBOEBTBTZODQH(SBGBOB%#FBWFSશ෦ඪ४ ˔ IZQFSUBCMF

    ѹॖ SFUFOUJPO͕એݴత DPNQSFTT@TFHNFOUCZDIͰDIΛrYѹॖ ˔ ҟछςʔϒϧΛ%#ʹू໿ SBX 8FMDIಛ௃ྔ FWFOUTΛ+0*/Ͱ෼ੳ ෴͢৚݅ ˔ ਺೔࿈ଓͰ(#೔͕ਏ͍ SBX1BSRVFU GFBUVSFT5JNFTDBMF%#ͷೋஈߏ੒ ˔ ෼ੳ͕୯७ͳूܭͷΈʹͳΔ $MJDL)PVTFʹҠߦ ूܭεϧʔϓοτॏࢹ  ˔ ֶ֎ެ։ɾෳ਺ඃݧऀͷ௕ظอ؅ 1PTUHSFT4$3". SFUFOUJPOڧԽ ؂ࠪϩά 4PVSDF%&4*(/NEː 5JNFTDBMF%#Λ࠾༻ͨ͠ཧ༝
  29. ީิͭͷൺֱ %&4*(/NEːͰݕ౼ͨ͠୅ସϓϩτίϧ -4-ͷΈ .255ͷΈ ;FSP.2 ,BGLB3FEJT -4- .255 ੜ&&(ൖૹ ˕

    ˚DIVOLඞཁ ˕ ˕ ˕ UJNFTZOD ˕OTਫ਼౓ ✕ࣗલ ✕ࣗલ ✕ࣗલ ˕-4-૊ࠐ EJTDPWFSZ ˕NVMUJDBTU ˕CSPLFS ˚ࣗલ ˕ ˕ ӬଓԽSFUBJO ✕ ˕SFUBJO ✕ ˕MPH ˕.255ଆ ೝূ5-4 ✕ ˓ ✕ࣗલ ˕ ˓.255ଆ #$*πʔϧޓ׵ ˕QZMTM./& ✕ ✕ ✕ ˕ CSPLFSཁ൱ ෆཁ ඞཁ.PTRVJUUP ෆཁ ඞཁॏΊ ඞཁܰྔ ӡ༻ෛՙ ௿ ௿ த ߴ ௿ ൑ఆ 6*ঢ়ଶʹෆศ UJNFTZOD࠶ൃ໌ ӡ༻ׂ͕ʹ߹Θͣ ϊʔυͰPWFSLJMM ࠾༻ ˕ڧ͍u˓Մu˚੍ݶ͋Γu✕ඇରԠ
  30. ϓϩτίϧ໾ׂ෼୲ ೾ܗ͸-4-ɺঢ়ଶͱ੍ޚ͸.255ɺطଘࢿ࢈͸)551 -4- .255 )551 ԿΛӡͿ ੜ&&(೾ܗ DIʷ)[ ঢ়ଶ ੍ޚ

    Πϕϯτ ಛ௃ྔ 3PPNCBۦಈίϚϯυ ۩ମྫ UPQJDFOEQPJOU QJFFH@DI PVUMFUˠJOMFU QJFFHIFBMUI DPOUSPMTUBUF  DPOUSPMUISFTIPME FFHDIVOL  FFHBMQIB SPPNCBDNEʜ 'BTU"1*NPWFIBMU SPPNCBTUBUFˠ3PPNCB SFUBJO Š TUBUFZFTFWFOUOP Š ڧΈ OTUJNFTZOD૊ࠐ #$*ࣄ࣮ඪ४ NVMUJDBTUࣗಈEJTDPWFSZ SFUBJOMBTUXJMM2P4 8FC4PDLFUCSJEHF .PTRVJUUP͸1JͰ΋ܰྔ طଘ3PPNCB'BTU"1*Λ ͦͷ··׆͔ͤΔ 3&45ඪ४ ऑΈ -"/಺ͷΈೝূͳ͠ ӬଓԽͳ͠8FC6*ʹෆ޲͖ )[ͷੜσʔλൖૹ͸ ඇޮ཰ DIVOLԽඞཁ TUSFBNJOHඇରԠ ϦΫΤετඵ͕૿͑Δͱෆ ར
  31. ෴͢৚݅ લఏ͕มΘͬͨΒɺͲͷϓϩτίϧʹҠߦ͢Δ͔ τϦΨ Ҡߦઌ ͳͥ 8"/ӽ͕͑ඞཁ .255 5-4 ೝূ 8FC35$

    %BUB$IBOOFM -4-͸-"/ NVMUJDBTUલఏͷͨΊ8"/ ӽ͑ෆՄ ϚϧνϓϩσϡʔαͰ ৴པ഑৴͕ඞཁ ,BGLB௥Ճݕ౼ QBSUJUJPO PGGTFUͰॱংอূGBOPVU֦ େʹڧ͍ ܭଌϊʔυ͕୆௒ 151UJNFTZODαʔϏε΁Ҡߦ -4-಺ଂTZODͷਫ਼౓ݶքΛ௒͑Δن໛ Ϋϥ΢υԆ৳ .255CSJEHFˠ"84*P5"[VSF*P5 )VC .255CSJEHFຊ଍͚ͩ͢ͰԆ৳Մೳ -4-͸-"/ࢭ·Γ ֶ֎ެ։ ෳ਺ඃݧऀͷ௕ظอ؅ .PTRVJUUPQBTTXPSE 5-41PTUHSFT 4$3".0*%$ ݱঢ়͸-"/಺BOPOZNPVTલఏͷͨΊೝ ূ૚͕ඞཁ
  32. -JWFλϒ σϞ༻ͷΧϥϜ၆ᛌϏϡʔɻੜମ৴߸ ࠨ ೝ஌ࢦඪ தԝ 3PPNCB࿈ಈ ӈ ɻ  

            ຌྫ  εςʔλε84 1J&&(%FDJTJPO3PPNCBͷPOMJOFঢ়ଶͱ8FC4PDLFU઀ ଓ  %FDJTJPOώʔϩʔ Ћ൑ఆͷݱࡏঢ়ଶ *%-&"$5*7& Λ࠷΋໨ཱͨͤΔଳ  &&(MJWF DI  DIͷੜ೾ܗuඵ૭u൑ఆର৅DIΛϋΠϥΠτ  ЋCBOEQPXFS DI෼ͷЋύϫʔΛॎόʔu൑ఆର৅DIΛڧௐ  )FBSUSBUF &&(৴߸͔Βਪఆͨ͠৺ഥ਺ #$(༝དྷ uCQN  .JOETUBUF ूத ЌЋ WTϦϥοΫε Ћ ͷඵਪҠάϥϑ  .JOETQBDFu% GPDVTʷSFMBYʷUJNFͷ%ي੻ ESBHճసՄ  $BNFSB 3PPNCBલํͷ64#Χϝϥu4UBSU4UPQ੍ޚ  5SBKFDUPSZ 3PPNCBͷಈ࡞ཤྺΛ఺Ͱඳըu௚ۙ࣌ؒ  5ISFTIPMET Ћ侒FOUFSͰBDUJWFuЋ侑FYJUͰJEMFuEXFMMNTͰ֬ఆ
  33. 1J&&(λϒ ೴೾ղੳNBTPOSZμογϡϘʔυɻ"*ཁ໿uτϙάϥϑΟuଳҬύϫʔuεϖΫτϧu૬ؔɻ        

        ຌྫ  "**OTJHIU (FNJOJʹߦͰ೴೾ཁ఺Λཁ໿ͤ͞Δղੳόʔ  5PQPHSBQIZ   ಄෦Ϛοϓ ిۃςʔϒϧuଳҬΧϥʔ  $PHOJUJWFNFUSJDT &OHBHFNFOUuЋЌuલ಄Ћඇରশ '' ΄͔  #BOEQPXFSuT બ୒DIͷЎВЋЌЍύϫʔ࣌ܥྻ MPHMJO੾ସ  $IBOOFMʷ#BOEIFBUNBQ DIʷଳҬu֤ଳҬ಺Ͱਖ਼نԽ  &&(MJWF DI  ඵ૭ͷ೾ܗάϦουuIPWFSͰશύωϧ࿈ಈ  %#SBJOuCBOE બ୒ଳҬύϫʔΛ೴ٿ໘ʹ౤Ө 5ISFFKT  5JNFʷ$IBOOFMuCBOE બ୒ଳҬͷඵཤྺΛDIॱॎ࣠Ͱදࣔ  #BOETuDI બ୒DIͷЎВЋЌЍύϫʔόʔ  $IBOOFMDPSSFMBUJPOuT DIؒϐΞιϯ૬ؔߦྻ ʶͰ׬શಉظ  1FSDIBOOFMCBOET DI͝ͱʹЎВЋЌЍΛࠨ͔Βฒ΂DI୯ҐͰਖ਼نԽ  14%uDI 8FMDI๏uඵuMPHZͷύϫʔεϖΫτϧ
  34. 3PPNCBλϒ 3PPNCBͷखಈૢ࡞ɾࣗಈӡసɾΧϝϥɾཤྺɻЋ൑ఆͷखಈςετ΋͔͜͜Βɻ        ຌྫ

     &NFSHFODZ4UPQ 3PPNCBΛଈఀࢭu6*શମͷ࠷্Ґίϯτϩʔϧ  $BNFSB 3PPNCBલํΧϝϥu1J"ଆ64#ΧϝϥΛऔಘ  5SBKFDUPSZ 3PPNCBͷ௨ͬͨي੻ΛϚοϓʹ఺ඳ  $POUSPM +PZTUJDL  खಈૢ࡞ͷԾ૝δϣΠεςΟοΫu໼ҹεϖʔεΩʔରԠ  "5SJHHFS Ћঢ়ଶʹجͮ͘खಈUFTUGJSFuϞʔυΰʔϧϞσϧࢦఆ  "VUPQJMPU (FNJOJʹΰʔϧ ྫIVNBOMFH Λࢦࣔࣗ͠ಈ୳ࡧuࢥߟϩά දࣔ  3FDFOUDPNNBOET ௚ۙૹ৴ͨ͠ίϚϯυ GPSXBSEMFGUSJHIUTUPQʜ ͷνοϓྻ