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 つの柱
- スキーマ駆動: ブロック型 (
MotorDriver等) と Topic / Service / Parameter を YAML 1 箇所に書く - コード生成: YAML → スレーブ C99 実装 + Protobuf blob + SHA-256
- 動的ブリッジ: マスターは 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_msgs | NodeInfo.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 API | fcan_ prefix |
| スキーマの階層 | YAML では / 区切り。C 側は __、ROS 側は topic/service は /、param は . に展開 |
関連
- fibril_can 使い方 (スキーマ + vcan quickstart)
- fibril_can ワイヤプロトコル — CAN ID 空間、設定/データプレーン、boot_id、ID 衝突検出
- fibril_can CAN ルータ — uplink 1 + downlink N の同梱ルータ
- fibril_can Web マスター — TypeScript の並列 master (gs_usb 経由)
- fibril_can 開発者向け内部構造 — レイヤ責務と検証分担 (
developer-guide/の入口)
最終更新: