/

2024年9月26日

プロダクトプロトタイピングで取り組んだこと備忘録(メタバースから奏でるピアノ)

メタバースピアノ

デジタルハリウッド大学大学院「プロダクトプロトタイピングA」で取り組んだことをまとめておきます。

miiboを使ったLINEボットの開発

これは実は、HTMLコードを確認して、タイトルや運行状況にあたるIDを見つけ出し、それをAIに指示して実現してます。そんな事ができてしまうなんて、かなり衝撃でした。

未解決事件発生

結局、実現できなかったことがあり、それを「未解決事件」としてChatGPTに記録することにしました。下記のように、ChatGPTのメモリを利用して記録しておくと、あとから引き出すことができます。

その時の記録内容は下記です。問題の切り分けに非常に時間がかかり、結局、Zapierから正しい戻り値が戻ってきていないことがわかった。Webhook自体がZapierでもテスト運用のようで、これ以上深ぼるのはやめて、いったん未解決事件入りさせました。

未解決事件: miiboとZapierで運行状況アプリ

内容:

  • チャットボットをつくるmiiboからユーザーの会話内容に応じてZapierのWebhookを発火 (Function Calling)
  • Zapier側で、会話内容を受け取り、外部APIから取得した情報を、会話内容で検索して必要な部分のみ収集(Python)。最後にPythonからの戻り値として、路線名と運行情報を返す。
  • これでつまり、ユーザーがチャットに路線名を入力すると、運行情報を返すことを目指している。

今回のつまづき分析:

  1. Zapier内での変数の渡し方を知らなかった(マッピングという処理をする必要があった)。
  2. miiboにWebリクエストから返ってきたレスポンスを見るログ機能を見つけ出すのに時間がかかった(非常に分かりにくい場所にあり、miibo自体のマニュアルが充実していない)。

現在の問題: Webhook URLが、正しい路線名と運行情報を返していない。ZapierのAIボットは賢かったが、問題解決には至らなかった。問題はPythonではなく、Zapier内でのJSONの扱い方(ネスト状態でアクセスしないといけないという制限があるようだ)が分かっていない可能性がある。

日付: 2024-08-24.

Obnizboardを使ってみる

Obnizboard

Obnizboardは、日本の企業obnizが開発したIoT(Internet of Things)デバイスです。

  1. クラウド接続: インターネットを通じてクラウドに直接接続できます。
  2. JavaScript制御: JavaScriptを使用してプログラミングとコントロールが可能です。
  3. 多様な接続性: Wi-Fi、Bluetooth、各種センサー、モーター、LEDなど、様々なデバイスと接続できます。
  4. 簡単な開発: ウェブブラウザを使用してプログラミングができるため、初心者でも比較的容易に開発を始められます。
  5. リアルタイム操作: クラウド経由でリアルタイムにデバイスを制御できます。
  6. 多目的利用: 教育、プロトタイピング、ホビー、産業用途など、幅広い分野で活用されています。

Obnizboardは、IoTプロジェクトの開発や実験を簡単に行えるようにすることを目的としています。ハードウェアとソフトウェアの知識を組み合わせて、様々なIoTアプリケーションを作成することができます。

Node-REDによるプログラミング

Node-REDは、データフローのプログラミングを視覚的に行うためのツールです。

  1. ビジュアルプログラミング: フローベースのプログラミング環境を提供し、ノードを繋げてアプリケーションを作成します。
  2. IoT向け: 特にモノのインターネット(IoT)プロジェクトに適しています。
  3. Node.jsベース: JavaScript実行環境であるNode.js上で動作します。
  4. 拡張性: 多様なノードが用意されており、カスタムノードの作成も可能です。
  5. Webベースエディタ: ブラウザ上でフローを編集・デプロイできます。
  6. 多様な接続: HTTP、WebSocket、MQTT等、様々なプロトコルをサポートしています。
  7. オープンソース: IBMが開発し、オープンソースとして公開されています。

Node-REDは、センサーデータの収集、APIの統合、シンプルなWebアプリケーションの作成など、幅広い用途に使用されます。プログラミングの経験が少ない人でも、比較的簡単にIoTソリューションを構築できるツールとして人気があります。

node-red

このように、ノードをつなげていくだけでプログラミングができるのです。

メタバースから音を鳴らしたら、リアルに音を奏でるメタバースピアノ

さて、作りたかったものは、メタバースピアノなので、いざ開発に着手。

メタバースピアノ

といいつつ、わたしはパキスタンへ・・・

パキスタン
パキスタン
パキスタン

まぁ、そうぞう以上にネットは繋がりませんでした。パキスタンのフンザにいました。

Obniz cloudを使う

それまで授業では、Node-REDを使って開発をしていました。それは、GitHub上にサーバーを借りて(?)行っていたので、最大4時間で再接続が必要でした。それでは、ピアノを鳴らせないと考え、Obniz cloudを使うことにしました。APIの発行は簡単でしたが、メタバース(Unity)から、Obniz cloudへのリクエストは、JSONフォーマットで行う必要があります。

Obniz cloudの管理画面に「API Testing」という欄があります。ここにコマンドを入力し、LEDやモーターを動かすことができなければ、Unityから制御もできません。というわけで、何はともあれ、ここに書くコマンドを解明することからはじめました。

これがなかなかの曲者で情報もなく(分かっている人には、きっと当たり前のことすぎて情報がないのだろう) マニュアルも全部目を通したけど、わたしのようなノンプログラマには理解不能。結局のところ、APIのリファレンスを、NotebookLMに全てぶち込むといういつもの方法で解決。やっぱりNotebookLMはすごい。

そしてUnityから音を鳴らすことに成功

次に、音質の改善をはかるため、一番カンタンな方法としてPerplexityが提案してきた「アンプとスピーカーをつける」に挑戦。

パキスタンで、車の改造とかしている人がスピーカーとアンプを繋げてくれました。ハンダも買おうと思ったら、「これは薄いからできないよ」ということで、はんだ付けまでしてくれました。

ところがObnizbordにつなげても音がならない。ハード音痴のわたしには、問題の分岐も非常に難しかったです。この時点で、
・これは5V必要だけど、Obnizboardは5Vでるのか?(後日、5V対応と知る)
・配線にスピーカーの右と左があるが、Obnizboardで圧電スピーカーと同じように配線するだけでいいのか(結論として、1つしか使わなければモノラルになる、たぶん)

が、主に分からないことだと思いました

そこでまず「5V」問題から解決してみることに。

ChatGPTに聞くと、USBをバラせばいい!ということで、バラしてみたらChatGPTが言うように「赤」と「黒」の線がない。赤は2本あるし、黒はなかった。写真をChatGPTに送ったら、AIも驚いてました。笑

そういえばこれは、MetaQuestかInsta360の付属品だったことを思い出し(そんなものをバラしてしまった。。。)、もっと普通のUSBをバラしてみることに。

しかし、音は出ず。スピーカーの方が壊れているのかも?ということで、車のスピーカーの代わりに繋いでみたら、ちゃんと音がなりました。というか、車のスピーカーが後部座席に、まるで電子工作なみにつなげてあり、簡単にこのスピーカーと差し替えられたことに衝撃をうける!!パキスタン人、何でも自分で作ってしまうのだ。

そうこうしているうちに帰国が近づいてきたため、秋月電子で、型番のあるアンプとスピーカーを購入しておく😅ハンダも買いました。

帰国して次の日、早速部品が届いたので接続したら、あっさりとアンプとスピーカーがつきました。これまでにいろいろ試行錯誤したので、いろんな知識がついたのが大きかったのだと思う。

CORSエラー

そして翌日、発表。それまでUnityのプレイモードでしか試していなかったので気づかなかったのですが、なんと、ブラウザからではCORSエラーが出ていることに気づく。CORSエラーとは、ウェブブラウザのセキュリティ機能によって発生するエラーで、異なるオリジン(ドメイン、プロトコル、ポート)間でのリソース共有を制限するものです。

スマホアプリ上では動くのですが、WebGLで書き出すとよくCORSエラーが起きるのです。Obnizcloudで、CORSエラーを回避するにはどうしたらいいのか?サクッとLLMに聞いたところ、Obnizでアプリをつくる必要があるということ。えっ!?もしかして、最初からAPIのアプローチ自体間違っていたのかも?!

ということに気づいてしまいました。いまここです。次はまず、CORSエラー解消をめざすべく、

わたしの旅は続きます。

ピアノ体験

ここに、ピアノがありますので、弾いてみてください。とはいっても、メタバース上でしか音は鳴りませんが。。(わたしがピアノをオンラインにしていたら、鳴っていますよ!)