manahiyoの気まぐれ

備忘録を兼ねたブログです。

AprilTagでARのイメージ性能が劇的に改善した!

はじめに

以前からRadioFieldARで電波の可視化をやっていましたが、アンテナ位置を検知するイメージトラッキングにはVuforiaを使っていました。正直、追従性能にはずっと不満があって、急に動かすとマーカーを見失ったり、遠くに離れると認識しなくなったりしてい、測定中も注意深く動かす必要がありました。イメージでなくもっと単純なマーカーなら処理も少なく追従も良くなるのではないかとリサーチしたところ、AprilTagというのがあるのを知りました。

こちらを試してみたところ、追従性能が劇的に改善しました。体感では全く別物です。これは記事にせねば、ということで今回紹介します。

AprilTagとは

AprilTagはミシガン大学で開発されたビジュアルマーカーシステムで、QRコードのようなマーカーを使って位置や姿勢を検出できます。ロボット工学の分野でよく使われているようです。こんな感じのマーカーで、ちょっと独特な感じですね。検索するといくつかブログも出てきます。

qiita.com

Unityで使う

UnityでAprilTagを使うにあたり、こちらのライブラリを使わせてもらいました。

github.com

keijiroさんのライブラリのおかげで、Unityへの導入はとても簡単でした。黄色が認識している状態です。

サイズ設定でハマった

ぱっと見は動作していたのですが、実際にAR画面上で使うと位置が合わないということが判明しました。具体的にはカメラとマーカーの距離が大きくずれていました。AprilTagではマーカーサイズやカメラのFOVに非常に敏感であるということで、見直していたところ、マーカーのサイズ設定が間違っていることに気が付きました。

はじめは外側のサイズ(点線の部分)を指定していたのですが、webでサイズの位置がわかり、ぴったり合うようになりました。正しくは、外側の白い余白を含まない内側の白い部分のサイズを指定する必要がありました。ひっかけレベルですね。

index.ros.org

マーカー移動中の認識問題

ここまでで静止したマーカーの認識はできるようになったのですが、マーカーが止まっている時は良いものの、移動中は認識できない問題がありました。ゆっくり動かせば追従するのですが、ある程度の速度にすると認識が失われてしまいます。

そこでClaudeに相談したところ、光学フロー(Optical Flow)という画像追尾の処理を並行して行うことで解決できるとのこと。光学フローを使えば、フレーム間の動きを推定して、マーカーが一時的に認識できない間も追尾を継続できます。

OpenCVで試してみた

OpenCVの光学フローが使えるということで、まずこちらのアセットを試してみました。

assetstore.unity.com

PC上では、うまく動作することが確認できました。

しかし、RadioFieldARはスマホで動作させるアプリです。このアセットはARM64に対応しておらず、使えないという結論になりました。

ARM64に対応しているものもあったのですが、趣味で買うには高価です。

assetstore.unity.com

結局、Claudeに光学フローの処理を作ってもらうことで対応できました。これでARM64で動作するようにでき、移動中も安定して追尾できるようになりました。

PC上でのデバッグ画面ですが、動作は次の通りです。黄色がAprilTagライブラリでの認識、赤枠が光学フローによる追尾です。時々乱れていますが、移動中に追尾している様子が確認できます。

youtu.be

最後に

VuforiaやARFondationのイメージトラッキングが、AprilTagに変えるだけでここまで改善するとは思いませんでした。もちろん専用マーカーなのでイメージトラッキングのように自由に画像を選択することはできません。

しかしRadioFieldARでの用途は、あくまでアンテナ位置の追尾なのでマーカーで問題ありません。これにより電波可視化がより快適になりそうです。近いうちにRadioFieldARのアップデートをする予定です。

 

 

Claude 3.7SonnetのGUI認識が優秀だった!!

はじめに

多くの人がAIにPCの操作をしてくれたら便利と考えていると思います。またいろいろな研究もされているようです。私自身もできたらいいだろうななどといつも考えていましたが、先日UFOというマイクロソフトの出しているUI認識を見つけたのをきっかけにいろいろ試していました。そんな中、Claude3.7Sonnetのパフォーマンスが高いことに気が付いたのでちょっと記事にします。

UFOをためす

こちらの記事がわかりやすかったです。まだ実用には程遠いようです。

zenn.dev

本家GITはこちら

github.com

自分でも試しましたが、遅いしコストかかるしで、全くダメでした。技術的には素晴らしいのかもしれませんが、一回動かしたら十分という感想です。

Claude3.7Sonnetで試す

3.7Sonnetは画像認識ができるので、ClaudeDesktopで画像を与えてコマンドボタンの座標を提示してもらってみました。

実際にペイントでその座標に赤印をつけると、結構いい場所を示していることに気が付きました。少なくとも中心をクリックすれば普通にボタンが押せそうです。

試行錯誤する

ただ実際に何度も試していくと精度よく座標を提示してくれる時と、外れている時があり、なかなか安定して良い状態が保てません。無理なのかなぁと半ばあきらめていました。なお、openAIなどほかのAIモデルで同様の実験をしてみましたが、私が試した限りでは3.7Sonnetだけがまともな座標を提示してきました。

そんな中、VSCodeで使用しているRoo-Codeから同様の作業を行うと、ClaudeDesktopよりも良い結果が得られることに気が付きました。

つまりClaudeDesktopではなく、API経由でプロンプトなどを工夫したらできるはずとの結論になり、再度いろいろ試しました。実際にはUIの認識ができるMCPサーバーとして作成し、ClaudeDesktopから使用しました。

これが功を奏したようで、だいぶ安定してボタンの位置を認識するようになりました。

試行錯誤の結果

MCPサーバーを使って実際に電卓のUI認識をさせたときの状態を示したものが次になります。

認識状態をわかりやすく表示する機能も付けました。

拡大 なかなかいい感じだと思いませんか。3.7Sonnetすごい!!

自動操作させてみた

この認識結果を使えば、UIの自動操作ができるようになります。次が実際に1から10までの各値の加算をしてもらったときの動画です。

youtu.be

次の通りAI自身で電卓のスクリーンキャプチャをして答え合わせができました。

他のアプリでも試してみた

ペイント

メモ帳

すでにやっている人もいそうな気もしますが、認識している様子が楽しいので改良していけたらと思っています。

 

無料で使える音声認識「RealtimeSTT」が気に入った!!

はじめに

最近はRoo-CODEでVIBE-Codingに夢中です。次々AIに指示を出す状態なので、キーボードで入力するより、音声のほうが便利だと思い始めました。

そこで音声を文字に変換するツールをいくつか使ってきたのですが、本日はGITでオープンソースの「RealtimeSTT」を紹介します。もっと早く知っておきたかったと思うくらい素晴らしいライブラリです。

これまでは月額1,000円くらいのサブスクでできるものを、無料期間で試しました。この辺りが有名どころでしょうか。

wisprflow.ai

withaqua.com

これらはもちろん良いもので特に不満もなかったのですが、サブスクでコストがかかるのと、ホスト側で変換しているので話している内容がwebに流れるのがちょっと嫌でした。

RealtimeSTTとは

内容はこちらの方がわかりやすく紹介してくれています。

 

zenn.dev

使うにあたってはGPUがないと厳しいです。CPU処理でも動作しますが、テキストへの変換に時間がかかり実用的ではありません。あとでデモ動画を付けますが、私のRTX3060では有料アプリ並みの実用的な速度で使えています。

github.com

使い方

とてもシンプルで簡単でした。GITにある指示に従うだけで、特に躓くポイントはありませんでした。動画で使用しているコードを示します。日本語用に若干修正しています。

from RealtimeSTT import AudioToTextRecorder
from pynput.keyboard import Controller
import pyautogui

keyboard = Controller()

def process_text(text):
    print(text)
    keyboard.type(text + ".\n")    #日本語の時
    # pyautogui.typewrite(text + " ")#英語の時

if __name__ == '__main__':
    print("Wait until it says 'speak now'")
    recorder = AudioToTextRecorder(
            model="large-v2",
            language="ja",  # "en" or "ja"
            use_microphone=True,
            on_recording_start=lambda: print(" - 🎤 Recording started"),
            on_recording_stop=lambda: print(" - 🛑 Recording stopped"),
            device="cuda",
            realtime_model_type="large-v2"
        )

    while True:
        recorder.text(process_text)
日本語モードで実演

こちらの動画で実際にVoicevoxで音声を出して、それをリアルタイムでテキストにしています。ちょっと小さいですが、左下がアプリの動作状態になります。メモ帳に次々テキストが入力されています。

youtu.be

英語モードで実演

モードを英語モードにして、同様の内容を入れてみました。ちょっと面白いなと思ったのですが、見ての通り日本語で話しているのに英語に自動的に翻訳されていきます。ほぼ同時翻訳しているのと同じですね。実は上記の有料のアプリもこれと同じ動きをしました。もしかしたら、ベースにしているモデルは同じなのかもしれません。

youtu.be

最後に

私は自分が使いやすいようにカスタマイズしてVibeコーディングに使っています。GPUの載っているPCをお持ちの方はぜひ試してみてください

 

tinySAオペレータのMCPサーバーを作ってみた

開発環境について

AIが進化する一方で、VSCodeなどのエディタに統合されたコーディングツールもたくさん出てきました。統合されたツールを使うことで、次のようなメリットがあります。

  • AIにコードを生成してもらった後にコピペするといった作業が不要
  • 同様にエラーが出たときにチャットボックスにコピペが不要
  • プロジェクトフォルダにあるファイルを自動的に読み込んでくれる。ファイルの生成もしてくれる。フォルダごとファイルの解析もしてくれる
  • 自動的に実行したり、結果を確認しエラーが出たら自動的に修正作業も進めてくれる

github.com

ちなみに、私のお気に入りは「Roo-Code」です。フリーで使えるのが良いです(もちろんAIにアクセスするためのAPIは別途支払い必要です)

Cluadeを試してみる

コーディングにはOpenAIのO3-miniを使用していたのですが、webサイトでいろいろ見ていると、Claude 3.7Sonnetのほうがコーディング能力が高いとのうわさ。そこで、実際にRoo-Codeでそれぞれのコーディングを試してみたところ、明らかにClaudeのほうが良かったです(あくまで私の個人の印象です)

もしかしたらRoo-Codeとの相性もあるのかもしれません。Claudeで指示するとプロジェクト一式のファイル生成からreadme.mdの説明まで一通り作成してくれます。これは感激しますね。

まだ試せてませんが、gitへのアクセスも自動でできるそうです。

もう一つ大きな理由は、最近話題のMCPの本家であることです。ClaudeDesktopから簡単に使えます。ここら辺はチュートリアルがわかりやすいです。

modelcontextprotocol.io

以前もfunctionCallingなどを使えばローカルのファイル操作などもできましたが、MCPで機能追加するほうがずっとお手軽です。またMCPにすることで様々なLLMからのアクセスが可能になります。上記のチュートリアルでテキストファイルの生成やファイルリストの表示などが体感できます。

MCPサーバーを作ってみた

こうなると自分でもMCPサーバーを作ってみたいという気になるわけで、下記のチュートリアルをやってみました。よくある天気の取得というものですが、とても簡単でした。ある程度のプログラム経験のある人なら余裕だと思います。

modelcontextprotocol.io

tinySAオペレータのMCPサーバーを作ってみる

ためしにRooCode内でClaudeにMCPサーバーを依頼すると、作ってはくれましたが、上記のチュートリアルとは違うライブラリを使っているようで、なんか複雑でよくわからないものが作成されました。

こちらがチュートリアルで使っているfastMCP。クイックスタートを見るとわかりますが、ほんとにクイックです。

github.com

そのため、上記のチュートリアルで作成したMCPサーバーのコードを渡して、それと同じように作ってほしいと頼んだところ、9割くらいは自動で作成してくれました。ただ、残念ながら動作までは至らず、1割は自分で修正して完成させました。まだ動いたばっかりなので、改善点は山ほどありますが、ざっと動作状態を紹介します。

ClaudeDesktopからMCPサーバー経由でtinySAを操作する

ClaudeDesktopからは次のように表示されました。

バージョンを取得したところ

なお、周波数設定のコマンドについては試したところ、tinySAにはないコマンドを勝手に出力していました。そのため、tinySAのサイトにあるUSBコマンド一式を添付ファイルで与えることで、次のように周波数設定をしてくれました。頼んでもいないのに設定状態の確認までやってくれるのは素晴らしい。

ただ、この後に別のコマンドを実行したところエラーが出ました。動くようになったばっかりなので、まだいろいろ対策が必要そうです。これに画像取得などのコマンドを追加すれば、コマンドだけでなく画像でも確認できて応用が広がりそうです。MCPサーバー側からtinySAの使い方などの情報を渡せるともっと気の利いたサーバーになりそうです。

最後に

YoutubeなどではMCPについて多くの動画が見られます。ゲームチェンジャーになるといった大きな期待もあるようです。このお試しでMCPの可能性を感じた気がします。アイデア次第でいろいろ遊べそうです。

 

 

 

 

RadioFieldMRの日本語版紹介動画を作成

はじめに

電波可視化のアプリ「RadioFieldMR」を改良中ですが、関連動画を英語で作成しているため、日本人にはあまりみられていないようです。そのため、日本語話者向けのアプローチを試みることにしました。また、いつも淡々とした動画なので、今回はVTUBER風に少し趣を変えてみました。

アバターを表示する方法:初心者向けツールを試してみた

いくつか候補はありましたが、下記が一番ポピュラーなようです。ちょうどセールで半額になっていたので、ポチっとしてしまいました。

denchisoft.com

ちょっとググると初心者向けの説明動画がたくさんあるので、初めてできたがさほど苦労せず使えました。自分の声や動きに合わせてアバターがリアルタイムで動くので、実際にキャラクターになりきった気分になれて楽しいです。

www.youtube.com

 

アバター探し:BOOTHで理想のキャラを見つける

いつも使っているBOOTHで探しました。技術紹介なので無難でかわいいものがいいなと、下記を選定しました。無料ではないですが、お手頃価格でよいかと。

booth.pm

ナレーションの選択:VOICEVOXで作る自然な音声

自分の声を使うのはちょっと恥ずかしいので、VOICEVOXでしゃべらせることにしました。以前にも試していたのですが、調べてみるとVOICEVOX-Nemo-というのが最近出たようで、こちらはキャラクター色のない比較的ノーマルな音声で無料で使えるようです。基本的に技術紹介なので、こちらが良い感じでした。

voicevox.hiroshiba.jp

 

ちなみにこういうのもありました。音声の自然さはVOICEVOXより上でしたが、キャラクター声しかなかったので、今回の動画にはちょっと合いません。今後に期待です。この分野の進化もすごいですね。パッと聞いただけではAIとわからなくなってきました。

aivis-project.com

台本を考える

自分でそれなりに考えて作ってみたのですが、ChatGPTに台本のアドバイスを求めたところ、「技術説明が難解すぎる」「ターゲット層を明確にするべき」など、具体的な改善案を多くもらいました。指摘を取り入れると、動画全体のメッセージがシンプルで分かりやすくなりました。

 

動画が完成!!

youtu.be

 

 

 

 

 

 

 

 

 

衛星に乗って地球を見てみる

はじめに

以前下記の記事で、衛星の軌道をARで見るというのを作りました。

manahiyo.hatenablog.com

今回は逆に衛星の視点から地球を見たときにどんな感じなんだろう・・・というきっかけで簡単なアプリを作ってみました。

まずは1枚、SYNSPECTIVEのSTRIX1から見たときの地球です。ちょうどこの時間に日本の上空を通るようです。

方法を考える

以前使った地球のassetを使えばよいかと考えたのですが、実際に拡大して使うと画像が荒すぎてぼけて話になりませんでした。

そこで次のようなより高解像度のものもよさそうだったのですが、それでも拡大すると荒さが目立ちました。

assetstore.unity.com

そういえば、以前Google EarthVRで使ったときのことを思い出して、Googleのサービスが使えそうでした。

qiita.com

しかし、調べていくと、Cesiumというより便利になったものがあるのを見つけました。

lilea.net

Cesiumを使ってみる

下記が本家webです。

cesium.com

見ているだけでワクワクしてきます。

まずは下記のクイックスタートに従ってUnityでソフトを作ってみました。

cesium.com

とても丁寧に説明があるので、全くハマらずに表示ができました。

特にGoogleAPIの登録もする必要はないようです。

実際に衛星の高度500kmにすると次のような感じです。なかなかきれいな画像です。

少しくらい拡大してもあまりぼけません

こんなのが無料で使えるのは改めてすごいなぁと感心するばかりです。

衛星の軌道を作成する

以前も衛星の軌道をTLEから作成しているので、基本的にそれを流用します。出てきた値をCesiumにそのまま突っ込むだけなので、とても楽です。こんな感じのパラメータがあります。入れ方は緯度経度か、ECEFの座標を選べます。ここに値を入れるだけで上記のような画面が得られます。

位置を確認してみる

前回もお世話になった「SatelliteTracker3D」で確認します。

アプリ画面

上記の通り位置がぴったり合っています。

画像だとただの衛星写真みたいなので、動画だと雰囲気が伝わるかと。

youtu.be

 

Cesiumはほかにもいろいろ機能があるようなので、しばらく遊んでみたいところです。

 

 

 

 

電磁波強度を可視化 その2

はじめに

以前、以前の記事でキットの電磁波計で可視化を試みました。今回はこれの続きです。

manahiyo.hatenablog.com

前回使ったのははんだ付けキットということで感度がちょっと不十分で、もう少ししっかりとしたもので測定できないかと思っていました。USBタイプの電磁波計があれば、直接QUEST3で取り込めると考えて探してみました。しかし、見つけたものは趣味で使うには高価でした。

www.webshiro.com

そこで、安価な製品を使い、内部電圧を確認すれば前回と同様にpokitで電圧を取得できるかもしれないと思い、試してみました。こちらなら千円以内です。周波数測定レンジは50Hz ~ 2000MHzとあります。本当に50HzだとするとAC100Vにも反応するのではないかという気もしますが。

https://www.amazon.co.jp/dp/B0C19GJ81D

買ってみた

パッケージは以下の通りで、いかにも中国製の安いものという感じです。外側も砂埃被っている状態で何年倉庫に置いてあったんだろうという印象でした。左上に見えるとおり、凹んだあともあったりして、ちょっと不安です。

amazonでは見つかりませんでしたが、パッケージの写真からは2種類あるみたいです。

電池が入っていないので、何を買ったらよいか確認したら久しぶりの角型タイプです。まだ活躍していたのですね。

動作確認

電池を入れて動作させたところ、正常に動作しました。下記写真はACアダプタに近づけて測定したものです。電磁波を検知するとアラームのLEDが点灯して、表示とともにアラーム音がピコピコ鳴ります。

周りにある電化製品を測定してみたところ、強さに違いはあるものの、ほぼすべてのもので反応していました。逆に車のリモートキーは300MHz帯なので、検知するだろうと試しましたが、反応しませんでした。バーストなので瞬間的なものは検知できないのかもしれません。

開けてみる

ビスを外してちょっと力を入れれば簡単に外れました。開けた状態は下記の通り。いくつかの穴がふさがれていて形状から推測すると熱電対の測定器とケースを兼用しているようです。上の部分が検知アンテナのようでスミチューブにワイヤーが入っています。その部分の半田は手付のためか、完全なイモはんだ状態。まぁ安いから動けばいいか。

基板の番号でググると、すでに解析している人がいました。OPの型番まで書いてあります。

www.prc68.com

アナログ電圧出力を探す

はじめはLCDOCRとかで読み取ることも考えましたが、簡単ではなさそうです。前回と同様にアナログ電圧で見れるのが一番簡単です。

とはいえ、電界強度の強さがどこの電圧で見られるのかはわからないので、いろいろ当たってみました。その結果、下記のR15とGNDでDC電圧を見ると、電界強度に応じた電圧が出てきていそうです。数mVから200mVくらいまで変動していたので、テスタで直接測定できる電圧です。

ワイヤーをはんだ付けして、ここをpokitで電圧を測定すれば、前回同様に電界強度を可視化することにしました。

Pokitは以前下記で紹介したBluetoothのマルチメータです。

manahiyo.hatenablog.com

ふたを開けたままだと不便なので穴をあけて次のように外に引き出して、Pokitに接続しました。

電圧を確認してみる

未検出状態 0mV

検出状態 265mV

上記の通り、値は違いますが、電界強度に応じた電圧が出ていることが確認できました。よって、強度分布を表示するのには十分使えそうです。

時々pokitのBluetooth通信自身を検知することがありましたが、実用上は問題にならないレベルでした。

AC100Vに反応してそうな気が・・・

試してみると、予想以上に多くのものに反応することが気になりました。周波数が50HzからとあったのでもしかしたらとACコンセントに近づけてみたところ・・・・下記のとおり検出していました。多くの電化製品に反応していたのはこのためかもしれません。

まぁここでは可視化の実験ができればいいので、良しとしましょう。

可視化してみた

いつもの通り、赤の部分が電磁波が強いところ、青が弱いところという表示になっています。定番のACアダプタを測定すると、ACアダプタの周りとケーブル部分が赤くなっているのがわかります。ACコードにも反応しているのでAC100Vに反応しているようです。

fogバージョン

液晶ディスプレイかも電磁波が出ているようです。離れるにしたがって青になっています。

fogバージョン

最後に

以前のキットよりは感度が良いようで、広範囲で検知できるようになりました。これだともう少し応用がしやすいかもしれません。