📷️

Spresense でビデオ撮る

に公開

Spresense でビデオ

前々回 写真撮影 をしました。今回はその動画版です。今回で Spresense 最終回ですね、たぶん。

あと、この記事書いてるときに Udon のバグ(というより Firefox がおかしい)を見つけたので修正しました。

作ったもの

Spresense で自動的にプログラムを起動する

実験している際に、書き込んで、USB通信を可能にするために sercon を打つのが面倒くさくてしょうがないです。それにコマンドを打たないとプロセスが起動しないというのは最終的な使用場面で考えても困ります。Spresense 起動時に勝手にプロセスが起動させる設定は必須ですね。

そのためには feature/startup_script を有効にすればよいようです。

spr-config feature/startup_script

で、これを有効にしてビルドして起動後に実行したい内容を init.rc に記述します。

init.rc
sercon
video

init.rctools/flash.sh-w オプションで送ればよいようです。何故かしらんけど、 -w を有効にするとボーレート(-b) のオプションを付けるとエラーになります。意味不明。

spresenseのsdkのtools/flash.sh -c USB書き込み先 -w init.rc

これで、 Spresense をリブート(プログラムを書き込むとリブートが走ります)したり、電源を入れたら勝手に serconvideo が起動します。

Spresense のコード

基本的には 前々回のカメラ前回のスレッドの組み合わせです。

  1. USBSerial のコマンド受信スレッド
  2. カメラ撮影+USBから送信スレッド

https://github.com/nodamushi/zenn-program/blob/main/src/spresense/camera/src/video/video_main.cxx

もともとは更に「カメラ撮影スレッド」+「USBから送信スレッド」に分けていた(無論コアも)のですが、どうしてもカメラ→送信スレッド間のやり取り(nxsem を用いた Queue)でどうしても速度が出ず、 QVGA で 120FPS が出せなかったので断念しました。単純にカメラ→送信で情報を送るだけでも110FPSぐらいになります。同一スレッドでやれば120FPSでるので、nxsem は相当重いですね。

nxsem は待機とか行うっぽいので、 std::atomic_integer でスピンロックにすれば別スレッドでも速度出るかもしれませんが、スレッドまとめたら速度出てしまったので確認してません。

一応、QVGA 120FPS, VGA 60FPS, HD 30FPS の速度は確認してます。

ホスト側

Spresense を作ったはいいものの、確認できなければどうにもなりません。今回は速度を出すために Base64 にもしてないので Teraterm などは使えず、プログラムを作る必要があります。

とはいえ、クッソ面倒。

というわけで、 最近どうにも一人負け感が強い Claude に Spresense のコマンド仕様をぶん投げてプログラムを作ってもらいました。

特に期待もしてないので Python です。(やっぱ C++ とか Rust とか書かせるとひどい結果にしかならんよね)

まず仕様と方針を入力して「設計」をさせる、「部分的に作らせる」(GUIじゃなくてCLIでまずは作らせた)、「最後にGUIだけ作らせる」という手順でやっています。

で、できたものがこれ。おぉ、いいじゃないか。

正直なところ1000行程度のショボいプログラムなんざ、 AIに指示してる時間で自分で書いたほうが早いと思うけど……。でも私は GUI を作るのは面倒くさいし、Python が死ぬほど嫌いなんだ……

まとめ

Spresense で最大速度で撮影してホスト側に送ることが出来ました。

以上

Discussion