Ryuz's tech blog

FPGAなどの技術ブログ

撮影ボックス買ってみた

以前、マクベスチャート(カラーチェッカー)欲しいけど高いと呟いたら、安いのあるよと言うお話を頂いたことがあります。

今回は、照明環境の話です。

画像処理開発していると、カメラで対象が綺麗に写らず「ドーム照明ほしい」、「同軸照明欲しい」、「積分球欲しい」、となりがちなシーンはしばしあるわけですが、個人ではスペースも金額も辛いので、何かないかなと思っていたらスマホ向けの撮影ボックスなるものがあることを知ったので買ってみました。

私が買ったのはナカバヤシ株式会社さんの SAC-BOX04 という製品になります。探すと他にもいろいろなものがありそうです。

こんな使い方をしております(まあMNISTには要らないけど、例として(笑))。

MNISTの撮影

多くの場合一般家庭にあるような照明環境ですと、照明が一部だけ鏡面反射で強く光ってしまい均一な画像が撮れないという事がよくあります。身近な例だと「口座を開くのにマイナカードの撮影認証がうまくいかない!」などがその典型でしょうか。

ですのでなるべく、360度全体から間接光を当てたいという要求が出てくるわけです。

これを極めてちゃんとやる場合は、積分球と言うランバート反射(すべての方向に一律に反射する)特性に近い素材で物体でドーム状に覆って、それを経由して間接光を当てるという装置を使うそうです。

そうでない場合でも被写体に対してなるべく360度すべての方向から均一な光がやってくるようにするとムラのない撮影が可能です。

この場合の条件は

  • 直接的な反射光が入る角度に光源を置かない
  • 間接光を反射してくれる対象はなるべく全方向にある

のような事をなるべく実現したいわけです。

その場合に撮影ボックスがとても便利そうに思いました。

本来の用途としては、メルカリとかヤフオクに出品するものを撮影する用途だと思いますが、個人や小さな研究室レベルの画像処理の研究でも案外便利そうな気がします。

で、届いたものを開けてみたのですが。

コンパクトサイズ

なかなかコンパクトです。

収納用の袋

持ち運び用の袋もついていました。

照明はLEDのリング照明で、薄いのでコンパクトにしまえる理由がわかりました。

LEDむき出しなので何かしらディフューザーになるものを追加で加工しても面白いかもしれません。

照明

USBを電源とするようで、輝度や色合いをリモコンで調整できるのもいいですね。

照明の調整

背景のシートも複数色あって便利そうです。

背景のシートも複数色

真上に穴も開いていて、リング照明の中心からも撮影できるようです。

上から撮影

近年は AI の学習の為の撮影を行う人も増えていると思います。

もちろん AI自身に写りの悪い画像に対する耐性を持たせたいケースももちろんあるかとは思うのですが、そうではなくもっと画像の持つ本質的な情報を学習させたいとき、綺麗に対象が写っていないというのは研究の本来の目的からすると遠回りになってしまいます。

こういったグッズをうまく活用するのもいいなと思った次第でした。

ちなみに私の作ったカメラをスマホで撮ってみたら、本来の用途通り結構きれいに写りました。

たまにこういうものを買ってみると楽しいですね。

結局CISC/RISC論争とは何だったのか?

はじめに

例によって当事者でもない人間が感想を書く素人考察ポエムです。

先日 こんな 記事を書き、その中で 「 このあたりで1命令で出来ること自体を複雑にするかシンプルにするかでCISC/RISC論争とかがあった気もしますが、今となってはあまり本質ではないのでおいておきます」と、バッサリと話をスキップしたので少しだけ回収しておきたいと思います。

なぜ本質ではないと言ったかというと、先日の記事の趣旨は「演算器の並列稼働率」にフォーカスしたものであり、CISC/RISC という「命令デコーダの効率」に関わる問題はそこで取り上げるべきではないと考えたからです。

事実、RISC の成功例だったはずの ARM は Thumb2 命令以降も複雑化を続けて十分 CISC っぽさを持っていますし、CISC の代表格の x86 もいつの間にやらRISC風の 内部 μ-OPs に変換して実行するようになっていきましたし、 Transmeta社が Crusoe というチップでVLIWに変換して実行してみたりもありましたし、ついにはAPX命令 のようなものまで飛び出しており、その境界はとても曖昧になってきています。

結局のところ、デコーダ設計者が血の涙を流しながら設計しないといけないほど複雑になった 点に目をつぶれば、どちらも如何様にも変換可能であり、「大量の演算器を並列に稼働させる」というターゲットに限定して語れば、技術的にはどちらも同水準に持ち込める ということになってるんじゃないかと思います。

ですので、命令密度であったり、デコーダの規模(コスト)や電力が問題になったりする小規模用途以外では、あまり関係なくなっている面はある気がしています。

幸い、普及期の携帯電話が上記が致命的に重要であったため、当時まだシンプルなRISCであった ARM がその分野の強いシェアを持つことになったわけですが、ご存じの通り、今のスマホはパソコン並みの性能を持っていますので、ARMももはや RISC であることのメリット よりも、スマホ市場などで育った膨大なARM命令セットでのエコシステム こそが最大の強みになっていると思われ、ここに 命令セットの権利 とか バイナリ互換性 という、重要な話を作っていくわけです。

CISC/RISC の爪痕としての命令セット

CISC/RISC の論争は、結果として様々な命令セットアーキテクチャのCPUを生み出し、そこからさらに生き残り競争の結果 x86 と ARM の2大勢力の構図を生み出しました。 述べてきた通り、守備範囲の違いはあれど、レンジの被る領域では、正直 ARM も x86 もそこまで大きな差はなくなってきています。 一方で、x86 は依然スマホ市場やタブレット市場への参入は苦戦していますし、パソコン分野は相変わらず x86 ですし、データセンターやHPCでは両者が争ってるイメージです。 どうしてこのようなことになっているかと言うと、結局、互換性の無い2種類の命令セットが、それぞれの得意分野でソフトウェアエコシステムの牙城を築いているからに他ならないと思うわけです。

先日の Kernel/VM にて、自作OSを動かすのに「UEFIなどの環境の揃ったARMデバイスがなかなか無い」という話をされていた方おられましたが、まさにそういう話です。 そしてその 命令セットこそが飯のタネ と言うのは両陣営よくわかっているんので、知的財産としてしっかり保護しているわけです。

うっかり、FPGA などで互換プロセッサを作って、GitHub に公開なんかすると、後悔することになるので誰もやらないわけです。

で、そんな中にダークホースとして出てきているのが「命令セット自由に利用していいよ」というオープンアーキテクチャRISC-V でして、学術機関や個人含めて、お布施を払ってどちらかの陣営に入れない 勢の救世主としてひそかに盛り上がってるわけです。

とはいえ、これらの話は、JS、JavaPython、Go など はもちろん C++ や Rust などでさえ、ある程度上流でプログラミングしている人々にはあまり関係のない話だったりします。最近の抽象度の高い プログラミング言語仮想マシンは、命令セットアーキテクチャの違いなんて綺麗に隠してくれます。

一方で、低レイヤー側の話として、OSだったり、仮想マシンだったり、コンパイラJITだったり、ブートローダーやデバイスドライバなりを作ってる人には大問題だったりして、これらのエコシステムを作っている領域の、歴史だったり人口だったり資金力だったりで、いろいろな勢力にそれぞれ得手不得手を生み出していたりするのだと思います。

そもそも CISC/RISC論争とは何だったのか?

話を戻すと、今でこそ大量の演算器をアウトオブオーダー実行によるスーパースカラで1サイクルに10命令とか実行したりしてるわけですが、この論争当時のマイコンは命令を入れるメモリも貴重でしたし、演算側もハードウェア乗算器が一個あれば「すげー」と言ってた時代であり、加算器を複数サイクル回して乗算命令を実現していたCPUも沢山あった時代です。

そうなってくると、少ないメモリに置いた1つの命令でより沢山の演算ができることも重要でしたし、命令デコーダが占めるLSI全体でのトランジスタ比率も重要でした、そして1つしかない ALU (Arithmetic Logic Unit) を如何に効率的に使うかもまた重要だったわけです。

どれもこれも重要だと並べてしまいましたが、結局これらのどこにウェイトを置いて考えるか重要になってきます。

「少ないメモリ、少ないトランジスタ数で、なんとか実用的な計算ができるプロセッサを作りたい」と考えたとき、確かに CISC は合理的だったのだと思います。

一方で、より「ALUを休みなく高いクロックで稼働させたい」となったとき、ここに演算指令とデータを次々送り込むのに RISC は優れていたと思います。

従ってまあ、どちらがいいのかの論争は起こったのだと思いますが、ここでもまた過去のソフトウェア資産(エコシステム)の話で、バイナリ互換性が重視され、x86 が生き残り、携帯電話/スマホと言う新しい市場で ARMというRISC が成功をおさめ、そしてまた命令セットライセンスと言う柵に対抗して RISC-V がじわじわ流行っているというのが今に繋がる流れではないかと思います。

おわりに

AIに聞いてみると CISC/RISC論争は概ね1980年代が盛り上がっていたようです。RISC自体はもっと前から開発が始まっていたようですが、表舞台でいわゆる論争と言うか議論が盛り上がったのがそのあたりのようです。

えっと私が丁度、中学生~大学生を過ごした時期ですね(笑)。

今は FPGA でCPU 作って遊べる時代になりましたので、過去を振り返って楽しめるいい歳のおじさんになってしまったわけですが、血の涙を流さなくても遊べる RISC-V の命令セットは本当によくできているなと思います(もちろんRISC-Vも本格的にやるとちゃんと血の涙が出てくるらしいですが)。

現代においてソフトウェアを学ぶ人からすると言葉だけ残ってる不思議なものかもしれませんが、CISCRISCのワードで検索していただくと、「今の計算機がなんでこんな仕組みなんだ?」という理解の一助にはなるかもしれません。

初期の CISCはマイクロコード方式でどうだこうだ、RISC が出てきてハードウェアパイプラインデコーダでどうだこうだといった話も、大変興味深いものです。実際今の x86 などは、ハードウェアデコードしつつもRISC化困難な複雑な命令の為にはマイクロコードもますます活用されてていますしね。

この駄文が誰かの役に立てば幸いです。

近代CPUのメリット/デメリットを考えてみる

はじめに

我々プログラマは CPU/GPU/NPU/FPGA なんかを特性に合わせて選択しながらプログラミングすることになっているわけですが、AI以降、CPU以外のプロセッサの台頭が著しいですので、今更ながら基本となる CPU をもう一度眺めてみようという書きながら考えているポエムです。

当然ながら私はCPUユーザーではあれど、CPU設計者ではありませんので、ユーザー視点から好き勝手レビューするという話なので、素人考察になるわけですが、マサカリ投げずにお付き合いください(笑)

CPU の進化の歴史を覗いてみる

4004 からのCPU の歴史を眺めてものすごく大雑把な感想を述べると

  • 1命令の実行時間を縮めるのに腐心していた時代(CPI縮小&周波数向上)
  • 一度に実行できる命令を増やすのに腐心してきた時代(IPC拡大&コア数増加)

の2つの時代に分けられる気がします。 ここで CPI(Clock cycle per Instruction) と IPC(Instruction per Clock-cycle) はまあ逆数を取っただけではあるのですが、考え方の転換の象徴でもあるので使い分けてみました。

どちらも 時間当たりの命令実行数 を増やすことにプロセッサ設計者が腐心されてきたことには変わりはありません。

もちろん、枝分かれとして、電力とかコストとか耐久性とか別の品質軸にウェイトを振った製品もいっぱいありますが、大雑把な流れとして、「絶対性能の向上」を幹として歴史を紡いでいるかと思います。

歴史の前半では、1命令を何クロックサイクルも掛けて計算していましたので、これを 如何に短くするか が重要で、CPIを下げることと、周波数を上げることが重要だったように思います。 (このあたりで1命令で出来ること自体を複雑にするかシンプルにするかでCISC/RISC論争とかがあった気もしますが、今となってはあまり本質ではないのでおいておきます(苦笑))

実際、当初は1命令に何十サイクルも掛かっていた命令実行は、最終的にはスーパーパイプライン技術の上で、実質1サイクルで実行できるようになり、周波数も数MHzだったものが数GHzまで達しました(半導体の微細化と、パイプライン段数を深くして1つのステージをどんどん薄っぺらくした賜物)。

一方で、このあたりで、半導体バイスとしても熱問題などで周波数の向上が頭打ちになり始めてきました。

そうなるとここからは、1クロックサイクルの中で 如何に沢山の命令を実行するか と言う話になっていき、

  • スーパースカラによる同時複数命令実行
  • OoO (Out of Order) による命令依存関係制約軽減による並列化増進
  • SMT (Simultaneous Multi-Threading)による命令依存関係制約軽減による並列化増進
  • マルチコアによる並列実行

などの方向に向かったように思います。 なお、ここでは SIMD(Single Instruction, Multiple Data) は、少し本質から外れるので話を置いておきます。

以前からポラックの法則というのがありましたが、もともと直列に書かれていたプログラムを互換性を保ったまま並列実行しようとしているのが現在なので、ますますリソース当たりの性能向上のハードルが上がっているようには思います。 いずれにせよLSIトランジスタ数はある程度ムーアの法則で増えているのに、CPUの絶対性能はそれより低いオーダーでしか伸びず、言い換えると非効率さが増加気味になってきているわけです。

なぜCPUが重要なのか

そんなCPUを裏目に、昨今、「CPU の何百倍の性能を誇る GPU で AI が加速した」みたいな話はニュースなどで誰もが聞くようになってきました。

「じゃあもうCPUなんてやめて GPU だけ載ったパソコンやスマホを作って、WindowsLinuxmacOSGPU 上で爆速で動かせばいいじゃないか、ブラウザも、表計算も、GPUでもっとサクサク動いてくれ!」と思われても仕方ありません。

が、残念ながらそうはいかず、CPU + GPU 構成のパソコンや、GPU入りCPUチップなどでしかシステムは構築できず、依然 CPU はコンピュータの心臓部です。

これは言うまでもなく、CPU で実行するのが最も効率が良いプログラム というものが大量にあるからに他なりません。 一応GPUチューリング完全なプロセッサですのでやろうと思えば何でもできるはずですが、 一度に同じ計算を大量にできる というだけで、それ以外はからっきしです。

では CPU が無いと困る処理とは何なのかを改めて考えてみると

  • 順番にしか計算出来ないものが1つづつやってくる処理
  • バイナリレベルでの高い互換性が必要な処理

の2つを真っ先に思いつきました。

前者は そもそも人間がそうである ため、世の中に大量にあふれていて、例えば表計算ソフトの複数のセルに一度に数字を入力したいという人はあまりいません。例えばマウスカーソルが1000個表示されていて全部別々に操作して入力できる達人がいれば 1000コアのGPU は活躍するかもしれません。ですが残念ながら多くの人間は1つづつしか処理できません。世の中にはこういう処理が溢れており、「1000個いっぺんに同じ処理がしたい」ほうが本来は稀なのです。

幸い、ビデオ表示処理には、「ディスプレイのピクセル数だけ同じ処理がしたい」という需要があったため、古くからGPUは並列演算の効率化が行われており、3D-CG の為にいろいろやってたところ「大量の積和演算が同時にしたい」というAIの需要と たまたまマッチした 為、今に至るわけです。

また、バイナリ互換の話についても、いろいろなインタプリタ言語や仮想マシンの技術が進歩しても、最後は、移植性のある基盤ソフトが無いとそもそもベアメタルからのパソコンのセットアップがままならないわけで、そもそもBIOSが作れてOSを作れるという前提を作ってくれてるのがこの「バイナリ互換」というものだったりします。 こんなものが何百種類があっても正直困るわけで、群雄割拠な時代もありましたが、なんだかんだで最近は x86 と arm と RISC-V の3つにかなり集約されてきている気がします。おかげでエコシステムも安定してきていますし、これは非常に苦労しつつもバイナリ互換性を保ってくださっているCPU開発者の方々の苦労の賜物なのかと思います。

進化の難易度が年々上がるCPU

そうはいっても年々CPUが得意としている分野の性能向上は苦しくなってきているように思います。

現在のハイエンドCPUの IPC は 10 を超えていたりするわけですが、なまじ汎用レジスタアーキテクチャなんかだったりすると、全部の処理ユニットが全部のレジスタにアクセス可能でなければならず、また処理結果を全部同時に書き戻せないといけません。次のサイクルには次の処理結果がまた IPC の数だけ同時にやってくるのです。 以前にこんな記事を書きましたが、対角線の数だけ規模が爆発していきます。 汎用レジスタやめて専用レジスタに戻すべきじゃないかとすら思ってしまいますが(素人考え)。

OoO の仕組みもより広い範囲で命令順序を入れ替えるためにどんどん複雑化しています。 リオーダーバッファはどんどん深くなり、後で辻褄を合わせるのも大変ですし、後から例外でも発生しようものならそこまで矛盾なく巻き戻せないといけません。

CPUがもっとも得意なのが逐次スカラ処理であり、スカラプロセッサと互換性を持ったまま高性能化しようとしているところにやはり限界を感じます。

しかしながら、そういう処理はそもそも人間というモデルがそうであり、人間の作ったルールを処理したり、人間とコミュニケーションをとる以上永久に続く問題な気がします。

人間が書いた自然言語の小説が10万文字あったとして、伏線や起承転結のある物語の10万文字を同時に読み込んで1サイクルで理解して伏線回収に感動するようなことは、人にも機械にも無理なのは、自然言語がそうなっている以上仕方のないことだと思います。

なお、そういった中でCPUも SIMD などのCPU以外が得意なことも取り込んで性能改善を行っています。 これはもちろんCPUの応用範囲を広げる大変有効なことなのですが、もともとCPUが得意だった逐次スカラ処理分野の高速化には寄与しないあたりが悩ましかったりします。

どのようにプロセッサを使い分けるべきなのか?

御託が続きましたが、我々プログラマは CPU/GPU/NPU/FPGA などのプロセッサをどう使い分けるべきなのでしょうか?

大雑把に言うと、専用ハードウェア(NPUなど)に嵌る処理はまずそこに当てはめ、並列化の余地のない逐次処理はCPU、同じ計算を大量に行う場合はGPU、という事になってくると思います。 最後に、並列化の余地はあるが異なる演算を大量に行い、なおかつ専用ハードウェア化できないぐらい変化が速いか需要が少ない部分が FPGA などに残ることになります。

私はよく Zynq-MP を使うので以前にこんな記事を書いていたりするのですが、Zynq-MP は Linux などの動くアプリケーションプロセッサと、Real-Time OS などが動かせる リアルタイムプロセッサと、FPGA部分と、GPU まで搭載しているなんでもありプロセッサです。 後継の Versal に至っては、XDNA というNPU まで入っており、ほんとに全部乗せ SoC になっています。

私はなるべく、システム全体の処理を、それぞれ得意なプロセッサに割り当てることを心がけています。

そういった中でアルゴリズムが固定されているケースもしばしあるのですが、そういう場合は「そのアルゴリズムがどのプロセッサ向けに作られたか?」でかなり決まってしまうように思います。

一方で、似たような結果が得られるならアルゴリズムごと新規に作ってよい というケースであれば、どのハードウェア向けにアルゴリズムを組むかでかなり話が変わってくるように思います。 GPUがあるならなるべく同じ計算の並列実行が生きてくるアルゴリズムを捻りだそうと悩みますし、特殊な演算器を持ったCPUなどがあればそれを使おうしますし、キャッシュサイズやデータ帯域なんかも考えながらアルゴリズムに手を入れていきます。FPGAをターゲットにしてよいならアルゴリズムの工夫範囲は一気に広がり、かなりいろいろな方法を候補に上げながら落としどころを探すことができます。

案外どのプロセッサでも、それ向けにアルゴリズムを考え直すと、いろんなプロセッサでそこそこ性能が出たりもします。

どんな時にFPGAなのか?

CPUの話をしておいて何なのですが、まあ、当ブログでFPGA に触れないわけが無いので最後に少し触れます。

正直、単純なデータプロセッシングの性能のみで FPGA を選ぶケースはかなり稀だと思います。

  • CPUやGPUに無いような特殊なデータ型での演算を、ヘテロジニアスに大量に行う
  • パイプライン演算がやりやすく、ストリーム処理が行いやすい

のようなケースでしょうか?

一方で、IoT となると話が変わってきます。FPGAプログラマブルでありながら

  • 現実世界とのインターフェースであるI/Oロジックがプログラムできる
  • リアルタイム性が高く、クロック位相などピコ秒単位で調整できることもある

などの特徴があります。

ようするにセンサーやアクチュエータを介して、現実世界とインタラクションできます。

こちらから何か作用すると、現実世界は変化しますので、それをまた取り込むという事を、非常に高いリアルタイム保証の中で組めます。 要するにアルゴリズムのデータループの中に「現実世界」を組み入れてしまう事が出来るわけです。

それこそピタゴラスイッチみたいなことを想像してもらっても良いかもしれません。 このような実世界を巻き込んだアルゴリズムはCPUやGPUではそもそも実行自体が不可能なものが多数ありますので、こういう分野をシステムの一部にでも保有すると計算機システムの面白みが一気に増大していくわけです。

おわりに

今回は、最初に8割ぐらい書いたところで、割り込み作業が入ってしばらく放置していて、最後の部分だけ慌てて書いたこともあってかなり、ちぐはぐなことを書いた気もしますが、いつものポエムという事でご容赦ください。

テストと検証の違いについて考えてみた

はじめに

今回は定期的にやってくる駄文というかポエム回です。

ソフトウェア開発において「テスト(Test)」と言うものは非常に重要です。一方でLSI開発などを含めて、RTL界隈では「検証(Verification)」という言葉をよく聞きます。

業種や人によっても用語の定義が微妙に違ったりもするので一概に定義できない部分もある気がしますが、今日は 主観100% となりますが、私なりの考えでこの二つを考えてみようと思います。 このあたりは一家言ある人が多い気がしているのでマサカリ飛んで来そうで怖いんですが、まあこんな考え方もあるよというレベルで私見として書いておきます。

私の理解として

  • テストはバグがあればそれを証明する試み
  • 検証はバグが無いことを保証しようとする試み

という理解をしております。

もちろん検証が完了したからバグがゼロ個であることを保証できるわけではないのですが、目的として目指しているものが異なるという点は重要かと思います。

そしてこれは、ソフトウェアだからとかハードウェアだからという問題ではないと考えています。実際ソフトウェアでも検証は必要ですし、CPU/GPU/FPGA向けのソフトウェアで低レイヤーの部分では検証が必要になってくるケースは多い気がしています。

機能の確認と、機能の保証の違い

例えば python二次方程式を計算する関数を書いてテストして意図した値が得られたとしましょう。

def func(x):
  return 3 * x**2 + 2 * x + 1

この関数はおそらく下記のようなことは起こりません

  • 何度も実行したら3回目で違う結果が返ってきた
  • Python と一緒に Excel を起動したら計算結果が変わった
  • CPUコア数の違うパソコンで実行したら結果が変わった
  • Windowsでは合うが、Linux では結果が変わった
  • その日の天気で結果が変わった

そのため、Excel と一緒に起動するテストや、晴れの日と雨の人雪の日でそれぞれテストするようなテスト項目を作ったりはしません。

一方で、OSを開発したりベアメタルで開発するなどの低レイヤーの開発の場合以下のようなバグはしばし発生します。

  • ある命令の区間で割り込みが来た場合に限り変数が壊れる
  • たまたまあるスレッドが先に終了したときだけ変数が壊れる
  • マルチコアへのスレッドの割り当て順が特定のケースで変数が壊れる
  • コンパイルオプションで最適化を指定すると結果が変わる
  • メモリバリアを書き忘れるなどして実行順序依存でキャッシュの状態次第で変数が壊れる

何が言いたいかと言うと、先の Python のコードが Python のコードに閉じて正しい機能かどうかだけをテストすれば済んでいるのは、プロセッサがメモリコヒーレンシを保証し、バグのないスピンロックの機構や、メモリ保護や、復帰可能な割り込みや、温度保証などの物理的な保証もしており、OS開発者がコンテキストの継続性を保証できるスレッドを用意し、安全なメモリ割り当てを行い、言語開発者がバグのないインタプリタコンパイラを提供しているから成り立っているわけです。

ものすごく乱暴な言い方をすると、先の Python コードが正しいかを確認するのが「テスト」で、それを保証する環境をのものを担保しているのが「検証」ではないかと思う次第です。

まさに「プログラマをダメにするハードウェア」の上に成り立っているのがテストなんじゃないかとさえ思ってしまうわけです。

テストと検証のやり方の違い

テストの場合いろいろな考え方があって

  • 境界値条件
  • 実行網羅/分岐網羅/条件網羅
  • ディシジョンテーブル
  • 原因結果グラフ

などなど教科書的な話に始まり、如何に効率的に目的の機能を満たすべく目の前のコードのバグを出していくかと言う点に心血が注がれます。

一方で、検証となると、起こりうるすべての事象で同じ機能が満たされること を確認する為、常に 状態の組み合わせ爆発 と戦う事になります。

そもそもとして起こりうる状態をちゃんと、漏れなくリストアップしてすべての組み合わせを把握できているか、もとても重要になります。

よくある「コーナーケースでバグが出た」なんて言うのは結局、状態組み合わせを見通せてなかったか、工数が無くて検査しなかったかのどちらかです。

そういった場合に案外強力なのが

などの考えになってくる気がします。

テストの場合、「境界値をちゃんと考えないランダムなテスト」と言うのは、質の悪いテストと思われがちですが、こと検証の場合は、検証予定の組み合わせパターンの100%網羅が目的ですので、「少ない工数で効率よく100%までもっていく」点でランダムパターンは有効なケースがしばしあります。

ランダムと言っても取りうる状態に条件があるので、複雑な条件を持った複数のオブジェクトの状態組み合わせとなると、多次元空間の探索ですので、それこそモンテカルロ法で使われるギブスサンプリングみたいなものが必要になってくるのではないかなどと思ってしまうわけです。

で、仕様が許す範囲での最大限の多様性を持った外乱を与えつつ、内部設計仕様を満たしていることをプロパティ検証などで見ていくのはなかなか有効な手段であり、いわゆる「ソフトウェアテスト技法」とも少し違ったものを思う次第です。

また、これらとは全く違うアプローチで、フォーマル検証も重要なのだと思います。

こちらも正しく条件を定義するところまでは同じですが、それが組み合わせ爆発の中ですべて満たされるかどうか、数学的に証明しようという試みなので適用可能なシーンでは非常に強力な武器になりそうな気はします。生憎なかなか簡単に使えるツールでもないので経験は無いのですが、興味深く思います。

テストと検証で似ているところ

ブラックボックス(外部仕様)/ホワイトボックス(内部設計)での区分けとか、

みたいに、階層化して問題に対処していくあたりは両者似ているなと思ってみたりもします。

TDD のように、先にテストや検証を定義してから、実装設計を進めるのも両者ともに有効だと思います。

境界はあるのか

ちなみに実務的にはテストと検証の境界は案外曖昧な気もしています。

ソフトウェアテストであっても、組み合わせ全網羅みたいなことをすることはありますし、検証であっても全部扱えないので検証項目を何らかのルールで絞ることも多いです。

感覚的に、低レイヤーは検証寄りの考えが重要になりがちで、上位レイヤーほどテスト技法が有効に機能する気がしています。

また、全部テスト/検証しきれないときに費用対効果を考えて、項目を落としていくビジネス観点でのセンスが必要なこともあるでしょう。

なかなかこれはテストをしているのか検証をしているのか、混ざっているのか、曖昧なケースは多い印象はあります。

研究開発などのプロトタイピングにおける検証

私は長らくそういうポジションでの開発が多いのですが、プロトタイピングで重要なのは 脳内設計だけで一発でバグのないコードを書く ところに達するまでひたすら修行することじゃないかと思っていたりもします。

この過程で重要なのは、「仮説を立てた事象が正しいかどうかの検証」だけなので、それができればどうだっていいわけです。

が、まあ、「しばし DMA転送が時々途中で固まって、実験が止まる」なんてことはよくあるわけで、そこで検証の出番となるわけです。

  • 疑うところを間違わない(手を抜いたところ、実績が無いところ)
  • 疑わしいところに絞って検証してバグ落としする
  • 場合によっては姑息な手法で暫定回避する

などにもセンスが問われます。

しばし試作システムでバグのモグラ叩きをはじめてしまい、全く研究が進まない人が居ますが、研究とかプロト開発のフェーズでは、それらはどれだけ頑張っても何一つ成果として認められないので、まあ、適当にさっさと何とかする 必要があったりします。

そして、「適当にさっさと何とかする」には「ちゃんとしたテスト技法や検証論の知識」がとても重要だったりするなと思う次第です。

産業用カメラを研究開発に用いる場合の課題

はじめに

タイトルの通りなのですが、本来産業用カメラは、製造や流通など産業の現場で活躍する精密かつタフな高品質なカメラであり、現場の要望に応えて進化を繰り返してきたものなのですが、本記事は 本来の用途と違う 研究開発に使う場合の課題について触れてみたいと思います。

産業用カメラについてはこちらなどでも少し触れていますが、どんなものか知らない方もおられると思うので少し有名どころを紹介しておくと、iDSさん、Baslerさん、CISさん、東芝テリーさんとか、このあたりのページに飛ぶと、なんとなくこんなやつと言うのがわかるのではないかと思います。あと高速度カメラだとフォトロンさんなんかもあります。

手元に一個、大学からお借りしたUSBタイプの産業用カメラが手元にありますが、こんなやつです。

USBタイプの産業用カメラ

なぜ画像処理研究に産業用カメラを使うのか

ではなぜ研究開発で普通にパソコンに繋がる一般的な Zoomミーティングなどで使う Web カメラを使わずに産業用カメラを使うケースがあるのでしょうか。

実は Webカメラは本格的な画像処理の研究開発に使うには多くの課題があります。

  • 露光時間/ゲイン/絞りなどの基本項目が設定できないことが多い
  • センサーの緒元が不明、現像処理も不明、あまつさえ勝手に適応制御する
  • 2つのカメラの同期シャッターや、照明との同期もままならない
  • ローリングシャッター歪が課題で、グローバルシャッターが使いたい場合がある
  • BAYER配列が邪魔でモノクロが使いたい場合、赤外が撮りたい場合などがある
  • 高速度撮影/低遅延リアルタイム認識にUSBが遅すぎる

などなど、ちょっとしたアクティブセンシングでもしようものなら役に立たないケースが多数あります。

これらの課題を解決してくれるのが産業用カメラです。

UVCカメラと違い、メーカー専用のAPIを経由してイメージセンサーのかなり細かい設定を行う事が出来、外部トリガの入出力などの機能も有しているものが多いです。

(研究用途での)産業用カメラの課題

高性能な産業用カメラですが、そうはいっても研究用途目的に作られているわけでもないので、課題も残ります。

値段がお高い(笑)

本来の用途を考えれば妥当なのですが、一般的には 10~20万円ぐらい、安い物でも数万円以上、高いものだと100万円を軽く超えてきますので、弱小研究室や個人だと気軽には買えないケースもあるのではないかと思います。

上のお借りしたカメラもメーカー価格で 389ユーロ、日本円を探してみたらこちらで 67,800円でした。これでもかなり安い方だと思います。

FPGAに直結出来ない

こちらでも書きましたが、FPGAに直結できるカメラは少ないです。

アクティブセンシングなどのFPGA制御撮影がしたい場合、複数カメラや照明やロボットをFPGAで操りながら、タイミングを合わせて厳密な撮影制御したいわけですから、これらをFPGAで掌握できないといけません。

一方で、USBタイプ や GigE-Vision などは、ナノ秒オーダーどころかマイクロ秒オーダーの制御をするにはあまりも遅すぎますし、他のインターフェースも高価すぎたり、規格が古く帯域が細かったり、仕様が非公開であったりと課題は多いです。

そしてこうならざるを得ない理由が、次に述べる センサーメーカーのNDA構造にも関連してきます。

センサーメーカーのNDAの問題

このあたりから少し技術とは異なる話になってくるのですが、産業用カメラで使われるイメージセンサーの多くは仕様が一般に公開されていません(そうでないものも少しありますが)。

そこでカメラメーカーはセンサーメーカーとNDA(機密保持契約)を結んでデータを開示してもらいカメラを製造するわけですが、NDAで守られた範囲をユーザーに開示するわけにはいきません。

したがって、カメラメーカーはそれぞれセンサー固有の機能を、産業規格などの一般化されたものに、カメラ内のFPGAなりで変換して外部に出すことになります。この際、物理層や低レイヤーまでは各種産業規格に準じるのですが、カメラに必要な上位のプロトコルは各社ばらばらで、各社独自のAPIを提供しています。ゲイン一つ設定するにも各社で方式が異なり、これもまたベンダーロックになっています。

また、カメラインターフェースもオープンなものもあれど、クローズな規格もあり、中には一定の基準を満たした法人が規格団体の有料会員になって初めて規格書が閲覧できるようなものもあります。

産業カメラの利権構造

結果的に、各社カメラメーカーが用意しているエコシステムを一式購入することになり、これも実質的にベンダーロックになっています。

もちろん、産業分野ではトラブルを起こさず適切なサポートを受けて産業活動を維持するには不可欠な事なのですが、こと研究用途に転用しようとすると困ることになります。特に下手にNDAに踏み込んでしまうと 論文に書けないこと やソースを GitHubに公開できない などの致命的なデメリットを受けかねません。また環境が高価なこと自体が他の人の研究の再現のハードルを上げてしまい研究の広がりを阻害してしまいます。

自作カメラの開発

また、上の絵を見てお気づきかもしれませんが、多くの産業用カメラがその内部にFPGAを内蔵しています。

ですので、当サイトのように「FPGAを活用してリアルタイム画像処理がやりたい」という用途ですと、高価なインターフェースボードとIPを使って、FPGA で変換された信号をまた FPGA でなるべく生の画像信号に戻すというなんとも無駄の多いことをする羽目になります。

信号用のIPも、商用の量産向けのライセンスを想定したものが多いですので、研究用に1個買うだけでも何百万円も払う例は少なくありません。

下記に絵を描きましたがもっとシンプルにやりたいと思ってしまうわけです。

無駄を省いて研究開発に集中したい

そこで私がいま開発しているのが、こちらのグローバルシャッター高速度カメラです。

rtc-lab.com

仕様がデータシートとして公開されているPYTHON300イメージセンサーを使って、KV260 や ZYBO に直結出来るカメラモジュールと言うわけです。このセンサーは Digikeyさんなどでも手に入り、サイズを絞った設定次第で1000fps 以上の高速度撮影もできるグローバルシャッターのカメラなので、研究開発には最適です。

物理層に安価なMIPIコネクタを選んでいるためセンサー側にも Spartan7 FPGA がいますが、こちらの回路図もRTLも公開しておりますので、Spartan-7 も研究対象の回路として扱ってしまえば、かなり理想に近いオープンハードウェアなカメラモジュールと言えます。

昨日、やっと LUT-Network による MNIST の認識が動き始めましたので記念記事として、この記事を書いた次第です。

撮影環境

MNIST認識

おわりに

昨今AIの台頭で、画像処理に挑戦する学生さんや研究者の方も増えているんじゃないかと思います。 この時、普通のZoom会議などで使うUSBカメラで画像処理を行う人が多いのではないかと思います。

一方で、FPGA+カメラ の構成で、普通と違うちょっと違う撮影や制御を行うだけで、「他の誰もやっていない研究」に挑戦しやすくなります。 特にアクティブセンシングや認識結果をさらにフィードバックするようなインタラクションを伴う処理は、パソコン上で PyTorch だけ弄っているのでは絶対に出来ないアルゴリズム研究が次々生まれてきますので、ぜひともいろいろ考えてみて頂ければと思います。

Zynq/ZynqMPのクロス開発環境を構築してみた

はじめに

私はこれまで ZYBO(Zynq-7000) や KV260(ZynqMP) の Linux 環境を活用してセルフコンパイル環境をメインに活用してきました。

Linux では gcc も rust も動きますので、OpenCV などの C++ や Rust などネイティブコンパイラでバージョン依存の強いものも、その場でコンパイルすれば問題が起こりにくいですし、何より FPGA のハードウェアというナマモノを扱うのにセルフ環境からいろいろできるのは便利だったからです。

また、VS Code Remote Development もこれらの環境に ssh で繋ぐだけで使えるため、大変便利でした。

一方で、AI の台頭で Vibe Coding みたいなものが当たり前になってくると、GitHub Copilot などが動くのに慣れ切ってくるわけですが、ZYBO の 512MByte のメモリ環境だと Copilot を有効にすると固まることも増えてきました。

また、4GByte ある KV260 であっても、Copilot と rust-analyzer などを使って、OpenCV や tonic を使うのはさすがに辛くなってきました(主に rust-analyzer が原因?)。

そこで、意を決して、PC からのクロス開発環境の整備に踏み出しました、というのが今回のお話です。

リモートから DeviceTree Overlay を行う FPGA-Server と FPGA-Loader

まず、セルフ開発でない場合に一番面倒なのがこれです。 セルフ開発なら dtb と bitstream を用意して sudo で DeviceTree Overlay できますし、xmutil や dfx-mgr-client を使う手もあります。

root 権限が必要と言うのも何とも面倒で、であれば サービスとして立ち上げてしまえ という安直な解に走ったのが下記の2つのプロジェクトです(PYNQも同じ?)。 このサービスはクロス環境だけでなく、セルフ環境でも便利です。なお、ローカルな利用のみ想定しているので、認証などはまだ入れていません。

github.com

github.com

その際、これまた cargo install もコンパイル時間長いので、バイナリインストールしたいなという事で、 後で述べるクロスコンパイル環境使って GitHub Actions でクロスコンパイルして自動でバイナリファイルをデプロイできるようにしました。

加えて cargo-binstall というとても便利なものを AI に教えてもらい導入しました。

結果、 サーバー側となる ZYBO や KV260 側では

curl -LsSf https://raw.githubusercontent.com/ryuz/jelly-fpga-server/master/binst.sh | sudo bash

とすればサービス登録が完了し、

クライアントを使う PC や ZYBO や KV260 のユーザー環境では

cargo-binstall --git https://github.com/ryuz/jelly-fpga-loader.git jelly-fpga-loader

とすればよいところまできて、サクッとバイナリインストールができるようになりました。

なお、自動デプロイする .github/workflows/release.yml などは、GitHub Copilot がサクッと書いてくれました。AI便利ですね。

ロスコンパイル環境を作る

今回、目指したのは各ボード環境で

apt install libopencv-dev 

して作ったお手軽 OpenCV のネイティブ環境で動くバイナリをクロスコンパイル環境で作る事です。

Python などのインタプリタ言語なら悩むことは無いのですが、FPGA 制御にはまだまだポインタを扱える C++や Rust などのネイティブコードを出力するコンパイラ言語は手放せません。

ここで有効な技術となったのが

です。

まずわかったのが、x86 であっても arm ターゲットボードと同じ Distro で、例えば

dpkg --add-architecture armhf
apt-get update
apt-get install crossbuild-essential-armhf
apt-get install libopencv-dev:armhf

などのようにして、armhf アーキテクチャの libopencv-dev と クロスコンパイラを入れて、おけば、ZYBO で動くバイナリが作れることがわかってきました。

そこで、C++ の為に DevContainer 用の Dokcerイメージ と Rust の cross 用の Docker イメージをそれぞれ用意しました。

さらに、devcontainer.json で、

"features": {
    "ghcr.io/devcontainers/features/docker-in-docker:2": {}
},

のようなことをすれば Docke in Docker の機能で DevContainer 内でも cross が使えることがわかりました。

ひとまず、これらを組み合わせて、セルフ環境でもクロス環境でもビルドできる Makefile が書けるようになってきました。

また、bitstream のダウンロードも、セルフ環境でもクロス環境でも先の jelly-fpga-loader で行えますので、あとはビルドしたバイナリを scp なりで送りつけて ssh で実行すればいいことになります。 何らかの方法で、ターゲットボードとクロス開発環境でファイルシステムをマウントしてしまうのも良いかもしれません。

また、Docker イメージは、GitHub Actions でも使えますので、新しいバージョンタグを打つと同時に必要な各種バイナリも自動デプロイする環境が作れてしまうわけで、いろいろ快適になってきたように思います。

おわりに

そのうち、実際のプログラム例が整備出来てきたら、もうちょっとちゃんとした記事にしようと思いますが、ここしばらくこれらに嵌っていたのがようやく落ち着いてきたので、記事にしてみました。

AI 時代も引き続き快適な FPGA 開発環境を維持していければと思います。よきFPGAライフを!

オープンハードウェアの壁

はじめに

ハードウェアの一言でくくってしまうと広すぎますが、個人でも作れる規模の電子基板とかのハードウェアガジェットを想定したお話です。

ここ数十年を経てオープンソースソフトウェア(OSS)というものはだいぶ世間の認知度が上がってきております。特に最近などでは AI の分野での新しい学習モデルであったり、学習データに学習済みパラメータなど、いろいろなものがオープンに公開されるようになってきております。おかげでモデルの改良版の研究や、異なるモデル同士の差分から新しいものを生み出したりなど関連研究がどんどん発展しているのが現状かと思います。

そんな中、FPGAプログラミングはソフトウェアだ、などといきがっている当サイトとしては、もうファブレスでつくれるものは全部ソフトウェア扱いでいいんじゃないか? などと乱暴なことも妄想してみたりもします。

実際、KiCAD で設計したデータを GitHub に上げていたら誰かがクローンを作成して試してみて issue が飛んできたなんてことは私自身も体験しています。

大学などでの研究開発成果を公開する場合も、ちょっと特殊なハードウェア装置を自作した場合、ソースコードだけではなくハードウェアの情報も公開されていないと論文を読んだ人が再現実験しようと思ってもできないわけです。

このソフトウェアでは簡単にできる再現実験であったり、成果の共有であったりを、もっとハードウェア的なところまで広げられればと常々思っていた次第です。

昨今、「3Dプリンタや製造サービスに図面を出せば製造してもらえる」、「基板設計データをアップロードしてクレジットカード決済すれば実装済み基板が送られてくる」といった時代になっているので、これらのものももっとOSS化して、オープンハードウェアにしたいなと思う次第です。

オープンでないハードウェアたち

昔の家電やパソコンは配線図や回路図がついており、町の電気屋さんが修理をしたり、拡張ボードを自分で作ったり自在にできていたそうです。

一方で、昨今はスマホやパソコンはもちろん、カメラやテレビなどの黒物家電も、エアコンや冷蔵庫のような白物家電もそんなものは公開されておらず、ちょっとした修理であれ、自力で分解解析するしかありません。

同様に研究に使うような、産業用カメラなどの機材も内部の回路図など公開されているわけもなく、「製品はブラックボックスとして説明書通りにのみ使ってください」というようになっています。

こういうものがそのまま使える研究なら良いのですが、特殊撮影や特殊センシングがしたい場合、そうもいかないので、公開されているスペックでやりたいことができない場合、自力で分解解析して改造するか、自分で新規に作るかしか選択肢がなくなってしまというなかなか残念なことになってしまいます。

見渡すと我々の周りはクローズなハードウェアだらけであり、買ってきたものをそのまま使い、壊れたらメーカー修理に出すか、買い換えるしかないという、エンジニア的には何とも面白みのないハードウェアが溢れているわけです。

オープンハードウェアをどう定義するか

これがオープンハードウェアだという明確な定義もないかとは思いますので、私なりに下記のように考えてみます。

  • 誰でも買える部品だけで作られていること
  • 設計図やソースコードが一般に公開されていること
  • 公知の情報だけで設計図やソースコードを読みながら理解や改善を行えること
  • 誰でも比較的容易に同じものを作成する方法がある事
  • 改造したものを再公開できるライセンスであること

などでしょうか、例えば電子基板で言えば

  • DigiKey, Mouser, マルツ, RS などで買える部品だけで設計
  • KiCAD の設計や、制御ソフトウェアは GitHub で公開
  • すべての部品はデータシートなり、解析情報なりが公知になっている
  • P版.com、JLCPCB、PCBGOGOなど、個人でも使えるサービスで製造できる事
  • MIT, Apache 2.0, GPL, CC などいろいろなソフトウェアライセンスを参考に適用すればよいように思います

なお、OSS 同様に、商用/非商用とか公開義務の有無とか、いろいろあってよいかとは思います。 ソースがオープンであることが重要で オープンソースハードウェアで OSH とでも呼べばいいのでしょうか(笑)

オープンハードウェアの壁

そこで冒頭のように、「じゃあ、そういうものを自分で作ればいいじゃないか」、となるわけですが、ここにも壁があります。

機密保持契約(NDA)の壁

自作する場合、自分で部品を買い集めて装置を構成していくわけですが、中には「機密保持契約(NDA)を結んだら仕様を教えてあげるよ」なんて部品があったりします。当サイトは画像処理研究が多いのですがイメージセンサーにこの手のものが多いです。

NDAを結ぼうにも大規模な需要が期待できるところじゃないと結んでもらえなかったりもするのですが、それ以前の問題として、NDAを結んでしまうとその情報を使って行った内部設計を容易に公開できなくなってしまいます。

有名大学などが企業との共同研究で凄いセンサーを使った研究論文なんか出したりすることもありますが、多くの場合、共同研究契約の中に機密保持条項が含まれていたりなんかして、どういう効果が得られるかの結果などは華々しく論文書かれていますが、どうやればそれと同じことをできるのかとか、設計図面とかソースコードとかは公開されていなかったりします。想像も含みますが、裏にそういう事情があるケースも結構あるかと思いますので、研究者視点で見ると、研究が広がりを持たないことになり大変もったいなく感じます。

そもそも売ってもらえない壁

バイスを研究開発して販売している側もビジネスですので、当然ながらある程度の需要が見込めるところ以外は相手にできないのです。 実際、零細だと数売れないのにサポート工数的なところで振り回されると死活問題となります。

お問い合わせ段階で、「月産何万個の予定ですか?」なんて確認があったりして、「研究用に5個だけ欲しいんですが」で撃沈したりする話も聞きます。お互い不幸です。

そもそも仮に自分は調達できたとして他の人が容易に手に入れられない部品を使っていると、オープンハードとしては意味をなさなくなってしまいます。

サポートの壁

部品を買うだけなら DigiKey などから買えたりしても、大企業が正規代理店のFAEさんのサポートを受けながら設計するのとは全く違い、公開情報だけからサンプルコードもない中で自力で試行錯誤しながら開発することになりがちです。 もちろん親切に個人事業主や趣味な人のQAに答えてくださるようなところもありますが、そうでないところもあります。

こういう時にとても役立つのがいわゆる製品の分解解析というものです。ネットを探してもいろんな製品を分解したり分析したりしているサイトは多数あるかと思います。

メーカーさんも販売しているものが競合他社に分解解析されることぐらいは織り込み済みなので、本当に隠しておきたいことは製品解析程度では解析できないようにはなっていますが、そうではなくて公開されてる情報だけでは理解が追いつかないのでサンプルが欲しい時って多いのです。 ソフトウェア開発でも「API仕様書だけあっても理解に困るので、サンプルコード欲しい!」ってときありますがまさにそんな感じで、実際の製品を分解解析したりするととても捗るのです。

余談ですがFPGAボードはこういう解析時の計測器としてもとても役立ちます。

お金の壁

これも結構重要でして、ソフトウェアと違って、ハードウェアを開発して公開する側も、それをダウンロードして活用するユーザー側も、どうしても作るのにお金がかかっちゃうのですよね。

これはいくつかOSSと異なる特性を生み出していて

  • 設計が不完全な状態で公開すると、ユーザー側の金銭的損害を発生させてしまう
  • 開発側はなんだかんだでバグが取れるまで試作の繰り返しで浪費してしまう
  • 基板などは各ユーザーが1枚作るより、ある程度まとまった数製造して配布したほうが単価が下がる

などです。

最初の方の話は、「とりあえず何かしら出来たら公開して、ユーザーからバグレポ貰いながら仕上げていく」と言うのがやりにくくなるという、わりと致命的な課題に繋がります。

初期開発費もある程度は寄付とかクラファンみたいなのとかに期待したいところはりますが、まだまだ開発者と受益者でうまく負担分担する仕組みはOSSほど発展していないようには思います。

あとは最後の奴とかは、薄い本を売られている方々が何冊刷るか悩むみたいな話を聞いたことがありますが、それに近い話になりそうです。

これらを緩和するにはとにかく安く作れるよう設計することも重要な気がしております。

オープンハードウェアの事例

世の中にはすでにいろいろなオープンハードウェアはあるのだと思いますが、個人的にはBrilliant Monocleというものを教えて頂いた時が一番衝撃でした。

思わず1つ買ってしまったのですが、これ、ハードウェアの機構の図面も回路図もソフトウェアも全部公開されているんですね。

丁度 GOWIN でカメラやってるときに知って、おんなじチップとカメラが載っていて面食らったのですが、回路図わかっていて JTAG繋いで書き換えできるならなんでもできちゃいそうですよね。

とても素敵なプロジェクトだと思いました。

仕様オープンなハードウェアを開発しつつ、ちゃんと費用回収して次のオープンハードウェアを開発するサイクルが回せれば本当に理想的だと思います。

おわりに

いろいろ書いてしまいましたが、何のことない今取り込んでいるグローバルシャッターMIPIカメラの宣伝記事だったりします(まだ完成してないし、完成するのかも不明なので宣伝もなにもないのですが)。

一応ここに書いたようなことをに挑戦したいなと、なんとか DigiKey や Mouser で買える部品だけで PCBGOGOさんとかに試作してもらいながら、FPGA (KV260) に直結できるグローバルシャッターの高速度撮影カメラ作ろうと頑張っております。

完成したら、BOOTHなどで販売して、開発費の一部でも補填できる程度に回収できると嬉しいなと思いつつ、どうなる事やらと言った感じです。

ただ、副業禁止の会社に勤めていたころはこの「一部でいいから回収して次の開発につぎ込む」すら禁じ手だったので、フリーランスになった今やらずしていつやるのだという感じで頑張っている次第です。

ソフトウェアだけでなく、ハードウェアでも多くの方と成果共有がやりやすいものが作れるといいなと思っております。

今後ともよろしくお願いいたします。