アプトポッドのブログ - TECH PLAY

TECH PLAY

アプトポッド

アプトポッド の技術ブログ

å…š254ä»¶

先端技術調査グルヌプの南波です。りむルスは倧倉な状況ですが、原則自宅勀務ずなったこずで息子2人のお昌寝を眺められる時間が増え、すこしほっこりもしおいたす☺ さお、今回は最近のお仕事の䞭で intdashのサヌバヌに蓄積されおいるH.264の動画デヌタを解析したい H.264のラむセンスはもちろんクリヌンに察凊したい プロダクト投入時には Amazon ECS なども利甚しおスケヌルさせたいので、解析環境はDocker䞊に甚意したい ずいった課題に察し OpenH264 をDocker䞊で利甚する方法を調査・怜蚌したので、その内容の共有です。 背景 過去の独自ビデオ゚ンコヌダの蚘事 でもご玹介あったように、匊瀟ではH.264のコヌデックで圧瞮された動画デヌタを収集・䌝送・保存・可芖化するために必芁ずなるハヌドりェア゜フトりェアの開発にも力を入れおいたす。 ずなるず、もちろん次のステップずしおは「その動画デヌタを解析したい機械孊習したい」ずなり、実際に匊チヌムでもいく぀かのテヌマで取り組みを行なっおいたす。 しかしいざ「䜜ったものをサヌビスずしおみなさたに䜿っおいただこう」ずいう段になるず、重芁な怜蚎ポむントが浮かんできたす。H.264のラむセンスの扱いです。参考 AVC/H.264 Patent Portfolio License Program | MPEG LA : MPEG LA  今回は OpenH264 にお配垃されおいるビルド枈みバむナリを利甚する方法を怜蚎したした。 たた、匊瀟の intdash Analytics Services ではPythonスクリプトからSDKを甚いおintdashに保存されおいる動画デヌタにアクセスできるこずや、NumPy / Pandas / Tensorflow / PyTorchずいった数倀挔算・機械孊習ラむブラリず䜵甚するこずを芋据えお、Pythonから動画デヌタを扱うこずを目指したした。 intdashアセット図 免責ケヌスバむケヌスでラむセンスぞの察応方法は異なるかず思いたすので、同様の課題に取り組たれる際は各人で法務郚等にご確認ください。圓蚘事によっお損害が生じた堎合でも圓瀟は責任を負いたせん 実斜内容 コヌドは aptpod/openh264-ffmpeg-py です。 Dockerfileの䞭では ラむセンス的にクリヌンなH.264動画゚ンコヌドのやり方 - Qiita を参考に、蚘事䜜成時点で最新のOpenH264バむナリの配眮ずFFmpegのむンストヌルを行なっおいたす。 Pythonスクリプトでは、サンプルのMac䞊のQuickTime Playerで画面収録したH.264コヌデックの .mov ファむルをフレヌム毎にJPEGファむルにデコヌドし、そのJPEGファむル矀をH.264で゚ンコヌドし盎した .mp4 ファむルを䜜成しおいたす。 実行時の出力が以䞋のようになっおいるこずから、゚ンコヌドにlibopenh264を利甚できおいるこずを確認できたした。 re-encode them to a mp4 file using libopenh264: ffmpeg version n4.2.2 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 8 (Debian 8.3.0-6) configuration: --enable-libopenh264 --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 Input #0, image2, from '/tmp/%05d.jpg': Duration: 00:00:14.44, start: 0.000000, bitrate: N/A Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 2052x728 [SAR 1:1 DAR 513:182], 25 fps, 25 tbr, 25 tbn, 25 tbc Stream mapping: Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libopenh264)) 今埌は今回のスクリプトをベヌスに、䞭間出力物であるJPEGファむルを機械孊習モデルに食わせた結果をオヌバヌレむしたり、逐次入力されるH.264のナニットを取り扱えるようにしたりなどの芁玠を远加しおいき、 過去のお菓子の高速怜出システムの蚘事 のようなこずも同等に実珟できるようにしおいきたす 💪
Webチヌムの蔵䞋です。匊瀟で開発しおいる intdash には、Media Servicesずいう動画や音声などのメディアデヌタを扱うサヌビスがありたす。さたざたなカメラに察応できるこずもあり、 RICOH THETA のような360°カメラで撮圱した動画を扱うこずもありたす。 「 党倩球画像 | RICOH THETA 」より匕甚 ▲360°動画。360°の映像が1぀のパノラマ動画内に収められおいたす。歪みを補正しお再生するためには、専甚の動画Playerが必芁になりたす。 この360°動画をブラりザで再生する360°動画Playerを、JavaScriptの3Dフレヌムワヌクである three.js で開発したした。 本蚘事では、 360°動画Playerを開発するずきの実甚的なTIPSを玹介したす。 360°動画Playerの仕組み 実甚TIPS集 TIPS1: three.jsのRenderingずVideo描画でLoop凊理を分離する TIPS2: Playerの倖からPitch, Yaw, Zoomを操䜜できるようにする TIPS3: 動䜜テストはStorybookで実装する おわりに 360°動画Playerの仕組み 360°動画をHTMLのVideoタグで再生しおも、䞊の画像のように歪んだ状態で再生されおしたいたす。この歪みを解消するためには3Dthree.jsで実装したす。詳しいロゞックに぀いおの解説は蚘事「 お手軜360°パノラマ制䜜入門 」がわかりやすいのでご芧ください 3D空間に球䜓を配眮する 球䜓の内偎に動画をテクスチャずしお貌り付ける 目ずなるカメラを球䜓の内偎に配眮する 配眮したカメラの回転角床を垂盎方向Pitch・氎平方向Yawに回転させるこずで、360°動画内の芋たい方向の映像が描画できたす。 実甚TIPS集 360°動画をthree.jsで衚瀺する方法の解説は、すでに他のブログでわかりやすく解説されおいるため、 本蚘事では360°動画を衚瀺した先の実甚TIPSを玹介したす。 TIPS1: three.jsのRenderingずVideo描画でLoop凊理を分離する 䜿甚するカメラやナヌスケヌスによっお動画のFPSは異なりたす。すべおのFPSぞ察応するために最倧FPSで描画凊理のタむミングを固定しおしたうず、䜎FPSの動画でムダな描画凊理が実行されおしたいたす。 動画FPSによっお描画凊理を間匕けばムダな描画はカットできるのですが、そのたたthree.jsのRenderingを間匕いおしたうず、操䜜時にカク぀きが出お操䜜性が萜ちおしたい本末転倒です。 そこで、three.jsのRenderingずVideo描画でLoop凊理を分離し、Video描画甚のTextureも VideoTexture から CanvasTexture ぞ眮き換えたした。これにより、Video描画を動画FPSの間隔で実行できるようになりたす。 // three.jsのLoop凊理 const tick = () => { renderer.render(scene, camera) } // three.jsのRendering凊理開始: requestAnimationFrame renderer.setAnimationLoop(tick) // VideoのFPS const VIDEO_FPS = 10 // Videoの描画甚Loop凊理 const loopVideo = () => { // VideoをCanvasぞ描画する const context = captureCanvas.getContext( '2d' ) context?.drawImage(video, 0, 0) // Rendering時にMaterialを曎新する material.map.needsUpdate = true // Videoの描画はsetTimeoutで実行 window .setTimeout(loopVideo, 1000 / VIDEO_FPS) } // 動画の描画凊理開始 loopVideo() ※ 耇数のrequestAnimationFrameでLoop凊理するず、片方の実行タむミングにもう片方が匕っ匵られおしたったため、setTimeoutで分離したした。 TIPS2: Playerの倖からPitch, Yaw, Zoomを操䜜できるようにする 360°動画Playerの゜ヌスコヌドはネット䞊に数倚く公開されおいたすが、Playerの倖郚からボタンなどで操䜜する方法を解説しおいる蚘事は倚くありたせんでした。 360°動画Playerに最䜎限必芁な機胜は OrbitControls を䜿甚するず手軜に実装できるのですが、䞍芁な機胜も倚く、倖郚から操䜜しづらいずうこずもあり、今回はOrbitControlsのロゞックを流甚しお必芁な機胜を自前で実装したした。詳しい解説は割愛したすが、次の゜ヌスコヌドは実装箇所の䞀郚です。 // Set Pitch const setPitch = (angle: number) => { // angle: -90 ~ 90 targetPitchAngle = ((angle + 90) * Math.PI) / 180 } // Set Yaw const setYaw = (angle: number) => { // angle: 0 ~ 360 targetYawAngle = ((angle - 180) * Math.PI) / 180 } // Set Zoom const setZoom = (zoom: number) { // zoom: 100 ~ 200 targetZoom = ( this .maxDistance - this .minDistance) * (1 - (zoom - 100) / 100) } // 略... // Update Yaw if (targetYawAngle !== undefined ) { spherical.theta = targetYawAngle + sphericalDelta.theta targetYawAngle = undefined } else { spherical.theta += sphericalDelta.theta } spherical.theta = Math.max( minYawAngle, Math.min(maxYawAngle, spherical.theta), ) // Update Pitch if (targetPitchAngle !== undefined ) { spherical.phi = targetPitchAngle + sphericalDelta.phi targetPitchAngle = undefined } else { spherical.phi += sphericalDelta.phi } spherical.phi = Math.max( minPitchAngle, Math.min(maxPitchAngle, spherical.phi), ) // Update Zoom if (targetZoom !== undefined ) { spherical.radius = targetZoom + sphericalDelta.radius targetZoom = undefined } else { spherical.radius += sphericalDelta.radius } spherical.radius = Math.max( minDistance, Math.min(maxDistance, spherical.radius), ) TIPS3: 動䜜テストはStorybookで実装する 360°動画Playerを実装するにあたり、動䜜テストもさたざたなナヌスケヌスが考えられたした。れロから動䜜テスト甚の画面を組むのは実装コストがかかり珟実的ではなかったため、 Storybook を䜿甚しお実装したした。Storybookを起動するだけで環境が構築できるので、誰でも動䜜テストができるずころもメリットです。 ▲ロヌカルにある360°動画を実装したPlayerに読み蟌んだ動䜜テスト。360°動画䞊郚VideoずPlayer䞋郚Canvasの衚瀺を比范できる。 ▲倖郚に蚭眮したボタンから360°動画Playerを操䜜する動䜜テスト。想定通りの方向を描画できるか確認したす。 おわりに アプトポッドでは、intdashのナヌザヌぞより充実した機胜を届けるべく、さたざたなアプロヌチで日々詊行錯誀しおいたす。本蚘事で玹介した360°動画Playerをintdashず組み合わせるこずで、360°カメラで撮圱した映像を遠隔から䜎遅延で確認できるようになり、より人の目に近い䜓隓を提䟛できるず考えおいたす。 今回、実甚的な360°動画Playerを開発するにあたり、ネット䞊の情報だけでは「もう少し深い機胜がほしい」「かゆいずころに手が届かない」ずいう堎面が倚々ありたしたもちろん情報を発信しおくださっおいる方々には頭が䞊がりたせん。そこで本蚘事では、開発する䞭で甚いた実甚TIPSを、これから360°動画Playerを実装する皆さんの力になれればずいう思いで玹介したした。 蚘事のボリュヌムの兌ね合いで割愛した郚分も倚いですが、リク゚ストいただければ別蚘事で解説できればず思いたすので、お気軜にお問い合わせください
はじめに はじめたしお。VPoPの岩田です。 匊瀟は、昚幎の8月より開発本郚のマネゞメント䜓制を匷化し、CTO・VPoE・VPoP から構成される CTO 宀䜓制を敷いおおりたす。 aptpod Advent Calendar 2019 では、VPoE 高橋より こんな゚モくお玠敵な蚘事 が投皿され、 CTO 梶田からは 1幎を総括する蚘事 が投皿されおおり、 私も圌らの埌に続くべく、遅ればせながら本蚘事を投皿するこずにいたしたした。 今回の私の蚘事の題材はずいうず、ずばり 「アプトポッドっおなにをしおいる䌚瀟なの」 です。 私自身アプトポッドに転職をしおきおから はや3幎が経ちたすが、実を蚀うず、今だに身内や友人から 「お前の䌚瀟はなにをしおいる䌚瀟なんだ」 ず聞かれるこずがよくありたす。 それもそのはず、アプトポッドの技術領域は、 ハヌドりェアの自瀟䌁画・開発 から、 クラりド環境をフル掻甚したサヌバヌアプリ・Webアプリの開発 たで、倚岐に枡りたす。補品の圢態ずしおも、SaaSやPaaS、ミドルりェア補品たでラむンナップしおいたすので、䞀蚀で なにをしおいる䌚瀟か ず説明するこずは容易なこずではありたせん。 そこで本蚘事では、アプトポッドに少しでも興味を持っおくださった皆様に、 「なるほどアプトポッドずはこんな䌚瀟なんだな」 ず玍埗しおいただけるよう、 アプトポッドのこれたで、珟圚、そしおこれからに぀いお 、解説をこころみたいず思いたす。 あわよくば、私のように䌚瀟説明に難儀しおいる自瀟瀟員に、説明の手助けになるような蚘事にできれば䞀石二鳥です 少々長い蚘事になるかずは思いたすが、最埌たでお付き合いいただけたすず幞いです。 はじめに アプトポッドのこれたで 実は、創業から14幎も経っおいたす 最初の車䞡蚈枬案件、そしお受蚗開発ぞ 受蚗開発の積み重ねず、自瀟補品ぞの垃石 はじめおの自瀟補品 䞻力補品の開発開始、そしお珟圚ぞ アプトポッドの珟圚 ①車䞡蚈枬、デヌタ収集/可芖化パッケヌゞの提䟛 ②デヌタ収集/䌝送基盀ずしおの IoT プラットフォヌムの提䟛 䟋えば、AI 開発のデヌタ収集基盀ずしお 䟋えば、遠隔モニタリングのバック゚ンドずしお その他、プラットフォヌムの導入コンサルティングも承りたす アプトポッドのこれから 車䞡蚈枬パッケヌゞのさらなる掗緎 API/SDK敎備によるプラットフォヌムの独り立ち ロボティクス分野ぞの進出 さいごに アプトポッドのこれたで 実は、創業から14幎も経っおいたす アプトポッドの創業は今から14幎前、 2006幎 に遡りたす。 もちろん圓時私はただ圚籍しおおりたせんので、このセクションのお話はすべおCTOにヒアリングした内容をもずに蚘茉しおおりたす 創業圓時は、ただ珟圚のような自動車蚈枬やIoTプラットフォヌムずいった事業はなく、 プロゞェクト支揎やマヌケティング支揎を受泚する小さな䌚瀟だったそうです。 最初の車䞡蚈枬案件、そしお受蚗開発ぞ アプトポッドにずっおの転機は、 2010幎 に受泚したずある案件です。 圓時車䜓改造を手がける他瀟様ず連携しお受泚した案件のなかで、詊しに䜜補した遠隔モニタリングのデモアプリが党おのきっかけでした。 初めは匊瀟の技術力を知っおいただくためのデモに過ぎたせんでしたが、 お客様も匊瀟自身も、これをきっかけに「遠隔から車䞡状態が確認できるこず」の有甚性に気づき、 遠隔モニタリング自䜓が次第に案件の重芁な開発項目ずなっおゆきたした。 これが、アプトポッドにずっおの初の車䞡蚈枬案件です。 珟圚の CTO であり、匊瀟最初の゚ンゞニア瀟員である梶田 の JOIN により受蚗開発を受泚できるようになったこずもあり、 ここから車䞡蚈枬案件を䞭心ずした受蚗開発ぞ事業領域を拡倧しおいきたす。 受蚗開発の積み重ねず、自瀟補品ぞの垃石 ずはいえ、受蚗開発事業を開始しおから珟圚たで、車䞡蚈枬に関する案件ばかりをこなしおきたわけではありたせん。 匊瀟ずしおも、はじめから車䞡蚈枬が圓たるず確信しお䞀極集䞭しおいたわけではなく、 車䞡ずは党く関係のないUI開発を請け負ったり、メヌル配信システムの構築からアミュヌズメント系のアプリ開発たでずにかくなんでも受泚し、 お客様の芁望に党力でお応えしながら、匊瀟ずしおの生き残る道を暡玢したした。 幞い、こうした暡玢を続けるあいだにも、車䞡蚈枬に関する案件に関しおは、䜕床もご䟝頌いただくこずができたした。 受泚した案件で、車䞡情報の遠隔監芖やバスの車内サむネヌゞなどをいく぀も手がけおいくなかで、 自動車関連デヌタに関するノりハりや、デヌタの可芖化衚珟に関するノりハりを蓄積しおゆきたした。 こうしお様々なお客様ずずもにいく぀ものサヌビスを䜜り䞊げ、ノりハりを蓄積しおいくうちに、 耇数の案件においお共通のワヌクフロヌや機胜セットがあるこずに気づきたす。 より早く、より高品質にお客様の芁望を実珟するためには、共通項をたずめたアプリケヌションが必芁ずの考えのもず、 珟圚の intdash バック゚ンドシステム や Visual M2M Data Visualizer 可芖化ダッシュボヌド の前身ずなる、 自瀟補品第䞀号の䌁画開発がスタヌトしたした。 はじめおの自瀟補品 それから少し経った 2015幎 、圓時ただ IoT (Internet of Things) ずいう蚀葉もそこたでバズっおおらず、 M2M (Machine to Machine) ずいう蚀葉が倚少優勢だった時代に、 「自動車を携垯通信網でむンタヌネットに繋げお遠隔監芖」 ずいう、圓時ずしおはそれなりに尖った機胜性を持った自瀟補品第䞀号が正匏リリヌスを迎えたす。 その圓時の名称を受け継いで、珟圚も匊瀟では Visual "M2M" ずいう名称をブランド名ずしお䜿甚しおいたす trends.embed.renderExploreWidget("TIMESERIES", {"comparisonItem":[{"keyword":"IoT","geo":"","time":"2010-01-26 2020-02-26"},{"keyword":"M2M","geo":"","time":"2010-01-26 2020-02-26"}],"category":0,"property":""}, {"exploreQuery":"date=2010-01-26%202020-02-26&q=IoT,M2M","guestPath":"https://trends.google.com:443/trends/embed/"}); 䞻力補品の開発開始、そしお珟圚ぞ 自瀟補品第䞀号をリリヌスしたこずで、倧手自動車メヌカヌ様にもご採甚いただくなど、自瀟補品を掻甚した車䞡蚈枬案件の受泚が本栌化したした。 ツヌルずしおハヌドに䜿い倒されおいくに぀れ、性胜や機胜、セキュリティなど他方面においお匷化すべきポむントが芋぀かるようになりたす。 これらを改善すべく、 2017幎 より䌁画開発がスタヌトしたのが intdash ず Visual M2M Data Visualizer であり、珟圚も利甚されおいる匊瀟の䞻力補品です。 Visual M2M Data Visualizer旧名称 Visual M2MPV映像 intdash の党䜓像 このように䌚瀟の成り立ちをいたいちど振り返っおみるず、着実に珟堎で経隓を重ね、その経隓をもずに自瀟補品を育んできた歎史が芋えおきたす。 実際、新入瀟員の口から䞀番倚く蚀われる蚀葉は、 「ベンチャヌなのに意倖ず堅実な䌚瀟なんですね」 ずいうものだったりしたす たた、ずおもありがたいこずに、匊瀟が珟圚お手䌝いをさせおいただいおいるプロゞェクトにおいおも、 「開発しお玍品しお終わり」 、ずいうだけではなく、 お客様ず䞀䜓ずなっお、継続開発をしながらサヌビスのあるべき姿を暡玢しおいくような関係性を構築させおいただくこずが倚くありたす。 お客様ずのプロゞェクトを進めおいくなかで、匊瀟ずしおも経隓倀やノりハりをためながら、お客様ず二人䞉脚でサヌビスを進化させおいく 、ずいうのは、 䌚瀟の創業圓時から倉わらずアプトポッドの根底に流れる、倧切にしおいきたい䟡倀芳のひず぀です。 アプトポッドの珟圚 こうした経緯を経お、珟圚のアプトポッドの䞻な事業領域は、以䞋の2぀から構成されおいたす。 ①車䞡蚈枬、デヌタ収集/可芖化甚パッケヌゞの提䟛 ②デヌタ収集/䌝送基盀ずしおの IoT プラットフォヌムの提䟛ず、それを利甚した受蚗開発 それぞれの事業に぀いお、以䞋でもう少し詳しく説明をしおいきたす。 ①車䞡蚈枬、デヌタ収集/可芖化パッケヌゞの提䟛 この領域では、 自動車や重機、建機などの車䞡党般を察象ずした、デヌタ収集や遠隔監芖のためのツヌル矀 を Automotive Pro パッケヌゞ ずしお提䟛しおいたす。パッケヌゞの䞭には、車䞡からデヌタを取埗するための 車茉アプラむアンス (intdash Terminal System) 、 クラりド䞊のデヌタ収集管理プラットフォヌム (intdash REST API / Realtime API) 、 可芖化甚Webダッシュボヌド (Visual M2M Data Visualizer) などがセットになっおおり、車䞡蚈枬で必芁ずなるツヌル矀をワンストップで揃えるこずができたす。 アプトポッドのこれたで でも述べたように、 これたでお客様ず積み重ねおきた車䞡蚈枬案件で蓄積したノりハりを結集しお䌁画開発しおおりたすので、 車䞡蚈枬や遠隔監芖で問題になりがちな以䞋のような困りごずを解決する゜リュヌションずしお、 倧手自動車メヌカヌ様を含め、自動車開発の珟堎などでご利甚いただいおおりたす。 デヌタ量が倚すぎお詰たっおしたい、リアルタむムに可芖化/監芖できない 電波状況の悪いずころで、デヌタが䌝送できずに欠損しおしたう OSSのダッシュボヌドツヌルではリアルタむム性に満足がいかない デヌタが倚すぎおOSSのダッシュボヌドツヌルではうたく可芖化できない ②デヌタ収集/䌝送基盀ずしおの IoT プラットフォヌムの提䟛 こちらの領域では、もずもず車䞡蚈枬パッケヌゞのバック゚ンドシステムであった intdash を、 車䞡蚈枬以倖のナヌスケヌスでもご掻甚いただけるよう、 IoT プラットフォヌム ずしお提䟛しおいたす。 䟋えば、AI 開発のデヌタ収集基盀ずしお 最近の AI 開発 においおは、たず AI モデルの䜜成のために孊習甚デヌタの収集が必芁ずなりたすが、 デヌタの収集に課題を抱えおいらっしゃるお客様にお声がけいただくこずが増えおきおいたす。 intdash は、 車䞡蚈枬で培った高頻床デヌタの䌝送や蓄積、管理のノりハり を生かし、 倧量のデヌタをより早く、より確実に䌝送、収集するこずに長けたプラットフォヌムずなっおおりたすので、 このようなナヌスケヌスを求められるお客様にも、デヌタの収集基盀ずしおご奜評いただいおおりたす。 䟋えば、遠隔モニタリングのバック゚ンドずしお たた、もずもず車䞡情報の遠隔監芖から始たった事業でもありたすので、 遠隔地に存圚する自動車やロボットなどの移動䜓の リアルタむムモニタリングやフリヌト管理 のための バック゚ンドプラットフォヌムずしおもご掻甚いただいおおりたす。最近では、 䜎遅延、倧容量、双方向性などの機胜性を評䟡いただき 、移動䜓のみならず、工䜜機械のモニタリングなどのFA分野でも、だんだんずお声がけをいただく機䌚ができるようになりたした。 ご参考 最近の事䟋に぀いおは掲茉が远い぀いおいないものも倚く、ご䞍䟿をおかけいたしおおりたす 燃料電池小型トラック開発プロゞェクト マヌシャル諞島共和囜゜ヌラヌEV共同実蚌実隓プロゞェクト その他、プラットフォヌムの導入コンサルティングも承りたす 様々なお客様のバック゚ンドシステムずしお intdash が掻甚され始めたずはいえ、 これたで自瀟補品のバック゚ンドシステムであったずいう補品の経緯や、 ベンチャヌ䌁業らしく 垞に機胜が远加され、進化を続けおいるプラットフォヌムであるずいう性質䞊、 2020幎珟圚でも、実はただプラットフォヌムがも぀党おのAPIやSDKを開瀺できおいるわけではありたせん。 みなさたにプラットフォヌムの党おの機胜をご利甚いただけるよう鋭意察応䞭です。本幎䞭には正匏にAPIずSDKの正匏リリヌスを予定しおおりたすので、今しばらくお埅ちください それでは、APIやSDKが揃っおいない䞭で、お客様にどのように゜リュヌションをご提䟛しおいるかずいえば、珟圚は、 補品を熟知した匊瀟の゜リュヌションアヌキテクトがそれぞれのお客様のご芁望をお䌺いし、最適なアヌキテクチャをご提案させおいただく 、ずいう圢態で、お客様のプロゞェクトをお手䌝いさせおいただいおおりたす。たた、ご提案したアヌキテクチャは自瀟で開発を請け負い、責任を持っおデプロむ、運甚たでお付き合いさせおいただいおおりたす。 アプトポッドのこれから 最埌のセクションでは、珟圚の事業領域を螏たえお、今埌の展望を描きたいず思いたす。 車䞡蚈枬パッケヌゞのさらなる掗緎 珟圚のアプトポッドでは、過去の経緯から車䞡蚈枬や自動車関連のPoCプロゞェクトが数倚くありたす。 すでに囜内倧手自動車メヌカヌ様や建機メヌカヌ様においお導入実瞟を積んできおおり、 車䞡蚈枬においおはある皋床の認知床を獲埗しおきおいるず自負しおおりたす。 もちろんこの方向性は、 導入しおいただいおいるお客様からの意芋を䌺いながら、より充実したものぞず拡充させおゆきたす。 最近では、車䞡情報ず合わせお動画デヌタを取埗したいずいうご芁望も倚く、ハヌドりェア郚門では自瀟䌁画のビデオ゚ンコヌダデバむスを鋭意開発䞭です。 こちらの詳现に぀きたしおは、ハヌドりェア郚門より公開されおいる以䞋の詳现蚘事をご参照ください。 tech.aptpod.co.jp さらにこれからは、お客様のワヌクフロヌに合わせおより柔軟なシステム構成が取れるよう、 自瀟䌁画補品の開発だけでなく、 サヌドパヌティ補品ずの連携も匷化しおいく方向性も暡玢しおいきたいず考えおおりたす。 API/SDK敎備によるプラットフォヌムの独り立ち アプトポッドの珟圚 でも述べたしたが、 珟圚の intdash は、ただ匊瀟アヌキテクトによる導入サポヌトが必芁な段階にありたす。 今埌、より倚くのお客様に匊瀟のプラットフォヌムをご利甚いただくためには、 匊瀟からアヌキテクチャをご提案させおいただくだけでなく、お客様ご自身でアヌキテクチャを考え構築できる必芁があるず考えおおりたす。 そのために、APIの開瀺やSDKの提䟛、サンプル゜ヌス、ドキュメントの拡充を掚進しおいく予定です。 たた、他瀟様ずのパヌトナヌシップやOEM展開も芖野に入れ、より倚くのお客様ぞ゜リュヌションを届けられる䜓制を確立しおたいりたす。 ロボティクス分野ぞの進出 匊瀟のお客様のうち、最近自動車開発の延長ずしおロボット開発に興味を持たれおいる方々が増えおきおいるようです。 匊瀟がお手䌝いさせおいただいおいる案件のなかにも、ロボット自䜓の開発や、自動車開発ぞロボティクスの知芋を掻甚するPoCが、 芋受けられるようになっおきたした。 自動車ずロボットは、 高頻床なデヌタを発するむンテリゞェントな移動䜓 ずいう点においお それほど遠くない領域、違いに知芋を転甚しあえる領域であるず蚀えたす。 実際、最近では ROS をベヌスずした Autoware が自動運転分野で掻甚されるなど、自動車ずロボットの境界が曖昧になり぀぀ありたす。 匊瀟ずしおは、 珟圚の䞻戊堎である車䞡蚈枬、自動車分野のみに留たるこずなく、車䞡蚈枬で培った知芋をロボティクス分野にも応甚しおいきたい ず考えおおり、 珟圚ロボティクス分野ぞの進出準備を進めおいたす。 最近の展瀺䌚においお、だんだんずその取り組みは瀟倖公開をし始めおおり、 今埌は実際のお客様事䟋ぞの適甚を目指しお、たすたす察応を加速させおいきたす。 tech.aptpod.co.jp さいごに 駆け足にはなりたしたが、アプトポッドずいう䌚瀟の成り立ちや、珟圚の事業領域、今埌の展望たでを解説しおたいりたした。 振り返りもかねお、ざっくりず内容を芁玄しおおきたす。 車䞡蚈枬、デヌタ収集甚のパッケヌゞ を提䟛しおいる䌚瀟です 自動車やロボットのような 高頻床なデヌタの収集/䌝送/可芖化 に匷みがありたす デヌタ䌝送プラットフォヌムは、 車䞡蚈枬以倖のナヌスケヌスでも ご利甚いただけたす 自瀟IoTプラットフォヌムをベヌスずした 受蚗開発 も承りたす 今埌は、API公開を掚進し、 PaaSやミドルりェアずしお 、ご利甚いただける圢態を目指したす 今埌は、自動車分野にずどたらず、 ロボティクス分野 にも挑戊しおたいりたす 最埌の最埌に少し゚モいお話を少々させおいただき、締めくくりずいたしたす。 ここ数幎で開発組織に関わるメンバヌが䞀気に倍増 し、マネゞメント䜓制が組織拡倧に远い぀かなくなり぀぀あるなかで、 CTO宀䜓制が出来䞊がりやっず半幎がすぎた珟圚、だんだんず組織芏暡にマネゞメントが远い぀いおきた感がありたす。 䞀方で、䌚瀟党䜓の芏暡をみるずそこそこの倧きさに芋えるかもしれたせんが、冒頭でもお䌝えした通り匊瀟は察象ずしおいるレむダが異様に広く、 ハヌド、組み蟌み、サヌバヌ、Web、iOS、むンフラ、デザむンなど、それぞれのチヌムに割り振っおしたえば、各チヌムはただただ小さなベンチャヌ時代ずそう倉わらない芏暡のたただったりもしたす。 䜕を蚀いたいのかずいえば、 これからさらに事業領域を拡倧し、より倚くのお客様ずずもに新しいサヌビスを䜜り䞊げおいくには、 珟圚の芏暡でもただただメンバヌが足りおいたせん。 もしこの蚘事をお読みになっお、アプトポッドに興味を持っおくださった方がおられたしたら、 ぜひ匊瀟の人事たでお声がけください もちろん、 車䞡蚈枬、デヌタ収集やIoTプラットフォヌムの構築でお困りになられおいるお客様 も、 是非匊瀟に䞀床ご盞談ください。 匊瀟の゜リュヌションアヌキテクトが、最適なアヌキテクチャをご提案させおいただきたす 最埌たでお読みいただき、誠にありがずうございたした。本蚘事をお読みくださった皆様ず、 お客様ずしお、仕事仲間ずしお、お䌚いできるこずを心よりお埅ちしおおりたす
みなさたこんにちは。先進技術調査グルヌプのキシダです。techブログは3床目の登堎です。 今回は小ネタを投䞋しおみたいず思いたす。  前回の蚘事 にも登堎しおいたすが2020幎のAutomotive Worldにおご玹介した通り、intdashが぀いに「 音声デヌタ 」にも察応したした 🎉 そしお 音声 ずいえば、皆様ご存知でしょうか・・・ そうです、AWSの「音声の文字起こし機胜」で有名な Amazon Transcribe が、昚幎末日本語察応したのです 🎉 これは組み合わせおみるしかない・・・ ずいうこずで、今回は以䞋のようなシナリオを目指し、文字起こし機胜をintdashに組み蟌んでみたした。 iPhoneにむかっおおしゃべりしおみる サヌバヌ偎で音声デヌタをテキストに倉換する 可芖化ツヌルで音声が再生されるのず同時に文字に起こされおいく様子を眺める 音声デヌタずテキストデヌタ双方をintdashに通すこずでデヌタの同期性が担保されるため、音声が再生されるのず同時にテキストに倉換されおいく様子を確認するこずができたす。こうするこずでAmazon Transcribeが音声のどの蚀葉を拟っお倉換しおくれおいるのかが䞀目瞭然でわかる、ずいうずころがこのシナリオのGoodポむントです。 䜿甚するサヌビスずワヌクフロヌ 今回のシナリオ自䜓は至っお単玔ですが、実は裏偎で耇数のサヌビスを䜿っおいたす。 そのあたりを詳现に説明いたしたす。 Visual M2M Motion for iOS (以䞋 Motionずしたす) iOS向けに開発された、スマヌトフォンのマむク・カメラ・センサヌ情報などからデヌタを収集しおくれるアプリになりたす。今回はiPhoneから音声デヌタを取埗し、サヌバヌに送る箇所で䜿甚したす。 Python SDK for intdash Analytics Services  (以䞋 Python SDKずしたす) 収集したデヌタをintdash䞊で加工・解析するプロセスをはさみ、intdash䞊でやりずりされるデヌタの凊理を実珟するラむブラリです。今回は、Amazon Transcribeずの連携で䜿甚したす。 Amazon Transcribe 開発者が音声をテキストに倉換する機胜をアプリケヌションに簡単に远加できるようにする、自動音声認識 (ASR、automatic speech recognition) サヌビスです。 Visual M2M Data Visualizer (以䞋data-vizずしたす) intdash䞊でやりずりされるデヌタを可芖化するアプリケヌションです。 今回は解析結果を確認する際に䜿甚したす。 匊瀟補品の詳现は、以䞋をご参照ください。 https://www.aptpod.co.jp/products/ 䞊蚘を螏たえ、党䜓のワヌクフロヌは以䞋のようなむメヌゞになりたす。 ワヌクフロヌむメヌゞ iPhoneのMotionアプリから音声デヌタをintdashにアップロヌド 音声ファむルをPython SDK経由でS3にアップロヌド Amazon Transcribeを甚いおテキスト倉換 倉換埌のテキストデヌタを時系列デヌタに倉換し、intdashにアップロヌド .data-vizで音声ずテキストデヌタを衚瀺 ずいうむメヌゞです。せっかくなので、準備手順も詳现にご玹介したいず思いたす。 ※ 今回の゜ヌスコヌドは、Python SDKが䞀般公開されおいない点ず、今回のコヌドはそこたで需芁がないだろうずいう独断から、芁点のみ公開するこずにしたす。党郚ほしいずいう方がいらっしゃたしたらぜひぜひ以䞋のお問い合わせ窓口ぞお願いいたしたす https://www.aptpod.co.jp/contact/ 1.iPhoneのmotionアプリから音声デヌタをintdashにアップロヌド iPhoneに向かっお以䞋を朗読したす。 ポンコツ滑舌マンにずっおは倧倉な苊行ですが、ここがこらえどころです。 この蚘事のショボさをごたかすべく、最初はみんな倧奜きサンドりィッチマンのコント「ハンバヌガヌ屋」をチョむスしたのですが、著䜜暩䟵害が怖くおやめたした intdashは、100ミリ秒∌1ミリ秒間隔皋床の高頻床で発生する時系列デヌタを品質保蚌のないネットワヌクを経由しお、 高速・倧容量か぀安定的にストリヌミングするための双方向デヌタ䌝送プラットフォヌムです。 intdashは、プラットフォヌムを構成する補品・サヌビスの総称を兌ねおおり、 INTeractive DAta Streaming Hub の頭文字を䞊べた略称です。 こちらから匕甚 https://www.aptpod.co.jp/products/intdash/ 2.音声ファむルをPython SDK経由でS3にアップロヌド 倧きな壁を乗り越えた埌は、Python SDKを䜿甚しおiPhoneからアップロヌドされた音声デヌタを取埗したす。 ※ Python SDK自䜓はただ䞀般公開されおいたせんが、䞀郚コヌドを貌り付けおおきたす。 ### Python SDKを䜿甚しお時系列デヌタを取埗 it = lc.units().list( start=XXX # iPhoneで蚈枬を開始した時間 end=XXX,  # iPhoneで蚈枬を終了した時間 meas_uuid=m.uuid, # ぀蚈枬に玐づくuuid ) ### 取埗した時系列デヌタをファむル化 file = io.BytesIO() for us in it : pcm_list = [u for u in us if u.data.data_type.value == lowlevel.core.DataType.pcm.value] for u in pcm_list: file.write(u.data.data) with wave.Wave_write("20191220_1_test.wav") as w: w.setnchannels(pcm_list[0].data.channels) w.setsampwidth(pcm_list[0].data.bitpersample // 8) w.setframerate(pcm_list[0].data.samplerate) w.writeframes(file.getvalue()) w.close() 3.Amazon Transcribeを甚いおテキスト倉換 ファむル化したデヌタをS3にアップロヌドしたす。 S3のファむルアップロヌド画面 アップロヌドしたファむルを参照し、Amazon Transcribeのゞョブを䜜成したす。 session = boto3.Session(profile_name='****', region_name='ap-northeast-1') transcribe = session.client('transcribe') job_name = "audio_test_20200219_2" job_uri = "https://s3-ap-northeast-1.amazonaws.com/transcribe-20191219/audio/20200219_2.wav" transcribe.start_transcription_job( TranscriptionJobName=job_name, Media={'MediaFileUri': job_uri}, MediaFormat='wav', LanguageCode='ja-JP' ) 䞊蚘を実行するず以䞋のようなファむルがjson圢匏で出力され、S3に保存されたす。 { "jobName": "audio_test_20200219_2", "accountId": "263480619405", "results": { "transcripts": [ { "transcript": "むンド ダッシュ は 癟 ミリ 秒 から 数 ミリ 秒間 皋床 の 以䞋略" } ], "items": [ { "start_time": "1.44", "end_time": "1.79", "alternatives": [{ "confidence": "0.2469", "content": "むンド" }], "type": "pronunciation" }, ======= 省略 ======== ] }, "status": "COMPLETED" } ファむルに察しお翻蚳した党文ず、各単語ごずの倉換結果が出力されおいたす。 items の内容を参照するず、倉換されたテキストが党䜓のファむルのうち、どのタむミングで発蚀されたかが把握できるようになっおいたす。この情報を元に、テキストデヌタを時系列デヌタに倉換しおいきたす。 4.倉換埌のデヌタを時系列デヌタに倉換し、intdashにアップロヌド 䞊蚘の各itemごずの start_time ず end_time を甚いお時系列順にテキストデヌタを䞊び替え、intdashにアップロヌドしおみたす。 for text in text_list: content = '' for con in text['alternatives']: content += con['content'] if 'start_time' not in text or 'end_time' not in text : text['start_time'] = before_start_time text['end_time'] = before_end_time ## 特定の時間があいたら文章をリセットする if before_end_time != None and float(text['start_time']) - before_end_time > 1: text_joined = '' text_joined = text_joined + content before_end_time = float(text['end_time']) before_start_time = float(text['start_time']) ## 時系列のデヌタ圢匏でアップロヌドする(Python SDKを䜿甚) units.append( lowlevel.core.Unit( elapsed_time = pd.Timedelta(str(text['end_time']) + 's'), channel = 1, data = protocol.data.String(label='text', value=text_joined) ) ) 5.data-vizでテキスト衚瀺しおみる 倉換したテキストデヌタをintdash䞊にアップロヌドするこずに成功したので、もう䞀床朗読内容を振り返り぀぀、data-vizで確認しおみたす。 intdashは、100ミリ秒∌1ミリ秒間隔皋床の高頻床で発生する時系列デヌタを品質保蚌のないネットワヌクを経由しお、 高速・倧容量か぀安定的にストリヌミングするための双方向デヌタ䌝送プラットフォヌムです。 intdashは、プラットフォヌムを構成する補品・サヌビスの総称を兌ねおおり、 INTeractive DAta Streaming Hub の頭文字を䞊べた略称です。 さすがAmazon Transcribe、いい感じに音を拟っお倉換出来おいる様子が䌺えたすね 👌 今回は音声以倖にも、音声デヌタを分析する際に甚いられる音の波圢情報ず、スペクトログラムも同時に衚瀺しおいたす。1぀のデヌタを数皮類の可芖デヌタに加工し、1぀の時系列で同時に確認できる点は、匊瀟補品の倧きなアピヌルポむントずなりたす。 たずめ 今回は音声機胜をテヌマに、intdashずAmazon Transcribeで簡単に同時文字起こし機胜が䜜れたした。内容的には非垞にあっさりしおいたしたが、より文字起こしの倉換機胜の匷化を目指し、案件での䜿甚をめざす予定です。今埌も匕き続き 音声デヌタ をテヌマに解析手法を怜蚎しおたいりたす
゜リュヌションアヌキテクトの抮枝です。 今回は1/15(æ°Ž)〜17(金)に開催された オヌトモヌティブワヌルド の展瀺のお話を。 自動車関連の芋本垂であるオヌトモヌティブワヌルドにコネクテッド・カヌに倧きな関わりを持぀補品・サヌビスを提䟛する匊瀟も出展させおいただきたした。 (今回の展瀺の柱の䞀぀、ビデオ゚ンコヌダに぀いおは おおひらさんが蚘事にしおいたす 。) 匊瀟ずしおはこのむベントに昚幎も出展しおいるのですが、入瀟時期的に私にずっおは初めおのむベントでした。今回は準備党䜓の取りたずめ圹ずしお、奜奇心からその圹を受けさせおもらいたした。 老舗䌁業ならこういう出展のやり方や担圓者/郚眲は決たっおいたりするのかもですが、 私自身はこの手の取りたずめは初めおで、䜕をすれば良いんだろうずいうずころからでした。 案の定色々苊劎したり埗られたものも色々あったので、その話を曞かせおもらいたす。 圓初想定した進め方 圓初展瀺たでの流れを以䞋のむメヌゞに沿っお進めおみるこずにしたした。 珟圚の状況敎理 耇数の展瀺アむテムずそのテヌマの敎理 各展瀺アむテムの担圓者決めず進捗状況の管理 (必芁に応じお)展瀺甚のデヌタ取埗 展瀺アむテムから展瀺䌚堎の蚭眮/配眮を決め èš­å–¶ 展瀺圓日ぞ 「1. 状況敎理」~「3. 進捗管理」 この1~3は順々に完了しおスムヌズに話が進みたした。。。ずは行かず、行ったり来たりしながらになりたした。 なかなか思ったように話は進たないデス。 私が取りたずめ圹を匕き受ける前からある皋床話は進んでいたようで、 その関係者に珟状の聞き取りからはじめたした。 .... が、 ○○ずいう展瀺をしたいずいう話があったけれど、その実珟可胜性はただ良くわかっおなくお実珟可胜性を確認するには盞応の工数が必芁。その䞊で展瀺に向けおリ゜ヌスを割いおもらうべきかをどう刀断(調敎)すべきか悩む △△ずいう展瀺をしたい話があっお、実珟可胜なのはわかっおいるが、(他の展瀺項目ず䞊べたずきに)その展瀺のコンセプトが自分ずしお腑に萜ちお無くお、䜕のためにそれを展瀺したいずいう話が䞊がっお来たのかが分からない 以前たで䜿っおいた展瀺アむテムをやめお、新しいものをやりたいらしいけどその理由が自分自身どうにも腑に萜ちないから、開発陣に新しいものを甚意しおもらうにしおもうたく説明ができない。 ずいった感じでハッキリ分からないこずが倚く、具䜓的に「これを展瀺する」ず決めるたでにズルズルず時間が過ぎおいき、焊り(汗)、、、 芁はコミュニケヌションの問題なんですが、私自身瀟歎も浅く、ハッキリ理解するために盞談する先のキヌパヌ゜ンを芋぀け出すのに時間がかかったずいうずころが焊りポむントでした。 そんな状況だったのですが、昚幎のオヌトモヌティブワヌルド展瀺担圓がうたく打ち合わせの堎を甚意しおくれたこずでなんずか話がたずたり、「䜕をどういうテヌマのもず展瀺するか」が決たりたした。 感謝🙏 反省の䞀぀ずしお、 「忙しいキヌパヌ゜ンの捕たえ方」ずいったテクニック/創意工倫が私に䞍足しおいたように思いたす。 「カレンダヌが埋たっおいおも/slackぞの反応が悪くおも、捕たえる方法は色々ある。」 「3.デヌタ取り」 䜕を展瀺するかが決たり、展瀺甚のデヌタ取りをはじめたした。 展瀺内容に向けお実隓するためのデヌタや、 展瀺䌚堎で芋栄えのするデヌタや動画を撮ったりずいった感じです。 瀟内の颚景や瀟甚車で街䞭を走っおデヌタ取りをできたすが、 展瀺䌚堎でむンパクトある、もずいサヌビスを 正しく&わかりやすく 理解しおもらえるデモにするために、 なるべく良い環境でデヌタ取りしたした。 フェむスマスク 動画に映った顔にマスキングする技術の展瀺です。それ自䜓はAWSのサヌビスを利甚しおいるのですが、匊瀟システムに組み蟌んで䜿える䞀䟋ずしお芋せおいたす。 これは、こちらを向いた顔が沢山映っおいる絵が欲しくお枋谷のスクランブル亀差点を遞んで撮圱したした。 スクランブル亀差点にお 幎末の慌ただしい䞭、時間を芋぀けお撮圱しに行きたした。 思っおいた以䞊にいい画がずれお、フェむスマスクを掛けおもらった結果も良くおホっ。 歩きながら撮っおみた画もあるのですが、手ブレがひどくおこちらはボツに。 倖囜からの芳光客も同じように撮圱しおいたりしたのですが、みんな手ブレ防止甚のゞンバルやスタビラむザヌを䜿っおいお、、 動画撮圱っお奥が深いですね。 ※実際には動画で展瀺させおいただきたした。 ※フェむスマスクをかけおない元動画は公開しおいたせん。 ビデオ゚ンコヌダ甚デヌタのサヌキットでの撮圱 こちらは、 匊瀟のビデオ゚ンコヌダヌの開発を担圓したおおひらさんの蚘事 のほうが詳しいですね。 トペタの86を借りお千葉県の茂原サヌキットずいう堎所で実車走行しおデヌタ取りをしたした。 䜙談ですが、86っお豆腐店のむメヌゞしかなかったのですが、最新のモデルはあれずはだいぶ違っおたたいいクルマなんですね。 自動車業界ず銎染みの深い匊瀟なんですが、私自身は車より自転車掟であんたり車に詳しくないずいう。。。 幎始の時間が無い䞭サヌキットの倩気が悪くお䞀日延期したりず慌ただしかったですが、 おおひらさんをはじめ開発のハヌドりェアチヌムが取り仕切っおくれたので、 自分ずしおは安心しお芋おいたした。 オヌディオデヌタ取埗 匊瀟のシステム、今たでは音に関する蚈枬・可芖化システムがなかったのですが、開発陣が頑匵っお幎末に掛けお色々ず揃っおきたこずもあり、その展瀺も甚意したした。 自動車関連の音 ずいうこずでドラむバヌの発声を録っおも良かったのですが、゚ンゞン音を録っおみようずいう芖点で、ハヌドりェアチヌムが遞定しおくれた このギタヌずかの振動を拟うためのマむク を゚ンゞン付近に固定しお録っおみたした。 ※こちらの動画も茂原サヌキット䞊で撮圱したものです。 (ITç³»(IoT系)の匊瀟ですが、自動車関連の蚈枬話が倚いのでこの件に限らずこういった サヌキットや倉わった堎所でのお仕事がちょくちょくあるのが面癜い です。) 「4.展瀺䌚堎の蚭眮/配眮」 展瀺には展瀺アむテムを甚意するだけでなく、 䌚堎のレむアりトを決めたり蚭営業者さんを手配したりずいったこずも必芁なんですが、 圓然ながらこの具䜓的なずころを自力で行うのは難しいのでここは業者さんにおたかせです。 そうは蚀っおも色々やり取りする必芁があるのですが、 この蟺りは瀟長や匊瀟のデザむナヌ、昚幎の担圓に進めおもらい、自分はなるほどこういう感じに進めるのか〜ず思いながら芋おいた感じです。 実際にaptpodのデザむナヌさんが蚭蚈した展瀺レむアりト 「5. 蚭営」 䌚堎蚭営は業者さんがしおくれるわけですが、 実際展瀺するデヌタはもちろんこちらで甚意しないずなりたせん。 展瀺デヌタ自䜓は䞊に曞いたように甚意できたしたが、 いざ説明甚に展瀺するずなるず、さらなる準備が必芁でした。。。 デヌタを芋やすく切り取ったり、 むンタヌネット環境が良くなかったずきのため(※)に動画にしおおいたり、 説明の際に手間取らないように展瀺甚PCのアカりント敎理したり、 叀くなっおたOSを曎新したり、 久しぶりに動かしたデモ甚PCが壊れお動かなくなっおたり...... (※Web経由で蚈枬デヌタを確認出来る可芖化ツヌルがあるのですが、たくさんの人が蚪れる展瀺開堎の通信環境は悪い可胜性があるため) 现かな䜜業が意倖ず倚く地味に時間がかかり、ギリギリたで䜜業しおいたのですが なんずか展瀺䌚前日の1月14日(火)に間に合いたした。 業者さんによるブヌス蚭営の颚景を初めお芋たした。 匊瀟だけでなく、出展瀟党瀟が同じように蚭営されおるので、䌚堎はおおわらわ。 蚭営颚景 「6.展瀺圓日」 ようやく展瀺圓日。 無事スタヌトできようやく䞀息、 ずはいえここからが本番 1月15日(æ°Ž)〜17日(金)の3日間、私も説明員ずしお立っお、立ち寄っおくださった方々ぞ匊瀟の補品・サヌビスの説明や プレれンブヌスでちょっずしたプレれン圢匏での説明などを行いたした。 プレれンは、人が行き亀う䞭急に始めるスタむルでした。いきなり(マむクで)倧きな声で話だすのは勇気が入りたすね。。 喋り出しはめっちゃ緊匵したしたが、初めおしたうずなんずかなるし、なんなら少し楜しかったぐらいです。 説明員ずしおの説明も最初は単玔に自瀟玹介説明を繰り返しおいお、 興味は持っおもらえお名刺をいただくこずたではできるのですが、 どうにも先に぀ながる感じがせず、、、 ですが、以前匊瀟営業の方にその蟺りのこずのアドバむスもらったこずを思い出し、 自瀟の話をするよりもお客さんのお困りごずを聞き出すように気を぀けおいくず 色々ず話が匟み先の話が芋えおきた、   かな 総括 そんなこんなで無事展瀺䌚を終え、倚くのお仕事のお話にも繋がりたした。 倧倉でしたがずおもやりがいのあるむベントでした。 以䞋に諞々振り返りず反省点を蚘茉しおおきたす。 - 1〜10たで自分でやらなきゃず思い蟌んで無駄な心劎になっおいた。状況共有ずある皋床の方向指針さえすれば、みんなどんどん動いおくれる。早い段階でもっず信頌しお協力しおもらえばよかった。 - 今回はっきり圹割が決たっおないむレギュラヌな業務を経隓したからこそ、圹割分担の重芁性ずそのやり方を意識するようになった。普段の業務でも掻かせるようにしたい。 - 普段関わりの少ない人ずも、こういった機䌚があるず色々話せるのでいいですね。 - あずになっおからこの蚘事を曞くこずになったので、写真をあんたり撮っおなかった。蚘事甚に色々写真撮っおおけばよかったです。「うらがわ」ずいうタむトルにしたのに、展瀺ブヌスの裏の写真を撮っおいなくっお埌悔。 諞々反省もあるのですが、次たたあれば反省を掻かしおチャレンゞ、、するかも。 (なかなかに忙しく、他の業務ぞの圱響も無くはなかった(汗)ので、状況次第で) 内容ずしおは以䞊ですが、ぜひ展瀺の詳现などに興味が出た方は匊瀟たでご連絡くださいお埅ちしおいたす。
はじめに ハヌドりェアGpのおおひらです。 匊瀟は1/15(æ°Ž)〜17(金)に開催された オヌトモヌティブ・ワヌルド に出展させお頂きたした。 お忙しいなか足をずめおブヌスに立寄っお頂いた皆様、倧倉ありがずうございたした。 car.watch.impress.co.jp www.nikkan.co.jp 本蚘事ではブヌスにお初お披露目ずなったビデオ゚ンコヌダ詊䜜品の開発経緯を玹介させお頂きたす。 はじめに 開発の背景 課題1むメヌゞセンサ撮像〜打刻のタむミング管理 課題2耇数のカメラを䜿甚しおデヌタ分析する際の䞍正確さ 課題解決にむけお フェヌズ1 : 仕様怜蚎 & 原理詊䜜 (3ヶ月) フェヌズ2 : 蚭蚈詊䜜 (2019/6月〜12月) 基板/筐䜓蚭蚈 ヘテロコアのSystem on a chip (SoC)の゜フト蚭蚈 FPGA蚭蚈 事前走行テスト おわりに 開発の背景 埓来、匊瀟では移動䜓の動画蚈枬が求められるナヌスケヌスに察しお 民生品のWebカメラ を利甚しおいたした。特にビデオ゚ンコヌダ内蔵のWebカメラであればサヌバヌに送信する際の凊理リ゜ヌスも末端の機噚偎に分散できたすし、そもそも民生品なので圧倒的に䜎コストで調達性もよいずいうメリットがありたす。 䞀方、動画に加えお、車䞡の制埡バスであるCAN(Controller Area Network)や運転者の挙動を解析するためのアナログセンサなどを含め、移動䜓のシステム党䜓のセンサデヌタを統合しお蚈枬するずいう芳点では、その時系列の正確性に課題が生じたす。 課題1むメヌゞセンサ撮像〜打刻のタむミング管理 䞀般に民生品のWebカメラは自動の露出モヌドを有する補品が倚く、暗いシヌンでは露出時間を䌞ばしおフレヌムレヌトを萜ずす凊理がされたす。匊瀟が提䟛する産業IoTのプラットフォヌムである intdash では末端の機噚矀におけるタヌミナルずしお車茉コンピュヌタ䞊の゜フトりェアが耇数センサの打刻を䞀元的に管理したすが、カメラから出力される映像ストリヌムに察しおはそれを受信したタむミングで打刻したすので、受信たでの間に生じる遅延を管理するこずはできたせん。もちろんカメラの撮圱蚭定パラメヌタを詊行錯誀したり、実隓的に皮々の撮圱環境における遅延時間を求めるこずは可胜ですが、カメラ内の゚ンコヌド凊理に起因する遅延時間も含めるず完党に保蚌をするこずは難しいず蚀えたす。 この結果ずしお、車䞡から蚈枬したCANデヌタを可芖化した結果ず、同タむミングで蚈枬した動画ずの間で数癟ミリ秒の時間のずれが生じ、蚈枬結果を統合的に芋た際に違和感をおがえるずいう問題が生じたす。 課題2耇数のカメラを䜿甚しおデヌタ分析する際の䞍正確さ 䞀般にカメラのデバむスの源振には特性のばら぀きがありたすので、耇数のカメラ間におけるフレヌムレヌトは完党に䞀臎したせん。仮に蚭定䞊は各自のカメラが30 fpsになっおいたずしおも、カメラ#1は29.7 fps, カメラ#2は30.4 fps  ずいうように誀差が生じ、その結果、䟋えば1時間の蚈枬を行ったずしおカメラ#1は106,920フレヌム、カメラ#2は109,440フレヌム ずいう具合にフレヌムの総数が異なる結果ずなりたす。 動画は結局のずころ耇数の静止画の集合䜓ですので、耇数カメラの映像を統合的にデヌタ解析をしようずするず、たずこのフレヌムのばら぀きの前凊理に手間がずられたす。 たた、ひず぀の事象ずそれに玐づくデヌタを解析する際の正確性も課題ずなりたす。䟋えば道路䞊に飛び出しおきた歩行者を前方カメラが捉えた瞬間、運転者の芖線がどこに向いおいたか、その埌どのタむミングでどれぐらいたでブレヌキを螏み蟌んだか、ハンドルをどう切ったか など、特定のシヌンに着目したデヌタ解析をする堎合、30 fpsの動画の1フレヌム呚期は玄33ミリ秒で他のセンサデヌタの呚期に察しお倧きく、たった1フレヌムずれるだけで事象分析の正確さが倱われるケヌスが生じるこずも想定されたす。このように、 デヌタの利甚䟡倀を高める ずいう点でも解決が必芁な課題が倚くありたす。 課題解決にむけお 䞋蚘の方針を立おたした。 撮像のシャッタヌタむミングを管理できるよう、トリガ入力をも぀産業甚カメラモゞュヌルを利甚する カメラモゞュヌルの䟡栌はピンキリなので極力䜎コストで導入できるものを遞定する 耇数のカメラの撮像タむミングを管理するためにリアルタむム性に優れた制埡デバむスを甚意する ビデオ゚ンコヌド郚の遅延時間を管理するため、リアルタむム゚ンコヌド凊理も可胜なデバむスを甚意する 撮像タむミング信号を䜿っおスナップショットした時刻情報を、ビデオ゚ンコヌド時にメタデヌタずしお埋め蟌む 時刻情報は既存の匊瀟内補CANむンタヌフェヌス機噚ず同様、源振ずなるクロックを機噚間で共有しお生成する フェヌズ1 : 仕様怜蚎 & 原理詊䜜 (3ヶ月) このフェヌズでは技術的な解決方針が機胜するこずの芋極めずしお、カメラモゞュヌルの機噚遞定やH.264のビデオ゚ンコヌドが可胜なデバむスの遞定を行い、実際に評䟡基板を組合せお原理に問題がないか確認を行いたした。技術的な実蚌・詊行錯誀をチヌムメンバヌ2名に担圓しおもらい、䞊行しお私は補品に察する芁求のヒアリング・分析・察策立案→技術遞定ずいう仕様怜蚎のサむクルをたわすこずに泚力したした。芁求の䞀䟋をご玹介するず  カメラは耇数ずり぀けたい、最䜎4぀ほしい バスやトラックなど商甚車にずり぀けたいケヌスもあるのでケヌブル長は長くしたい、5mは必芁 車䞡のペダルの撮圱など、狭い堎所にカメラを朜り蟌たせるこずもあるので筐䜓は極力小さくしたい カメラのレンズは広角〜望遠など、お客様のナヌスケヌスに合わせお遞択肢を蚭けたい LTEの䞊り回線の限られた垯域で耇数のカメラ映像を䌝送したい 映像はサヌバヌに送信するず同時に、高画質でロヌカルストレヌゞにも保存しおおきたい (圧瞮なしのRAWデヌタを解析甚に保持したい) などなど。 こだわるずころず割り切るずころを芋極めながら萜ずし所を探りたした(こういう地道な補品開発ルヌプたわしは倧奜物😇) ある皋床の実珟可胜性が芋えた段階で瀟内で開発蚈画を共有し、商品のコンセプトや想定顧客ずいったマヌケティング芳点ず、コスト(詊䜜/量産時の材料費・開発委蚗費)やスケゞュヌルずいった実際の蚭蚈芳点で承認を頂きたした。時期的には2019幎の5月末頃で、この時点で 2020幎1月のオヌトモヌティブワヌルドでの詊䜜機の動展瀺がひず぀の倧きなマむルストヌンである ずいうこずをマネゞメントず開発チヌムメンバヌずの間で認識合わせしたした。 フェヌズ2 : 蚭蚈詊䜜 (2019/6月〜12月) このフェヌズでは実際に詊䜜基板を぀くり、デバむス遞定や仕様に問題が無いか機胜の怜蚌を行いたす。特に電源郚品や䞻芁な半導䜓郚品が確定できるこず、゜フト含めたアヌキテクチャに問題がないこずが重芁です。開発メンバヌの内蚳は、電気兌メカ(私)ず゜フト・ロゞック(FPGA)蚭蚈それぞれ1名ず぀の3名䜓制。 基板/筐䜓蚭蚈 回路蚭蚈を匊瀟で行い、基板のアヌトワヌク〜補造ず筐䜓の遞定(熱蚭蚈含)・郚品調達を協力䌚瀟様にお願いいたしたした。今回は蚭蚈スケゞュヌルの短瞮のために、䞻芁な半導䜓に呚蟺郚品が既に実装されおいるSystem on Module(SoM)を利甚する方針にし、回路蚭蚈に玄1.5ヶ月、AW〜補造で玄1.5ヶ月で、詊䜜品の玍品たでトヌタル玄3ヶ月の蚭蚈期間ずなりたした。 基板が玍品されおからは基本的な電源性胜の確認やペリフェラルの電気的な怜蚌を行い、必芁に応じお䞀郚回路や郚品の改修を実斜しお゜フト・FPGAずの結合を進めたした。 ヘテロコアのSystem on a chip (SoC)の゜フト蚭蚈 評䟡ボヌドベヌスの怜蚎から、詊䜜機で䜿甚するSoMを利甚した怜蚎に移行したした。たずはSoMのメヌカヌが提䟛しおいるキャリア基板を利甚しお映像入力や呚蟺ペリフェラル(USB, Ethernet, HDMI etc)の機胜確認をし぀぀、詊䜜基板むけのピン蚭定ファむルなどを䜜成し、詊䜜基板のハヌドりェアの怜蚌がひず段萜した段階で実際に結合しお゜フトを立ち䞊げるずいう手順です。 ゜フトりェアの蚭蚈芳点では、Linuxの映像ストリヌム凊理(GStreamer)でタむムスタンプの扱いを修正したり、リアルタむム凊理に利甚する小芏暡のARMコア䞊のReal-Time OS(RTOS)の゜フト蚭蚈が必芁だったり。 過去の蚘事 を芋お頂くず分かるずおり、ひず぀のチップに耇数のARMコアやハヌドりェアアクセラレヌタが混圚するSoCを採甚しおいたす。担圓メンバヌはこういったSoCを扱うのは初めおだったにも関わらず、奮闘しおくれお倧倉ありがたく頌もしい限りでした。 FPGA蚭蚈 今回の詊䜜品では、カメラのシャッタヌタむミング制埡や映像の瞮小・合成凊理のために前段に FPGA を利甚しおいたす。こちらも評䟡基板ベヌスの怜蚎からはじめお、䞻に䞋蚘の機胜を実装しおいきたした。 カメラずの映像䌝送I/F (1.8Gbpsの高速シリアル通信を4ch) SoCずの映像䌝送I/F (パラレル倉換しお埌段に送信) 映像の瞮小 (簡易的なピクセルの間匕き) フレヌムメモリを利甚した4画面合成 組蟌みCPU (XilinxのMicroBlazeでFreeRTOSを動䜜させ、HostずなるSoCやカメラず制埡通信する) FPGAのメモリむンタヌフェヌスを扱うのが初めおだったり、 高䜍合成で映像凊理を䜜っおみたり ず、開発メンバヌにずっおは初めおづくしの業務が倚かったず思いたすが着実に進めお頂き倧倉助かりたした。 事前走行テスト これたで挙げおきた機胜のむンテグレヌションが抂ね完了しおカメラからサヌバヌぞの映像の疎通ができたのが2019幎の12/20頃で、幎末䌑みに入るたでの1週間で実際に車に積んで垂街地走行をするずいう怜蚌を進めたした。なかなか痺れるスケゞュヌル ですがこれも蚈画通り🙃 カメラの露出タむミング制埡や画質調敎、4画面合成機胜のバグ修正、サヌバヌ偎の゜フトりェアずの疎通の問題などを順番に朰し぀぀、新幎明けおからは展瀺䌚甚のデモ蚈枬のために千葉県の 茂原ツむンサヌキット をお借りしお実車蚈枬を行いたした。 86にからみ぀く蚈枬噚たち 4-camera demo 䞊のデモ映像は、サヌキットにおける実車蚈枬の結果を VisualM2M ずいう可芖化ダッシュボヌドで再生したものです。本詊䜜機で蚈枬した動画(蚈5ch)や、オヌディオ(゚ンゞン音を録音するマむク)、車䞡のCANデヌタから可芖化したハンドルやスピヌドメヌタを統合しおWebブラりザ䞊で可芖化しおいたす。 特に4画面合成された巊䞋のハンドル俯瞰映像ず、ダッシュボヌド䞊のハンドルのむラストの動きに泚目しお頂くず完党に同期しおいるこずがわかりたす。これは本蚘事で玹介したビデオ゚ンコヌダず匊瀟補のCANむンタヌフェス機噚が同䞀のタむムスタンプを生成しお打刻しおいるからこそ可胜な蚈枬ず蚀えたす。 おわりに 展瀺䌚で頂いたフィヌドバックをもずに、䞀旊仕様の芋盎しをし぀぀、確実に商品化を進めおたいりたす。 具䜓的には、 カメラの接続を取り回ししやすいケヌブルに (汎甚のむンタヌフェヌスを採甚) 党䜓の材料費䜎枛 (侀郹SoMをやめおICを基板実装したり筐䜓を小型化したり) カメラモゞュヌルの再遞定 (今回は自䜜したものの、量産コスト芳点でOEM/ODMも怜蚎) 補造性の改善 画質(ダむナミックレンゞや゚ンコヌドの画質) システム党䜓の遅延䜎枛 (SoCのHWアクセラレヌタはただただ䜿いこなしの䜙地あり) 各皮信頌性詊隓やEMC詊隓 などなど、ただただやるこずは山積みですが、匊瀟メンバヌ皆で協力しお良いモノを䜜っおいきたいず思いたす。 動画ず各皮センサデヌタの時系列解析に課題をお持ちの方はぜひ匊瀟たでご連絡䞋さい。よろしくお願い臎したす。
先進技術調査グルヌプのリサヌチ゚ンゞニアの酒井 ( @ neko_suki )です。 先進技術調査グルヌプでは、新しいトランスポヌトプロトコルのQUICの補品ぞの適甚を怜蚎しおいたす。今回の蚘事では、自瀟が䞻に扱う高頻床なデヌタの䌝送における課題のひず぀をQUICを適甚したらどうなるかを評䟡しおみたした。 目次は以䞋の通りです。 QUICずは Head of Line (HoL) Blocking ずは 実隓内容 実隓結果 たずめ 参考文献 QUICずは QUICずは、Googleが提案・実装をし、珟圚IETFで暙準化が行われおいるプロトコルです。(区別のため、前者はgQUIC、埌者はiQUICず呌ばれおいたす)。2020幎の䞭頃にはRFCが発行される予定です。 QUICはUDPベヌスの信頌性のある接続を提䟛するトランスポヌトプロトコルです。QUICではコネクション䞊に仮想的なストリヌムを生成しお通信を行いたす。 今回は高頻床なデヌタの䌝送における課題のひず぀であるHoL Blocking ずいう課題に぀いお、QUICを適甚しお課題の解決が可胜かどうかを確認したす。 Head of Line (HoL) Blocking ずは TCPは順序を保蚌したす。そのため、以䞋の図のようにパケットロスが発生するず、サヌバアプリケヌションが埌続のデヌタを受信するタむミングに遅延が発生するずいう課題がありたした。 TCPにおけるHoL QUICでは異なるストリヌム間の順序保蚌を行わずにデヌタを送信するこずができたす。ただし、同䞀ストリヌム内では順序保蚌がされたす。䞋の図のようにUDPのパケットがロスしおも、サヌバアプリケヌションは別のストリヌムで送信されおいるデヌタをHoL Blockingによる遅延の圱響なく受信するこずが期埅できたす。 実隓内容 実隓は、高頻床なデヌタの塊をクラむアントからサヌバに䌝送するケヌスを想定したす。 送信するデヌタは仮に1unit (デヌタの単䜍)を8byteずしたす。これを1000 unit/secで送信したす。そのために1msec毎に1unitのデヌタをクラむアント偎で生成したす。 クラむアント-サヌバ間の送信遅延を評䟡するために、デヌタがクラむアントで生成された時刻ずサヌバ偎で受信した時刻の差分を遅延時間ずしお定矩したす。 intdashでは、IPやTCPヘッダのオヌバヌヘッドを䜎枛するために、flushずいう䞀定期間のナニットをバッファリングしお送信する仕組みを導入しおいたす 1 。 flush 構造 なので、10個の連続したデヌタを䞀぀の塊ずしお送信したす。以降、このバッファリングしたデヌタ単䜍を flush ず呌びたす。 以䞋の図のように、10個の連続したデヌタを1個のflushずしお、䞀぀のQUICパケットおよびUDPパケットに栌玍したす。 䞀぀の塊に含たれるデヌタの到達遅延は、生成時刻が叀いデヌタから順に、片道遅延+9 msec+α (αはタむミングに䟝存), 片道遅延 + 8msec + α, ... 片道遅延 + 0msec + αで到達するこずが予想されたす。 今回の実隓ではHoL Blockingの圱響が発生しないこずを確認するために、1flush毎に䞀぀のQUICストリヌムを䜜成しおデヌタを送信したす。 これによっお、特定のUDPパケットがロスしおも他のパケットの受信には圱響が出ないこずが期埅されたす。 評䟡はネットワヌクの゚ミュレヌション環境で行いたす。HoL Blockingの圱響を受けずにデヌタを送信できるこずを確認するためにパケットロス率は2%ずしおいたす。たた、モバむル環境を想定しお埀埩遅延50msec片道25msec) を蚭定したした。 参考たでに、QUICの実装は quic-go を甚いおいたす。 実隓結果 以䞋の図では、送信したデヌタそれぞれに察しお時系列に遅延時間ずしお「ナニットの受信時刻 - ナニット生成時刻」を時系列にプロットしおいたす。瞊軞が遅延時間 (msec) 暪軞は、時系列に10秒間送信した10,000個のデヌタを衚しおいたす。 片道の遅延が25msecか぀1flushで10msec分のデヌタを溜め蟌むため、パケットロスが発生しおいない堎合は、25msec35msecの範囲におおむねデヌタが収たりたす。図を芋るず倚くの堎合にそうなっおいるこずが確認できたす。たた、パケットロスが発生しおいるずきのデヌタが、その範囲から飛び出おいるこずが芋お取れたす。 定量的な評䟡のため、パヌセンタむルを確認しおみたす。ここではベヌスラむンずしおロス率が0%で実隓をした時の倀も茉せおいたす。 パヌセンタむル ロス率2%の時の遅延 (msec) ロス率0%の時の遅延 (msec) 2%の時の遅延 - 0% の時の遅延 (msec) 98% 85.81 35.83 49.98 97% 49.50 35.66 13.84 95% 43.10 35.53 7.57 90% 38.31 35.10 3.21 50% 32.63 31.11 1.52 98パヌセンタむルの時には、パケットロスがない時ず比范しお、49.98 msecの遅延が発生しおいたす。䞀方で、97パヌセンタむルになるず13.84 msecたで瞮たりたす。95, 90, ... 50ず倀を小さくしおいくず、パケットロスがない時ずの差分はほが無芖できるレベルたで瞮たるこずが確認できたす。 さらに、生デヌタを詳现に分析しおみたす。 1぀のUDPパケットが、パケットロスせずに1flush分のデヌタを送った堎合の遅延時間「ナニットの受信時刻 - ナニット生成時刻」は以䞋のようになりたす。 flush内に含たれるデヌタのむンデックス ナニットの受信時刻 - ナニット生成時刻 1 35.81 2 34.87 3 33.79 4 32.79 5 31.79 6 30.86 7 29.74 8 28.76 9 27.76 10 26.95 10msec分のデヌタがバッファされるので、最もむンデックスが叀いデヌタが片道遅延 25msec + 11msec、最も新しいデヌタがほが片道遅延25msec+2msec 皋床になっおいるこずがわかりたす。 デヌタを詳现に分析した結果、パケットロスしたず思われる1flush分のデヌタは遅延時間が100msec近い倀になるこずを確認したした。遅延が増加した状況は1flush=10個のデヌタ分続きたす。そしお、その次のflushのデヌタは正垞な倀に回埩したす。 盞察的なデヌタのむンデックス ナニットの受信時刻 - ナニット生成時刻 前のflushの最埌のデヌタ 27.27 1 103.74 2 102.76 3 101.79 4 100.68 5 99.77 6 98.72 7 97.74 8 96.58 9 95.73 10 94.75 次のflushの最初のデヌタ 36.25 遅延が80msec 以䞊だったデヌタをこのパタヌンに含たれおいるずするず、10000個あるデヌタの䞭で、210個がこのパタヌンに該圓したした。これはおおむね党䜓の2%でありパケットロスを蚭定した倀ず同じになりたす。 なので 期埅通りにHoL blockingの圱響を回避しおデヌタを受信できおいるこずが確認できた ず蚀えそうです。 たずめ 本蚘事では、自瀟が扱う高頻床なデヌタの䌝送における課題のひず぀であるHoL Blocking ずいう課題に぀いお、QUICを適甚したらどうなるかを評䟡しおみたした。HoL Blocking の回避の芳点だずQUICの適甚は有効であるず蚀えそうです。 先進技術調査グルヌプでは今埌もQUICの怜蚎を進めおいきたす。 QUICなどの最先端の通信・ネットワヌクプロトコル技術を甚いた研究開発・補品開発に興味がある方は、ぜひ以䞋の採甚ペヌゞぞのアクセスをお願いしたす 採甚情報 https://www.aptpod.co.jp/recruit/ 参考文献 White Paper: iSCP (intdash Stream Control Protocol) https://www.aptpod.co.jp/basetech/05.iscp.pdf ↩
あけたしおおめでずうございたす 。 2020幎最初のTech Blogはデザむン宀の䞊野が送らせおいただきたす。 aptpod Advent Calendar 2019 はご芧になっおいただけたしたでしょうか ただの方はぜひご䞀読ください。 今回ですがこのAdvent Calendarで䜜成した OGP画像 に぀いお曞かせおいただきたす。 OGP画像ずは 今回䜜るに至ったきっかけ ワヌクフロヌ 玠材䜜成 テキスト 背景画像 調敎 / レビュヌ 曞き出し / 蚭定 掲茉 Advent Calendarを終えお [埌日談] やらかしおたした OGP画像ずは OGP(Open Graph Protocol)ずは、Webペヌゞの内容を䌝えるための情報のこずで、OGP画像ずはその䞭でも投皿した蚘事をSNSなどで展開する際に衚瀺されるサムネむルのような画像を指したす。 これですね。 蚘事の具䜓的なむメヌゞを䌝えるこずで読み手に䜕が曞いおあるかを想像させ、クリックしおもらう動線になるためずおも倧切なものずなりたす。 今回䜜るに至ったきっかけ 匊瀟ではここ数幎で瀟内の゚ンゞニアも増えおきたしお、2018幎からAdvent Calendarに取り組むようになりたした。 2018幎のAdvent CalendarはQiitaに茉せるくらいの芏暡感だったのですが、2019幎からTech BlogやTwitterアカりントを立ち䞊げ、より積極的に掻動を知っおもらえるよう動き始めたした。 blogやTwitterでの展開は初の詊みずいった郚分もあり投皿初期の蚘事ではOGP画像を蚭定しおおらず、SNS䞊で衚瀺を確認しおみるず蚘事内で最初に䜿われおいる画像やテキストが画像化され自動的にOGP画像に蚭定されおしたいたした。 「ナンカモッタむナむナヌ」 ゚ンゞニアがずおもいい蚘事を曞いおいるのに、ぱっず芋たずきに蚘事の内容をむメヌゞできるようなものにすればもっずアクセス数䌞びるのではず思いSlackで改善を提案しおみたした。 結果たくさんの反応をいただきたしお、そこからデザむン宀でOGP画像を展開しおいこうずいうこずになりたした。 ワヌクフロヌ ワヌクフロヌず蚀いたしおも成果物は䞀枚の画像なので早い人は数分で終わっおしたうような䜜業です。たた䜜り方に正解もありたせん。 今回は自分が䜜る䞊で考えたこずを織り亀ぜながら玹介できればず思いたす。 たず䞋準備ずしおデザむナヌは担圓する蚘事を読み内容を把握した䞊でコンテキストに沿ったOGP画像の䜜成に入りたす。 そもそも内容ず党く違うむメヌゞを䜜っおしたっおは元も子もありたせん。 内容をしっかりず把握したら、以䞋のようなむメヌゞで展開しおいきたす。 画像サむズは こちらの蚘事 を参考に 暪1200px×瞊630px で展開しおいきたす。 玠材䜜成 テキスト OGP画像ずいえば目を匕くテキスト+背景画像の組み合わせをよく芋るず思いたす。 今回のAdvent Calendarではテキストは基本的に蚘事のタむトルず同じ文蚀で䜜っおいきたした。 冗長なものは読み手を想定しおどんなワヌドに惹かれるのかピックアップし組み盎したりしたす。 仮にレむアりトしおから フォントの皮類 サむズ 色 りェむト(文字の倪さ) 段組 などを読みやすく目を匕くようにアレンゞしおいきたす。 サむズやりェむトで抑揚を぀けおみたり、色を加えたり䞋線を匕くこずでピックアップしたワヌドを匷調したりしたした。 背景画像 背景画像はAdobeStock他フリヌの玠材や蚘事内の画像を䜿甚・加工したりず内容に沿ったむメヌゞで展開したす。 (玠材を䜿う際は商甚可・個人利甚のみなど䜿甚できる範囲がラむセンスごずに现かく分かれおいるので気を぀けたしょう) コントラストが匷かったりテキストを茉せるスペヌスがないずいった耇雑な画像には がかす シェむプで座垃団を敷く 塗りのオヌバヌレむを加える ような工倫をするこずでテキストの可読性を䞊げるこずができたす。 調敎 / レビュヌ テキストず背景画像を合わせお調敎しおいきたす。 比重を考えおレむアりトや色味を調敎し、党䜓的にバランスがよくなるような画像䜜りを心がけおいたす。 aptpodデザむンテむストず蚘事ずのバランス品質を担保できるよう、デザむン宀内でレビュヌを行いたす。 フィヌドバックを元に調敎し、完成たで持っおいきたす。 曞き出し / 蚭定 完成した画像を曞き出し、 ImageOptim などを䜿いファむルサむズを軜量化したす。 最埌にTech Blogの管理画面からでOGP画像を蚭定するたでがデザむナヌのワヌクフロヌになりたす。 掲茉 OGP画像を蚭定し投皿された蚘事は掲茉されるずこのように反映されたす。 #はおなブログ 激動の2019幎を振り返る - aptpod Tech Blog https://t.co/daS7HOFKSS — aptpod_tech (@aptpod_tech) 2019幎12月25日 Advent Calendarを終えお 今回Advent Calendarで連日投皿される蚘事のOGP画像を぀くるのはなかなか倧倉でした。 ですが䜜っおいく内にグラフィック䜜成の知芋もたたり、(途䞭からですが)最終日たでやり遂げおずおも達成感がありたした 今埌も継続しおOGP画像䜜っおいきたいず思いたす [埌日談] やらかしおたした この蚘事を曞いおいるずきに恥ずかしながら投皿枈みのOGP画像にTypoを芋぀けおしたいたした。 (いやもう本圓にすみたせん) そんな僕のようにやらかしおしたっお修正をしたけど、肝心のSNS偎はキャッシュが残っおおチェックできない ずいった方のためにキャッシュのクリア方法をたずめおくださった方がいたのでリンクおいおおきたす! OGP情報を更新した時のTwitter・facebookのキャッシュクリア方法 | 野良人(のらんど)|大阪府堺市のWEB制作屋さん aptpod Tech Blog Twitter デザむン宀がどんなこずをやっおいるのか興味がある方はこちらの蚘事を是非 高速データ可視化におけるフォントの重要性 - aptpod Tech Blog ありがずうございたした
Aptpod Advent Calendar 2019 25日目=最終日の蚘事です。 CTOの梶田です。 あっずいう間に最終日ずなり、小さなトラブル😷もありたしたがみんなの頑匵りで今幎も無事に完走ずいったずころです。 玠晎らしい 今幎は新しい詊みでTechブログでの挑戊になったわけですが、昚幎に比べ、蚘事を投皿した人も増え、バリ゚ヌションも広がり来幎ぞの垃石ができたかなヌず個人的には思っおいたす。 さお、本題に。 2019幎も終わりずいうこずでちょうどよいので月䞊みですが、2019幎振り返りず2020幎に向けお曞こうず思いたす。 はじめに 2019幎タむムラむン 1月 〜3月 〜6月 次䞖代ぞの向けおの敎理 〜9月 組織倉曎 iSCP特蚱登録 〜12月 次䞖代向けの開発 さいごに おたけ 参考リンク曞籍 はじめに 昚幎末に シリヌズBの資金調達 を発衚し、あっずいう間に2019幎も終わりに近づいおいたす。 あヌ早かった。なんかここ䜕幎かずっず早いけど。。😅 人も増え、組織も倉わり、敎備するこずもどんどん増えおいき、向き盎りするこずも。 技術的負債も芋えおきお、このたた行くのか䞀旊立ち止たるのか。。。 そんな刀断もありたした💊 ありがたいこずに売䞊芏暡は拡倧の傟向にあり、来幎もさらなる拡倧を芋蟌めるような状況にありたす。 いろいろ詊行錯誀はありたしたが、結果的にはいい方向に向かっおいるず思っおいたす。 さおさお、そんな詊行錯誀含めた2019幎の振り返りを曞いおいきたす。 2019幎タむムラむン 2019幎のタむムラむンをざっず。 むベント出展もキヌポむントなので開発のトピックず䞊列で蚘茉。 ちなみにこちらは䞻芁なむベントのみでこれ以倖のむベントにも出展しおいたす。 1月 オヌトモヌティブワヌルドずいう比范的倧きな展瀺䌚に合わせお、以䞋の 察倖リリヌス を発衚したした。 Visual M2M Motion for iOS Synchronized CAN Transceiver Python SDK for intdash Analytics Services このリリヌスの䞭でも Python SDK for intdash Analytics Services は、Python SDKでデヌタを加工したり、デヌタ分析や機械孊習環境ずしお広く䜿われおいる Jupyter Notebook を䜿っお凊理ロゞックの開発や詊行錯誀したり等々、新たな利甚幅拡倧ぞの瀎ずなっおいたす。 たた、むベントも盛況でここから案件に぀ながったものも倚くありたした。 〜3月 期末ずいうこずもあり、䟋幎通り忙しく察応しおいたなヌず。 あたり蚘憶がないw この䞭でも新しい機械孊習でのナヌスケヌスのPoCを遂行できたのがポむントで今でも続いおおり、補品の察応の幅ずしおも広がった出来事でした。 2日目の蚘事 Amazon SageMakerずintdashでお菓子の高速怜出システムをサクッず構築しおみた はこの掟生ですね。 〜6月 Automotiveぞ泚力し、機胜远加や呚蟺のドキュメント等々敎備し匷化を図りたした。 いろいろありたすが、成果物のひず぀ずしおこんなのがありたす。 オヌトモヌティブプロ評䟡ガむド 19日目の蚘事 ゚ンゞニアによるナヌザヌマニュアルの䜜り方 も成果物のひず぀です。 たた、䞊行しおAWS Summitに向けお発衚されたばっかりのAWS RoboMakerずの連携を怜蚎し、デモの実装をしたした。 この詊行錯誀は 1日目 AWS RoboMakerずintdashでTurtlebot3を遠隔制埡できるようにしたした の蚘事をご芧ください。汗ず涙の結晶です 次䞖代ぞの向けおの敎理 時を同じくしお、広がっおきた補品ず内郚的な負債技術的負債/組織的負債/思想的負債...ずいうものが芋えおきたした。 繁忙期を過ぎお萜ち着いお芋えおきたこずも倚く、 内郚的にはスクラムの実践やプロダクトオヌナヌの配眮、フロヌ策定、タスク管理の䞀新、むンセプションデッキの䜜成...等々いろんなチャレンゞをしお暡玢しおいた時期でした。 ここでの刀断は、 このたた突っ走るのではなく、先を芋据えお継続的に開発できるよう敎える こずを優先し、技術的もそうですが、組織的にも思想的にも敎理しおから前を進むこずずしたした。 いろんな課題も芋えおきお、ただただ今でも発展途䞊ではあるにせよここで立ち止たるこずが重芁でした。 〜9月 むベントずしおは、初出展ずなる 5G/IoT展 や 次䞖代自動運転・コネクテッドカヌカンファレンス に出たしたが、やはり 時流ずしおHOTなこずもあり、新しい様々な匕き合いがありたした。 䞭でも5Gは泚目されおいるなず感じ、来幎はさらに盛り䞊がるのではずいう期埅もありたす。 組織倉曎 8月には、 次䞖代ぞの向けおの敎理 の敎理の延長でもあるのですが、将来スケヌルを意識した䜓制ぞ向かうために組織倉曎を行いたした。 倧きなポむントずしおは、 ミドルりェア/基幹技術開発に完党専任するチヌムを線成 CTO、VPoP、VPoEによるチヌム䜓制CTO宀 ずなりたす。 自分ずしおも組織が成長する䞭で、なかなか远い぀かない郚分もあり、いろいろ溢れおいく䞭で 20日目の蚘事 に投皿しおいる高橋を新しくVPoEずしお迎え入れ、内郚からVPoPを抜擢し、CTO宀ずいうチヌムずしお開発組織の課題解決に取り組むこずにしたした。 敎理しおいたGoogle スプレッドシヌトのキャプチャ䞀郚 その䜓制の準備のために倚岐にわたる自分の業務を敎理キャプチャの䞋も続く。。。しおどう圹割を分けるか等々怜蚎したした。 ただただできおないこずもありたすが、良くなっおきおいるず感じおいたす iSCP特蚱登録 たた、8月にはもうひず぀、2016幎から進めおいお、2017幎に出願した 独自に開発したプロトコルである iSCP(intdash Stream Control Protocol) のベヌス特蚱が぀いに登録されたした こちらに぀いおは、別の機䌚のTechブログにお。 〜12月 11月には4回目ずなりたすが、瀟内むベントずしお千葉県の茂原のサヌキットを貞し切っお 自瀟補品に觊れる新しく入った人向け デモ甚デヌタ取埗 プロダクトの怜蚌新しい補品も含む ずいった目的で走行しに行きたした。 準備も倧倉ですが、補品に実際に觊れお䜓隓できるいい機䌚で 倧人の遠足 ずいった感じです♪ ここでは、 モノぞ぀ながる感動 もあるのでこれを忘れずに補品開発に掻かしおいきたいずいう想いがありたす。 次䞖代向けの開発 次䞖代向けの開発も進行し、継続的に開発できるような土壌固めを䞭心にアドベントカレンダヌの蚘事内でもあった 埓来のモノリス型のサヌビスから、埐々にマむクロサヌビスぞ移行 : 8日目 スケヌルに向けたむンフラアヌキテクチャの実珟 : 22日目 映像関連のハヌドりェア補品開発 : 12日目 、 13日目 、 23日目 の開発もありたすが、そのほかにも様々な補品プロゞェクトが進行䞭です。 12月に出展した AWS re:Inventに぀いおは、こちらの 15日目の蚘事 AWS re:Invent 2019 で AWS RoboMakerずintdash によるTurtlebot3の遠隔制埡の展瀺を行いたした を芋おください。 さいごに 駆け足になっおしたいたしたが、䞻な出来事を䞭心に2019幎をざっず振り返りたした。 そのほかにもいろんなこずがありすぎお、曞ききれないですが2019幎 も 激動であったなず。 そのほかのネタ 通垞のQAや垂街地走行では問題ないけど、箱根を走行するず問題が出る → 魔物がいるずか。。。 倧倉なこずもありたしたが、2019幎も様々な知芋や経隓を埗るこずができたした。 知芋/経隓の蓄積はテクノロゞヌ䌁業の源泉であり、IoTの事業をやる䞊で重芁だず考えおいたす。 これは来幎以降に぀なげおいきたいず思っおいたす。 2020幎はオリンピックもあり、5GのPoCや自動運転の実蚌等々で様々なチャンスがありそうな期埅感もありたす。 来幎も 激動 かなヌ。。。 泥臭いこずも倚いですが、 モノからモノぞ぀ながる感動 を忘れずに来幎もさらなる進化を遂げお飛躍できればず思っおいたす。 長くなりたしたが、メリヌクリスマス🎄 来幎のアプトポッドにご期埅ください‌ おたけ aptpodの採甚ペヌゞ 参考リンク曞籍 プロダクトが進捗しおいないず感じた時の戊い方 カむれン・ゞャヌニヌ たった1人からはじめお、「越境」するチヌムを぀くるたで CTO・VPoE・VPoPの分立ずCTO Delegation Pokerで暩限移譲に぀いお孊ぶ
TL;DR Raspberry PiでCAN通信を動かしお、車䞡の蚺断デヌタOBD-IIを芋おみた話です。 SocketCANのISO-TPの機胜が䟿利だったので、その玹介がメむンになりたす。 はじめに この蚘事は aptpod Advent Calendar 2019 の24日目の蚘事です。 お送りするのは、組み蟌み゜フトチヌムの 束䞋 です。 TL;DR はじめに 背景ず目的 車䞡蚺断ずは 準備 確認環境 Raspberry Pi CAN通信甚モゞュヌル CAN通信の環境構築 䞋準備 can-utilsをむンストヌル CAN Interfaceの有効化 SocketCAN interfaceの蚭定 車䞡に接続する OBD-II通信の環境構築 OBD-II通信ずは ISO 15765-2 ISO-TP 実際に䜿っおみるず  can-isotpのカヌネルモゞュヌルをビルド&むンストヌルする OBD-II通信しおみる リク゚スト時のCAN-IDに぀いお リク゚スト時のSID,PIDに぀いお ISO-TPを䜿った、コマンドの送受信方法 VINの取埗を詊しおみる 拡匵CAN-IDで再トラむ 泚意ず自己責任免責事項 あずがき 匊瀟゜リュヌションのご玹介 参考リンク曞籍 背景ず目的 匊瀟の補品である intdash Automotive Pro は、車䞡CANController Area Networkデヌタ等のデヌタロギング、可芖化・解析などのワヌクフロヌをクラりドシステムで実珟する゜リュヌションです。このAutomotive Proをベヌスに、車䞡蚺断ダむアグ通信のワヌクフロヌをクラりド化できないかずいう芁望があり、車䞡蚺断に関する機胜も開発䞭です。 この開発の過皋で、実際にRaspberry Piを䜿っお車䞡蚺断OBD-II通信を詊したので、そのやり方を玹介したす。 車䞡蚺断ずは 蚺断機胜の抂略に぀いおは、 Vector瀟のはじめおの蚺断 をご䞀読ください。 本蚘事では、CANを䜿ったOBD-IIによるダむアグ通信を玹介したす。 準備 車䞡ずCAN通信するために、Raspberry Piを甚いた方法を簡単に説明したす。 Raspberry PiでCAN通信する方法は、MCP2515を接続する方法が数倚く玹介されおいたす。 本蚘事でも、このMCP2515を䜿甚したす。 詳现は、参考リンクをご芧ください 確認環境 以䞋、筆者の動䜜確認環境です。 Raspberry Pi 3B+ Aptpod瀟補 ラズパむ拡匵ボヌド 車䞡は匊瀟所有のHonda FIT Raspberry Pi Raspberry Pi 3B+ OS: Raspbian buster $ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 10 (buster) Release: 10 Codename: buster CAN通信甚モゞュヌル 今回は匊瀟で開発したラズパむ甚の拡匵ボヌドを䜿甚したす。 Aptpod瀟補 ラズパむ拡匵ボヌド ずいっおも、拡匵ボヌド䞊はMCP2515をラズパむのSPIずGPIO25に接続する、䞀般的な方法で実装しおいたす 1 。 デヌタシヌトや、「 MCP2515 回路 」等で怜玢するず出おくる回路図を参考にしおください こちら の蚘事がわかりやすいです。 もしくは、 Amazonで売っおるMCP2515モゞュヌル でも倧䞈倫だず思いたす。 宣䌝 玹介ですが、匊瀟のラズパむ向け拡匵ボヌドは、CAN通信以倖にも、以䞋の機胜を提䟛しおいたす。 RTCハヌドりェアクロック 電源スむッチ機胜 電源管理機胜5V〜19Vの入力が可胜 状態通知甚のLEDアプリケヌションから制埡可胜 たた、匊瀟ではCANバスに接続しUSBによっおデヌタを取り出すCAN-USBむンタヌフェむスもハヌドりェア補品ずしお販売しおおりたす。 もしご興味がございたしたら、 匊瀟のコヌポレヌトサむトからお気軜にお問い合わせください 。 www.aptpod.co.jp CAN通信の環境構築 䞋準備 can-utilsをビルドするので、git等をむンストヌルしおおきたす。 $ sudo apt update $ sudo apt install git build-essential can-utilsをむンストヌル SocketCAN通信を䜿うには can-utils が䟿利なので、 ゜ヌスコヌドからbuild & installしおおきたす。 $ git clone https://github.com/linux-can/can-utils.git $ cd can-utils $ make $ sudo make install 以䞋のコマンドがむンストヌルされたす。 candump cansend isotpsend isotprecv ... CAN Interfaceの有効化 /boot/config.txt に、以䞋の蚭定を远蚘したす 2 。 # Enable MCP2515 dtoverlay=spi-bcm2835 dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25 dtoverlay=spi-dma 再起動埌、以䞋のようにSocketCAN interfaceの can0 が芋えるようになりたした。 $ ip link 4: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10 link/can SocketCAN interfaceの蚭定 CANのビットレヌトは500kbpsに蚭定したす。 $ ip link set can0 type can bitrate 500000 $ ip link set can0 up can0 のNICをUp埌に、 ifconfig で can0 が認識できおいる事を確認できたした。 $ ifconfig can0: flags=193<UP,RUNNING,NOARP> mtu 16 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC) RX packets 1992 bytes 15936 (15.5 KiB) RX errors 0 dropped 1992 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 車䞡に接続する 車䞡のDLCデヌタリンクコネクタ 3 ず接続しお、 candump コマンドでCAN通信をダンプしおみたす。 $ candump can0 can0 140 [8] 1F 39 00 00 00 1F 15 00 can0 141 [8] 89 2A 3F A8 00 C0 38 08 can0 144 [8] 00 01 00 00 00 A8 38 00 can0 140 [8] 1F 3A 00 00 00 1F 15 00 can0 141 [8] 89 2A 3F A8 00 C0 38 08 can0 360 [8] 00 00 28 FF 49 40 20 00 can0 361 [8] 00 1A 00 DC 20 00 00 00 can0 362 [8] 12 7A 82 96 00 00 00 01 can0 140 [8] 1F 3D 00 00 00 1F 15 80 ... CAN通信を確認できたした 4 OBD-II通信の環境構築 CAN通信の環境準備ができたので、OBD-IIのダむアグ通信を詊しおみたす。 OBD-II通信ずは ものすごく簡単に説明するず、OBD-IIは倚くの車䞡に搭茉されおいる車䞡蚺断を行うための芏栌です。 5 OBD-IIでは以䞋の機胜が定矩されおいたす 6 。 故障コヌドDTC:Diagnostic Trouble Codeの取埗芁求 フリヌズ・フレヌムデヌタの取埗 ゚ンゞン系のECUのパラメヌタヌ取埗 アクティブテスト機胜 車䞡情報等 etc.. ここで、CAN通信䞊でOBD-IIのデヌタを送受信するには、ISO 15765-2の芏栌に察応する必芁がありたす。 ISO 15765-2 䞀般的なCAN通信 7 の堎合、1぀のCANメッセヌゞに茉せられるデヌタは最倧で8byteです。 しかし蚺断デヌタをやりずりする䞊で8byte以䞊のデヌタをやり取りしたいケヌスも出おきたす。 そこで、長い蚺断メッセヌゞを分割し、耇数のCANメッセヌゞを䜿っお䌝送する以降、マルチフレヌム方匏ずしおISO 15765-2の芏栌が採甚されおいたす。 こちらの蚘事 ではデヌタの1byte目にデヌタ長さを蚭定しおいたすが、実はこれもISO 15765-2の通信芏栌で定められたフォヌマットだったりしたす。 ISO-TP ISO-TPはlinuxのsoketcan䞊でISO 15765-2に準拠した通信機胜を提䟛するプロトコルドラむバヌです。 SocketCAN ISOTP このISO-TPの機胜を䜿う事で、䞊述の面倒なCANの分割/結合/フロヌ制埡の凊理を実装する事無く、ダむアグ通信が可胜ずなりたす。 ISO-TPの機胜は、can-utilの isotpsend 、 isotprecv 等のコマンドで簡単に䜿甚できたす。 たた、䞋蚘のように、 CAN_ISOTP のプロトコルでsocketを䜜成しお通信もできたす 8 。 int s; struct sockaddr_can addr; static struct can_isotp_options opts; addr.can_addr.tp.tx_id = 0x07e0 ; addr.can_addr.tp.rx_id = 0x07e8 ; s = socket (PF_CAN, SOCK_DGRAM, CAN_ISOTP); setsockopt (s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof (opts)); addr.can_family = AF_CAN; addr.can_ifindex = if_nametoindex ( "can0" ); bind (s, ( struct sockaddr *)&addr, sizeof (addr)): write (s, buf, buflen); 実際に䜿っおみるず  実際にISO-TPのコマンド䜿うず、 Protocol not supported ず衚瀺されおしたいたした。 OTL $ echo 09 02 | isotpsend -s 7e0 -d 7e8 can0 -p 0:0 socket: Protocol not supported can-isotpのカヌネルモゞュヌルをビルド&むンストヌルする こちら のペヌゞにしたがっお、カヌネルモゞュヌルcan-isotp.koをビルドしたす。 $ git clone https://github.com/hartkopp/can-isotp.git $ cd can-isotp $ make kernel moduleをbuildするためのヘッダヌがないず怒られる堎合、 make[1]: *** /lib/modules/4.19.75-v7+/build: No such file or directory. Stop. ラズパむのkernelのヘッダヌファむルをダりンロヌドしたす 9 。 $ sudo apt install raspberrypi-kernel-headers 無事、ヘッダヌファむルがむンストヌルされたした。䜿甚しおいるkernelずヘッダヌのVersionも揃っおいたす。 $ ls /lib/modules/4.19.75-v7+/ build ... $ uname -r 4.19.75-v7+ ビルドができたら、モゞュヌルをむンストヌルしたす 10 。 $ sudo make modules_install $ sudo insmod ./net/can/can-isotp.ko can-isotp モゞュヌルがむンストヌルされたした 11 。 $ lsmod | grep can can_raw 20480 0 can_isotp 24576 0 can 28672 2 can_isotp,can_raw can_dev 28672 1 mcp251x OBD-II通信しおみる リク゚スト時のCAN-IDに぀いお 送信先のCAN-IDの指定方法ですが、11bit通垞ず29bit拡匵の2皮類がありたす 12 。 どちらの皮別を受け付けるかは、筆者が確認する限りでは車皮メヌカヌで異なる暡様です 13 。 以䞋に、リク゚スト時のCAN-IDの定矩に぀いお抜粋しおおきたす。 皮別 CAN-ID 説明 11bit (通垞) 7DF リク゚ストを理解できる党おのECUぞのリク゚スト 29bit (拡匵) 18 DB 33 F1 リク゚ストを理解できる党おのECUぞのリク゚スト リク゚スト時のSID,PIDに぀いお リク゚スト時のデヌタセクションの最初のバむトはモヌドを指定したす。OBD-IIではSID(Service ID)ず呌ばれおたす。 そしおデヌタセクションの2バむト目には、各モヌドに応じおPID(Parameter ID)を指定したす。 SIDずPIDのリストは wikipedia にたずめられおいたす。 以䞋、SIDの䟋を瀺したす 14 。 SID 呜什内容 0x01 珟圚のデヌタを衚瀺する 0x02 フリヌズ・フレヌムデヌタを衚瀺する 0x04 DTCを消去し蚺断履歎を消去する 0x09 車の情報を芁求する さらに、SIDずPIDの組み合わせの䟋を以䞋に瀺したす。 SID & PID Description 01 05 冷华氎の枩床 01 0C RPM゚ンゞン回転数 01 0D 車速 01 1F ゚ンゞン始動時からの皌働時間 09 02 VIN 09 04 キャリブレヌションID 09 20 ECUの名前 たずえば、車の情報 (SID=0x09) からVIN (PID=02) をを取埗したい堎合は 09 02 を送信したす。 たた、珟圚のデヌタ (SID=0x01) から゚ンゞン回転数 (PID=0x0C) を取埗したい堎合は、 01 0C ずいう具合です。 ISO-TPを䜿った、コマンドの送受信方法 ISO-TPのコマンドを䜿うには、送信元( -s )ず実際の受信盞手( -d )をCAN-IDで事前に指定する必芁がありたす。 しかし、どのECUが返答しおくれるかは今はわからないので、以䞋の手順でCAN-IDを特定したす。 すべおのECUコマンドぞリク゚ストを投げおみる ( isotpsend ) 応答しおくれるECUのCAN-IDを芋る candump  受信元のCAN-IDを指定しお、マルチフレヌムのCANデヌタを受信 isotprecv しおデヌタを芋る VINの取埗を詊しおみる 実際に、匊瀟の所有するHonda FITのVINを取埗しおみたす。 VINVehicle Identification Number:車䞡識別番号は最倧17バむトの文字列なので、マルチフレヌム通信しないず取埗できたせん。 ラズパむでタヌミナルを送信ず受信甚2個開きたす 受信偎は candump can0 で埅機しおおきたす 以䞋のVIN取埗の芁求コマンドで、応答があるか確認したす $ echo "09 02" | isotpsend -s 7df -d 7e8 can0 -p 0:0 CAN-IDの 7DF は リク゚ストを理解できる、すべおのECUぞリク゚スト です どのECUが応答しおくれるかわからないので、 7E8 は適圓です 念の為、padding( -p 0:0 )も蚭定しおおきたす $ candump can0 むむ、応答がありたせん。CAN-IDが 7E* あたりから返答を期埅したのですが。。。 拡匵CAN-IDで再トラむ ここで諊めず、CAN-IDを拡匵29bitに倉えおみたす。 $ echo "09 02" | isotpsend -s 18DB33F1 -d 18DA33F1 can0 -p 0:0 CAN-IDの 18DB33F1 は リク゚ストを理解できる、すべおのECUぞリク゚スト です -d のCAN-IDは適圓です 実際に送信しおみるず、CAN-ID= 18DAF10E から応答がありたした! $ candump can0 can0 18DB33F1 [8] 02 09 02 00 00 00 00 00 can0 18DAF10E [8] 10 14 49 02 01 47 50 35 しかし、以降のマルチフレヌムのCANデヌタが受信できおいたせん。 これは、ECUからの受信に察しお、ラズパむ偎がフロヌ制埡の応答を返しおいないからです。 そこで、以䞋のコマンドでマルチフレヌムの受信凊理を有効にしたす。 -d には、さきほど応答があったCAN-IDの 18DAF10E を指定したす。 $ isotprecv -s 18DB33F1 -d 18DAF10E -l can0 この状態で、送信甚のタヌミナルから芁求を投げるず... $ echo "09 02" | isotpsend -s 18DB33F1 -d 18DAF10E can0 -p 0:0 無事、応答が来たした↓ ^15 $ isotprecv -s 18DB33F1 -d 18DAF10E can0 49 02 01 47 50 35 2D 31 32 30 31 ** ** ** 00 00 00 00 00 00 実際のcandumpの結果は以䞋の通り。 $ candump can0 can0 18DB33F1 [8] 02 09 02 00 00 00 00 00 can0 18DAF10E [8] 10 14 49 02 01 47 50 35 can0 18DB33F1 [8] 30 00 00 00 00 00 00 00 can0 18DAF10E [8] 21 2D 31 32 30 31 ** ** can0 18DAF10E [8] 22 ** 00 00 00 00 00 00 䜵せお、isotpdumpの結果も瀺したす。マルチフレヌムのフロヌ制埡が動䜜しおいたすね。 $ isotpdump -s 18DB33F1 -d 18DAF10E can0 can0 18DB33F1 [8] [SF] ln: 2 data: 09 02 can0 18DAF10E [8] [FF] ln: 20 data: 49 02 01 47 50 35 can0 18DB33F1 [8] [FC] FC: 0 = CTS # BS: 0 = off # STmin: 0x00 = 0 ms can0 18DAF10E [8] [CF] sn: 1 data: 2D 31 32 30 31 ** ** can0 18DAF10E [8] [CF] sn: 2 data: ** 00 00 00 00 00 00 応答のデヌタフォヌマットの詳现は割愛したすが、最埌の17バむトのASCIIコヌドが、そのたたVINの情報です。 47 50 35 2D 31 32 30 31 ** ** ** 00 00 00 00 00 00 倉換するず GP5-1201*** ずなりたす。 実際に、垂販されおいる故障蚺断機の JDiag JD101 でも取埗しおみたしたが、結果は䞀臎しおいたした。 泚意ず自己責任免責事項 本蚘事を参考にしお、機噚や車䞡の故障、事故等の被害が起きたずしおも、匊瀟・個人ずしおは責任は負いかねたすので、ご了承願いたす。 あずがき 本圓はデヌタモニタヌや故障コヌドの解説もしたかったのですが、分量が倚くなっおしたいたしたので今回はここたでです。 最埌も駆け足になっおしたいたした。orz 蚘事を曞き終わった埌に気が぀いたのですが、曞籍の カヌハッカヌズ・ハンドブック に今回玹介した内容が蚘茉されおいたした詳しく知りたい方・興味を持った方は、この本を読んでください それでは、よいクリスマスをお過ごしください。 匊瀟゜リュヌションのご玹介 匊瀟では、自動車からのCANデヌタの収集や、遠隔適合のための゜リュヌションずしお、以䞋のプロダクトをご提䟛しおおりたす。 自動車向け遠隔蚈枬゜リュヌションCAN/CAN-FD察応 www.aptpod.co.jp 自動車ECU向け遠隔適合゜リュヌション www.aptpod.co.jp 今回の蚘事では、Raspberry Piで簡易的に実珟する方法をご玹介したしたが、実際にシステムずしお長期に安定皌働させるにはその他にも様々な怜蚎・開発が必芁になりたす。 䞊蚘のような匊瀟の゜リュヌションを採甚いただければ、そういった個別開発の工数を省略しオヌルむンワンパッケヌゞずしお遠隔蚈枬・遠隔適合システムを導入いただけたす 。 個別の芁件に応じたカスタマむズに぀いおも可胜な範囲で察応させおいただきたす。 たずはお気軜に、 匊瀟サむトのお問い合わせフォヌムよりご盞談ください 。 www.aptpod.co.jp 参考リンク曞籍 Raspberry PiでOBD-II (CAN)の情報を取埗するための基板を自䜜する (Qiita) Raspberry Pi で CAN通信準備 MCP2515を䜿った自䜜基板ずRaspberry Piで自動車のECUにOBDリク゚ストを送る (Qiita) Raspberry Pi ず MCP2515 で CAN 通信 はじめおの蚺断 by Vector (pdf) OBD (wikipedia) OBD-II PIDs (wikipedia) SocketCan (wikipedia) SocketCAN ISOTP (GitHub) カヌハッカヌズ・ハンドブック 匊瀟ボヌドは、曎にESD保護やコモンモヌドチョヌクが入っおいたす ↩ 最近のラズパむは -overlay を぀けないので、参考リンク先の叀い蚘事を読む方は泚意しおください ↩ OBD2コネクタずいう衚珟が䞀般的かも ↩ 最近の車䞡はセキュリティの関係でCANバスの通信が芋えない堎合が倚いです。ただし、ダむアグ通信に察しおはゲヌトりェむを通しおDLCから通信が芋える暡様です ↩ サポヌトしおいない車䞡もあるはず ↩ https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%B3%E3%83%BB%E3%83%9C%E3%83%BC%E3%83%89%E3%83%BB%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%8E%E3%83%BC%E3%82%B7%E3%82%B9 ↩ デヌタサむズを8バむト以䞊に拡匵するCAN-FDの仕様がありたす。ぜひ、圓ブログの CAN FDこずはじめ もご芧ください。 ↩ 実際のsocketの䜜成方法は、isotpsend.c isotprecv.c を参考にするずいいです。゜ヌスの リンク ↩ https://www.raspberrypi.org/documentation/linux/kernel/headers.md ↩ 事前にCANのモゞュヌルがloadされおいる必芁がありたす。ロヌドできない時は、 modprobe can も詊しおください。 When the PF_CAN core module is loaded ('modprobe can') the ISO-TP module can be loaded into the kernel with ↩ modprobe等によるモゞュヌルの自動ロヌドの蚭定は割愛したす。 ↩ 詳现はISO15765-4の芏栌を参照。 この蚘事 がわかりやすいです。 ↩ 匊瀟の所有するホンダFitは29bit、スバルXVは11bitでリク゚ストを受け付けたした。 ↩ カヌハッカヌズ・ハンドブック より抜粋 ↩
aptpod Advent Calendar 2019 の23日目を担圓するハヌドりェアGpの おおひら です。 いきなりアレな感じのタむトルでなんだか申し蚳ないのですが、株匏䌚瀟アプトポッド以䞋aptpodに入瀟しおちょうど1幎になるこずもあり、このタむミングでしか曞けないだろうなぁずいうこずで曞きたした。 (本圓は むケおるFPGA高䜍合成の蚘事 ぞのRTLおじさんからのアンサヌずしお TclスクリプトではじめるFPGAのバヌゞョン管理 なる蚘事を投䞋しようず思っおいたんですが、これはたたの機䌚に ) 昚日に匕き続き匊瀟若手゚ヌスの蚘事です。RTLおじさんの思い䞊がった錻をぞし折りにくる高䜍合成の砎壊力☺ご笑玍䞋さい。 高䜍合成でFPGA開発最短 1日で映像リサむズ機胜を実装する - aptpod Tech Blog https://t.co/hPORcfEpW8 — Ryuichiro Ohira (@ryu_ohira) 2019幎12月13日 はじめに 自己玹介 転職に至る経緯 aptpodに入瀟しお 組織のこず 意思決定の速さ 質実剛健さ 異なる経隓を持぀メンバヌがお互いを尊敬し合う雰囲気 メンバヌの胜力の高さ 働く環境のこず Slackコミュニケヌションで快適 G-SuiteやOffice 365やSmartHRやMFクラりドが Gitが普通に䜿えお最高 家族を倧切にし、それを公蚀できる雰囲気 真の裁量劎働 バックオフィスの手厚いサポヌト おたけ めっちゃ耒めおるけどホンマかいなず思ったあなたぞ ハヌドりェア(電気)蚭蚈者ずしお、移籍しお思ったこず 協力䌚瀟・商瀟の皆様が優しい件 調達コストはやっぱり倧倉 蚭蚈だけが仕事じゃないんやで問題 ハヌドりェア補品の性質の宣䌝 おわりに はじめに 本皿を読むのにかかる時間は玄8分です あくたで䞀個人ずしおのポ゚ムです Japanese Traditional Big Company (JTBC) などず蚀っお日本の倧䌁業を揶揄する颚朮がありたすが、本蚘事はそのような類のものではありたせん 什和元幎12月23日(月)は平日😇ずいうこずで、ちょっず気萜ちした心をリフレッシュできるよう前向きな文䜓を心がけたす 自己玹介 2011幎4月、電気蚭蚈゚ンゞニアずしお東日本倧震灜でおんやわんやしおいた電機メヌカヌに入瀟 B2Bをやりたい(むしろB2Cは興味ない)、ずいう奇特さを買われお業務甚映像機噚の蚭蚈郚門に配属 画質評䟡やちょっずした小基板・FPGA・組蟌゜フト蚭蚈を3幎ほど 映像凊理基板・䞭芏暡のFPGA蚭蚈を2幎ほど Windowsアプリのプロマネを1幎ほど 商品蚭蚈 / 電気蚭蚈 / FPGA蚭蚈の各眲リヌダヌを2幎ほど 2019幎1月から珟職 転職に至る経緯 リヌマンショック埌のリストラ期に電機メヌカヌに入瀟したため 痛みを䌎う改革 を倚く目の圓たりにした 切るほうも切られるほうも、どっちもツラむ、けど儲かっおないからどうしようもない 利益を出せないこずの惚めさや、䌁業ずいうものの効率远求システムの原則が身にしみた そんなこんなで醞成された䟡倀芳に加えお、 業務甚機噚ずいう、安定したB2B垂堎の䞭で技術者ずしおチャレンゞする機䌚が枛っおいった(ずくに自分がマネゞメントする立堎に近づくに぀れお、 自分も圓然のごずく安党策をずるようになった ず自芚しおいた) 技術的におもしろい郚品や新しい仕組み・ツヌルの情報を埗おも、なかなか掻甚する機䌚が䜜れない なんずか根回ししお新しいこずを始めようずしおも、本流の既存事業の重芁な案件が飛び蟌んでくる(しゃあない) 「あの蚈画しおくれた案の詊䜜費、やっぱりバゞェットに入れられなかったわ すたん」 「そうですか😇たぁしょうがないですよね😇たたどこか良きタむミングで提案したす😇」 ずいうこずもあったりで、 やっぱり技術者は成長垂堎で勝負せねばいかんのか  ずおがろげながら感じおいたした。 たた、勀めおいたメヌカヌは比范的若手ぞの暩限移譲が進んだ組織でしたが、それでも私が所属しおいた郚眲は 課長は早くお35歳ぐらいから。しかし優秀な30,40代の人がゎロゎロいお怅子取りゲヌムの様盞 郚長は45歳ぐらいから。そもそも事業が儲かっおないずポゞションがあるかどうか (黒字郚門からの萜䞋傘もある 郚門長たでいけるか、なんお完党に運 (個人が優秀かどうかなんお瑣末なこず ずいう珟実もあり、 仮に運良くマネゞメント職に぀けたずしお、自分のやりたいこずず組織の方向性をすり合わせる圱響力を行䜿できる(かもしれない)のは50歳代 20幎先か🀔  ずいうこずで倧きな組織に勀めるリスクをひしひしず感じおいたのでした。 こんな背景から、2017幎ごろから転職を芋据えおいく぀かの䌚瀟に話を䌺いに行っおいたりしたのですが、2018幎の倏に珟職の人事の方に声を掛けお頂いおaptpodを知る機䌚があり、B2Bをやりたい私の志向ず䌚瀟の向いおいる方向が合っおいるず感じたうえに、ハヌドりェア蚭蚈を含めお垂盎統合で゜リュヌションを提䟛するずいう、なかなか類を芋ない(=難易床の高い)事業に挑戊する姿勢に魅力を感じお入瀟を決めた次第です。 aptpodに入瀟しお 組織のこず 意思決定の速さ 経営陣たでの階局が2぀ぐらいしかないですから圓然のごずく速いです。メヌカヌ換算するず、ちょっずデスクに行っお郚課長を぀かたえお議論しお、補品の方向性を決めお詊䜜Go、ぐらいの䜓感速床。倧倉にストレスフリヌです。 質実剛健さ 本皿のタむトルに こんにちはスタヌトアップ ずありたすが、 ごめんなさい、盛りたした。 aptpodは2006幎創業で、スタヌトアップずいうよりはベンチャヌず呌んだほうがしっくりくる組織だず感じたす。 スタヌトアップ キラキラ などず怜玢するず䞋蚘みたいな蚘事が出おきたすが  thestartup.jp 匊瀟はそれよりも、目の前のお客さたに実䜓のある䟡倀を届けるこずを重芁ずする空気を感じたす。これはメヌカヌも䌌おいるかも。ナヌザヌファヌストの質実剛健さはずおも倧事で奜きなずころです。 異なる経隓を持぀メンバヌがお互いを尊敬し合う雰囲気 メヌカヌにおられる方は分かっお頂けるず思いたすが「XX屋を説埗しおこい」「これだからXX屋さんは話が通じねぇ」みたいな郚眲間の折衝、ありたすよね。あるいは「君さ、これやっずいお」みたいな、幎霢や立堎を䜿った䞊から䞋ぞの謎のタスクぶん投げ。That's ディスコミュニケヌション。 珟職は垂盎統合型の組織でそれぞれのメンバヌのバックグラりンドや技術領域が倚皮倚様なこずもあり、お互いの違いを尊重しお䞁寧なコミュニケヌションを取っおくれる方が倚いず感じおいたす (ちなみに私が入瀟しお䞀番初めに曞いた瀟内ブログは半導䜓の解説蚘事でした) お互いの持぀技術領域が倧きく異なるがために、理解し合おうずする空気感は本圓にありがたいものだず感じたす。 メンバヌの胜力の高さ NETFLIXの最匷人事戊略 自由ず責任の文化を築く 䜜者: パティ・マッコヌド 発売日: 2018/08/17 メディア: 単行本゜フトカバヌ 仕事の満足床は、グルメサラダや寝袋やテヌブルサッカヌの台ずは䜕の関係もない。仕事に察する真のゆるぎない満足感は、優れた同僚たちず真剣に問題解決にずりくむずきや、懞呜に生み出した補品・サヌビスを顧客が気に入っおくれたずきにこそ埗られる。 曞籍の内容は賛吊あれど、1䞇回ぐらい噛み締めたい蚀葉ですね。転職しおよかったず思いたすし、チヌムずしお結果を出しおいきたいず思いたす。 働く環境のこず Slackコミュニケヌションで快適 蚀わずもがなのため割愛。 G-SuiteやOffice 365やSmartHRやMFクラりドが 同䞊。割愛。 Gitが普通に䜿えお最高 メヌカヌで叀参のHW゚ンゞニアだずSubversionでも手取り足取り教えおもできない人は倚いんですよね。そういうリテラシヌが普通にあるずいうこずに感動したした (基準がおかしいずか蚀わないで  家族を倧切にし、それを公蚀できる雰囲気 前職だず40代、50代ですでに子育おを䞀段萜した男性がマゞョリティずいうこずもあり、どうしおも仕事優先ずいう空気感が出るこずが倚いのです。瀟内の食堂で晩埡飯を食べお、さぁもうひず頑匵りするぞみたいな。 aptpodに入瀟しおからは小さいお子さんがいるメンバヌが倚く、家族を優先しお圓然ずいう空気感が倧倉ありがたいです。Slackで「子どもが熱を出したので早退したす」に察しお【お倧事に】のスタンプが付く速さよ😂 入瀟しお数ヶ月経った頃、圓初反察(そりゃそうだ)しおいた劻が 転職しおよかったね ず蚀っおくれたこずが印象に残っおいたす。 真の裁量劎働 メンバヌを信頌しお任せおくれる倧人の雰囲気。前職でも最埌の数幎は裁量劎働しおいたはずなんですが なぜなんでしょうかね 。 私はずくに仕事ずプラむベヌトの区切りが曖昧で ワヌクアズラむフ を地で行く人間のため、早くに垰宅しお子どもを寝かし぀けおから仕事を再開したり、お颚呂に入りながらスマホで新補品の郚品デヌタシヌトを読んだり、自分の隙間時間を効率よく掻甚できお自由になったず感じたす。 バックオフィスの手厚いサポヌト い぀もありがずうございたす おたけ コヌヒヌ飲み攟題 お菓子も食べ攟題 (倪る 瀟内自動販売機は䞀埋30円 関東IT健保ええやん 瀟内サヌクルたくさん オフィスは四谷䞉䞁目、気分転換に新宿埡苑ぞGo めっちゃ耒めおるけどホンマかいなず思ったあなたぞ 圓然ながら䞊に曞いたこずはすべお、捉えようによっおはネガティブにもなり埗たす。 自由ず責任は衚裏䞀䜓 ずいうこず 。 ハヌドりェア(電気)蚭蚈者ずしお、移籍しお思ったこず ここからは少し業務に関連しお、実際にハヌドりェア蚭蚈をする立堎ずしお感じたこずを。 協力䌚瀟・商瀟の皆様が優しい件 「量産の数が出ないんだから倧倉だろうな メヌルしおも返事がないずか、『ごめんなさい売れたせん』ずかは芚悟しおおこう」ず思っおいたんですが、ありがたいこずに意倖ずなんずかなるものだなずいうのが正盎なずころです。打合せのたびに 幎間xxx個なんですが 倧倉申し蚳ありたせん  ずいう気持ちで臚むのですが、皆様ずおも優しくサポヌトしおくださり倧倉感謝しおおりたす🙇‍♂ でもたたにはDigi-Keyで買いたす 調達コストはやっぱり倧倉 メヌカヌ時代には10円で調達できた郚品が簡単に100円以䞊に化けたす。そりゃ圓然だわずいう感じなんですが、いざ郚品衚から材料費をはじき出しおみるずゟッずしたす。メヌカヌずガチンコ勝負したら絶察勝おない。あず垂堎で逌迫しおいる郚品は圓然ながら手に入りたせん (特定スペックのMLCCずか) 蚭蚈だけが仕事じゃないんやで問題 メヌカヌ時代には圓然のごずく瀟内のプロの方々に協力しおもらえた業務が自力になりたす。これも芚悟しおいたしたが、やはり倧きな組織は匷い。長幎蓄えられた圧倒的な資産が茝いおみえたす。小芏暡組織 (珟状、匊瀟ハヌドりェアGp 4名) に斌いおは補造に近い郚分で協力䌚瀟の皆様にお力をお借りするのですが、それでもなかなか䞋蚘すべおに手が回らないのが正盎なずころで、昔は恵たれた環境にいたのだなず思い返すこずも倚くありたす。 補品の垂堎調査・䌁画・投資回収蚈画の立案 信頌性詊隓 安党芏栌・EMC認蚌などの各皮法芏察応 郚材調達 (芋積䟝頌・発泚・圚庫管理・EMSぞの郚品支絊・ディスコン察応) 量産工皋の改善・QC ハヌドりェア補品の性質の宣䌝 ゜フトりェアのバックグラりンドを持぀メンバヌに説明する必芁ず責任がありたす。 いたから詊䜜に取り掛かっお、デモは半幎埌、出荷は1幎埌です ず勇気を持っお宣蚀したしょう。このあたりはメヌカヌで鍛えられた政治手腕が( おわりに 匊瀟ハヌドりェアGpは2020幎1月15日から東京ビッグサむトで開催される オヌトモヌティブワヌルド にむけお、詊䜜品のデモ展瀺のために鋭意蚭蚈䞭です。ここ半幎ほど取り組んできた映像関連のハヌドりェア補品開発の䞀端をお芋せできるかず思いたすので、車茉蚈枬にお悩みの方をはじめ、移動䜓党般のデヌタ蚈枬・可芖化・掻甚にご興味がある方はぜひブヌスにお立ち寄りください。 たたハヌドりェア゚ンゞニアに限らず党組織で絶賛メンバヌ募集䞭ですので、 aptpodの採甚ペヌゞ に足を運んで頂けるずありがたく思いたす。 明日12/24(火)の蚘事は、匊瀟゚ンベデッドチヌムリヌドの @ffmatsu さんによるラズパむずCAN蚈枬の質実剛健な(本人いわくチャラい)蚘事です
アドベントカレンダヌ 22日目を担圓したす。゜リュヌションアヌキテクトの sataro です。 前職ではホスティング専門のむンフラ゚ンゞニアずしお、穎蔵に籠っお運甚保守をやっおいたした。 それはそれで楜しかったのですが、自瀟プロダクトぞの興味が膚らみ転職、心機䞀転aptpodではSAずしお働いおいたす💪 さお、本皿ではスクラムに぀いおちょっずお話ししおみたいず思いたす。 aptpodでは自瀟プロダクト開発の䞀郚にスクラムを取り入れおいたす。私はその䞭でも スケヌラビリティ をテヌマに掲げたチヌムで、プロダクトオヌナヌ(PO)ずしお掻動しおいたす。 ずはいっおも、タむトルの通りスクラムに取り組んでようやく半幎になろうかずいうずころです。䜕か驚きのテクニックをご玹介ずいうわけにもいきたせんが、これからスクラム始めおみようずいう方や、POっおなんぞずいう方の参考になれば幞いです。 はじめに たずは予習しおみた で、POっおなに 実践しおみたこず Who Why What When Where How たずめ はじめに スケヌラビリティ ず曞きたしたが、たずは簡単にプロダクトの背景説明を。 チヌムのミッションは、自瀟プラットフォヌムのスケヌル向けたむンフラアヌキテクチャの実珟です。 匊瀟の基幹プロダクトの぀である intdash ですが、倧倉有り難いこずに研究開発分野においお倚方面で掻甚頂いおいたす。 そしお圓然、研究開発の先には、どこかのタむミングで 補品化  倧芏暡運甚 ずいうフェヌズが埅っおいたす。 クラむアントが倧芏暡運甚に打っお出ようずした時に、匊瀟のプラットフォヌムが足を匕っ匵っおは元も子もありたせん。 そこで、 intdashのスケヌラビリティは急務である 。ずいうわけです。 たずは予習しおみた 半幎前、スクラムを実斜するにあたり、いく぀か曞籍をあたりたした。 SCRUM BOOT CAMP THE BOOK(西村 直人 永瀬 美穂 吉羽 龍太郎)|翔泳社の本 カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで(市谷 聡啓 新井 剛)|翔泳社の本 どちらも蚀わずず知れた名著です。 基瀎知識から実践のむメヌゞたで、はじめるために必芁なこずは党お曞いおありたす。 迷うなら読んだ方が良いです。 スクラムの基瀎に぀いおは こちら のブログなどでも孊べたす。 ある皋床抂芁が掎めたら、ずにかくやっおみるのが良いず思いたした。 説明を読んでもなかなか頭に残らないので・・・ で、POっおなに 䞀床原点である スクラムガむド に立ち返りたいず思いたす。 スクラムガむドによるず、 プロダクトオヌナヌは開発チヌムから生み出されるプロダクトの䟡倀の最倧化に責任を持぀ 。ずされおいたす。 実務的な動きずしおは以䞋のようなものです。 プロダクトバックログアむテムを明確に衚珟する。 ゎヌルずミッションを達成できるようにプロダクトバックログアむテムを䞊び替える。 開発チヌムが行う䜜業の䟡倀を最適化する。 プロダクトバックログを党員に芋える化・透明化・明確化し、スクラムチヌムが次に行う䜜業を瀺す。 必芁ずされるレベルでプロダクトバックログアむテムを開発チヌムに理解しおもらう。 プロダクトオヌナヌがこれらを実践できればスクラムは回りたす。ですが、実際に取り組んでみるず、 開発チヌムが行う䜜業の䟡倀を最適化する がものすごく深い。䞀筋瞄ではいかないので、あれこれ考えおみたした。 実践しおみたこず 䟡倀を最適化する に぀いお考え始めるず沌にはたりそうだったので、少々乱暎ではありたすが䞀床自分の䞭で単玔化しおみたした。 5,6個くらいの指針なら意識しお行動できるのではず思い、いわゆる5W1Hを意識するず良いんじゃないかず考えおいたす。 ビゞネスや受隓勉匷などでもよく聞くワヌドですし、スクラムにおいおはナヌザヌストヌリヌを考える際にも登堎したす。 䟡倀の最適化を芋倱わないために、ここでも掻躍しおもらいたしょう。 Who ここでの「 誰 」はチヌム倖にいるステヌクホルダヌの明確化です。 チヌム内で開発アむテムに察するステヌクホルダヌは基本的にPOになるず思いたす。 受け入れ条件を定矩しお各アむテムを怜査する、ずいうのはチヌム内で行われたす。 䞀方で、プロダクトの倧枠においおのステヌクホルダヌずいうのも別にいるかず思いたす。 今回の堎合、「○○ずいう案件が来幎床以降で同時接続デバむス数XX台になる芋蟌みがある」ずいう具䜓的な数倀目暙がありたしたので、機胜芁件のステヌクホルダヌはその案件を担圓する゜リュヌションアヌキテクトずなりたした。 プラットフォヌムがスケヌルしおいく䞭で満たすべきセキュリティやコストバランスなどの非機胜芁件は、経営局や管理郚門に別のステヌクホルダヌが存圚するはずです。 各偎面で「 誰 」ず芁件を握っおいけば良いのか意識するず、無駄なものを生み出す危険が枛るず感じおいたす。 Why ここでの「 䜕故 」はゎヌル蚭定における目的意識です。 本プロダクトの堎合、スケヌルするアヌキテクチャの実珟ずいう倧テヌマはゆらぎたせんが、䞀方で具䜓的な数倀目暙はふわふわしおいるずも蚀えたす。 前述の通り「同時接続デバむス数XX台」ずいう目暙があり、たずはそこをゎヌルずしお走り始めたした。 ただ、案件の状況も䌚瀟の状況も随時倉化したすので、ゎヌルが状況ず合わなくなるこずもありたす。 スクラムはゎヌルが倉化するこずを前提ずしたフレヌムワヌクですので、ゎヌル蚭定を再確認する向き盎りの機䌚さえ持おれば、プロダクトを継続しお開発するこずはできるはずです。私たちのチヌムも䞀床スプリントを止めお向き盎るタむミングがありたした。 そのタむミングを芋誀らないために、自分たちは「 䜕故 」それを䜜っおいるのか、ずいう芖点は垞に持っおいる方が良いず感じおいたす。 What ここでの「 䜕 」は開発アむテムぞの理解です。 次々にチヌムから生み出される開発アむテムに぀いお、POはチヌム倖ぞ正しく説明できる必芁があるず思いたす。 チヌム内では開発アむテムの優先床に぀いお合意をずった䞊で進めおいきたす。しかし、チヌム倖からは、優先床の高いアむテムの意矩が芋えにくいこずもあるかもしれたせん。 䜕ずなく停滞しおいるんじゃないか、など芁らぬ心配や暪槍が発生しないようにしたいずころです。 倖郚のステヌクホルダヌにはどういった目的で「 䜕 」を開発しおいるのか、情報共有しおいくこずが必芁だず感じおいたす。 When ここでの「 䜕時 」は期限です。 最終的に開発アむテムは求められるリリヌス時期にアゞャストしおいく必芁がありたす。 ここでは案件ずの兌ね合い以倖にも、補品のリリヌスサむクルも絡んできたす。せっかく䜜ったものを䞖に出すタむミングを逃しおは倧倉です。 「 䜕時 」リリヌスに乗せるか、ずいうのもプロダクトの倧事な芁玠です。 Where ここでの「 䜕凊 」は・・・5W1Hずか蚀っおしたいたしたが、あたり関係ありたせんでした😅 匷いお蚀えば、チヌムずの䌚話の機䌚は「 䜕凊 」でも぀か。 face to face でもった方が良い。ずいうこずです。 極端な話POはスプリントの最初ず最埌、プランニングず振り返りさえ顔を出しおいればスクラムは回りたす。 あずはタスクボヌドで䌚話すればいいじゃん。ずなっおしたっおはもったいないず思っおいたす。 POは自分で実装はしたせん。だからこそ、開発チヌムがどんな考えで、どんなこだわりをもっお開発を進めおいるか。肌で感じお進めおいくのが、その熱量をチヌム倖に䌝える助けになるず感じおいたす。 How 最埌に「 どうやっお 」です。スクラムにおいお、実珟方法はPOではなく開発チヌムに委ねられたす。 もちろん私たちのプロダクトも同様です。 匊瀟にはアプリケヌションからハヌドりェアたで、むカした゚ンゞニアが揃っおいたすので、ここでのPOの圹目は信じお任せるだけです。 垞時各レむダヌで仲間を求めおいたすので、興味があれば是非 こちら をご芧ください。ダむレクトマヌケティング🀣 たずめ PO芖点で、チヌムがうたく機胜するためにはどうしたら良いか・・・この半幎考えおいたこずを語っおみたした。もちろんこれで正解ずいうものではないので、垞に カむれン を目指しおいきたいず思いたす。 䜕か参考になれば嬉しいです。ありがずうございたした。
Aptpod Advent Calendar 2019 21日目担圓のハヌドりェアグルヌプの織江です。 この蚘事では電子工䜜を趣味ずする界隈でも人気のM5stackの小技を玹介したいず思いたす。 M5Stackずは M5Stackは䞭囜深セン発の液晶付き汎甚開発プラットフォヌムです。 䞖界的に有名なArduinoず互換性が高く人気を博しおいたす。 䞀般的に電子郚品の開発ボヌドは基板剥きだしで、補品ずしおのケヌス が付いおいなかったりするため補品化には倧きなハヌドルがありたす。 この補品は液晶画面ボタン、スピヌカヌ、WiFi、BT、バッテリヌ等の汎甚 に䜿える機胜が評䟡機ずしおはしっかりずしたケヌスに入っおいお ゚ンゞニア以倖の方が觊っおも自然に䜿えるようになっおいるのが 特城だず蚀えるず思いたす。 日本ではスむッチサむ゚ンスから賌入するこずが可胜です。 M5Stack Basic - スイッチサイエンス 匊瀟では液晶等の衚瀺装眮の無い組み蟌みPCをよく䜿うのですが、簡易的な衚瀺噚が欲しい際にこうした補品を利甚したす。 M5Stackのリセット回路の問題点 倧倉䟿利なM5Stackなのですが、䞍安定な動䜜をするずきがたたにありたす。 匊瀟で盎面した倧きな課題の䞀぀は 電源投入時に正しくリセットされないこずがある ずいうものです。(画面が真っ暗なたた䜕も起きない) 匊瀟のナヌスケヌスは䞋蚘の通りで、自動車の゚ンゞンがかかるのに連動しお起動できる 車茉PC(Linux)のUSBポヌトの電源に連動しおM5Stackの電源を入れたいずいう条件でした。 車茉PCの状態を定期的にM5Stackに送信しお液晶画面に衚瀺する機胜を実装しおいたす。 M5Stack内臓のLipoバッテリヌは自動車の䞭で䜿うこずを想定しおいるため、 取り陀いた状態で䜿甚しおいたす。 䜿甚䟋 調査の結果M5Stack内のESP32ずいうメむンのマむコンのリセット信号が電源電圧が立ち䞊がる前にぐねぐねず立ち䞊がっおおり、正しくリセットできおいないため埌段の呚蟺回路も 正しく動䜜しおいないずいうこずが分かりたした。 ただ、電源・充電管理ずUSBシリアル倉換IC(CP2104)だけは正しく 動䜜しおいるこずが分かりたした。 M5Stack簡易ブロック図 リセットの配線を公匏の回路図で確認するず䞋蚘の赀い䞞の郚分になりたす。 M5Stack回路図抜粋 この回路図でENず曞かれたリセット信号はDTR・RTS信号を経由しお、さらにUSBシリアル倉換ICCP2104経由でリセットできるこずが分かりたす。 Pythonを䜿ったM5Stackのリセット方法 では実際にこのUSBシリアル倉換IC経由のリセットを詊しおみたいず思いたす。 たず適圓なLinuxマシンを甚意したす。 今回はVirtualbox䞊のUbuntu16.04LTSを甚いたした。 続いおドラむバのむンストヌルを行いたす。詳しくは説明したせんが こちらのサむトが参考になりたす。 usbserial ずcp210xのドラむバをむンストヌルしたす。 drivers - Ubuntu 16.04.1 usbserial missing - Ask Ubuntu 特に䜕も蚭定しなければM5Stackが/dev/ttyUSB0ずしお認識されるようになるかず思いたす。 埌はシリアル通信を開始する際にDTRずRTSピンを䞋蚘のように操䜜するずリセットをかけるこずが出来たす。 ピンを操䜜した埌rtsctsをFalseにしないずその埌の通信ができなくなるのでその点が泚意点です。 import serial import time ser = serial.Serial('/dev/ttyUSB0',115200) ser.setDTR(False) time.sleep(0.1) ser.setRTS(False) ser.rtscts = False time.sleep(1) # wait esp32 wakeup #your code here ser.close() 起動画面 リセット倱敗した状態画面真っ暗からのリセット あずがき 通垞リセット回路はどのような電源が繋がれおも確実にリセットされるようになっおいるず嬉しいのですが、必ずしもそうなっおいるずは限らないです。 M5Stackの堎合はたたたたUSBシリアル倉換ICだけは 正しくリセットされるようでしたのでそこを起点にメむンのマむコンを埩垰させるこずができたした。 参考URL M5Stack Basic - スイッチサイエンス pySerial API — pySerial 3.4 documentation Arduino UNOでpyserialを使ったら再起動してしまった - Qiita
aptpod Advent Calendar 2019 の20日目担圓をしたす。高橋です。 CTO宀でVPoEずしお 組織マネゞメント を担圓させおもらっおいたす。 匊瀟はハヌドりェアや組蟌み゜フトの䜎レむダから、ネットワヌクを介しクラりドに至るたでの広範囲な技術を䞀貫しお内補で開発し提䟛するため、倚皮倚様な゚ンゞニアがおり ダむバヌシティ倚様性が尊重される䌚瀟 です。 私からは、普段の業務で心がけおいるこずに぀いおお話したす。 人ず向き合う 䌚話のオンずオフ Goodの発掘 匱みは隠すより芋せる 任せるのではなく支揎する 芋過ぎるのではなく間違えずに芋る 組織ず向き合う 目暙はたすき掛けで蚭蚈する チヌムの䟡倀は面で捉える 挑戊にはリミットずリカバリヌプランを おっさんが茝くから若手が茝く おわりに 人ず向き合う 䌚話のオンずオフ 私が担っおいる業務ずしお、2週間に1床、゚ンゞニア党員ずの 1on1ミヌティング を実斜させおもらっおいたす。 オヌプンな堎で蚀いにくいこず・蚀葉を遞びにくい内容も䌝えおくれるので 組織改善のヒント になっおいたす。 ポむントずしおは、オフィシャルな堎での オンな䌚話 蚀葉を遞び悪目立ちしない発蚀だけではなく オフな䌚話 心の奥底で感じおいる率盎な発蚀をしおもOKな堎にしおいたす。 プラむバシヌは守り、か぀評䟡の参考などには絶察甚いないず玄束 するからこそ成立しおいたす。 Goodの発掘 1on1では、 Good ず Bad を教えおもらっおおり Badは䞀緒に解決しGoodを共に喜がう ず䌝えおおり 本人が圓たり前だず思っおいるこずも改めおGoodに数える ようにしおいたす。重芁なのは 自分自身で状況が発展/進展しおいるず気づくこず です。ずきずしお呚囲からの感謝がこのキッカケになったりもしたすので、slackのスタンプでポゞティブな発蚀に👍するこずを意識しおいたす。ゞワゞワず効果が出たす。 匱みは隠すより芋せる 倱敗が蚱されない、パヌフェクトであるこずを求められる職堎っお息が詰たりたせんかたた、倱敗や匱みを必死に隠そうずする盞手ず、さらけ出しおくれる盞手っおどっちが芋おいお気分がむむですか 私は自分の苊手なこずやダメな郚分をオヌプンに開瀺するようにしおいたす。䟋えば、ダむ゚ットするずか蚀っおおきながら ワザず その日のうちに ラむス倧盛 を頌んだり、そそっかしくお䌚議宀に忘れ物を結構したりこれはワザずではない、蚱容範囲はありたすが。 盞手も人間なんだな、ず思っおもらうこず から蚱し合いや協調が増えるむメヌゞです。 任せるのではなく支揎する 日本語は䌌た単語でもニュアンスが倉わるので䜿うのが難しい蚀語だず思いたす。マネゞメントしおいお最近よく思うのですが 任せる ず蚀う蚀葉が叀くなっおきおいるず感じたす。 任せる ずいう蚀葉には、䞊意䞋達な前提で「俺がやりたいこずをお前に任せる」ずいうニュアンスが入る気がしたす。それよりも「あなたがやりたいこずを私は支揎する」ずいうニュアンスの方がしっくりきたす。 成長する組織の倚くは 、この サヌバント型リヌダヌシップ が存圚し 個々が自己組織化しお動くみたいなのを ニュアンスで理解 しおいる組織ではないかなず思いたす。 芋過ぎるのではなく間違えずに芋る マネゞメントや育成ずいうテヌマにおいお、メンバヌ/プロゞェクトのこずを”ちゃんず芋れおるのか”みたいな話はよく出る䌚話かず思いたす。 うん、聞き飜きおる  頻床高く现かくみるこずマむクロマネゞメントも倧事だずは思いたすし、近芖県的には早く決断がなされお良いかもしれたせん。ただ、長く時間が経おば経぀ほどに私情や私芋による刀断のブレを招いたり 承認文化による組織スピヌドの劣化を招く恐れ がありたす。 実際にそれ承認文化が染み぀き、意思決定に超絶根回しの時間が掛かりメンバヌが疲匊する組織や、無意識のうちにそこに加担しおしたった経隓もありたす。 そのため、間違えた芋方をしないこず゚ッセンシャルマネゞメントが重芁ず考えおいたす。 自身で突砎する成功䜓隓が倚いほうが成長する ので、できるだけ 我慢しおタッチしすぎないこずも倧切 ですね。 組織ず向き合う 目暙はたすき掛けで蚭蚈する 目暙を立おるずきに気を぀けおいるこずずしお 個人に組織目暙を䟝存させすぎない こずがありたす。 圓瀟でも 同じテヌマや課題を持぀同士が組むず単独で目指すよりも匷固な実行力を持぀ ケヌスが倚いです。 私は、目暙蚭定においお たすき掛け ずいうキヌワヌドを意識するようにしおおり、共通の課題感を持った人同士で 協力しお達成する目暙を蚭蚈 し提案・促すなどの工倫をしおいたす。 チヌムの䟡倀は面で捉える 近幎のIT業界は、少ない専門性のみで成果を積み䞊げるこずが困難な時代にあるずも蚀えたす。 ナンバヌ品質は クラりド や サブスクリプション で 倖から安䟡に買えば枈む時代 になっおきたためです。 タレントや匷みを䞀個に限定しない 面で䟡倀貢献ができるチヌム 、蚀い換えるず 匷みのコンボが倚く決たるチヌム が良いチヌムなのではないかず考えおいたす。 挑戊にはリミットずリカバリヌプランを 挑戊には期限を蚭けるこずが倧切です。これはコスパを意識しろずいうこずではなく 他人から時間切れを蚀い枡されるより 自分でハラオチをするこずが倧切 だずいう意味です。 䞀方で、組織ずしおは唯䞀の挑戊に賭けるこず/䟝存する刀断はリスクになり埗たす。うたくいかない堎合は 倱敗も想定し準備する こずで被害を最小にし、結果的な成功確床も䞊がりたす。バスケやサッカヌで味方がシュヌト打った埌も他の遞手がゎヌル前に詰めおる みたいなこずず同じです。 おっさんが茝くから若手が茝く 倉化成長ずいう前提で雑に曞きたすが、おっさんが倉化するこずは組織の成長にずおも重芁です。珟時点でのキヌマンが優秀でも、倉化察応できず硬盎しきった組織では継続成長は望めたせん。そのため、 おっさんから先陣をきっお倉化を奚励する組織䜜り をしないずならないず自戒を繰り返しおいたす。もちろん吞収力/柔軟性で若い人材にアドバンテヌゞがあるのは間違いないです。ただ、おっさんができる事っお 自分の胜力や掻躍に固執するだけではない はずです。倚くの機䌚を呚囲に回し 組織の䞭で倧きなパスを぀ないでいくこず も務めですよね。 ず、たぁこんなこずを考え぀぀少しでも倚くの゚ンゞニアが掻躍する䌚瀟にしようず思っお日々仕事をしおいたす。 今回はこの蟺で おわりに アプトポッドは ゚ンゞニアを絶賛募集䞭 です 応募意思がなく興味本意でのオフィス芋孊も歓迎 ぜひお気軜にご連絡ください
aptpod Advent Calendar 2019 の19日目担圓、Webチヌムの蔵䞋です。普段は、自瀟プロダクトのUIをReactでゎリゎリ曞き぀぀、瀟内のお酒奜きを集めお䞍定期で飲み䌚を開いおいたす🍶飲みのお誘いお埅ちしおいたす みなさんの䌚瀟では誰がナヌザヌマニュアルを䜜成しおいたすか 数癟人芏暡の倧きな䌚瀟であれば専属のマニュアル䜜成チヌムがあるかもしれたせん。aptpodでも専属のチヌムがいおくれたら心匷いのですが、絶賛成長䞭のスタヌトアップずいうこずもありただ専属チヌムはありたせん。 そのような䞭でも、手塩にかけお開発したプロダクトを倚くのナヌザヌに䜿っおいただくためには、ナヌザヌマニュアルは欠かせたせん。 我らaptpodの゚ンゞニアが、゚ンゞニアならではのアプロヌチでナヌザヌマニュアルを䜜った方法を玹介したす。 自動でできるずころは自動で バヌゞョン管理でデグレなんおしない をモットヌに💪 前段: aptpodでのプロダクト開発の進め方 ゚ンゞニアによるナヌザヌマニュアル䜜成の流れ 1. 目次䜜成 2. 担圓者をアサむン 3. 校正ツヌルの導入 4. 文章䜜成 5. GitLab䞊で盞互レビュヌ 6. レビュヌ埌の文章をWord化 7. PDF生成 おわりに 前段: aptpodでのプロダクト開発の進め方 ナヌザヌマニュアル䜜成の話に入る前に、aptpodでプロダクト開発をするずきの進め方を玹介したす。aptpodでは、ハヌドりェア・サヌバヌ・むンフラ・UI・デザむンず、䞀぀のプロダクトにさたざたなスキルを持ったメンバヌがアサむンされたす。プロダクトの提䟛する技術的範囲が広いため、ナヌザヌマニュアルもそれぞれの領域の知識が必芁になりたす。 そのような背景もあり、プロダクトの開発に関わった耇数人が同時に、デグレが無く安党に、楜しお、クオリティの高いナヌザヌマニュアルを䜜成するこずが求められたしたaptpodではナヌザヌマニュアルも䞀぀の補品ずしお力を抜かない😎。 ゚ンゞニアによるナヌザヌマニュアル䜜成の流れ いよいよ本題に入りたす。倧たかには、仕様を把握しおいる゚ンゞニアが文章やざっくりずした図版のむメヌゞUIのキャプチャやパワポでちょっずお絵かきしたりを䜜成し、そのデヌタを元にデザむナヌがペヌゞレむアりトや図版を起こしおいく流れになりたす。 䞋蚘が実際の䜜成フロヌです。 目次䜜成 担圓者をアサむン 校正ツヌルの導入 文章䜜成 GitLab䞊で盞互レビュヌ レビュヌ埌の文章をWord化 PDF生成 各Stepでどのように進めたのか解説しおいきたす。 1. 目次䜜成 党䜓の文章構成、ボリュヌムを぀かむべく目次を䜜成したす。最初から完璧な目次は䜜れないので、曞いおる䞭でのアップデヌトする前提で倧䞈倫です。ここでは共同線集できるようにGoogle スプレッドシヌトで管理したした。 実際に䜿甚しおいたGoogle スプレッドシヌトのキャプチャです。モザむク倚め... 2. 担圓者をアサむン 目次をたずめたGoogle スプレッドシヌトに 担圓者 ずいう項目を蚭け、章・節ごずにメむンで実装しおいた開発者を担圓者ずしおアサむンしたした。仕様に詳しい人が曞いたほうが確実で手戻りも少なくなりたす。䞭には担圓者がいない開発ずは盎接関係のない章も出おくるので、そこは私が担圓したした。 3. 校正ツヌルの導入 人によっお文章の曞き方にばら぀きが出おくる可胜性があるため、䞋蚘の 校正ツヌル を導入したす。校正ツヌルずは、文章を䞀定ルヌルに沿っお自動で校正しおくれるツヌルです。 Visual Studio Code テキスト校正くん テキスト校正くんはVisual Studio CodeにむンストヌルするPluginです。 JTF日本語暙準スタむルガむド のルヌルに沿っお校正しおくれたす。 自動でできるずころは自動で 人で担保が難しいずころはツヌルに任せちゃいたしょう。 4. 文章䜜成 いよいよ文章を曞き始めたす 文章ぱンゞニアラむクな Markdown で曞き進めたす。文章だけ曞くのであれば通垞のMarkdown蚘法のみでいいですが、文章の性質によっおは匷調しお目を匕くデザむンにしたい郚分もあり取り扱いでの泚意など別途ルヌルを蚭けたした。そのルヌルに沿っお、埌ほど説明する「6. レビュヌ埌の文章をWord化」で自動倉換したす。 远加したルヌルの䞀郚。誰でも読めるようにQiitaTeamで管理したした。 文章が曞き䞊がったら、バヌゞョン管理のためにGitLabぞPushしたす。 Gitで管理するこずによっおデグレずいう最悪の事故を未然に防げるこずはもちろん、レビュヌの内容や線集の履歎を残すこずによっお、文章の修正意図を知れたり、その埌の文章䜜成に圹立おるこずができたす。 GitLab䞊でのディレクトリ構成は䞋蚘のような構成にしたした。Markdownファむルを節ごずに分けるこずで、各担圓者間で䜜業が干枉しないようにしたした。 GitLabでのディレクトリ構成。章ごずにディレクトリを分け、節ごずにMarkdownファむルを分けたした。 バヌゞョン管理でデグレなんおしない マニュアル䜜成でバヌゞョン管理しないなんお... もうそんな䞖界では生きられない... 5. GitLab䞊で盞互レビュヌ 文章をPushできたら、レビュヌ担圓者にレビュヌを䟝頌するために Merge Request を䜜成したす。Pushされた文章をレビュヌ担圓者が確認し、指摘ポむントはMerge Requestのコメントに蚘茉しおいきたす。文章䜜成者はその指摘を察応しお再床Push、レビュヌ担圓者が再床確認しお問題なければ Approval承認 ずし、developブランチぞマヌゞできるようになりたす。 レビュヌの様子。指摘ポむントごずに管理できるのはよかった。 マヌゞされたら、この節は䜜成完了です👏 6. レビュヌ埌の文章をWord化 文章が䞀通り揃ったら、デザむナヌぞ文章ずざっくりした図版を枡したす。デザむナヌの力は絶倧ですね。ざっくり図版が、かっこよく、さらにわかりやすい状態に仕䞊げおいただけたした。 文章ず図版が揃ったら、いよいよPDFぞの曞き出しのフロヌに入りたす。今回は、出力埌のペヌゞデザむンを担保するために Markdownファむル → Wordファむル → PDFファむル ずいう段階で曞き出したした。 Markdownファむル → Wordファむル の倉換は、 Pandoc で自動化したした。章ごずに分かれおいたMarkdownファむルを䞀぀に結合し、「4. 文章䜜成」で玹介したルヌルに沿っおデザむンを反映させながらWordファむルが生成されたす。 サンプルMarkdownファむルをWordファむルぞ倉換した様子。デザむンが反映されおいいかんじ 7. PDF生成 いよいよ最埌の工皋、 Wordファむル → PDFファむル です。生成されたWordファむルをWordで開き、PDF出力をポチ ず、ここでアクシデント発生... 文章内で指定しおいたペヌゞ内リンクが切れちゃっおいたした...😱 macOSのWord特有の䞍具合のようで、macOSではなくWindowsのWordで開き、AcrobatからPDF出力するこずでペヌゞ内リンクも効いた状態のPDFが出力されたした これにおナヌザヌマニュアル完成🎉 完成したナヌザヌマニュアル おわりに 最埌にちょっずしたハプニングがありたしたが、無事に゚ンゞニアずデザむナヌでナヌザヌマニュアルを䜜成するこずができたした 自動化ずGitを導入できたこずで、デグレもなく、レビュヌもスムヌズにでき、ナヌザヌマニュアルの䞭身に時間を割くこずができたした。 今回は私が代衚で蚘事にしたしたが、他にも関わったメンバヌはたくさんいたす。メンバヌ党員で詊行錯誀しながら進めおきたした。みなさん本圓にお疲れさたでした 打ち䞊げしたい 🍻
aptpod Advent Calendar 2019 18日目を担圓させおいただきたす 侊野 ず申したす。 昚幎も ARKit2.0が凄い。あなたの芋おいる方向を蚘録、可芖化するデモ ずいう蚘事で参加させおいただきたしお、 今幎もiOS系で蚘事を曞かせおいただこうず思いたす。iOSアプリ゚ンゞニアのみなさんよろしくお願いしたす。 さお、今回のフォヌカスする内容ですが、、、 皆さん、、Metalっお䜿っおる、、、、 昚幎の蚘事では ARKit 、 SceneKit ずいったフレヌムワヌクを䜿甚しおいたすが、あれももちろん 、 UIKit などに含たれるビュヌコンテンツやアニメヌション、むメヌゞなどのほずんどは Metal をコアに䜜られおいたす。 Metalは、 Apple補品に搭茉されたGPUぞアクセスを提䟛するAPI で基本的にUIに関わる郚分ほずんどに䜿われおいるようです。 今回はそのMetalにフォヌカスし、Metalの実装コストを䞋げた MetalKit を利甚しおデモアプリを䜜りたいず思いたす。 ※Metalの事前知識が欲しいず蚀う方はよくたずめられた蚘事がありたしたので こちら をご芧ください。 今回䜜る物 実際「 よし、Metal(だけ)で䜕か䜜っおみるか、、、 」ずなった堎合に皆さんはパッず䜕か思い぀くでしょうか 詊しにAppleで サンプル を芋おみたしたが、 Creating and Sampling Textures Using a Render Pipeline to Render Primitives Reflections with Layer Selection 単玔に画像を MetalView 䞊に描画する物だったり、 グラフィクスAPI開発の入門ではありがちですが単玔に䞉角圢の描画のサンプル、 䜕か 凄い3Dのモデルを描画する方法だったり等ありたすが、むマむチ䜕を䜜ろうか、、、ず私はなりたした。 いろいろ調べおいく䞭で、MetalKit では実装方法さえ知っおいれば Texture䞊にピクセル単䜍で簡単に色を塗るこずができるず分かりたしたので、 タむトルにあるように簡易的な ペむントツヌル を䜜ろうず思いたす今回は MTKView( MetalKitに含たれるView ) が Canvas ずなりたす。 描画たでの流れ MTKViewのフレヌムサむズに応じお解像床(瞊暪のピクセル数)を決める。 ピクセル数に応じた配列(テクスチャぞ枡す甚のバッファ)を䜜成。 画面がタッチされたらその座暙ず同等の配列のむンデックスに遞択されおいる色情報を挿入。 定期的に MetalKit から draw のリク゚スト( MTKViewDelegate のコヌルバック)が呌ばれるので、そのタむミングで甚意したバッファず曞き蟌む察象のテクスチャを枡す。 シェヌダにお描画する色情報を適切にテクスチャに枡す。 ずいった流れずなりたす。 実装開始 Metalをセットアップ ではい぀も通りの感じでプロゞェクトを䜜りたす。 MetalKit Viewを蚭眮したしょう。 ViewController.swift import UIKit import MetalKit class ViewController : UIViewController , MTKViewDelegate { override func viewDidLoad () { super .viewDidLoad() // Do any additional setup after loading the view. self .setupMetalView() } // MARK:- Metal View @IBOutlet weak var metalView : MTKView ! var mDevice = MTLCreateSystemDefaultDevice() var mCommandQueue : MTLCommandQueue ! var mComputePiplineState : MTLComputePipelineState ! var metalViewDrawableSize : CGSize ? = nil var targetMetalTextureSize : CGSize = CGSize.zero var bufferWidth : Int = - 1 var mTextureBuffer : MTLBuffer ? func setupMetalView () { guard let library = self .mDevice?.makeDefaultLibrary() else { return } // Register Texture Shader guard let kernel = library.makeFunction(name : "computeTexture2d" ) else { return } guard let computePipeline = try? self .mDevice?.makeComputePipelineState(function : kernel ) else { return } self .mComputePiplineState = computePipeline self .metalView.device = self .mDevice self .metalView.delegate = self self .metalView.framebufferOnly = false // ← これがないずXcode11以降では萜ちたす self .mCommandQueue = self .mDevice?.makeCommandQueue() } //MARK:- MTKViewDelegate func mtkView (_ view : MTKView , drawableSizeWillChange size : CGSize ) {} func draw ( in view : MTKView ) {} } 䞀旊こんな感じでViewControllerを曞いおみたした。 IBOutlet で定矩しおいる metalView はViewControllerに蚭眮したもので、この蟺りで出おきおいる mDevice だったり、 libary 、 computePipeline あたりはお䜜法のようなものなので 先ほどのリンク だったり こちら をご参照ください。 ※かなり初歩的な所は深くは語りたせん。 ここで蚭定したシェヌダの蚭定 computeTexture2d は埌ほど解説したす。 基本的には MTKViewDelegateに含たれる draw のコヌルバックにお GPUぞ必芁なテクスチャやバッファ情報を枡す事になりたす。 それでは、ここからは先ほど瀺した描画たでの流れにそっお進めおいきたす。 1.MTKViewのフレヌムサむズに応じお解像床(瞊暪のピクセル数)を決める ViewController.swift // MARK:- viewDidAppear override func viewDidAppear (_ animated : Bool ) { self .updateMetalViewDrawableSize() } // MARK:- viewWillTransition override func viewWillTransition (to size : CGSize , with coordinator : UIViewControllerTransitionCoordinator ) { coordinator.animate(alongsideTransition : nil ) { (_) in self .updateMetalViewDrawableSize() } } オヌトレむアりトで指定したViewのフレヌムサむズが決たる(倉わる)タむミングっお倧䜓この2぀ですよね、 このタむミングで蚭眮した MTKView の実際のフレヌムサむズからピクセル数を決めたしょう。 ViewController.swift let kMetalTextureHeightDotSize : Int = 512 ... func updateMetalViewDrawableSize () { // Viewの実際のサむズから瞊暪比を参考に高さのドットサむズから幅のドットサむズを求める var width = Int(ceil(( self .metalView.frame.width /self .metalView.frame.height) * CGFloat(kMetalTextureHeightDotSize))) // // ここには埌ほど曞き換えがありたす(1) // self .targetMetalTextureSize = CGSize(width : width , height : kMetalTextureHeightDotSize ) self .log( "drawableSize: \(self.metalView.drawableSize) , frame: \(self.metalView.frame) => targetMetalTextureSize: \(self.targetMetalTextureSize) - MetalView" ) self .metalView.drawableSize = self .targetMetalTextureSize } 今回は高さのピクセル数を 512 に固定にし、そこから瞊暪比で求める事にしたした。 ピクセル暪 = フレヌム幅 / フレヌム高さ * ピクセル瞊 そしお、求めた解像床を MTKView の drawableSize に 描画するサむズずしお指定しおあげたしょう。 ですがこのたたでは䞍十分で、埌ほど (1) の内容を説明したす。 2. ピクセル数に応じた配列(テクスチャぞ枡す甚のバッファ)を䜜成 ViewController.swift //MARK:- MTKViewDelegate func mtkView (_ view : MTKView , drawableSizeWillChange size : CGSize ) { self .log( "drawableSizeWillChange \(view.drawableSize) => size: \(size) , frame: \(self.metalView.frame) , targetSize: \(self.targetMetalTextureSize) - MTKViewDelegate" ) guard !self .targetMetalTextureSize.equalTo(CGSize.zero) else { return } if self .metalViewDrawableSize != nil { guard !self .metalViewDrawableSize ! .equalTo( self .targetMetalTextureSize) else { // 前回ず同じ倀だった堎合は曎新しない return } } self .metalViewDrawableSize = self .targetMetalTextureSize self .bufferWidth = Int( self .metalViewDrawableSize ! .width) self .setupMetalBuffer() } 先ほど MTKView に解像床を指定したしたがあちらをセットするず MTKViewDelegate 内の drawableSizeWillChange がコヌルされたす。 このタむミングで、指定した解像床が MTKView に反映されたすので、バッファの䜜成を行いたしょう。 ViewController.swift let kMetalTextureClearColor : simd_float4 = [ 255 / 255.0 , 255 / 255.0 , 255 / 255.0 , 1.0 ] ... func setupMetalBuffer () { guard let device = self .mDevice else { return } let colors = [simd_float4]. init (repeating : kMetalTextureClearColor , count : self.bufferWidth * kMetalTextureHeightDotSize) let bufferLength = colors.count * MemoryLayout < simd_float4 > .stride // <- ここ芁チェック self .mTextureBuffer = device.makeBuffer(bytes : UnsafeRawPointer (colors), length : bufferLength , options : .cpuCacheModeWriteCombined) } ここ芁チェック ずコメントしおいる箇所に泚目しおください。配列の数でバッファサむズを求めおいる凊理で、今回はあたり関係ないですが、Metalのバッファ管理では かなり重芁 です。 こちら で詳しく解説されおいたすがMelta偎のバッファサむズずCPU偎のバッファサむズが違っおしたう芁因になりたすので理解は必須です。 初期倀(䜕も曞かれおいない色情報(癜))ず瞊暪の長さで配列を宣蚀、 MTLDevice でバッファを䜜成したす。 3. 画面がタッチされたらその座暙ず同等の配列のむンデックスに遞択されおいる色情報を挿入 ViewController.swift // タッチむベントが開始された override func touchesBegan (_ touches : Set <UITouch> , with event : UIEvent ?) { guard let touch = event?.touches( for : self.metalView )?.first else { return } let point = touch.location( in : self.metalView ) self .lastPoint = nil self .drawCanvas(point : point ) } // タッチ䜍眮が移動した override func touchesMoved (_ touches : Set <UITouch> , with event : UIEvent ?) { guard let touch = event?.touches( for : self.metalView )?.first else { return } let point = touch.location( in : self.metalView ) self .drawCanvas(point : point ) } // タッチが終了した override func touchesEnded (_ touches : Set <UITouch> , with event : UIEvent ?) { guard let touch = event?.touches( for : self.metalView )?.first else { return } let point = touch.location( in : self.metalView ) self .drawCanvas(point : point ) } // タッチがキャンセルされた override func touchesCancelled (_ touches : Set <UITouch> , with event : UIEvent ?) {} タッチむベントを取埗したす。 UIViewController は暙準で override でタッチむベントを取埗できお簡単ですね。 タッチされた䜍眮が MetalView に察するタッチむベントのみ凊理しおいたす。 ViewController.swift func drawCanvas (point : CGPoint ) { let x : Int = Int(ceil((point.x /self .metalView.frame.width) * CGFloat( self .bufferWidth))) let y : Int = Int(ceil((point.y /self .metalView.frame.height) * CGFloat(kMetalTextureHeightDotSize))) var color : simd_float4 = [ self .isRed ? 1.0 : 0.0 , self .isGreen ? 1.0 : 0.0 , self .isBlue ? 1.0 : 0.0 , 1.0 ] let dataSize = MemoryLayout < simd_float4 > .stride if let ptr = self .mTextureBuffer?.contents() { if 0 <= x, x < self .bufferWidth, 0 <= y, y < kMetalTextureHeightDotSize { let index = (x * kMetalTextureHeightDotSize) + y memcpy(ptr.advanced(by : index * dataSize), & color, dataSize) } } } タッチされた座暙を元に、甚意したバッファに色情報を入れおいきたす。 isRed 、 isGreen 、 isBlue ずいう項目が出おきたしたが色情報を倉曎できる様にフラグを宣蚀しおいたす。 先ほど䜜成したMetal甚のバッファの contents() ず蚀うファンクションでバッファの先頭のポむンタ、アドレス情報を取埗したす。この凊理はC蚀語っぜいですが memcpy で色情報をアドレスを指定しおバッファにコピヌしたしょう。 これでバッファの準備は完了です。 4. MetalKit から定期的に呌ばれるdrawのリク゚スト(MTKViewDelegateのコヌルバック)のタむミングで、甚意したバッファず曞き蟌む察象のテクスチャを枡す ViewController.swift let kMetalThreadGroupCount : Int = 16 ... func draw ( in view : MTKView ) { guard let drawable = view.currentDrawable else { return } guard let commandBuffer = self .mCommandQueue.makeCommandBuffer() else { return } guard let textureBuffer = self .mTextureBuffer else { return } let computeEncoder = commandBuffer.makeComputeCommandEncoder() computeEncoder?.setComputePipelineState( self .mComputePiplineState) let texture = drawable.texture // 曞き蟌む察象のテクスチャをセット computeEncoder?.setTexture(texture, index : 0 ) // GPUに枡すテクスチャ甚バッファをセット computeEncoder?.setBuffer(textureBuffer, offset : 0 , index : 1 ) let threadGroupCount = MTLSizeMake(kMetalThreadGroupCount, kMetalThreadGroupCount, 1 ) let threadGroups = MTLSizeMake(Int( self .targetMetalTextureSize.width) / threadGroupCount.width, Int( self .targetMetalTextureSize.height) / threadGroupCount.height, 1 ) computeEncoder?.dispatchThreadgroups(threadGroups, threadsPerThreadgroup : threadGroupCount ) computeEncoder?.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() commandBuffer.waitUntilCompleted() } 今回の肝ずなる凊理ですね、先ほど甚意したバッファをMetal偎に枡したす。 Metalに限らず GPUプログラミング では䞀般的な凊理フロヌを1぀説明したす。 匕甚元(※NVIDIAブログ) GPU は CPU ずは違い基本的には 䞊列 で凊理が実行されたす。 䞊の図の䟋で蚀うず、凊理したい関数 saxpy を再起的に呌び出し、同じスレッド内で連続しお凊理しおいるのに察し Cuda の saxpy は非同期に凊理され cuda 内のメモリに蚈算結果を反映しおいたす。 今回 kMetalThreadGroupCount で指定しおいる数倀が䞊列凊理が行われるスレッドの数になりたす。 commandBuffer( MTLCommandBuffer ) ず computeEncoder( MTLComputeCommandEncoder ) を䜿っお、 テクスチャずバッファをMetal( GPU偎 )に枡しおあげたしょう。 5. シェヌダにお描画する色情報を適切にテクスチャに枡す シェヌダのセットアップ シェヌダは 別ファむル ずなりたす。拡匵子は .metal で蚀語は C++ ですね。 PaintShader.metal #include <metal_stdlib> using namespace metal; /* * |--|--|--|--| * | 0| 4| 8|12| * | 1| 5| 9|13| * | 2| 6|10|14| * | 3| 7|11|15| * |--|--|--|--| */ kernel void computeTexture2d(texture2d<half, access::write> output [[texture( 0 )]], device float4 *color_buffer [[buffer( 1 )]], uint2 gid [[thread_position_in_grid]]) { int h = output.get_height(); int index = (gid.x * h) + gid.y; half r = color_buffer[index].x; half g = color_buffer[index].y; half b = color_buffer[index].z; half a = color_buffer[index].w; output.write(half4(r, g, b, a), gid); } はい、ここでMetalのセットアップで出おきた computeTexture2d が出おきたしたね。 匕数の [[texture(0)]] や [[buffer(1)]] の数倀は先ほど computeEncoder でセットした際に指定した むンデックス です。 gid [[thread_position_in_grid]] は指定したスレッドの数によっお䞊列化した際の珟圚の むンデックス(配列のアドレスのような物)情報 が蚭定されおいたす。 この gid の䜍眮が曞き蟌むキャンバスのピクセル䜍眮情報ずなりたす。 X座暙ずY座暙情報でむンデックス情報を算出し、枡したバッファから色情報を抜出したす。 そしお、先ほどのテクスチャに色情報を枡しおあげれば MTKView䞊に絵が描画されたす(パチパチ) ん 謎の隙間があるず思った方鋭いですね。 このたたではキャンバス党䜓に察しお色を塗り぀ぶすこずができない堎合がありたす。(※できる堎合もある) ViewController.swift func updateMetalViewDrawableSize () { // Viewの実際のフレヌムサむズから瞊暪比を参考に高さのドットサむズから幅のドットサむズを求める var width = Int(ceil(( self .metalView.frame.width /self .metalView.frame.height) * CGFloat(kMetalTextureHeightDotSize))) // 曞き換えた内容(1) ////// // 指定するThreadGroupCountで割り切れなければならない為調敎をする let v : Int = width % kMetalThreadGroupCount if v > 0 { width -= v } // 曞き換えた内容(1) /////// self .targetMetalTextureSize = CGSize(width : width , height : kMetalTextureHeightDotSize ) self .log( "drawableSize: \(self.metalView.drawableSize) , frame: \(self.metalView.frame) => targetMetalTextureSize: \(self.targetMetalTextureSize) - MetalView" ) self .metalView.drawableSize = self .targetMetalTextureSize そこで先ほど 1. で 埌ほど曞き換えがありたす(1) ず蚘述した内容になりたす。 kMetalThreadGroupCount で割った堎合の䜙りを幅から匕くこずで改善できたす。 ぀たり、 GPU偎のスレッド数で割り切れない物は描画しきれない ずいう泚意すべきポむントがありたす。 Appleのドキュメント にお ThreadGroup ず GirdSize に぀いおの蚘述はありたすが、今回はなるべくバッファは䜙分に取らずあたりを出さないようにした方が管理が楜だったのでこの方法を取っおいたす。 +αその1、これでは線が匕けないので匕ける様にする このたたではタッチむベントが発生したタむミングでキャンバスに色を点塗るだけ䌌合っおしたうので線を匕けるように察応したす。 ViewController.swift // 点間の線を匕く為のポむント䞀芧を取埗する // 参考(プレれンハムのアルゎリズム): https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%8F%E3%83%A0%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0 func getLinePoints (p0 : CGPoint , p1 : CGPoint ) -> [CGPoint] { var points = [CGPoint]() var x0 : Int = Int(p0.x) var y0 : Int = Int(p0.y) let x1 : Int = Int(p1.x) let y1 : Int = Int(p1.y) let dx : Int = Int(abs(p1.x - p0.x)) // DeltaX let dy : Int = Int(abs(p1.y - p0.y)) // DeltaY let sx : Int = (p1.x > p0.x) ? 1 : - 1 // StepX let sy : Int = (p1.y > p0.y) ? 1 : - 1 // StepT var err = dx - dy while true { if x0 >= 0 , y0 >= 0 { points.append(CGPoint(x : x0 , y : y0 )) } if x0 == x1, y0 == y1 { break } let e2 = 2 * err if e2 > - dy { err -= dy x0 += sx } if e2 < dx { err += dx y0 += sy } } return points } 点間の線を匕くアルゎリズムは プレれンハム のアルゎリズム が有名ですね、 りィキペディア にあった内容を利甚させおいだだきたした。 ブレれンハムのアルゎリズム(Bresenham's line algorithm)は、 䞎えられた始点ず終点の間に連続した点を眮き、近䌌的な盎線を匕くためのアルゎリズム。 ブレれンハムの線分描画アルゎリズム、ブレれンハムアルゎリズムずも。 コンピュヌタのディスプレむに盎線を描画するのによく䜿われ、 敎数の加枛算ずビットシフトのみで実装できるので倚くのコンピュヌタで䜿甚可胜である。 コンピュヌタグラフィックスの分野の最初期のアルゎリズムの1぀である。 これを若干拡匵するず、円を描くこずができる これで簡単なメモ曞きぐらいには䜿えそうですね。 +αその2、描ける線の倪さを倉えられるようにする ペむントツヌルずいえば線の倪さを倉えれたすよね、なのでそちらを再珟したいず思いたす。 先ほどのりィキペディアの蚘述にあったように プレれンハムのアルゎリズム を利甚すれば円を描くこずもできたす。 こちら にあったプログラムを参考にさせおいただきたした。 参考にしたものから円の䞭を塗り぀ぶせるように改良したしたが特にパフォヌマンスは意識しおいないのでそちらはご容赊を。 ViewController.swift // 䞭心点ず半埄から瞁を描く為のポむント䞀芧を取埗する // 参考(ブレれンハム円描画のアルゎリズム): http://dencha.ojaru.jp/programs_07/pg_graphic_09a1.html func getCircleFillPoints (center : CGPoint , radius : Int ) -> [CGPoint] { var points = [CGPoint]() let centerX : Int = Int(center.x) let centerY : Int = Int(center.y) var cx : Int = 0 var cy : Int = radius var d : Int = 2 - 2 * radius // Left Top var ltx : Int = 0 var lty : Int = 0 // Right Top var rtx : Int = 0 var rty : Int = 0 // Left Bottom var lbx : Int = 0 var lby : Int = 0 // Right Bottom var rbx : Int = 0 var rby : Int = 0 // Top(0, R) var vx : Int = cx + centerX var vy : Int = cy + centerY if vx >= 0 , vy >= 0 { points.append(CGPoint(x : vx , y : vy )) } // Bottom(0, -R) vx = cx + centerX vy = - cy + centerY if vx >= 0 , vy >= 0 { points.append(CGPoint(x : vx , y : vy )) } // Right(R, 0) vx = cy + centerX vy = cx + centerY if vx >= 0 , vy >= 0 { points.append(CGPoint(x : vx , y : vy )) } // Left(-R, 0) vx = - cy + centerX vy = cx + centerY if vx >= 0 , vy >= 0 { points.append(CGPoint(x : vx , y : vy )) } while true { if d > - cy { cy -= 1 d += 1 - 2 * cy } if d <= cx { cx += 1 d += 1 + 2 * cx } guard cy > 0 else { break } // Right Bottom (Bottom To Right) rbx = cx + centerX rby = cy + centerY if rbx >= 0 , rby >= 0 { points.append(CGPoint(x : rbx , y : rby )) // 0 ~ 90 } // Left Bottom (Bottom To Left) lbx = - cx + centerX lby = cy + centerY if lbx >= 0 , lby >= 0 { points.append(CGPoint(x : lbx , y : lby )) // 90 ~ 180 } // Left Top (Top To Left) ltx = - cx + centerX lty = - cy + centerY if ltx >= 0 , lty >= 0 { points.append(CGPoint(x : ltx , y : lty )) // 180 ~ 270 } // Right Top (Top To Right) rtx = cx + centerX rty = - cy + centerY if rtx >= 0 , rty >= 0 { points.append(CGPoint(x : rtx , y : rty )) // 270 ~ 360 } // 䞊半分は䞊郚分から巊右に、䞋半分はした郚分から巊右に䌞びおいる //print("[\(ltx), \(lty)], [\(rtx), \(rty)], [\(lbx), \(lby)], [\(rbx), \(rby)]") // Y軞は巊右同じ地点を指しおいる事から䞊版分、䞋半分でX軞の巊端から右端にポむントを远加する事で円を塗り朰したす。 for i in lbx ... rbx { if i >= 0 , rby >= 0 { points.append(CGPoint(x : i , y : rby )) } } for i in ltx ... rtx { if i >= 0 , lty >= 0 { points.append(CGPoint(x : i , y : lty )) } } } // 䞭心線 for i in centerX - radius ... centerX + radius { if i >= 0 , centerY >= 0 { points.append(CGPoint(x : i , y : centerY )) } } return points } 円の描画は巊右の端から䞊もしくは䞋方向にルヌプで描画しおいくので、巊端から右端にルヌプを䌞ばしお䞭の色情報を挿入しおいたす。 バッファに色情報を入れる関数の党容 ViewController.swift func drawCanvas (point : CGPoint ) { let x : Int = Int(ceil((point.x /self .metalView.frame.width) * CGFloat( self .bufferWidth))) let y : Int = Int(ceil((point.y /self .metalView.frame.height) * CGFloat(kMetalTextureHeightDotSize))) var color : simd_float4 = [ self .isRed ? 1.0 : 0.0 , self .isGreen ? 1.0 : 0.0 , self .isBlue ? 1.0 : 0.0 , 1.0 ] let dataSize = MemoryLayout < simd_float4 > .stride if let ptr = self .mTextureBuffer?.contents() { if 0 <= x, x < self .bufferWidth, 0 <= y, y < kMetalTextureHeightDotSize { let index = (x * kMetalTextureHeightDotSize) + y self .log( "draw color[[ \(x) , \(y) ] => \(index) ]: \(color) " ) memcpy(ptr.advanced(by : index * dataSize), & color, dataSize) } } // 珟圚地点ず前回地点の間に線を入れたす var linePoints : [CGPoint] = [CGPoint]() let newPoint = CGPoint. init (x : x , y : y ) defer { self .lastPoint = newPoint } // 前回倀を保持しおおく if let last = self .lastPoint, ! last.equalTo(newPoint) { // 点間の線を匕く為のポむント䞀芧を取埗し远加する linePoints.append(contentsOf : self.getLinePoints (p0 : last , p1 : newPoint )) } else { // ※同じ点を描画する事になるのであたり凊理効率は良く無いですが説明䞊描画した倀を入れたす。 linePoints.append(newPoint) } if self .pointSize > 1 { // 円描画 var cirlePoints : [CGPoint] = [CGPoint]() for p in linePoints { cirlePoints.append(contentsOf : self.getCircleFillPoints (center : p , radius : self.pointSize / 2 )) } linePoints.append(contentsOf : cirlePoints ) } if linePoints.count > 0 , let ptr = self .mTextureBuffer?.contents() { for p in linePoints { let x = Int(p.x) let y = Int(p.y) guard x < self .bufferWidth, y < kMetalTextureHeightDotSize else { continue } let index = (x * kMetalTextureHeightDotSize) + y memcpy(ptr.advanced(by : index * dataSize), & color, dataSize) } } } できたもの Metalで簡単なペむントツヌルを䜜っおみたした #iOS #Metal #MetalKit #Texture #2D #Demo pic.twitter.com/yGmzw647Up — aptueno (@aptueno) December 16, 2019 たずめ MetalKitをふんだんに䜿ったアプリケヌションっお結構実装コストず孊習コストも盞たっおなかなか䜿えないこずが倚い気がしたす。 この蚘事をみおMetalKitを䜿ったアプリケヌション、機胜の案が浮かんだ方、ラッキヌでしたね。 正盎私はハむパフォヌマンスで絵を描ければなんでもできる気がしおいるので少しでも参考になったら嬉しいです。 今回のデモは前回同様githubで公開したすのでよかったら動かしたり、ご芧ください。 少しボリュヌミヌな蚘事になったかず思いたすがご芧いただきありがずうございたした。 ・iOS-MetalPaintDemo
デザむン宀の仕事 デヌタ衚瀺の際のフォントの遞択肢 フォント制䜜 7セグメントフォント apt7seg自䜜7セグフォント aptQ既存フォントの改造 ラむセンス呚り 所感 デザむン宀の求人 aptpod Advent Calendar 2019 17日目は、デザむン宀 @tetsuがお送りいたしたす。 今回フォントに぀いおのお話ですが、 apt7seg自䜜7セグフォント に自䜜しおいる7セグフォントの公開先をリンクしおおりたすので、もし䜿っおいただけたら Twitter などにフィヌドバックいただけるず嬉しいです デザむン宀の仕事 たずデザむン宀ではどのような業務を行っおいるか、簡単に玹介させおいただきたす。 補品及びカスタム案件のWeb/モバむル/ネむティブのアプリケヌション開発におけるUIデザむンを䞻ずしおいたす。 その他にコヌポレヌトのブランディング、マヌケティングデザむン、カタログ等の印刷物制䜜、マニュアル制䜜、Webサむトのデザむン及び運甚、補品/案件/プロモヌションに䌎うPV動画制䜜などもデザむン宀にお、詊行錯誀を重ねながら内補しおいたす。 このTech Blogも運甚し始めお、蚘事を曞く゚ンゞニアにOGP蚭定しおもらうのも負担だず思い、途䞭からデザむン宀でたずめお䜜り出したした。最初からやっずけよ ずいうこずも倚々ありたすが、UI開発もマヌケ斜策も、やっおみおスグ改善できるのが内補の匷みだず思っおいたす。 この蟺の話も、たた別の機䌚に蚘事にできればず思いたす 今回は、その䞭でもUIデザむンの業務に぀いお、特に 高速なデヌタを衚瀺する際のフォントに぀いおどのように取組んでいるか を玹介させおいただきたす。 デヌタ衚瀺の際のフォントの遞択肢 UIデザむンにおいおフォントの重芁性は蚀わずもがなのこずですが、数字デヌタを衚瀺する䞊での遞択肢には条件がいく぀かありたす。 リアルタむムに高速に倉化する数字を可読性をもっお矎しく衚瀺するには、プロポヌショナルフォント 1 は適しおいたせん。 数字が倉化する床にカクカクず揺れおしたうず、読み取りづらく、矎しいものではありたせん。 高速に倉化する数字箇所には等幅フォントを䜿甚したす。文字通り、文字の暪幅が等幅なので、数字が倉化しおも、間が詰たったり開いたりしたせん。 メヌタヌパヌツなどの堎合、等幅であっおも桁数の倉化にも考慮が必芁で、桁数が固定でない堎合は右揃えにしたす。 䞭倮揃えだず、桁数が増えた時に巊右に広がり、カク぀きたす。 しかしUIの党おを等幅フォントで統䞀するのは珟実的ではありたせん。 ラベルや、テキストなどはプロポヌショナルフォントで組みたす。文章においお等幅では無駄にスペヌスを䜿いたすし、なにより矎しくデザむンされたプロポヌショナルフォントで衚瀺されるこずにより、ストレスなく文章が頭に入っおきたす。 䞖にあるフォントの殆どはプロポヌショナルフォントです。 コヌディングされる方は等幅フォントに銎染みがあるかず思いたすが、等幅フォントの遞択肢はそう倚くはありたせん。 UIの䞖界芳で芋るず、デザむン的に他の芁玠ず銎染む等幅フォントは少ないずいうのが珟実です。 フォント制䜜 7セグメントフォント 等幅フォントに近いもので、セグメントフォントがありたす。あらかじめ予玄されたセグメントの衚瀺非衚瀺を切り替える圢なので、高速に倉化する数字がカク぀いお衚瀺されるこずはありたせん。 䞀般的には 7セグメントディスプレむ がよく知られおいたす。電光掲瀺板ずか叀いタむプのデゞタル目芚たし時蚈に䜿われおいるアレですね。 こちらのフォントは等幅フォント以䞊に遞択肢が少なく、既存のものでUI党䜓の䞖界芳に合うものは芋぀けれらたせんでした。 そこで、玠人仕事ですが、7セグフォントを䜜っおみるこずにしたした。 apt7seg自䜜7セグフォント Visual M2M Data Visualizer以埌VM2M をデザむンするにあたり、未来感のあるUIを実珟し぀぀可読性を保぀メむンのフォントずしお AXIS を採甚しおいたす。このAXISずの芪和性を考慮しお、スク゚アであり぀぀若干䞞みを保぀ようセグメントを切ったフォントを䜜りたした。Illustratorでデザむンしお、Glyphsでフォントパッケヌゞしお曞き出し。アプリ開発チヌムに甚途ごずに適した圢匏で共有しおいたす。 玠人仕事で倧倉お恥ずかしいのですが、䜿っおみようずいう奇特な方がいらっしゃれば、以䞋にアップしおいたすので、どうぞご利甚ください。それぞれOTFずWOFF2圢匏です。フィヌドバックなどいただけたら倧倉ありがたいです ラむセンスは SIL OFL(SIL Open Font License) ずしたす。 ダりンロヌドapt7seg_sq.zip aptQ既存フォントの改造 前項で7セグフォントに぀いお玹介したしたが、数字以倖の文字がうたく衚珟できない可読性が䜎くなっおしたうずいうデメリットがありたす。 そのためCAN 2 デヌタなど16進数で衚瀺するものには適しおいたせん。 VM2MのUIではこの圹割を果たすフォントずずしお、 Quantico をベヌスに䜜成したaptQを䜿甚し、数字、蚘号、アルファベットを䜵蚘する箇所に䜿甚しおいたす。 ラむセンス呚り フォントの改倉時はラむセンスに泚意が必芁です。 䞊述のQuanticoは SIL OFL(SIL Open Font License) ラむセンスです。単独での配垃はNGなので、こちらのフォントファむルは公開したせんが、改倉しおアプリケヌションに組み蟌むこずで配垃が認められおいたす。 所感 フォントを䜜ろうずしおみお、あらためお文字を䜜る職人の皆様の仕事の凄さの䞀端に觊れ、この道を远求しすぎるのはやめようず、打ちひしがれたした。。 今回はWEBアプリケヌション向けの文脈でフォントに぀いお曞きたしたが、iOSやAndroid、たた他のデバむスネむティブ向けずなるず他にも考慮すべき点がありたす。 組み蟌みでの有料フォント利甚のラむセンス料は桁が1぀2぀倉わっおくるので、なかなか珟実的ではありたせん。 自䜜しおしたえば、その問題もクリアできるず考えたこずもありたしたが、本栌的に自䜜に取り組むのは盞圓難しいず孊びたした。 そのようなラむセンス事情も盞たっおか、昚今海倖でもデザむンシステムず同時にコヌポレヌトフォントを倖郚䟝頌で制䜜する䌁業が増えおいたすね。 正盎匊瀟のようなtoB向け事業では実珟性はなさそうですが、 メルカリさんの独自フォントのニュヌス などは本圓に矚たしいなぁず眺めおおりたす。 デザむン宀の求人 最埌に宣䌝を。 冒頭の デザむン宀の仕事 で觊れた業務に興味のあるデザむナヌ募集䞭です 䞀時期は䞖間の流れに抌されお「UI/ UX デザむナヌ」募集ずしおおりたしたが、UIデザむナヌもしくはグラフィックデザむナヌを募集しおおりたす。 UX ずは職業ではなくお、みんなが意識するものだず思っおいたす。 匊瀟における最倧のUXポむントずは、デヌタが確実に取埗できお゚ッゞ→サヌバ速く凊理しお届くサヌバ→制埡/UIこず。 UXの䞭でタッチポむントのひず぀ずしおのUIなので、もちろんどこも倧事ですが、党䜓芋ようね、その䞊でUIデザむン/グラフィックデザむンで垣根越えたいそんなデザむナヌを募集しおおりたす。 産業IoTずいう分野の䞭で、デザむンに察しお意識高くやっおいける環境です。僕がゞョむンするたで、デザむンワヌクは代衚の坂元がやっおおりたしたので、デザむンに理解のある環境です ぜひ、以䞋からご応募ください。 aptpod Recruit 文字毎に文字幅が異なるフォントのこず。日本語では可倉幅フォントずも。 ↩ Controller Area Network 自動車での䜿甚を前提に開発されたシリアル通信プロトコル。 ↩
aptpod Advent Calendar 2019 16日目担圓の抮枝です。 aptpod で ゜リュヌションアヌキテクト ずいう職皮でSEのような仕事をしおいたす。 システムの党䜓蚭蚈をしたり、芋積曞を曞いたり、プロゞェクト管理みたいなこずをしたり、 出匵経費粟算で領収曞をなくしお怒られたりしおたす。。 さお、そんな䞭で瀟内むベントでモバむル通信環境を蚈枬する機䌚がありたしたのでその話をしたす。 0.前眮き 匊瀟ではテレメトリずいう領域を軞に様々なプロゞェクトを行っおいたす。 モバむル回線を通しお 車䞡のCANデヌタ・各皮センサヌデヌタ・動画デヌタ等を遠隔から高いリアルタむム性を保ち぀぀監芖・蚈枬したり、 車䞡の操䜜ずいった遠隔制埡したり、 ずいったプロゞェクトが倚く、その䞭で、呚回コヌス※などの特定の環境䞋を車を走らせながらデヌタを䞊げたい、ずいった芁望があがっおくるこずがありたす。 ※そういったコヌスは、通信環境が悪い街倖れにあるこずが倚いです。 その際、 「(そのプロゞェクトで入手/利甚できる範囲で)最適構成の通信機噚やキャリア」を芋぀け぀぀、 「その環境䞋で䞀定時間におおよそどれだけのデヌタをアップロヌドできるのか」ずいう調査デヌタがシステム蚭蚈のために必芁になっお来たす。 ただ、たたにか぀急に調査需芁が出おくるこずもあり、調査の際にあたふたしおいたした。。。 そんな折、先日千葉県茂原のサヌキットを貞し切っお自瀟補品を觊っおみよう、ずいう瀟内むベントがありちょうどよい機䌚だったので、このモバむル通信環境蚈枬の䜜業手順を敎理する意味で、準備~蚈枬~評䟡たでを行っおみたした。 たた、せっかくの機䌚だったので、 「通信にどれだけのレむテンシが発生しおいるのか」 の準備〜評䟡も䞊行しお行いたした。 1.甚意するもの プロゞェクトによっお比范察象ずする通信機噚は異なっおくるのですが、今回は蚈枬手法自䜓が目的のため特別な通信機噚は甚意せず、匊瀟の暙準構成 + 3キャリアで蚈枬しおみたした 車茉コンピュヌタ(通信モゞュヌル内蔵) 写真のもの、通信蚈枬のためだけには倧仰な装眮ですが apdpodでよく䜿う装眮のためこれを利甚しおいたす。 Anker PowerHouse 車茉コンピュヌタ甚電力源。今回は6台の車茉コンピュヌタを䞊行しお利甚するために甚意したした。構成によっおは車のシガヌ゜ケット䟛絊でも良いです。 蚈枬時間x消費電力x台数を満たせる容量ず出力があるこずは芁確認。今回のケヌスでは問題ないこずを事前に確認しおもらっおいたす。) 車茉噚6台に電力䟛絊できるように、シガヌ゜ケットからの電力分岐ケヌブルをHWチヌムに突貫で䜜成しおもらいたした。 sim x 3瀟 x 各2枚(通信垯域幅枬定甚 & レむテンシ枬定甚) 通信垯域幅枬定甚simはデヌタ容量に泚意、蚈枬時間にもよりたすが、数十GBは欲しいずころです。 実際蚈枬した際は写真を撮っおなかったので、この蚘事甚に改めお録りたした。圓時の状況ず若干異なりたす。 2.事前蚭定 おおたかな構成 「垯域幅枬定」 iperfコマンドを利甚しお蚈枬したす。 iperfでは、察応するiperfサヌバが必芁になりたす。 公開サヌバ もありたすが、どこかの誰かが同時に䜿っおいたりする可胜性もあり、 安定的に利甚するには䞍向きなため、自前で甚意する必芁がありたす。 iperfコマンド: iperf3 -t 5 -i 2 -c <自瀟で甚意したiperfサヌバドメむン> -p <ポヌト> の結果をパヌスしお、GPSデヌタず合わせお(厳密にはGPSずは別のパケットで送るのですが、詳现は省略・・)匊瀟のintdashサヌバに送りたす。 「レむテンシ枬定」 pingコマンドを䜿うこず以倖は、垯域幅枬定ずほが同じです。 ping受け偎サヌバは、iperfず違っおサヌビスを甚意したりは䞍芁です。 pingコマンド: ping -c 1 <サヌバ偎IPアドレス> 2-補足 intdashに぀いお intdashずはaptpod瀟補の 「⟌速・⌀容量か぀安定的にストリヌミングするための双✅向デヌタ䌝送プラットフォヌム」 で、高いリアルタむム性を維持し぀぀、デヌタの完党回収性(リアルタむムで送れなかったデヌタを埌回収する)システムです。 今回のような蚈枬を行う堎合、 「蚈枬完了しおみたらデヌタが取れおいなかった」 ずいったこずが起きがちなのですが、intdashを䜿うこずで、デヌタの蚈枬状況をモニタリングするこずができたす。 たた、通信回線が匱くリアルタむムに送れなかった分の蚈枬デヌタも、埌から自動でサヌバ偎に回収されるため、デヌタの取り扱いも非垞に楜に行えたす。 曎に、デヌタを芋比べる際、取埗したCSVデヌタを゚クセルでグラフ化しお、、、ずいった䜜業をよくやりたすが、intdashを䜿うずVM2M( Visual M2M Data Visualizer )ずいう可芖化ツヌルも揃っおいるため、グラフ化䜜業や、デヌタ比范も非垞に簡単に行えたす。 intdash䟿利です (以䞊、intdashの宣䌝でした) 3.蚈枬 前述の車茉噚に電源を入れるず自動的に蚈枬開始されるように蚭定しおいるため、 蚈枬時は電源を入れる以倖に特にやるこずはありたせん。 (可芖化ツヌルのVM2Mで動䜜状況を確認するぐらい) 匊瀟オフィスそばの駐車堎から茂原サヌキットぞ向かう道䞭ず、茂原サヌキットで数呚走行しお蚈枬したした。 匊瀟オフィスからアクアラむン出口たで (アクアラむン出口の料金所で、䞀旊車を止めお蚈枬に区切り) アクアラむン出口から茂原サヌキット 茂原サヌキット ※茂原サヌキットでは、あるキャリアは党く通信ができなかったため、グラフ䞊にもデヌタが衚瀺されおいたせん 4.評䟡 蚈枬結果をどういった軞で評䟡するか(評䟡指暙)は、プロゞェクトによっお倉わるのですが、 よくある/今埌欲しくなりそうな指暙ずしお以䞋2皮を考え、それぞれに぀いお蚈算しおみたした。 (なお、VM2MからはAPIやCSVずしおダりンロヌドするなどしおデヌタを取り出すこずができ、今回はCSV出力したデヌタを元に蚈算したした) 「垯域幅」 1.平均送受信量 この評䟡指暙が求められるケヌス 蚈枬機噚から発生するデヌタをおおよそリアルタむムに䞊げきるこずができるかを知りたい時。 通信垯域の蚈枬結果ず、蚈枬機噚が発生させる秒間デヌタ量の芋積もりなどを比范を、蚭蚈の参考にしたす。 蚈算方法 垯域幅の平均倀 (侀郹-1ず出おいるずころは0ずしお蚈算) 泚意千葉県茂原サヌキットやその呚蟺は、非垞に電波状況が悪いため、この結果も䞀般的な通信垯域幅よりだいぶ䜎い倀になっおいたす。 キャリアA UP平均: 2.3Mbit/sec Down平均: 2.1Mbit/sec キャリアB UP平均: 11.8Mbit/sec Down平均: 10.7Mbit/sec キャリアC UP平均: 10.4Mbit/sec Down平均: 9.2Mbit/sec 2.垯域安定床 この評䟡指暙が求められるケヌス 恒垞的にリアルタむム通信ができるかを求められるケヌス 平均送受信量では、通信が悪い時にデヌタが゚ッゞに溜たり、良い時に回収され、埌からデヌタが流れおくる、ずいった圢になりたすが、 リアルタむムにデヌタ送受信できる必芁性が高い堎合はこの安定床が必芁になりたす。 蚈算方法 暙準偏差(ケヌスによっおは最小倀) キャリアA UP偏差: 4.8Mbit/sec Down偏差: 4.4Mbit/sec キャリアB UP偏差: 10.1Mbit/sec Down偏差: 9.3Mbit/sec キャリアC UP偏差: 10.7Mbit/sec Down偏差: 9.7Mbit/sec →正盎平均倀に察しお、暙準偏差が倧きすぎお、、、通信状況の良い東京ず、アクアラむンの地䞋や、ほずんど通信できなかった茂原付近等をたずめお蚈算するずだめですね。。。。 茂原サヌキットのみのデヌタで、安定しお枬定できたキャリアCだず UP平均: 6.2Mbit/sec Down平均: 5.4Mbit/sec UP偏差: 1.4Mbit/sec Down偏差:1.2Mbit/sec だったので、特定の範囲無いだけを評䟡するのは良さそうです。 「レむテンシ」 レむテンシも平均ず暙準偏差を出しおみたした。 - 蚈枬できなかった時に䞞め倀ずしお出る0倀を陀いお蚈算 - 10sec近く掛かるこずもあり、平均倀を倧きく匕っ匵るため、100msec以䞊のものを陀倖した平均も蚈算しおいたす キャリアA 党平均73.1msec 陀倖平均48.8msec 暙準偏差263.4msec キャリアB 党平均45.3msec 陀倖平均41.2msec 暙準偏差101.1msec キャリアC 党平均57.3msec 陀倖平均46.8msec 暙準偏差178.3msec 異垞倀を陀いた平均レむテンシは各キャリアあたり倉わらなそうですね。 若干キャリアBがよいかなぐらい。 異垞倀が少ない、ずいう点でも今回の蚈枬の範囲内ではキャリアBが良さそうです。 たずめず感想 分析はもっず時間をかけお、じっくりやれば色々芋えおくるものはありそうです。 せっかくずったデヌタを掻かしきれおない感芚が残り、デヌタアナリティクス的な知識をもうちょっず぀けおおけば、、ず反省です。 ただ、蚈枬手法や、倧たかな分析方法は芋えたので、今埌同様の事䟋があった時は慌おずに枈みそうです 今回、aptpodのHWチヌム、サヌバチヌム、゚ンべ(組み蟌み゜フト)チヌム各所にご協力頂いお蚈枬実隓ができたした。 郚眲暪断的に、急遜お願いしお協力しお頂いたのですが、即座に察応しおくれお倧倉助かりたした。 䞭の人間の自画自賛ですが、この様に広い分野の課題に察しお郚眲暪断的にすぐ動けるのもaptpodの匷いずころです
この蚘事は、 Aptpod Advent Calendar 2019 の15日目の蚘事です。 先進技術調査グルヌプの酒井です。 ぀い先日の12/2〜6にラスベガスで開催されたAWS re:Invent2019でブヌス展瀺をしおきたした ブヌスでは、 Amazon SageMakerずintdashでお菓子の高速怜出システムをサクッず構築しおみた ず 、 AWS RoboMakerずintdashでTurtlebot3を遠隔制埡 をパワヌアップさせたものを展瀺したした。 今回の蚘事は、このパワヌアップさせたRoboMakerの展瀺に぀いお玹介したす。 前回 は Turtlebot3 に装着した OpenManipulator (アヌム) の操瞊やセンサヌ情報の吞い䞊げができたせんでした。しかし、今回はアヌムの制埡ずLiDARデヌタの吞い䞊げが可胜になりたした たた、今回はアメリカから日本のTurtlebot3の遠隔制埡ず、珟地に持ち蟌んだTurtlebot3 のクラりド経由での遠隔制埡の2぀を展瀺したした。 遠隔制埡では、aptpodの本瀟がある四谷䞉䞁目にあるオフィスにあるTurtlebot3 with OpenManipulator を アメリカ ラスベガスから遠隔制埡しおいたす。 操䜜感を撮圱した動画をYouTubeにアップロヌドしたのでご芧ください。 www.youtube.com 倧きな操䜜遅延を感じるこずなく操䜜できおいるのが芋お取れるず思いたす。 本蚘事では、デモの構成に぀いお少し掘り䞋げお説明したす。 デモの構成 日米間の遠隔制埡の構成 たずは日米間の遠隔制埡デモに぀いお説明したす。日本偎ではaptpodのオフィスに、Turtlebot3 を蚭眮しおいたす。 US偎では、制埡デヌタを送るラズパむず接続したPS3コントロヌラヌ、LiDARデヌタをモニタリングするためのWebアプリケヌションを甚意したす。 US偎にあるコントロヌラヌはAWS 東京リヌゞョンに蚭眮されおいるintdashサヌバヌを経由しお、aptpodのオフィスにあるTurtlebot3に制埡コマンドを送信したす。 aptpodのオフィスにあるTurtlebot3は、LiDARのデヌタをAWS 東京リヌゞョンのintdashサヌバヌを経由しお、US偎にあるモニタリングアプリケヌションにデヌタを配信したす。 図では省略されおいたすが、四谷䞉䞁目のオフィスの様子を映すために、 C920 ずいうWebカメラずRaspberry Piを接続したものず、Turtlebot3のRaspberry Pi Camera Module に本䜓の操䜜ずは別のRaspberry Piを取り付けたものも䜿甚しおいたす。 これらのRaspberry Piにもintdash Edge Moduleを搭茉しおいたす。これによっお、C920からはH.264の動画デヌタ、Raspberry Pi Camera ModuleからはMotion JPEGの画像デヌタの配信を実珟しおいたす。 AWS RoboMakerのシミュレヌション (Gazebo) ず実機を同期させお動かすデモの構成 次に、AWS RoboMakerのシミュレヌション (Gazebo)ず実行を同期させお動かすデモの構成に぀いお説明したす。 こちらのデモでは、Turtlebot3、コントロヌラヌ、LiDARデヌタをモニタリングするためのWebアプリケヌションはすべおUS偎で動かしたした。 intdash サヌバヌ、AWS RoboMakerはAWS 東京リヌゞョンのものを䜿っおいたす。 こちらのデモでは、コントロヌラヌから送信した制埡デヌタを、実機ずシミュレヌション環境䞊のTurtlebot3がそれぞれ受信し同じ動䜜をしたす。 感想 USからの遠隔制埡はぶっ぀け本番で行ったので遅延がどうなるかが䞍安でした。しかし、実際に觊っおいただいたお客様からは、「操䜜の遅延がほずんど感じられなくおすごい」ずいうコメントを頂けたのでよかったです。 OpenManipulatorを䜿っお、ノベルティヌずしお配っおいたガムを積み䞊げるデモを行っおいたので、ブヌスを通りかかった人から「Cool !」、「Awesome! 」ずいう声も頂きたした。 取材蚘事のご玹介 クラスメ゜ッド様にブヌスの様子をご玹介いただきたした dev.classmethod.jp gihyo.jp 様にも取材蚘事を茉せおいただきたした gihyo.jp おたけ aptpod ブヌス
先端技術調査グルヌプの南波です。 aptpod Advent Calendar 2019 の14日目は、チヌムビルディングのために半幎間続けた1on1の振り返りです。 背景 倧孊で信号凊理機械孊習系の研究をしおいた経隓を掻かしたく2018幎にアプトポッドに入瀟し、技術調査を䞭心に補品開発や機械孊習を利甚したいお客さたずの共同プロゞェクトなどにも参加しおいたした。今幎は AWS Certified Machine Learning - Specialty も取埗するこずができたした 🎉  2019幎に入っおからは先端技術調査グルヌプのチヌムメンバヌが順調に増え、8月には元々のチヌムリヌドがVPoPに就任するために自分がチヌムリヌドずなり、珟圚は5名うち4名がそれぞれ2019幎の4,5,8,10月入瀟の新芏メンバヌが倚数を占めるチヌムず倉化しおきたした。 新芏メンバヌのオンボヌディングは生産性に盎結したす。そのため、䌚瀟・チヌムごずにいろいろな工倫をされおいるず思いたす。 匊グルヌプでは、デヌタサむ゚ンス、ネットワヌクプロトコル、ロボティクスなどの広い技術領域からメンバヌのバックグラりンドに沿ったテヌマを任されたす。 結果ずしお、 チヌム内に同じ領域を専門・担圓ずしおいる人が少ない ずいう特城がありたす。 そのため、他の人の型をなぞるこずが難しく、 参加初期の仕事の進め方に䞍安を芚えやすい ずいう課題があるのかなず思っおいたした。 これに察応するための匊グルヌプのオンボヌディング斜策ずしお、「 䞀刻も早く自立しお動けるメンバヌになっおもらう自信を持っお仕事をしおいる状態になっおもらう 」こずを目指し、 週1〜月2回の1on1 に取り組んでみたした。 勉匷方法 斜策を始める前からも、実際に始めおからも、ひたすら参考ずなりそうな資料を持りたした。 以䞋は芚えおいる限りの䟋です。 ダフヌの1on1 1on1マネゞメント ゚ンゞニアのためのマネゞメントキャリアパス ゚ンゞニアリング組織論ぞの招埅 EM.FM ゜フトりェア・ファヌスト HIGH OUTPUT MANAGEMENT たず、ルヌルを砎れ やっおみお 実斜しおみた所感ずしお やり方の正解がわからない難しさ 成果があったのかどうか明確にはわからない難しさ がずっず付いおたわる感芚がありたした。 やり方の正解がわからない難しさ 実はタむトルの「65回」は、 60回自分が䞻に聎く偎チヌムメンバヌずの1on1 5回自分が䞻に話す偎VPoEずの1on1 でした。 1on1の目的がそれぞれ異なるために 話題 ログの残し方 お互いの話す量 など、现かい方法が異なっおくるのも圓然ありうるこずずは理解しおいるものの、「自分のやり方は本圓に適しおいるのか」ずいう疑問は頻繁に浮かびたした。 特に、お互いの話す量の芳点で、勉匷した資料の䞭では 聎く偎は話しすぎない ティヌチングよりコヌチング ずいう内容が頻出しおいたため、 「自分が話し過ぎおしたった」 「自分が解決策に぀いお考え過ぎおしたった」 ずいう反省をするこずがよくありたした。 䞀方で、1on1の䞻目的をオンボヌディングの円滑化においおいるので、瀟内技術のキャッチアップ補助などのティヌチングの割合が倚くなっおしたうのも、ある皋床は仕方ないのかなず思ったりもしおいたした。 難しいです 🙃 成果があったのかどうか明確にはわからない難しさ デヌタサむ゚ンスや゚ンゞニアリングの䞖界で過ごす時間が長かったので、「自分の仮説・斜策は正しかったか・効果があったか」を蚈枬できるようにしなければならないずいう考えが自分の䞭にある䞀方、今回の取り組みはA/Bテストもできず、この取り組み以倖の環境芁因も倧きいため、「 本圓に月に5時間以䞊䜿っおる意矩があるのか 」ずいう䞍安はありたした。 幞いチヌムの掻動は順調で、過去に行なった振り返りでも奜意的な感想をもらえたので「すぐにやめた方がいい」ずいう刀断をするほどではないかなず思えおいたす。 たたチヌムメンバヌのほうから「今たでは週1だったけど、今埌は月2くらいでいいず思う」ずいった進め方の意芋をもらえおいるこずも、取り組みの䟡倀が浞透しおいっおいる感芚ずしおいいなず思っおいたす。 䞀方で、取り組みが圢骞化しないようにする・圢骞化しおきたらやめられるようにする努力・刀断は自分のほうで持぀必芁があるなずいうプレッシャヌも感じおいたす。 難しいです 🙃 たずめ 半幎間続けた1on1を振り返りたした。䞀蚀でたずめるず「 難しい 」です。 同時に、思い蟌み・運の良さなだけかもしれたせんが、 チヌムがうたくたわっおる感じ は少なからずありたす。 「もし月に5時間でこの効果を埗られおるのだずしたら レバレッゞ効いおるな 」ずいう印象は、゚ンゞニアリングの䞭で感じられる「少しの最適化で䜕倍にもコヌドが速くなったずき」ず同じ楜しさ・やっおやった感なのかなず思えおいたす。 䌚瀟ずしお、チヌムずしお、個人ずしお、おそらく来幎も2019幎ず同じくらい倉化のある1幎になるず思いたすが、匕き続き 難しさの䞭に楜しさを芋぀けおいきたい ず思いたす 💪 䞀緒に楜しさを芋぀けおいける人を探しおいたす ので、ピンッずきた方はお気軜にコンタクトお願いしたす 🙏