Post

iPhoneを最高のROS 2センサーノードにするConduit 2.0リリース

iPhoneを最高のROS 2センサーノードにするConduit 2.0リリース

ROS 2を扱っている人なら、おそらくこんな経験があるはずです。点群データが必要となったとき、高級な3D LiDARでポイントクラウドを取るか、ステレオカメラで深度画像を撮影するかしか選択肢はありません。ポケットからiPhoneを取り出して使う人は、まずいません。

でもiPhoneには9軸IMU、磁気、気圧、照度、GPS、温度、近接センサーが備わっています。プロモデルならToF式のLiDARまで入ります。広角・超広角・望遠の3眼カメラ、マイク、MFiコントローラ接続。バッテリーで何時間も動き、ディスプレイで計測値を即座に出せます。高性能かつ低消費電力のAシリーズ / MシリーズのApple Siliconが動作し、Neura lEngineとGPUも内蔵しています。

これだけのセンサーパックを、多くの人はポケットに入れて持ち歩いています。なのに、ROS 2ネットワークへ繋ぐ道は長年ない状態が続いてきました。

理由は当たり前ですが、ROS 2エコシステムがAppleデバイスに対応していなかったからです。rosbridge_suiteのWebSocket経由はリアルタイム性を失い、JSONへのシリアライズ/デシリアライズで帯域とCPUを溶かしてしまいます。 zenoh-pico やCycloneDDSをApple SDKでクロスコンパイルすればネイティブ経路は作れますが、 xcodebuild のSDK切り替えとCMakeのホスト判定がぶつかり、半日以上が試行錯誤に消えていきます。 rcl/rclcpp ごとビルドする道は、依存ツリーを見れば現実的でないことがすぐに分かります。

結果として、ROS 2開発者の大半は「iPhoneはセンサーデバイスとしては存在しないもの」として扱うようになりました。一番センサーが豊富で入手性も高いはずのデバイスをです。

Conduitはこの状況を変えたかったのです。iPhone / iPad / Mac / Apple Vision ProをファーストクラスのROS 2ノードにするApp Storeアプリです。ブリッジは要りません。Linux側の特別な設定も要りません。アプリを開いてZenohルーターのIPを入れて配信ボタンを押すだけです。DDSならルーターさえ必要ありません。

Conduitができること

12種類のセンサー、4種類のApple OS、2つのトランスポート

ConduitはiPhone / iPadのセンサーをROS 2標準メッセージとして配信します。

センサーROS 2 メッセージ型最大レート
IMU (加速度+ジャイロ)sensor_msgs/Imu100 Hz
磁気sensor_msgs/MagneticField100 Hz
気圧sensor_msgs/FluidPressure10 Hz
照度sensor_msgs/Illuminance10 Hz
GPSsensor_msgs/NavSatFix1 Hz
カメラ(複数同時)sensor_msgs/CompressedImage30 Hz
LiDARsensor_msgs/PointCloud230 Hz
マイクaudio_common_msgs/AudioDatastreaming
バッテリーsensor_msgs/BatteryState1 Hz
ゲームコントローラ(MFi)sensor_msgs/Joy50 Hz
近接sensor_msgs/Range10 Hz
温度sensor_msgs/Temperature1 Hz

動作するAppleプラットフォームは iOS 16+ / iPadOS 16+ / macOS 13+(Mac Catalyst) / visionOS 1+ で、ROS 2 ディストロは Humble / Jazzy / Kilted / Rolling の現役4つすべてに対応しています(Lyricalは未検証ですが動くはず)。トランスポートは Zenoh(rmw_zenoh_cpp)と DDS(rmw_cyclonedds_cpp)から選べます。Zenoh ↔ DDSの切り替えは設定画面のトグルで済みます。

オンボーディングはトランスポート切り替え、通信のセットアップ、配信開始の3ステップだけで完結します。 Zenohを選ぶならルーターのIPとポートを入れてドメインIDを合わせます。DDSならDiscovery ModeをHybridにしてUnicast PeersにホストIPを足します。あとは配信ボタンを押せば、選んだセンサーがすべて流れ始めます。設定画面からはいつでもトランスポート、ルーター、ドメインIDを切り替えられます。

LiDARとマルチカメラ

iPhone ProのLiDARスキャナは sensor_msgs/PointCloud2 として30 Hzで配信されます。点群はそのまま流すと1フレームで数MBになるので、オプションで Google Draco圧縮をかけて帯域を抑えられます(CompressedPointCloud2 という独自メッセージ型を別途用意しています)。広角・超広角・望遠の3眼カメラは、それぞれを別トピックとして同時に配信できます。

MCAP録画とエクスポート

ライブ配信だけでなく、端末上でMCAP形式のバッグファイルとして録画できます。録画は別パイプラインではなく、ライブ配信と同じXCDR v1バイト列を .mcap にミラーする実装にしてあるので、ros2 bag play でもFoxgloveでも mcap CLIでも、生のグラフで観測したのと完全に一致するデータが再生されます。スキーマはバッグのヘッダーに自動で埋め込まれるので、後から .msg を別途共有する必要もありません。

録画した .mcap はiOSの共有シートからFiles、AirDrop、メール、Slackへエクスポートできます。

swift-ros2 1.1.1

Conduitのリリースを重ねるうちに気づいたのは、ROS 2のワイヤープロトコルを話す部分は、Conduitに閉じ込めておくべきではないということでした。iOSで別のセンサー配信ノードを作りたい人もいるはずですし、Macで rvizの代替を作りたい人や、LinuxサイドでSwiftからROS 2を喋れたら嬉しい人もいるはずです。

そこで、Conduit内のZenoh / CycloneDDS FFIとXCDR v1コーデックを、別パッケージとして切り出しました。それが swift-ros2 です。

現在のリリースは1.1.1で、Conduitで用いるPub/Sub以外の主な機能はこの4つです。

  1. Services — ROS 2のrequest / responseパターン。Zenoh / DDS の両方で動きます。
  2. Actions — long-running goal + feedback。Fibonacciサンプル付き。
  3. Parameters — 各ノードでの declare / get / set、/parameter_events へのコールバック、ROS2ParameterClient での外部からのパラメータ操作まで対応しました。
  4. swift-ros2-gen.msg / .srv / .action ファイルからSwift型を自動生成する SwiftPM build plugin。hashオラクル付きで、type hashの整合性をCIで検証しています。

これでセンサー配信だけでなく、Swiftで書けるフル機能のROS 2クライアントになりました。ビルトインメッセージ型は 23種類(sensor_msgs / geometry_msgs / std_msgs / audio_common_msgs / tf2_msgs の主要なもの)、対応OS はApple (iOS / iPadOS / macOS / Mac Catalyst / visionOS) + Linux (Ubuntu 22.04 / 24.04、x86_64 + aarch64)+ Windows (x86_64)+ Android (arm64-v8a + x86_64) です。

Statcounterのシェア (2026年3月) で見ると、これは識別可能な消費者デバイスOSの約90.7% (モバイル99.7%、デスクトップ78.7%) に相当します。一般家庭やオフィスにあるほぼすべてのOSから、SwiftPM 一発で参照できるROS 2クライアントだと言えます。

現在地

ここまで紹介してきたConduitは現在2.2.1です。本記事はこのリリースを記念して書いています。swift-ros2は1.1.1で、それぞれApp StoreとGitHubからダウンロードできます。

数字で見るとこんな感じです。

  • 累計10,000+名のROS 2開発者 が利用 (2026年5月時点)
  • App Store「Developer Tools」カテゴリで、日本で最高 #4 にランクイン (2026年1月以降)
  • swift-ros2はApple / Linux / Windows / AndroidのCIを毎PRで回しており、Conduit自身が製品ユーザ

DDS対応は非常に難航しました。実はZenoh対応の前に始めていたのですが、iOSとマルチキャストの相性が非常に悪く、一旦諦めてZenohに切り替えて初回リリースを乗り切りました。その後も数ヶ月デバッグしてようやく対応することができました。諦めそうになりましたが、Conduitの潜在的ユーザーがZenohユーザーの4倍いることがわかり、頑張り直すことができました。

そしてROSCon 2026にもプロポーザルを投稿しました。結果はわかりませんが、出すべきだと思うストーリーは、一本に通った良いタイミングだった気がしています。

コミュニティの使い方

数字以外にも、X上ではConduitの使い方を見せてくれる方が少しずつ増えてきました。なかでも、僕の予想を超えた方向に使ってくださっている例を4つ紹介させてください。

実機ヒューマノイドのラジオ体操第一

iPhoneを振ると、中間プロトコルMeridianを介して、Mujocoシミュレータの中のヒューマノイドと、卓上の実機ヒューマノイドの両方が同期して腕を振り体をひねります。アプリリリースの翌日に届いたこの動画は、僕がこのアプリで一番やりたかった「iPhoneを片手にロボットを動かす」を、誰よりも早く形にしてくれていました。

iPhone LiDARでGLIM SLAM

iPhone ProのLiDARストリームを、オープンソースのLiDAR-Inertial SLAM であるGLIMに流す試みです。「iPhone Pro は移動ロボットの SLAM センサーにぴったり」という設計意図をそのまま実機で検証してくれている形で、僕にとってもとても嬉しい使い方でした。

TouchDesignerでIMUを購読

ROSを一切使わずに、Zenohの生CDRバイトをTouchDesigner側で自前デシリアライズして購読する実験です。Conduitのワイヤープロトコルはswift-ros2がROS 2標準そのものを話しているだけなので、ROSの世界の外からも理屈上は読めるはずですが、そこに踏み込んでくれる人を実際に見たのはこれが初めてでした。

iPad Airを有線接続で組み込む

iPad AirにUSB-Ethernet変換器を挿し、有線LANでROS 2トピックを流すデモです。充電しながら通信できることを実機で確認してくれたので、移動ロボットへの組み込みのハードルが一段下がりました。

これから

Conduitとswift-ros2は ROS 2 / iOS開発者からのフィードバックを常に歓迎しています!

「自分のロボットでこんな風に使った」というユースケースは、特に大歓迎です。X(@youtalk)、LinkedIn、GitHub、どこでも気軽にお声がけください。

This post is licensed under CC BY 4.0 by the author.