notes
ToolsFibril can

fibril_can の概要 (PC + マイコン間 CAN FD フレームワーク)

スキーマ YAML から両側 (PC ROS 2 / MCU C99) の通信コードを機械的に得るフレームワーク。マスターはスキーマ依存のビルド成果物を持たず、スレーブから受け取った blob で ROS Topic/Service/Param を実行時構築する

要点: PC (master) <-- CAN FD --> MCU (slave) の通信を、スキーマ YAML 1 箇所に書けば両側の実装が機械的に得られる。マスター側にスキーマ依存の生成物を持たず、スレーブが自分のスキーマ blob を送ってきて ROS 2 の Topic / Service / Parameter が動的に生える。

3 つの柱#

  1. スキーマ駆動: ブロック型 (MotorDriver 等) と Topic / Service / Parameter を YAML 1 箇所に書く
  2. コード生成: YAML → スレーブ C99 実装 + Protobuf blob + SHA-256
  3. 動的ブリッジ: マスターは blob 受信で ROS entity を実行時組立、スキーマ変更でブリッジを再ビルド不要

パッケージの責務#

パッケージ役割
fibril_can_core (C++)ワイヤ + IR 知識の単一の正本。ハッシュ、採番、packing、ROS 型変換表
fibril_can_codegen (C++)fcan_codegen CLI と fcan_generate_schema CMake 関数。YAML → 生成物
fibril_can_runtime (C99)スレーブ側 MCU ランタイム。ROS 非依存、C++ 非依存、malloc 非依存
fibril_can_master_runtime (C99)組み込みマスター (MCU 上で master 側) 向け
fibril_can_bridge (rclcpp)SocketCAN 経由で ROS 2 と橋渡し。スキーマ依存コードを持たない
fibril_can_web (TypeScript)ブラウザ or Node から gs_usb 経由で駆動する web master (別経路)
fibril_can_msgsNodeInfo.msg と ReprovisionNode.srv の 2 個だけ

依存方向は厳格に一方向。_runtime 系は ament 化されていない (MCU 側の FetchContent / submodule で取り込む)。

触ってはいけない不変条件#

  • ワイヤ + IR は core に集約: bridge や TS 側で「実は N バイト」と書かない
  • codegen と bridge は同じ採番関数を呼ぶ: compute_numbering を再実装しない
  • runtime は ROS / C++ / 動的確保を持ち込まない: fcan_init 後は malloc なし (性能ではなく決定性のため)
  • bridge はスキーマ依存コードを生成しない: ros_babel_fish で動的解決、find_package(some_schema_pkg) を要求させない
  • スレーブはステートレス寄り: 通信設定は RAM のみ、不揮発に書かない。正はマスターが持つ
  • 静的検査は core / codegen で完結: ROS 環境なくても FW CI が回る
  • little-endian 固定、タイムスタンプなし: 時刻同期はアプリ層
  • ウォッチドッグ・セーフティはアプリ層: 指令途絶時のサーボオフは FW が判断

プレーン分離#

プレーン用途フレーム
設定プレーン接続確立、管理 (DISCOVER / ANNOUNCE / SCHEMA_READ / FRAME_DEFINE / START / HEARTBEAT)Extended ID ch 0、ACK/NAK 型
データプレーン運用時通信、レイアウトは事前交渉済Topic = Standard ID (11bit)、Service = Extended ID ch 1/2

CAN 調停で Standard ID が Extended ID に優先するので、高頻度な制御 feedback (Topic) が自然に優先される。

ノード状態#

スレーブは 4 状態: DISCOVER → ANNOUNCE 受理 → PROVISIONED → RUNNING。マスターは ANNOUNCE 受信時にスキーマハッシュを既知の blob と照合し、未知なら SCHEMA_READ で全転送を要求。

命名規則 (シンボル干渉防止)#

領域名前空間
fibril_can_core C++namespace fibril_can
fibril_can_codegen C++namespace fibril_can_codegen
fibril_can_bridge C++namespace fibril_can_bridge
生成 C++ ラッパnamespace fcan_gen
ランタイム C APIfcan_ prefix
スキーマの階層YAML では / 区切り。C 側は __、ROS 側は topic/service は /、param は . に展開

関連#

最終更新:

On this page