分身ロボもどき #IT_Party

友人の頑張りにより本州最西端でITパーティーが開かれました🎊

connpass.commargaritan.hatenablog.com

最近オリィ研究所にはまっている私はRaspberry Pi を用いた自作分身ロボットについてお話させていただきました。

ロボコン部署紹介.pptx - Google ドライブ

今回のブログでは実演に用いた分身ロボットの作り方を中心に書いていきたいと思います。早速ですが、Raspberry Piを遠隔操作するために「TeamViewer」というアプリを導入します。ラズパイ関係なく簡単にPCの遠隔操作が可能になるのでおすすめです。

iot-plus.net

次に回路・ハード周りを構築していきます。

基本的には周南ロボコンの時に参考にした「ZeroBot」と同じ構成です。

https://cdn.hackaday.io/images/6417841519894620814.png

https://hackaday.io/project/25092/instructionsd

電源周りは面倒なのでモータードライバーに単3電池4つを直列に繋ぎ

モータードライバーはBanggoodから輸入いたしました。

http://デュアルチャンネルL298N DCモータドライバボードPWMスピードデュアルHブリッジステッパモジュール モジュール基板 from エレクトロニクス on banggood.com https://banggood.app.link/GYGmJW1vv2

ブレッドボードやジャンパーピンで回路を繋ぎ

タミヤ製品を使いながら適当にハードを完成させます。

 

そしてロボット駆動用のGUIを作ります。

Tkinter を使い4つのボタンを配置。

電卓のレイアウトを作成する - Narito Blog

そしてそれぞれ呼び出す関数を定義し

GPIOピンを直接制御します。

Raspberry Pi のGPIOをPythonから利用する - Qiita

こちらが最終的なプログラムです。

github.com

最後にストリーミング。

Raspberry Piと動画モニタアプリMotionで、晩ご飯作成風景を家庭内ストリーミング配信する - Qiita

今回はぎりぎりのスケジュールでしたので、ラズパイのストリーミング配信をラズパイ上で表示させるという頭の悪そうな事をしています。ここはぜひより良い方法を探して教えて下さいますようお願いしておきます。


f:id:massiro-myaon:20191218203617j:image

そんなこんなで現時点の分身ロボットの出来上がりでございます!発表本番でも自宅にロボットを置いた状態で発表会場から動かすということができ、喜んでいただけたようなので良かったです(本当は会場に分身を置いて自宅から参加したかったw)!

分身として使う為の音声周りの機能追加やハードのデザイン向上などやるべき事はまだまだありますが、マイペースにやってまいります🍵

NrealAirでスマホのGPS情報を見る

NrealAirでもGPSを使った開発はできるという情報を聞き、試してみました。
やったこととしては、UnityのLocationServiceで取得したものを、Nrealで表示するTextに当てはめた形です。

NrealAirのテキスト表示(視線追従機能付き)アプリはMESONさんのTech Blog、
UnityのLocationService実装は、BioErrorLogさんの記事を参考にしました。

zenn.dev

www.bioerrorlog.work

Unityのシーンとしてはこんな感じ

NrealAirでは、こんな感じで見えました

位置情報付きの3Dモデルを、取得したGPS情報からの相対距離・角度で表示するみたいなことがしたくなりました。

謎のGPSモジュールGT-U7を使ってみた

Amazonで何となく手に入れたGPSモジュール。

Amazon.co.jp: GPSモジュールGT-U13 gpsアンテナ衛星位置サブメーターの位置決め精度 カートラッカー、スマートフォンに適用GNSS: 家電・カメラ

youtu.be

使い方はこちらの動画の通り。

うまいこと使えたので何かしらに使っていきたい。

リクルートの提供する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,
            };
        }
    }
}

これを実行してみるとこんな感じ

 f:id:massiro-myaon:20210320172212j:plain

画像の数には限りがあるみたいで、見当違いな結果になることも多いが、キーワード次第でそれっぽい結果を返す。 今は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に降圧する

詳細はデータシートにありますが、細かいピン配置などは少し頭を使う必要があるので参考までに活用ください

f:id:massiro-myaon:20201023113154j:plain

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デバイスを頂きました。
今回はそれらを用いて製作したものとその製作手順を紹介していきます。

www.hello.soracom.jp

はみがきチェッカー

応募時に提案していたアイデアです。
歯ブラシを取り出したタイミングを検知・記録します。

f:id:massiro-myaon:20200813140613j:plain

リミットスイッチをはんだ付けしてプリンターパーツを付けてハード側は完成。

f:id:massiro-myaon:20200813140932j:plain

通知は以下の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

f:id:massiro-myaon:20200813141112j:plain

f:id:massiro-myaon:20200813141157j:plain

ここまでIoT特化のデバイスを扱ったことがなかったので比較的スムーズに取り組めて楽しかったです。習慣の可視化という点でも色々なユースケースが他にもありそうなので今後も思い付く限り試してみようと思います!

OculusLink+Kinectでフルトラッキング

VRやってたらフルトラッキング憧れますよね...

そんな中以下の記事を見つけまして...

bironist.hatenablog.com

情報系の先生にKinectV2を借りていたこともあり、OculusLink+Kinectでのフルトラッキングに挑戦!

基本的には上記サイトの手順通りに出来ました!


OculusLink+Kinectでフルトラッキング

詰まった点としてはキャリブレーション時にコントローラから調整できなかったのでバーチャルデスクトップからKinectToVRのパラメータを直接操作することで対応しました。

VRChatなどSteamVRから起動できるアプリで活用することは出来ましたが、clusterでは認識出来なかったので解決案を模索中です!