分身ロボもどき #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)!

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

リクルートの提供する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では認識出来なかったので解決案を模索中です!

clusterでワールド生産した話

最近はclusterにはまってもくもくしてましたがワールド製作に関しては何も記事を上げれてなかったのでまとめてみました。


Virtual Bowling


Virtual Ping-Pong in cluster


Virtual Golf in cluster

これら以外にもいくつか作って来ましたが超ハッカソンのテーマ「バーチャルスポーツ」に焦点を絞りながら紹介していきます。

基本的な作り方

creator.cluster.mu

まあ公式のチュートリアルをやれば完成します!

ほかにはWikiや交流スペースで知見が共有されているのでそちらをご覧ください!

scrapbox.io

creator.cluster.mu

バーチャルスポーツ

私が便乗したのはこの企画(43分頃に半魚人で登場)

live2.nicovideo.jp

日頃はFusion360を使ってるのでそのデータをFBX出力して使ってます。

【Unity】Fusion360で作成したデータをUnityにインポートしたい!

この仕組みを利用してロボコン展示のワールドも作れました。

今後の可能性にも期待しながら是非ご活用ください。

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

Grabbable Itemを設置してVRモードで入るだけで大抵の競技はできそうな印象。

まあclusterはスマホやPCでも遊べるのが1番の売りなのでそこは機種依存なく遊べるワールド作りを心がけましょう(ブーメラン)

Grabbable Item - Cluster Creator Kit ドキュメント

共同開発

【Unity/Git】Unityでチーム開発をする(1) 概要と初期設定編 - Qiita

Unityでの共同開発についてはここが分かりやすかったです。

ただCreaterKitSample自体がGitHubで管理されてるのでgitignoreの設定等もすでに出来ています。ですのであとはブラウザでもコマンドでもGitHubデスクトップ(私はこれ)でも通常のプロジェクト管理通り使って問題ないです。

何だかんだ雑なまとめになりましたがリンク集的に活用頂けると幸いです。

 

H430PとSelfie 2 Waifu

最近ペンタブを買いました。 f:id:massiro-myaon:20200514120757j:plain ノート取る時やちょっとしたテクスチャ編集に使っていけたらなと思います。
基本はタイピング&マウスの方が無難てなるでしょうが、ちょっとした数式とか図を書くときツールの選択肢としてあることが大事。

というわけで早速画像編集。
SNSで流れてきた自撮り写真アニメ化ツール「Selfie 2 Waifu」を使って出てきた画像からメガネを取りました。 getnews.jp

ソフトはメディバンペイントを使用。
medibangpaint.com

スポイトやペンを使ってテキトーに仕上げました。
少しすべり易い印象ですが細かいところをこすって直していく感じがペンタブならではで新鮮でした。
f:id:massiro-myaon:20200514123407j:plain f:id:massiro-myaon:20200514120804p:plain

このくらいの入門機を一度試してみては?