Safie Engineers' Blog!

Safieのエンジニアが書くブログです

Safie組み込みエンジニアの業務と独自ファームウェアSafieClientについて

プロダクト基盤開発グループデバイスコアチーム、組み込みエンジニアの楊(よう)です。

セーフィーのプロダクトというと、「カメラ」というイメージを持つ方も多いかもしれません。
そんなカメラを始めとしたデバイスの開発は、組み込みエンジニアが担当しています。
今回は組み込みエンジニアの業務内容やカメラ開発の中身をご紹介したいと思います。

セーフィー組み込みエンジニアの業務

以前、「商品開発の歴史」の記事でもご紹介したように、セーフィーでは創業以来さまざまなカメラとデバイスを開発してきました。
デバイス開発をメインで担当する組み込みエンジニアの業務・開発内容は、採用サイトにも記載があるように、主にこちらの6つになります。

  • カメラ・デバイス開発
  • Safie Client SDKの開発
  • エッジアプリプラットフォームの開発
  • CI/CD環境や開発環境の整備と改善
  • カメラ設定用各種ツール開発
  • カメラユーザーの問い合わせ・障害対応

今回は、上記のうち「カメラ・デバイス開発」、「Safie Client SDKの開発」、「エッジアプリプラットフォームの開発」にフォーカスし、Safieカメラの構成と併せて説明します。

Safieカメラ・デバイスの構成

セーフィーではSafieClientという実行ファイルを各カメラ/デバイス向けにビルドして搭載しています。
当初、SafieClientはカメラの制御/映像の送信を担うだけでしたが、現在ではSafieエッジアプリを管理する機能も実装され、Safieプラットフォームの一部としての機能を日々進化させています。

SafieClientは大まかに下記三つのモジュールによって構成されています。

  • Safie Client SDK:サーバへの映像/音声の送信、サーバからの命令処理などSafieClientのコア機能がここに集約されています。
  • Camera I/F:各カメラ/デバイスの固有実装への対応を担います。映像/音声データを取得してSafie Client SDKに渡したり、Safie Client SDKからの命令に応じてカメラ/デバイスの制御を行ったりします。
  • SafieエッジアプリやEdgeAppFramework:Safieエッジアプリがセーフィー対応のカメラ/デバイスに配布可能なエッジアプリになります。EdgeAppFrameworkがSafieエッジアプリの動作管理を担っており、必要な一連の開発環境も含まれています。現在開発中のAIカメラ用のエッジアプリもこちらの仕組みを利用して開発しています。(厳密にはSafieClientとは別のプログラムですが、SafieClientによって制御される付随したモジュールになります。)

Safie Client SDKの開発

Safie Client SDKの基本的な役割は、Safieクラウドとの接続管理と各カメラ/デバイス全体の管理です。そして、通信状態が悪くても映像を視聴できるように、また通信状態が復帰した時に映像をリカバーできるように色々工夫しています。また、Safie Client SDKはSafieが対応する全てのカメラに共通で使われているので、どのカメラでも動くよう汎用性のある設計・実装にする必要があります。

Safie Client SDKの機能を項目としてまとめると以下の通りです。
詳細の説明は割愛しますが、イメージをつかんでいただければ幸いです。

・デバイスのクラウド接続時の自動認証
・Safieクラウドとの安全・安定な接続・再接続
・カメラの制御、カメラの状態管理
・カメラの動画ストリームやイベント、通知のアップロード
・通信状態が悪い時のビットレート調整
・通信切断状態の映像のバックアップと後のリカバリ
・LogやDebug情報のアップロード
・SafieClientまたは各カメラ/デバイスのシステムFW更新
・WebRTCのシグナリング
・Safieエッジアプリの管理

また、カメラの数やユースケースの増加と共に、以下のような機能追加・改善を検討しています。

・よりスマートなビットレート調整
・通信状態によらず録画欠損の無いバックアップと後のリカバリ
・設置環境やニーズに合わせたハイブリッド映像配信(デバイス配信/サーバー配信)
・プラットフォーム化に伴うセキュリティ対策
・Androidなど汎用プラットフォームへの対応

そして、今まではプロダクトを市場に出すことを優先してきたため、技術負債が溜まっています。
今後の市場拡大を考慮すると、より品質を担保するためにも負債を解消しなければなりません。
現在は、CI/CD環境の整備やエミュレーション環境の構築などを通して、負債の解消を目指しています。

カメラ・デバイスの開発

Safie Client SDKがSafieの共通機能をまとめて対応しているので、新規カメラ・デバイスの開発・対応が基本Camera I/Fでカメラ固有機能の開発になります。基本的に以下3つのパターンに分類されます。

  • 自社製カメラの開発
  • 他社市販カメラのSafie化開発
  • Safie Client SDKを外部へ提供
自社カメラの開発

自社製の代表的なカメラと言えば、CC-2シリーズSafie Pocket2、現在開発中のエッジAIカメラになります。

自社製と言ってもセーフィーでは、ハードウェアも含めて完全に社内で開発する訳ではなく、カメラ製品開発能力があるハードウェアベンダーとの協力開発になります。ハードウェアおよびOSなどのシステム周りの開発と製造を先方にしてもらって、セーフィーがその上位にあたるカメラ全体の制御や通信部分の開発を行うのが一般的です。
ただ、製品の開発元として全体を見通した工程管理を行う必要があるので、場合によってドライバレベルのデバッグや試作もハードウェアベンダーと一緒にやる必要があります。また、新しいハードウェアベンダーにもセーフィーにもノウハウがない技術の開発をする際は、我々組み込みエンジニアが先陣を切って勉強するところから始めなければなりません。これからは新しいカメラを開発する機会も増えてくるので、5G、手ぶれ補正、位置推測など技術的な挑戦をする機会がたくさんあります。

また、これからは事業の拡大とともに、理想的な製品や機能の開発、より安くて高い品質を保つためにも、当社の組み込みエンジニアがソフトウェア開発だけではなく、ハードウェアを設計する技術や生産管理のノウハウも積極的に貯めて守備範囲を拡げていく必要があります。

他社市販カメラのSafie化開発

商品開発の歴史」の記事でもご紹介したように、セーフィーではユーザーぞれぞれの利用用途、設置環境のご要望に応えるため、またより多くの販路やパートナーを巻き込むため、自社製のカメラだけではなくトップメーカーであるAxis Communications社やVivotek社を始めとした、他社製市販のセキュリティカメラのSafie対応を行っています。

他社市販カメラはRTSPやONVIFといった映像を取得したり制御したりするために規格化されたインターフェースを持っていることが多く、さらにAxis Communications社のACAPやVivotek社のVADPのようなアプリケーションプラットフォーム機能を持っているカメラもあります。他社市販カメラのSafie対応は基本はRTSP /ONVIFあるいはそのカメラ特有のアプリケーションプラットフォーム機能を使うCameraI/F開発になります。

そして、各種他社市販カメラは基本的にはLinuxベースのデバイスになりますが、ToolchainやSDKがそれぞれ異なっているので、ビルド環境の整備や再現が大変です。今はDockerでカメラToolchainを管理するなど色々工夫をしています。

Safie化している他社市販カメラは、AXIS社とVivotek社のカメラだけで200機種以上、機能や仕様も様々です。多くの機種に対応することによって、Safieがカバーできる利用用途や設置環境はかなり増えますが、その分サポート対応が煩雑になります。

Safie Client SDKを外部へ提供

Safie対応のカメラはすべて自社で開発したわけではありません。条件次第で、積極的にSafie Client SDKを開発パートナーへ提供して共同開発をしています。当然、技術的なサポートは組み込みエンジニアから行います。

Safie対応カメラを増やしていく為には、様々な開発パートナーにより広くカメラ開発を行って頂くのが理想的ですが、今はまだSafie Client SDKが使いにくいなどの課題があるので、偶に密なコミュニケションしないと開発が進まないケースや自社で開発した方が早いケースがあります。なので、これからはSafie Client SDKをより使いやすくし、今後いずれオープンソース化などしてより誰でも使えるようにしていきたいと思います。

Safieエッジアプリやそのプラットフォームの開発

昨今ではカメラ(エッジ側)で処理できることが増えています。そのため多くのカメラをSafie化したとしても、機能追加できるのが自社のエンジニアだけになってしまうのはとてももったいないと考えています。
そのため、セーフィーではテックパートナーと協創できるプラットフォームの実現を目指しており、その一環としてSafieEdgeAppFrameworkを開発。現在はエッジAIカメラ用のAIエッジアプリやWebRTC音声通話機能の開発環境として使っています。

SafieEdgeAppFrameworkは、SafieデバイスにデプロイできるSafieエッジアプリを動かす・開発するためのフレームワークになります。Safieエッジアプリを開発するためのツールとしては、以下の一連機能を提供しています。

・アプリの自動生成
・アプリのビルド・構築
・単体テスト環境
・実機デバッグ環境
・アプリの登録・デプロイ

そして、Safieエッジアプリの実装に関しては、以下の機能・ライブラリーを用意。カメラから映像などの情報を取得して解析をしたり SafieクラウドとRPC通信で連携するエッジアプリを作ることができます (現状Safieエッジアプリの実装は C++ だけサポートしています)。

・アプリのリモート更新
・アプリのリソース(推論モデルなど)のリモート更新
・Safieクラウドからのアプリ設定
・RPC通信(Safieクラウドから、他のSafieエッジアプリから、WebRTCなどのP2P通信から)
・イベントをSafieクラウドに送信・記録
・カメラの映像・イベントを購読
・カメラ制御・Overlay設定など
・3rd Party Libs(TensorflowLite、OpenCV、Dlibなど)、デバイス固有のSDK(SNPEなど)

Safieエッジアプリの構成概要とSafieクラウド/カメラとの動作概要の全体像については、下図になります。
基本アプリのライフサイクルコールバックI/Fを実装し、上記機能・ライブラリーを使ってアプリの機能を実装すればアプリが出来上がるイメージです。

現状SafieEdgeAppFrameworkは社内のみの利用で、まだまだブラッシュアップ中です。完成度が上がり対応するカメラなどの条件が揃い次第、テックパートナーに公開していきたいと考えています。

ちなみに、SafieエッジアプリはWebRTC経由やSafie API 経由でも通信できる構想(妄想?)があります。例えば、顔検出のSafieエッジアプリを作って、Web側で下記のようなjavascriptコードで顔の検出通知をsubscribeしたり、検出したい顔の特徴をSafieエッジアプリに設定したりすることもできるかもしれません。
そうなると、Safie開発アカウントを持っていれば、Safieカメラと連携するフルスタック開発ができるので、面白いかもしれません。

// この顔見つけたら教えてね
camera.edgeapp("FaceDetector")
   .subscribe(“FaceDetectedEvent”,
   (event) => {
       console.log("people in:", event.face_name)
   })

camera.edgeapp("FaceDetector")
   .request(“StartFaceDetected”, face_data)

最後に

ここまでで、多少理想語りも含めたセーフィーの組み込みエンジニアの業務・開発内容を紹介をしてみましたが、イメージは少し湧きましたでしょうか。

組み込みエンジニアの全ての努力は、Safieのカメラ・デバイスや開発環境を、より安全・安定でより手軽にインフラのように、顧客や共に開発するパートナーの身近に届けるためです。
そして、理想を語りながら、顧客ニーズや現実を見て調整し、確実に泥臭い現実課題を解決していくのがセーフィーの組み込みエンジニアの姿になると思います。

現在、一緒に働く組み込みエンジニアを募集しています。セーフィーのビジョンや組み込み、エンジニアの開発内容に共感・興味を持って頂けるようであれば、是非ともご連絡ください!

募集職種一覧/セーフィー株式会社

© Safie Inc.