はじめに
こんにちは。普段の業務では Ruby を書いている 田村 です。今回は、久しぶりに電子工作・ IoT ネタです。
昨年、リモートワーク下でもコミュニケーションを円滑にとれるようにすることを目的に、趣味の電子工作を活かして多機能カメラ「 neibo 」を製作しました。
詳しくはこちらの記事で紹介しています。
neibo を作ってみて、課題がいくつか見つかりました。それらの課題を解決すべく、 neibo 改良機を作ることにしました。
これから複数回にわたって neibo 改良機の製作記録について書いていきたいと思います。今回の記事では、 neibo 製作の経緯、改良機の設計と製造の一部について説明します。
neibo は、以前は neighbo という名前でしたが、書きづらかったので変更しました。 neibo のほうが親しみやすさもありますし。
neibo 改良機製作の経緯
neibo 初号機を製作して見えてきた課題は下記です。
- 市販品に比べてコストが高い
- 映像配信を行う際に CPU 負荷が高い
- ソフトウェアの安定性・拡張性が低い
- 手軽に利用できない
- 大きい
- 外観が美しくない
課題がたくさん見つかりました。
これらの課題を解決するために、新しい neibo を製作することに決めました。
製作の方針
まず、 neibo 改良機を製作する方針として、先行して neibo 研究開発機を作り、そこで得た知見をもとに neibo 量産機を作ろうと考えています。これまで、 neibo 初号機は 1 台しかありませんでしたが、 neibo 改良機では複数台が協調して動作する仕組みを考えています。詳しい構想・構成は、今後の記事に書いていきたいと思います。
今回からしばらくの記事では、 neibo 研究開発機を作っていく過程を紹介していきたいと思います。 neibo 研究開発機では、新しいハードウェアを試し、検討するため、一旦課題にあげていた「市販品に比べてコストが高い」は考えないこととします。
neibo 初号機では、 Raspberry Pi 4 Model B と Arduino Uno を用いていましたが、 neibo 改良機では Jetson Nano B01 を使ってみることにしました。 Jetson Nano を選択した理由は Raspberry Pi に比べて、高性能な GPU を搭載しているためです。
後述する「映像プロトコルの調査」に関連しますが、 neibo 初号機は Raspberry Pi で構築していましたが、もっとも処理能力を必要とするのは映像配信部分でした。 Jetson Nano が Raspberry Pi と比べて、映像処理にどれくらい差があるのか、試していきたいと思います。
Jetson Nano | Raspberry Pi 4 Model B | |
---|---|---|
CPU | Quad-core ARM Cortex-A57 MPCore processor | Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz |
GPU | NVIDIA Maxwell architecture with 128 NVIDIA CUDA® cores | VideoCore IV |
Memory | 2 GB / 4 GB | 1 GB / 2 GB / 4 GB / 8 GB |
Video Encode | H.265 / H.264 | H.265 / H.264 |
Video Decode | H.265 / H.264 | H.265 / H.264 |
映像プロトコルの調査
neibo 初号機では、映像に関連する課題は大きく2つあります。
1つ目は、 CPU 負荷です。 Jetson Nano 、 Raspberry Pi は、どちらもハードウェアエンコード/デコードに対応しています。 neibo 初号機では、ブラウザから Google Meet を使用して映像の配信を行っていました。この方法ではハードウェアエンコード/デコードを利用できず、 CPU が非常に高負荷になってしまうのが課題でした。また、 neibo 初号機は、カメラからの映像の受像、 Google Meet での配信、モーターの制御のほとんどを Raspberry Pi の CPU で処理していたため、処理が追いつかずに画質が低下してしまうことも課題でした。
2つ目は、遅延です。 Google Meet は映像を配信するまでに1秒弱の遅延が発生します。 neibo は遠隔地にいる人がカメラを操作して状況を確認できるようにする機能を提供したいと考えているため、遅延は小さくしたいところです。
今回、映像プロトコルを決定するために下記を目標として調査を行っていきたいと思います。
- CPU への負荷が低いこと
- 低遅延であること(0.1秒以内目標)
CPU への負荷を減らすために、 neibo 改良機では映像処理を極力行わないようにします。カメラで受像した映像は、ハードウェアエンコード後に高性能な別のマシンに転送し、その別のマシンから Google Meet などで配信を行うことを考えています。
neibo 改良機から高性能な別のマシンへ転送するのに最適な映像配信プロトコルについて調査をしていきます。まずは、下記の技術要素を比較検討することにしました。
- RTSP
- NDI
- WebRTC
RTSP
RTSP(Real Time Streaming Protocol) は、映像や音声などのリアルタイムデータを制御しオンデマンド配信を可能にするためのプロトコルです。 RTSP は再生、停止、録画など制御を扱うのみであり、映像や音声データの配信には一般的に RTP(Real-time Transport Protocol) を使用します。
細かな検証手順は今回は割愛しますが、試しに GStreamer で Mac の Web カメラの映像を RTSP で配信してみたところ、約 2.5 秒の遅延が発生する結果となりました。
NDI
NDI(Network Device Interface) は、 NewTek 社によって開発、提供されている IP を利用した映像プロトコルです。こちらも対応している Web カメラが一部存在しています。 LAN で高品質に低遅延に映像を伝送することを目的としており、 1080p 60fps で 180Mbps と非常に多くの帯域を使用します。
NDI の SDK をダウンロードし、 Jetson Nano から配信を試してみました。正確に遅延を計測したわけではありませんが、体感上は遅延をほとんど感じることはなく、 0.1 秒以内の目標を達成できそうです。しかし、 NDI はソフトウェアでエンコード/デコードを行うためか CPU 使用率は高くなり、使用率が 100% に達すると、途端に映像の遅延が発生するようになりました。
WebRTC
WebRTC(Web Real-Time Communication) はウェブアプリケーションやウェブサイトにて、仲介を必要とせずにブラウザー間で直接、データやオーディオ/ビデオストリームの送受信を可能にする技術です。
調べると、 Raspberry Pi や Jetson Nano のハードウェアエンコード/デコードを使用して、 WebRTC で低遅延で配信を実現している例があるので、期待できそうです。しかし、 WebRTC は一般的な利用は簡単ですが、応用的な使い方をしようとすると、仕様が複雑なため、途端に難易度が上がります。
今回の neibo 製作でも WebRTC の調査はまだあまり進められていません。今後の製作記録で紹介していきたいと思います。
スリップリングの製作の試行錯誤
映像プロトコルの調査の他にも、 neibo 初号機の課題を改善するために調査することがいくつかあります。その1つがスリップリングの改善です。
スリップリングとは、回転体に電力・信号を伝達できる回転コネクタのことです。この部品を使うと、何回転してもコードが絡まらなくなります。
neibo 初号機では、ツバメ無線製の SRG-2-14GC というスリップリングを採用しました。14 本線があり、USB信号、ステッピングモーターの電力を伝達させました。ツバメ無線製 SRG-2-14GC は、1万円弱と意外と高い部品でした。これだけに限らずスリップリングは値段が高めな傾向にあります。
高ければ、作ってしまえば安く抑えられるのではという安易な発想を思いつきました。
スリップリング製作1
早速設計したスリップリングがこちらです。だいぶ大がかりな装置になりました。
neibo 初号機でも使用した Fusion 360 を使用して設計しました。 neibo 初号機では主に MDF 板をレーザーカッターで切り出して組み立てていましたが、 neibo 改良機では 3D プリンタでの造形を考えています。外観の美しさを達成するためです。
部品の1つがこちらです。2つの金属リングの上に合計6つのこの部品が回転し、下部から受けた電力を上部ユニットに伝達します。金属リングに接する部分にはボールベアリングを配置しています。
組み立てて回転させてみたものがこちらの動画です。リンクをクリックしてご覧ください。
https://twitter.com/i/status/1477660689875759105
テスターで電圧を測定してみると、回転時に著しく電圧が低下しました。ボールベアリングは構造上接地面が小さくなるように作られているので、電力を伝達しようとすると安定しないようです。また、電蝕が起きやすく、ベアリングの寿命を縮めてしまうようです。このアイデアは失敗に終わりました。
スリップリング製作2
スリップリングのベアリングの代わりに、純粋な金属のリングをつけてみることにしました。
また、スリップリング製作1では幅をとってしまったので、少し改良しました。
金属のリングは旋盤で丸棒から削り出します。真鍮と銅の2種類を切削しました。
組み立てた部品の1つがこちらです。
さて、結果はどうだったのかというと、まだ完成させて通電試験は行っていません。ですが、数時間かけて旋盤加工をしたり、そもそも旋盤を導入する時点で既製品より高くついているため、このアイデアも失敗だったと言えます。
改良型の neibo では、電力(2極)のみを伝達させたいため、もっと安価な既製品のスリップリングを素直に採用したいと思います。
さいごに
長くなってしまうので、今回はここまでにしたいと思います。
次回は、CADで設計した neibo 全体の構造についての紹介予定です。