分身ロボもどき #IT_Party
友人の頑張りにより本州最西端でITパーティーが開かれました🎊
connpass.commargaritan.hatenablog.com
最近オリィ研究所にはまっている私はRaspberry Pi を用いた自作分身ロボットについてお話させていただきました。
今回のブログでは実演に用いた分身ロボットの作り方を中心に書いていきたいと思います。早速ですが、Raspberry Piを遠隔操作するために「TeamViewer」というアプリを導入します。ラズパイ関係なく簡単にPCの遠隔操作が可能になるのでおすすめです。
次に回路・ハード周りを構築していきます。
基本的には周南ロボコンの時に参考にした「ZeroBot」と同じ構成です。
https://hackaday.io/project/25092/instructionsd
電源周りは面倒なのでモータードライバーに単3電池4つを直列に繋ぎ
モータードライバーはBanggoodから輸入いたしました。
ブレッドボードやジャンパーピンで回路を繋ぎ
タミヤ製品を使いながら適当にハードを完成させます。
そしてロボット駆動用のGUIを作ります。
Tkinter を使い4つのボタンを配置。
そしてそれぞれ呼び出す関数を定義し
GPIOピンを直接制御します。
Raspberry Pi のGPIOをPythonから利用する - Qiita
こちらが最終的なプログラムです。
最後にストリーミング。
Raspberry Piと動画モニタアプリMotionで、晩ご飯作成風景を家庭内ストリーミング配信する - Qiita
今回はぎりぎりのスケジュールでしたので、ラズパイのストリーミング配信をラズパイ上で表示させるという頭の悪そうな事をしています。ここはぜひより良い方法を探して教えて下さいますようお願いしておきます。
そんなこんなで現時点の分身ロボットの出来上がりでございます!発表本番でも自宅にロボットを置いた状態で発表会場から動かすということができ、喜んでいただけたようなので良かったです(本当は会場に分身を置いて自宅から参加したかったw)!
分身として使う為の音声周りの機能追加やハードのデザイン向上などやるべき事はまだまだありますが、マイペースにやってまいります🍵
NrealAirでスマホのGPS情報を見る
NrealAirでもGPSを使った開発はできるという情報を聞き、試してみました。
やったこととしては、UnityのLocationServiceで取得したものを、Nrealで表示するTextに当てはめた形です。
NrealAirのテキスト表示(視線追従機能付き)アプリはMESONさんのTech Blog、
UnityのLocationService実装は、BioErrorLogさんの記事を参考にしました。
Unityのシーンとしてはこんな感じ
NrealAirでは、こんな感じで見えました
位置情報付きの3Dモデルを、取得したGPS情報からの相対距離・角度で表示するみたいなことがしたくなりました。
謎のGPSモジュールGT-U7を使ってみた
Amazon.co.jp: GPSモジュールGT-U13 gpsアンテナ衛星位置サブメーターの位置決め精度 カートラッカー、スマートフォンに適用GNSS: 家電・カメラ
使い方はこちらの動画の通り。
うまいこと使えたので何かしらに使っていきたい。
リクルートの提供するAPIを使ってそれっぽいAsureBotを作る
online.kosen-career.tech こちらのイベントでそれっぽいAsureBotを作ったのでその手順を備忘録。 基本的な環境構築からオウム返しBotまでは以下を参照。 qiita.com 無料で使えるそれっぽいAPIを探したところA3RTというものがリクルートから提供されていたので、これをBotに組み込むことを目標とする。 a3rt.recruit-tech.co.jp EchoBot.csの初期状態を読むと
- OnMessageActivityAsyncでメッセージ送信時の反応
- OnMembersAddedAsyncで接続時の最初のメッセージ
を行っていることが分かる。
なので基本的にはOnMessageActivityAsyncの方を拡張していくような形。今回はBot上で画像を扱ってみたかったこともあり、ImageSearchAPIを使ってみた。
Image Search API | PRODUCT | A3RT
結果画像の送信はこちらのプログラムを参考にして実装した。
メッセージにメディアを追加する - Bot Service | Microsoft Docs
using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Bot.Builder; using Microsoft.Bot.Schema; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Net; using System.IO; namespace Microsoft.BotBuilderSamples.Bots { public class EchoBot : ActivityHandler { protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { var replyText = $"{turnContext.Activity.Text}"; //API処理 string search_word = replyText; WebRequest request = WebRequest.Create("https://api.a3rt.recruit-tech.co.jp/image_search/v1/search_by_text?apikey=AAAAAAAAAAAAAAAAAAAAAAAA&query=" + search_word); WebResponse response = request.GetResponse(); using (Stream dataStream = response.GetResponseStream()) { // Open the stream using a StreamReader for easy access. StreamReader reader = new StreamReader(dataStream); // Read the content. string responseFromServer = reader.ReadToEnd(); string jsonString = JsonConvert.SerializeObject(responseFromServer); JObject deserial = (JObject)JsonConvert.DeserializeObject(responseFromServer); string send_img = deserial["result"]["img"][0]["url"].ToString(); //返信処理 IMessageActivity reply = null; reply = MessageFactory.Text("This is an inline attachment."); reply.Attachments = new List<Attachment>() { GetInternetAttachment(send_img) }; await turnContext.SendActivityAsync(reply, cancellationToken); } // Close the response. response.Close(); } protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { var welcomeText = "Hello and welcome!"; foreach (var member in membersAdded) { if (member.Id != turnContext.Activity.Recipient.Id) { await turnContext.SendActivityAsync(MessageFactory.Text(welcomeText, welcomeText), cancellationToken); } } } private static Attachment GetInternetAttachment(string img_url) { // ContentUrl must be HTTPS. return new Attachment { Name = @"Resources\architecture-resize.jpg", ContentType = "image/jpg", ContentUrl = img_url, }; } } }
これを実行してみるとこんな感じ
画像の数には限りがあるみたいで、見当違いな結果になることも多いが、キーワード次第でそれっぽい結果を返す。 今はJson内の1つ目の画像URLを参照しているが、全部表示or最も類似するものを推定みたいなことが出来るといいかもしれない。
C# による JSON 相互変換 (Json.NET 利用) - clock-up-blog
基本的に他のAPIもリクエストするURLと受け取ったJsonの読み方を変えてやることでほぼ全部実装可能。必要に応じて組み合わせて見てほしい。
USB電源を回路で使用する
授業でUSB電源を回路で使用する機会があり、少し悩んだので備忘録
使うのは以下の2つ
- ブレッドボード用マイクロBメスUSBコネクタDIP化キット
- NJW4181U3 DIP化キット
1つ目のはUSB電源の5Vを端子にそのまま出してくれる
2つ目ので3.3Vに降圧する
詳細はデータシートにありますが、細かいピン配置などは少し頭を使う必要があるので参考までに活用ください
OBSアップデートしようとしたら詰まった話
OBSアップデートしようとしたら詰まりました
avutil-55.dll is still in use 的なのが出ました
特に日本語で調べても見つけられなかったのでメモ
こちらのサイトを見て「Teams」の単語があったので開いていたTeamsを終了
Bug Report - Cannot update to 21.0.1 nor install - avutil-55.dll | OBS Forums
そしてアップデートをやり直したら成功。以上です。
SORACOM Summer Challenge
SORACOM Summer Challengeに参加して2種類のIoTデバイスを頂きました。
今回はそれらを用いて製作したものとその製作手順を紹介していきます。
はみがきチェッカー
応募時に提案していたアイデアです。
歯ブラシを取り出したタイミングを検知・記録します。
リミットスイッチをはんだ付けしてプリンターパーツを付けてハード側は完成。
通知は以下の2つの記事を参考にメール通知とLINE通知を実装しました。
https://soracom.github.io/iot-recipes/door-monitoring-by-iot-starter-kit-magnetic-sensor/
https://www.maff.go.jp/kyusyu/seiryuu/cyoujyugai/attach/pdf/wana_tsu-4.pdf
ここまでIoT特化のデバイスを扱ったことがなかったので比較的スムーズに取り組めて楽しかったです。習慣の可視化という点でも色々なユースケースが他にもありそうなので今後も思い付く限り試してみようと思います!
OculusLink+Kinectでフルトラッキング
そんな中以下の記事を見つけまして...
情報系の先生にKinectV2を借りていたこともあり、OculusLink+Kinectでのフルトラッキングに挑戦!
基本的には上記サイトの手順通りに出来ました!
詰まった点としてはキャリブレーション時にコントローラから調整できなかったのでバーチャルデスクトップからKinectToVRのパラメータを直接操作することで対応しました。
キャリブレーション失敗例。コントローラから調整できなかったのでバーチャルデスクトップからKinectToVRのパラメータを直接操作することで対応(今パラメータを保存してなかったことに気づいた...) pic.twitter.com/yjvHbJg3Vc
— みゃおん (@blackcatyuma) 2020年6月3日
VRChatなどSteamVRから起動できるアプリで活用することは出来ましたが、clusterでは認識出来なかったので解決案を模索中です!