この記事はSafie Engineers' Blog! Advent Calendar7日目の記事です
はじめに
こんにちは。第4開発部でデバイスエンジニアをしている集路(しゅうじ)です。
今回は2024年新卒エンジニア研修におけるデバイス分野の開発についてお話しします。
セーフィーでの2024年新卒エンジニア研修と作ったプロダクトの紹介
セーフィーでは全体研修後、約3ヶ月のエンジニア研修があり、エンジニアとしての基礎を学びつつ、社内課題を解決するプロダクトを開発しました。
課題選定から開発言語、体制まで全て自分たちで決める形式で、私たちは「isai connect」を開発しました。これは、他部署の方とランチに行くと会社がランチ代を負担してくれる「異才ランチ」制度をより活用し、活発化を図るためのプロダクトです。
詳しくは以下の記事でご覧ください。
- 新卒研修の紹介とチーム開発前にやったこと
- 2024年新卒エンジニア研修-アジャイル開発編
- 2024年新卒エンジニア研修-isai connectについて
- 2024年新卒エンジニア研修-isai connect開発のアウトプット_サーバーサイド
- 2024年新卒エンジニア研修-フロントエンド開発編
- 2024年新卒エンジニア研修-インフラ構築編
- 2024年新卒エンジニア研修-isai connect開発のアウトプット_デバイス編 ←本記事
- 2024年新卒エンジニア研修-新卒研修の成果発表とその後
セーフィーではカメラを扱っていることもあり、新卒エンジニア研修でも組み込み開発の領域も体験するため、 RaspberryPi とカメラを用いるという条件がありました。
我々の開発したプロダクト「isai connect」では、Webの開発が主であり、どのようにしてデバイスをサービスに結びつけるのか、など苦労した点も多くありました。開発したデバイスの概要や、その紆余曲折についてご紹介します。
開発したデバイスの概要
まず、開発したデバイス「Receipt Sender」の概要・機能について説明します。
このデバイスでは、名前の通りレシートの画像を個人のSlackに送信します。ランチから帰ってきた人がすぐにレシートを送信できるよう、オフィスの出入口付近2か所に設置しています。
異才ランチ後の経費精算では、経費申請の際にレシートの画像を登録する必要があります。その際、入力の都合上PCでの申請が便利なため、一度手持ちのスマートフォン等でレシートの写真を撮り、Slack等で自分宛てに共有している人が複数いました。この手順をもっと手軽に行えないか、ということで生まれたのがこの「Receipt Sender」です。
Receipt Senderを利用したレシート送信は以下のような流れです。
1. 顔認証ログイン
2. レシート撮影
3. レシート送信
以下で Receipt Sender の利用方法をご紹介します。
~利用方法~
1. 「始める」ボタンから顔認証を実施
2. 本人であることを確認し、「レシートの撮影に進む」ボタンからレシート画像を撮影
3. 撮影した画像を確認し、「DMに送信する」ボタンからSlackへ送信
4. Slackに画像が届いていることを確認
デバイス機能の決定まで
デバイスの具体的な機能や活用方法には悩みました。どのようなプロダクトを作っていきたいかのアイデア出しの時点においても、デバイスをどう活用するのか?を念頭に置いて考える必要があり、なかなかアイデアが定まらない一因となっていました。
アイデアが固まり、デバイスの用途は「レシート送信から経費申請までの手間を減らす」ものを作ると決まりました。当初の計画では、経費精算サービスと連携して、レシートの送信から申請までをスムーズに行えるよう整備することを考えました。
しかし、いざ社内で相談してみると、サービスとの連携はNGという結果に…。経費に関係し、セキュリティ面も考えての結果だったため、当初より範囲を小さくして開発することとなりました。そこで、ランチから帰ってきてすぐにレシートの送信ができるだけでも申請の手間が減ると考え、その機能を作成しました。
ただレシートを送信する機能だけではなく、デバイスとして設置する価値を高めたほうがよいとのご指摘もありました。どのように活用するかを考えた結果、トップページにおいて累計・月間それぞれのコネクト数を表示し、どの程度使われているのかを知ることができるように工夫しました。
これにより、isai connect の状況を社員の方が簡単に見れるようになり、興味を持っていただくきっかけを作ることができたのではないかと考えています。
開発上の苦労・工夫点
今回のデバイス開発では、実装の手軽さから Python を選択しました。GUIの作成は tkinter を使用しています。
- 2台のカメラの制御
図のように、Receipt Sender では、顔認証用のカメラ(市販のUSB-Webカメラ)と、レシート撮影用のカメラ(RaspberryPi用カメラモジュール)の2台のカメラを同時に使用しています。
1つのアプリ内でこれらのカメラを別々で動作させる際、顔認証用のカメラ映像は映らないがレシート撮影用のカメラ映像は映る…などの問題が生じました。
各カメラの映像を扱うのに、顔認証用ではOpenCV、レシート撮影用では picamera2 および libcamera と別々のライブラリを使用しており、複雑化していた点も要因の一つでした。
最終的には、カメラ毎にスレッドを割り当てて処理することで解決しました。
- 顔認証
顔認証の機能を実装するにあたり、2023年度の新卒エンジニア研修で開発された「librarian」の顔認証用APIを利用させてもらうことにしました。顔認証の実装となると大きく時間もかかるため、23卒の先輩方に利用させてほしい旨お伝えしたところ快く許諾してくださいました。
結果として、先輩から我々へと新卒エンジニア研修の成果が繋がる非常に良い要素だったのではないかと思っています。
一方、顔認証の部分では、複数人で連続で利用する際、操作している人ではなくその前に操作した人として認証されてしまう不具合もありました。下図に示す通り、顔認証画面からの画面遷移時にその時点でのカメラ画像が保持されたままになっており、再度顔認証画面を開いた際に保持された画像が一瞬表示されてしまうことが原因でした。
この不具合に対し、顔認証の処理を走らせる間隔を調整してみるなど様々試しながら修正を行いました。時間はかかってしまったものの、最終的には顔認証画面遷移時に明示的に認証情報をリセットすることで解決しました。
- 専用のケース作成
社内に設置するにあたり、RaspberryPi本体を隠しつつレシート撮影用カメラを固定するケースが市販で存在しなかったため、プラ板を用いて自作しました。本体に合う大きさに切って張り合わせるだけの単純な作業ではありましたが、ぴったり合うものを作成でき、むき出しのまま置くことを防げています。
今後の展望
今後は、常時稼働していることを活かし、利用されていないときは社内への周知事項を表示させるデジタルサイネージのような機能を開発することを考えています。また、このデバイスの価値を最大限高めるには、やはり経費申請をより簡単に行えるよう改善していく必要があると思っております。
最後に
私自身、チーム開発の経験がなく、プログラミングも研究で扱った程度(しかもFortranのみ)といった状態でした。技術的な不安が多くある中、必死に勉強しながら同期のメンバーや先輩の社員の皆様にもご協力いただき、最終的にはデバイスの開発部分の多くを実装することができました。デバイス以外にもフロント分野に挑戦することもでき、未経験でも多くの経験を積める有意義な研修であったと感じています。