ロボティクスクラウド WebRTC ソフトウェアエンジニアな私が MoQROS を作った話
気づけば WebRTC と付き合い始めて6〜7年ほどになりました。 もともとロボットのソフトウェアエンジニアだったはずが、いつの間にかメディアストリーミングの世界にもどっぷり浸かっています。
この記事では、そんな私のここ数年の変化を振り返りつつ、 最近ほぼ Vibe Coding で作ったライブラリ、MoQROS を紹介します。
WebRTC との付き合い
WebRTC を仕事でよく扱うようになったのは、2019年ごろからです。
最初は WebRTC を使ったプロダクトを含むクラウドサービスのプリセールスという立場で、 お客様のユースケースを聞いて構成を提案したり、デモを作ったり、技術的な質問に答えたりしていました。 プリセールスとはいえ、実際に動かしてみないと分からないことも多く、 NAT 越えやコーデック、ネットワークが不安定なときの挙動など、手を動かしながら色々と学びました。
そして2023年頃からは、WebRTC を使ったプロダクトの開発をしています。 提案する側から作る側に回ったことで、製品としての安定性向上のため、ライブラリ仕様や実装上の制約に向き合う機会が一気に増えました。
狙っていなかった専門領域
個人的には、今でもロボットソフトウェアエンジニアのつもりでいます。 ただ、振り返ってみると専門領域としては Robotics x Cloud (AWS) x メディアストリーミング (WebRTC) という、 かなり特殊なエンジニアになったなと思います。
これは別に狙ってそうなったわけではなく、結果としてそうなったというのが正直なところです。 ロボットの遠隔監視や遠隔操作には映像が欠かせませんし、そのロボットを多数管理しようとするとクラウドが必要になります。 目の前の課題に取り組んでいるうちに、自然とこの3つが重なる場所に立っていた、という感じですね。
2021年の振り返りでも「そろそろ肩書を変えたほうが良いかもしれない」なんて書いていましたが、 あれから数年経って、その傾向はますます強くなっています。ひとまず肩書は今も Robotics Software Engineer です。
技術イベントに参加して
仕事を続けるうちに、WebRTC だけでなくメディアストリーミング一般に関する知識が必要な場面が増えてきました。 例えば、低遅延配信のプロトコルの比較や、ライブラリの選定、チューニングなどなど。
そこで、WebRTC Meetup や Tokyo Video Tech、 RTC.on といった実装寄りの技術イベントに参加するようになりました。 こういったイベントでは、普段の仕事では触れない領域の話を聞けたり、 同じような課題に取り組んでいるエンジニアと話せたりするのが良いところです。
特に RTC.on のようなグローバルなカンファレンスに参加すると、WebRTC だけでなく、 Media over QUIC (MoQ) のような新しい技術の標準化に関わっている方と話す機会があったりします。
仕様が議論され、それに合わせて新しいライブラリやツールが次々と登場し、少しずつエコシステムが育っていく。 そのプロセスをリアルタイムで見られるのは、とても楽しいですね。
AI 時代のエンジニア
一方で、最近の生成 AI のトレンドに乗って、仕事の進め方も大きく変わってきました。 今では、コードを自分で書くよりも、AI に書かせたコードをレビューすることがメインになっています。
自分で一から書くよりも圧倒的に速く進められる反面、 コードの細部よりも設計や仕様、正しさの検証に時間を使うようになり、 ソフトウェアエンジニアの役割そのものが変わりつつあるのを感じます。
ただ、悪いことばかりではありません。 副産物として、趣味の個人開発のハードルがぐっと下がりました。 以前は、平日の夜や週末の限られた時間で新しい技術を試そうとしても、なかなか億劫で手が出なかったのですが、 今では時間がなくても、とりあえず動く何かを作るのが簡単になりました。
MoQROS
ということで、ほぼ Vibe Coding で開発したライブラリ MoQROS を紹介します。

MoQROS は、ROS 2 の画像トピックを MoQ でストリーミングできる Rust 製のライブラリです。 まさに Robotics x メディアストリーミングという、自分の専門領域のど真ん中ですね。 GitHub で公開しているほか、crates.io でも公開しています。
何ができるの?
MoQROS は、ROS 2 の sensor_msgs/Image を受け取って VP8 または H.264 でエンコードし、MoQ のリレーサーバーに配信します。
配信フォーマットには hang を使っているので、
公式の @moq/watch Web コンポーネントを使えば、ブラウザでそのまま再生できます。
また逆方向にも対応していて、MoQ のブロードキャストを受信してデコードし、ROS 2 のトピックとして再配信することもできます。
ROS 2 topic ──► moqros-pub ──► moq-relay ──► browser (<moq-watch>)
sensor_msgs/Image hang QUIC/WebTransport └──► moqros-sub ──► ROS 2 topic
コアの部分 (画像変換やエンコード、MoQ の Publish/Subscribe) は ROS に依存しない作りになっているので、 ROS を使わない Rust のプログラムからも利用できます。
簡単に試すことができるので、詳しくは README を参照してください。
さいごに
WebRTC との出会いから始まり、狙ったわけでもなく Robotics x Cloud x メディアストリーミングという特殊な専門領域にたどり着きました。 そして、生成 AI のおかげで、その専門領域のど真ん中にある「あったらいいな」を、限られた時間でも形にできるようになりました。
MoQ はまだまだ発展途上の技術で、仕様もライブラリもどんどん変わっていきます。 MoQROS もそれに合わせて育てていきたいと思っているので、 ロボットの映像を MoQ で配信してみたい方は、ぜひ試してみてください。Issue や PR も大歓迎です!
という記事を AI に書いてもらいました。ありがとう AI。