OGIMOノート~家族のためのモノづくり~

OGIMOテックノート ~家族のためのモノづくり~

重度障害の息子を持つ父親エンジニアの備忘録。自作の電子工作おもちゃ/リハビリ器具/ロボット関係の製作記録、思った事を残していきます

【2019/8/27】フジテレビ~めざましテレビ~ 歩けない息子のため…父の発明品

昨日に突然報告させて頂きました
めざましテレビ」出演の件、
本日8/27(火) に同番組内で放送して頂きました。

youtu.be


・特特祭に向けて製作した
「車椅子をワクワク新幹線に変えるモジュール」

・すべての製作原点である
「息子の歩行リハビリのためのメロディ靴」


を2分半の中で非常に分かりやすく、また暖かくまとめて放送頂く事ができました。
めざましスタッフの方、私の意図を等身大の言葉で丁寧に表現頂き、ありがとうございました!!
そして、非常に大きな反響を頂き、本当にありがとうございました! メッセージや頂いたコメントは随時返信させて頂けばと思います。
※製作番組ディレクター様に相談したところ、放送動画の公開許可を頂きました。

今回の放送では、
『父が障害を息子ためにモノを作る想い』
にピックアップした感動ストーリーになってましたが、

『子供たちやハンデを持った方と、
その方々の笑顔を引き出そうと取り組む
心暖かい人/面白い人達が
実はこの世界にたくさんいて、
自分自身がモノを作り発信し続けた事で、
その世界を知る事ができたワクワク感』
点をインタビュー時には多く伝えてました。

ロボット技術で孤独を解消しようと頑張る方達もいる。
障害当事者と一緒に身近な課題を解決するモノづくりを頑張る方達もいる。
パーソナルモビリティの世界を広げて足が不自由でも自由に移動できる世界を作ろうとする人もいる。
ICT技術を駆使してコミュニケーションをサポートしようと情熱を持って取り組む方達もいる。
歩行できない子供が少しでも新しい体験ができる様に地道にリハビリや作業療法に取り組む方達もいる。
子供たちの笑顔を引き出そうと全力で楽しませようとする先生方、大人たち、子供たちもいる
重度の子供たちが自分の意志を示す機会を作ろうと頑張るお母さん達もいる、
障害という社会課題の解消のために、継続的に維持できるビジネス仕組みを作ろうと奮闘している方々もいる


本当に色んな人達が、障害の有無を気にしなくて済む暖かい世界を創ろうとしてるんだなぁ、と思うと、すごく希望が湧いてきます!
それに励まされ続けている我が家だったりします!


2年前は全く知らなかった世界。
障害を持った息子や家族が将来どうなるか分からない不安感、
その不安感を解消するために
息子や家族のために自分達が出来る事が何かを考え、
自分の得意であるモノづくり技術を使ってサポートしようと決意してから、
志願して職種を変えてロボット技術で息子の足代替を作ろうとして、

また個人でのモノづくり活動をはじめつつ、
考え方・視野を変えてとにかく行動していった中で、
たくさんのご縁に恵まれた結果、
知る事ができた新たな世界です。

そして、たくさんの大人と関わるんだけど、ほんと優しい世界。とても居心地いいことが多い。みんなで、子ども達の笑顔、そしてやってみたいという気持ちをを引っ張り出すんです。
そして、その笑顔に僕たち大人もまた頑張ろうって思えるんです!
2年経った今。

すごく感じてるのは、
『世界ってこんなにおもしろかったんだぁ』
という事です。今回の特特祭のテーマがまさに自分で一番体感してます!

だいぶ長文になりましたが、とりあえず想いをつらつら書きました。
とにかく、一区切り!

Maker Faire Tokyo 2019 出展情報 (ブース紹介)


出展情報

8/3(土)~4(日)に東京・ビックサイトで開催される
メーカーイベント Maker Faire Tokyo 2019に
個人として出展
します。

2019年5月のMaker Faire Kyoto 2019に続き、人生2回目の展示会参加になります。

日時 :

2019年
8月3日(土)12:00~19:00
8月4日(日)10:00~18:00

場所

東京ビッグサイト 西3、西4ホール
https://makezine.jp/event/mft2019/


私は、今年5月にMaker Faire Kyotoでの展示コンセプトは同じで、
『家族のためのモノづくり』
というテーマで、昨年から取り組み続けてる 息子や家族のために作った自作リハビリ機器・改造おもちゃを多数展示予定ですー!
アシスティブテクノロジー&キッズ向けのカテゴリーで展示します。

以下が公式サイトでの私のブース説明になります。
ブースは【C-03-05】になります

makezine.jp


また、Maker Faire Tokyo2019 公式ブログに見どころとして弊ブースが紹介されております!!
なんと!ありがたや~!!
個人の取り組みがこうして注目して貰えると嬉しいなぁ~

makezine.jp




展示作品紹介

『実際に触って体験できる』
をコンセプトにしたいと思っていますので、是非とも積極的に遊んでいってください!(特にお子様、大歓迎!)

「あれも見て欲しい」「これも見て欲しい」と欲張った結果、展示物は 合計10点! とにかくたくさん展示してます(笑)


(1) 歩行リハビリを楽しくする「歩くと音の鳴る&光る&振動する靴」

MFK同様に動作デモを含めて現物展示予定。
今回は輸送都合で歩行器は持ってこれないので、代わりの移動サポート機器を用意。
元々は息子用のために子供靴にセンサーを埋め込んでおりますが、今回は展示会用として大人用スリッパに装着 or 手持ちタイプとして疑似体験できる様に準備しています!
是非体験していってください
ogimotokin.hatenablog.com




(2) 【新作】おかん分身ロボット用 遠隔操作オムニ台車

息子が手術入院する事になり、関西に残った妻(おかん)&息子が、分身ロボットを使って当日は説明員として参加、さらに客引き役として遠隔操作で移動できるオムニ台車ユニットも開発しました!
500km離れた自宅から、あたかもその場に来て、自分の意志で自由に動き回る雰囲気を楽しんでもらえれば、と思います。(無事にWifi混信がなければ、ですがw)


※そういえば、作るのに必死で、製作記事を書くのをすっかり忘れてました。後日、製作技術メモを公開しますー


(3) 【新作】電車でGo!コントローラで動かすプラレール

最近電車が好きになってきた息子を喜ばせようとした電車工作品。電車でGo!コントローラでモビリティを動かす事も出来ますが、モビリティは今回輸送が難しかったので、プラレールのみになります。


※こちらも後日製作記事を整理予定



(4) 【開発中】電車ごっこを楽しくするイルミネーション

8月中旬のロールアウトに向けて開発中。まだ途中段階ですが、この機会を使って使用感フィードバックを貰ってみたいため、参考展示します! 特に電車好きの方に体験してもらってのご意見お待ちしています



(5) 【進化】ボタンを押すと暴走するワンワン

実際にボタンを押して触ってもらう体験予定!
前回よりも更に元気に暴走するワンワンを見て、笑ってください!





(6) ワンボタンでじゃんけんが出来るじゃんけん義手

こちらはMFK同様に、動作デモを含めて現物展示予定です。娘とじゃんけん勝負、しましょう!




(7) 電動車椅子の操作練習のための自作ジョイスティック+二輪走行ロボット

操作コントローラ3種類×操作ロボット2種類持っていきます!
操作体験もできますよ!
ogimotokin.hatenablog.com






Special Thanks

今回はなんと、モノづくり仲間である てらきゅーとーま(https://twitter.com/toma18720)さんに
2日間 幣ブースのサポートを引き受けていただく事になりました!!!

とーまさんは今回
分身ロボットOriHimeを遠隔操作できるObniz戦車(OriTank)
を持ってきてくれます!


もしかしたら、OriHimeパイロットさん達も遠隔から分身参戦してくれるかも!?
Maker Faire はまさにロボットと人が混在した世界なので、
「見た目はロボット、中身は人間」な存在がたくさんいても違和感なさそう!!

私の妻の操作するOriOmni と OriTankとのコラボ、どうなるか分からないワクワク感でいっぱいです!!



意気込み

想いはMFKと変わりません!

障害を持った当事者や家族をサポートするアシスティブテクノロジー
大事なのは
『当事者に近い位置にいる事』
であると、この1年で強く感じました。そして、一品モノづくりができるメーカーズ活動と、個々の症例に対してカスタマイズが必要な障害支援テクノロジーは本当に相性が良いと思ってますー

・個人の超具体的な課題に対して解決案を考えれる
 (謎解き好きなエンジニアには格好のテーマがたくさん)
・実際に自分が手を動かして仕上げていける
 (モノづくりの楽しさ)
・自分が作ってくれたモノで喜んでくれる、その姿が目の前で見れる
 (エンジニアのやりがい)

エンジニアと当事者が繋がってテクノロジーを作っていく活動・世界をこの1年でたくさん見てきました!
そんな世界がこれからどんどん広がっていく事を願いつつ、自分もその一つのきっかけが出来れば、と考えてます。そんな、一番身近な人の困り事を解決するモノづくり活動の一例として、何かを一つでも伝えれれば、と思いますー

上記の展示物を見て頂ければ分かる通り、決してすごく難しい技術は使っていません。Maker Faireというモノづくりのプロが集まる祭典で、難しい技術を求める人にとって弊ブースは少し物足りないかもしれません。
あくまで、幣ブースの特徴は、

「必要とする人のニーズ目線で
 ①日常使用を目指し
 ②具体的な誰かを
 ③ちょっぴり笑顔にさせる
個人モノづくり活動」

だと思っているので、その視点で暖かい目で見て貰えれば、と思います~


日常使用を目指した暖かみある自作アシスティブテクノロジー
是非とも触って感想等頂けると嬉しいです!!

YOLO v3による一般物体認識をROS上で試してみた

f:id:motokiinfinity8:20190701230409j:plain

はじめに

前回の記事で取り上げた深度計測カメラD435 と 自己位置認識カメラT265

ogimotokin.hatenablog.com

これを使って、『息子と自動で鬼ごっこをするロボット』や『息子からひたすら逃げる立位支援ロボット』などを作りたいというモチベーションがでてきました! そのために必要なのは、ある程度正確な『息子の位置&距離を計測するか』、です。 息子個人を認識するのは次のステップで実施するとしても、まずは人認識をして人との距離情報をカメラから取得するというやり方です。 一番単純なのはOpenCVに搭載されている顔検出機能を使う手段ですが、息子は普段はズリバイなど地面と接している機会が多く、なかなか顔を見せてくれません。なので、背中を向いていてもしっかり認識してくれる手段が必要です。

そんな時、ちょうどROS上で比較的簡単に動く darknet_rosノードがあるという情報を聞いたので、息子認識に対してどの程度有用であるか、早速試してみたいなぁ、と思います

darknet_ros セットアップ

開発環境

今回は、GPU搭載の開発用ゲーミング用PCで実行してみます。
 ・CPU : i7-8750H
 ・GPU : GeForce GTX 1060
 ・OS : Ubuntu16.04 LTS
いずれはJetson Nanoに移植しますが、まずは高スペック機で動作確認。

インストール手順

以下のサイトを参考にインストールを進めました。
demura.net

$ git clone --recursive https://github.com/leggedrobotics/darknet_ros.git
$ cd ../../
$ catkin_make -DCMAKE_BUILD_TYPE=Release

しかし、下記エラーで停止

CMake Error at darknet_ros/darknet_ros/CMakeLists.txt:161 (add_library):
Cannot find source file:
src/activation_layer.c
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx
CMake Error: CMake can not determine linker language for target: darknet_ros_lib
CMake Error: Cannot determine link language for target "darknet_ros_lib".

ん?なぜだろう…とよく見てみると

darknet_ros,/ darknet_ros,/CMakeList.txt内の ${DARKNET_PATH} が何故かルートファイル直下になっている。
原因が分からないが、これを回避するため、~/catkin_ws/src/darknet_ros/darknet/に置換することで回避した。
なんという力技(笑)

おかげで無事にcmakeは通りました!

次に、YOLO ver3のモデルのインストールは下記で実施します。

  wget http://pjreddie.com/media/files/yolov3.weights
  wget http://pjreddie.com/media/files/yolov3-voc.weights

上記は、/catkin_ws/src/darknet_ros/darknet_ros/yolo_network_config/weights/how_to_download_weights.txt にも記載されています。

動作確認

まず、使うカメラのトピック名を確認します!
D435で実施する場合であれば、RGB画像のトピック名は、
/camera/color/image_raw
になるはずなので、その場合は darknet_ros/darknet_ros/config/ros.yaml  を書き換えます。

[catkin_ws/src/darknet_ros/darknet_ros/config/ros.yaml]
subscribers:
  camera_reading:「
    topic: /camera/color/image_raw
    queue_size: 1

となっていればOKです。

その上で、一つ目のターミナル上で

roslaunch realsense2_camera rs_camera.launch

でRealsense D435カメラを起動。
その後に、darknet_ros を起動

roslaunch darknet_ros darknet_ros.launch

それで、認識画像も表示してくれます。これだと、1.0fps くらい。。。
雰囲気枯らして、おそらくCPU処理のみっぽそう

GPUでの動作確認

darknetでYOLOv3を動かしてみた。 - Qiita

を参考にして、darknet/Makefile を以下に変更

GPU=1
CUDNN=1
OPENCV=0
OPENMP=0
DEBUG=0

そして、再度ビルドすると……120fps!!!
GPUすごっ!!

実際に、息子で試してみると、顔が見えない側面や背面でも人物と認識していそう〜!
時々は、ネコとか認識してるが(笑)

ちなみに、認識結果は、
/darknet_ros/bounding_boxes
トピックに表示されるので、このトピックをサブスクライブすれば認識結果をいろいろと使えそうですね。

上記動画は、スコアの低い認識結果も表示しているのでビジーに見えるが、スコアの高いモノだけ表示する様にすれば
それなりに信頼度の高いデータのみを抽出できそうなので、そのあたりはチューニングしていきたいと思います。

D435で検出した人物との距離を測定する

上記の bouding_boxes 情報から人物のいるRGB画像上の座標を抽出し、その座標に対応した位置の深度画像から距離を抽出することとする。
D435 で使用するトピックは以下
・RGB画像 : /camera/color/image_raw
・深度画像 : /camera/aligned_depth_to_color/image_raw

深度画像は、/camera/depth/image_rect_raw' でも表示されるが、これだとRGB画像と座標相関がないため、上記にトピックを使用する。

サンプルコードは以下(Pythonで例を記載しています)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# This import is for general library
import os
import threading

# This import is for ROS integration
import rospy
from sensor_msgs.msg import Image,CameraInfo
from cv_bridge import CvBridge, CvBridgeError
import numpy as np
from darknet_ros_msgs.msg import BoundingBoxes,BoundingBox
import cv2

class PersonDetector():
    def __init__(self):

        # cv_bridge handles
        self.cv_bridge = CvBridge()

        self.person_bbox = BoundingBox()

        # ROS PARAM
        self.m_pub_threshold = rospy.get_param('~pub_threshold', 0.40)

        # Subscribe
        sub_camera_rgb     =  rospy.Subscriber('/camera/color/image_raw', Image, self.CamRgbImageCallback)
        sub_camera_depth   =  rospy.Subscriber('/camera/aligned_depth_to_color/image_raw', Image, self.CamDepthImageCallback)
        sub_darknet_bbox   =  rospy.Subscriber('/darknet_ros/bounding_boxes', BoundingBoxes, self.DarknetBboxCallback)

        return

    def CamRgbImageCallback(self, rgb_image_data):
        try:
            rgb_image = self.cv_bridge.imgmsg_to_cv2(rgb_image_data, 'passthrough')
        except CvBridgeError, e:
            rospy.logerr(e)

        rgb_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2RGB)

        # 人がいる場合
        if self.person_bbox.probability > 0.0 :

           # 一旦、BoundingBoxの中心位置の深度を取得 (今後改善予定)
            m_person_depth = self.m_depth_image[(int)(self.person_bbox.ymax+self.person_bbox.ymin)/2][(int)(self.person_bbox.xmax+self.person_bbox.xmin)/2]

            cv2.rectangle(rgb_image, (self.person_bbox.xmin, self.person_bbox.ymin), (self.person_bbox.xmax, self.person_bbox.ymax),(0,0,255), 2)
            rospy.loginfo('Class : person, Score: %.2f, Dist: %dmm ' %(self.person_bbox.probability, m_person_depth))
            text = "person " +('%dmm' % m_person_depth)
            text_top = (self.person_bbox.xmin, self.person_bbox.ymin - 10)
            text_bot = (self.person_bbox.xmin + 80, self.person_bbox.ymin + 5)
            text_pos = (self.person_bbox.xmin + 5, self.person_bbox.ymin)
            cv2.rectangle(rgb_image, text_top, text_bot, (0,0,0),-1)
            cv2.putText(rgb_image, text, text_pos, cv2.FONT_HERSHEY_SIMPLEX, 0.35, (255, 0, 255), 1)

        cv2.namedWindow("rgb_image")
        cv2.imshow("rgb_image", rgb_image)
        cv2.waitKey(10)
        cv2.normalize(self.m_depth_image, self.m_depth_image, 0, 32768, cv2.NORM_MINMAX)
        cv2.namedWindow("depth_image")
        cv2.imshow("depth_image", self.m_depth_image)
        cv2.waitKey(10)
        return


    def CamDepthImageCallback(self, depth_image_data):
        try:
            self.m_depth_image = self.cv_bridge.imgmsg_to_cv2(depth_image_data, 'passthrough')
        except CvBridgeError, e:
            rospy.logerr(e)
        self.m_camdepth_height, self.m_camdepth_width = self.m_depth_image.shape[:2]
        return

    def DarknetBboxCallback(self, darknet_bboxs):
        bboxs = darknet_bboxs.bounding_boxes
        person_bbox = BoundingBox()
        if len(bboxs) != 0 :
            for i, bb in enumerate(bboxs) :
                if bboxs[i].Class == 'person' and bboxs[i].probability >= self.m_pub_threshold:
                    person_bbox = bboxs[i]        
        self.person_bbox = person_bbox



if __name__ == '__main__':
    try:
        rospy.init_node('person_detector', anonymous=True)
        idc = PersonDetector()
        rospy.loginfo('idc Initialized')
        idc.start()
        rospy.spin()
        idc.finish()

    except rospy.ROSInterruptException:
        pass

その他参考情報

darknet_rosを使ったサンプルコード等は以下です。適宜参考にしていきます。

github.com
robot.isc.chubu.ac.jp

RealSense D435(距離計測カメラ) & T265(自己位置認識カメラ) をROS上で動かした

f:id:motokiinfinity8:20190605001720j:plain

はじめに

現在、息子の遊び相手になってくれる自律移動ロボット 及び 息子の手動車いすを電動化かつ半自動運転化する仕組みを個人で検討中。
その中で、今更ながら Intel Realsenseカメラを入手することができたので、導入に向けて早速立ち上げてみました。

Realsenseの様な深度計測カメラは2年ほど前に、Realsense R200 / SR300 を使ったことはあり、これをROS上に組み込んで、ペットボトルを高速で追従させたり、
しまいには子供の顔位置を認識させてその口元に正確にスプーンを運ぶ「自動ご飯食べさせアームロボット」を本気で制作したりしていました(遠い目)

しかし、R200もSR300 も Intel提供のドライバが不安定だったのか、一度開発環境が崩れてしまって、その後に復旧できないという悲劇に襲われてしまい、それきりになってしまいました。
ファームウェアエンジニアの友人に解析協力を依頼しましたが、結局ハマってしまい、復活不可という自体になってました)

今回のD435 / T265のドライバはだいぶ安定しているという噂を聞いたので、以前の悪夢を忘れられたらよい、ですが。。。

Realsense D435

普通のカメラ同様のRGB映像の取得に加えて、ステレオビジョンによる距離計測が可能なカメラです。最小11cm〜最大10mまでの各映像の奥行き値を計測可能とのことです。
そのため、主な用途は
 ・物体検出時に物体との距離が分かる
なので、ものを掴むための位置を把握したり、障害物との距離を検知したり、かなり広い用途での活躍が期待できます。
近距離用だったSR300と比べても圧倒的にコンパクトなので、幅広いロボットに取り付け可能なのも利点。

ちなみに、IMU(加速度/ジャイロ)搭載のD435i という品番もあります。今から買うならこちらの方が良いかも。
(単独でVisual SLAMができます)

Realsense T265

2対の魚眼カメラと、IMU(加速度/ジャイロ)搭載しており、カメラだけで完結してVisual SLAMが実行できます。
つまり、主な用途は、
 ・カメラが移動した際の現在位置情報を把握できる
なので、移動ロボットに搭載しておくだけで簡単に現在位置が把握できるということですね。Visual SLAMなので、これだけだと絶対的な位置が分からない(あくまで実行開始場所からの相対位置)のと、特徴の少ない場所(例えば、真っ白な部屋)では使えないなどのデメリットはあるものの、日常的な場所で使いモノになるのかは、じっくり見ていきたいと思います。

初期確認 @ D435

Windows上でまずは動作確認をしてみました。
ツールは以下を参照。
Releases · IntelRealSense/librealsense · GitHub

RealSense SDK もしくはViewerをダウンロード して確認します。普通のRGBカメラ映像 と 距離画像(グレイスケール)の映像が見えれば、カメラ自体は正しく動いているのがわかりました。

D435のファームアップ

D435購入時期が古かったため、念の為もカメラのファームウェアバーションを上げておきます。

以下のサイトを参照にして、バージョンを5.9.2→5.10.13(当時では最新)に変更しました。

Download Latest Firmware for Intel® RealSense™ D400 Product Family
からZIPファイルをダウンロード。Signed_Image_UVC_5_10_13_0.binファイルがあったので、
Download Windows* Device Firmware Update Tool for Intel® RealSense™ D400 Product Family
にあるIntel RealSense D400 Series DFU Tool for Windows.zipツールもダウンロードして、これを起動する。
③ ②でダウンロードしたintel-realsense-dfu.exeを「管理者として実行」を行う
④ Realsense D435をPCのUSB3.0に刺した状態で、「2」を選択。カメラバージョンが読める事を確認する
⑤ 「1」を選択してバージョンアップ作業開始。「1」

Ubuntu上でのカメラ動作確認 (D435/T265)

インストール環境

私の開発環境に合わせて以下を入れました
 ・開発PC : Intel Core i5-8250U
 ・開発OS : Ubuntu16.04 LTS

インストール手順

naonaorange.hatenablog.com

上記サイトを参考にしながら設定を進めました。
まずは関連パッケージのインストール

sudo apt-key adv --keyserver keys.gnupg.net --recv-key C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C8B3A55A6F3EFCDE
sudo apt-get update

そして、ここからrealsenseドライバのインストールになります。D435だけで使用していた際には、aptから realsense2関連パッケージを入れていたのですが、
今回はT265で SDK1.22.0 以降が要求されております。 (なぜかaptから入れると 1.18.1から更新されない…)
なので、私は一旦、公式gitサイトからSDK一式を落としてきて、buildしておりますのでご注意を!

github.com
にしたがってインストール。

git clone https://github.com/IntelRealSense/librealsense.git
sudo apt-get install git libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev
sudo apt-get install libglfw3-dev
./scripts/setup_udev_rules.sh
./scripts/patch-realsense-ubuntu-lts.sh
sudo make install
カメラ画像確認方法

realsense-viewer で SDK起動。
まず、D435を接続して… 普通のRGBカメラ映像 と 距離画像の映像が見えることを確認します。
f:id:motokiinfinity8:20190605013557p:plain
左側が距離画像、右側がRGBカメラ画像になります。左側の距離画像を見ると…前方のおもちゃの土台までの距離は32cmとなっています。
実際にものさしで測ってみると…33cm程度なので誤差は1cm程度、とても優秀です!!
RGB映像と距離画像は画角が違う様で近距離になる程、ずれ量がある点には注意。おそらく画素位置の補正は必要だろうなぁ〜

次に T265 を接続。普通に魚眼カメラ映像×2が見えます。同時に画面右側にはソフト起動時を原点とした座標を表示しています。
f:id:motokiinfinity8:20190605014559p:plain
こちらは座標の軌跡を3D表示しています。座った状態でカメラを起動した後、立ち上がってぐるっとリビングを移動したので、その軌跡が残っています。
しっかりとloop closeできているので、それなりに自己位置認識の精度はありそうですね。
f:id:motokiinfinity8:20190605014642p:plain

ROSでの起動方法

以下のサイトからダウンロード。
github.com

あとは、catkin_make のビルドでOK

D435確認方法

RGB映像の確認方法は以下

roslaunch realsense2_camera rs_camera.launch
rosrun image_view image_view  image:=/camera/color/image_raw

上記に加えて、深度映像を確認します。

rosrun image_view image_view image:=/camera/depth/image_rect_raw

で深度映像が見えます。

次に、D435の特徴である画像をPointCloud で取得できます。これをRviz上に表示してみます。

roslaunch realsense2_camera rs_rgbd.launch enable_pointcloud:=true align_depth:=false depth_registered_processing:=true align_depth:=true

別ターミナルにて

cd ~/catkin_ws/src/realsense2_camera/rviz
rviz -d pointcloud.rviz

おぉ、各画素位置が深度情報に応じて立体的にマッピングされている! なんだか面白い(月並みなセリフ)
[RGB画像]
f:id:motokiinfinity8:20190605215252p:plain
[PointCloud画像]
f:id:motokiinfinity8:20190605215329p:plain
これを使えば Visual SLAMが綺麗に可視化される訳ですね!

T265確認方法

asukiaaa.blogspot.com
を参照しています。

roslaunch realsense2_camera rs_t265.launch

で起動して、その後に

rostopic echo /tf

でカメラの現在位置(
カメラを動かすと x,y位置が変わって、自己位置(相対位置)が取得できることが分かります。

また、

roslaunch realsense2_camera demo_t265.launch

を使えば、 起動時の場所を原点として、カメラの現在の位置と角度がrviz上に表示されます。おぉ、素晴らしい!
f:id:motokiinfinity8:20190605221924p:plain

今後の参考文献 (都度更新)

本ブログをアップする直前のタイミングで、からあげ先生のサイトで「D435+Jetson Nano」の設定方法がアップされてました(光栄です!)
今後のJetson移植時に参考にします。
qiita.com

D435でVisual SLAMをするなら参考になりそうなサイトです。
qiita.com

まとめ

周囲の障害物との距離を算出できる距離計測カメラD435 と 周囲の画像を元に自己位置を認識するカメラT265 をROS上にて動かすための情報を整理してみました。
今回は一旦はノートPC上で実装しましたが、本当はロボットにのせるエッジデバイスでカメラは使用するべきなので、最終的にはそちらで再度環境を立ち上げようと考えています。
ちょうどいま、Jetson Nanoを注文しているので、入手次第 そちらでの環境セットアップを進めて、簡単な自律移動ロボットで遊んでみたいと思います!

ROS2 crystalをUbuntu16.04にインストールして動かしてみた

f:id:motokiinfinity8:20190518103128j:plain

はじめに

ロボット向けミドルウェアROS(Robot OS)。
複数センサー/デバイスを分散処理しやすい、センサー可視化ツールが豊富、オープンソースで利用者が多い等、現在ロボットソフトのデファクトスタンダードになっているソフトウェアです。個人でも、業務でも、ROSを使った開発をする機会も増えてきています。ロボットは関連技術分野が広く、すべてを自分で作るのは本当に大変なので、この様なオープンソースパッケージを活用して簡単に自立移動が実装できるため、個人開発/研究用途に非常便利です。

ROS2は、ROSの思想を汲みながら、ROSの課題であるコンポーネント間通信の改善(リアルタイム性、信頼性)を行ったものになるそうです。
特に、ロボットを展示会・研究の世界から、実用の世界に持っていくのにここは重要と思ったので、ちょうどROS Japan主催の勉強会に参加してきたので、勉強メモがてらに残したいと思います。

rosjp.connpass.com

ROS2について

撮影した写真をいくつか抜粋
f:id:motokiinfinity8:20190519211835j:plainf:id:motokiinfinity8:20190519211906j:plain
f:id:motokiinfinity8:20190519211921j:plain

ROS2の特徴は
①新しい通信プロトコル(Data Distribution Service)
  - ROS Masterがいらない、信頼性が高い、速度アップ
  - 様々なベンダー実装品と入れ替え可能

②リアルタイム性の管理
 - ノードの実行順も管理可能

③組み込み機器/Ubuntu以外のOSもサポート

だそうです。

ROSだと、リアルタイム性が保証できていない点や、通信信頼性が低い点もあり、なかなか導入に踏み切れないのが現状なのかなぁ、と。
ROSを導入するとしても、結局自前で信頼性を上げる様に時間と人をかけて独自カスタマイズしたり、じっくり検証せざるを得なくなり、開発費がかさみ事業性が悪くなってしまう(=普及を阻害する要因になる)んですよね…
せっかくのオープンソースなのに勿体ない…

という訳で、ロボットの社会実装を目指す上でROS2の考え方は個人的には良さそうに感じました。

ROS2の現状

ディストリビューションとしては、2017/12に最初のリリース版Ardent、2018/6に2nd版 Bouncy、2018/12に3rd版 Crystal と更新されている様です。本記事記載時ではCrystalが最新版なのですが、2週間後(2019/5/31)には 4th版 dashingがリリースされる様です。
ちなみに、Dashingは2年サポートなので、今後ROS2を触ってみるなら Dasingの方がよいかも

なので、現時点でのCrystal版の記載内容がどこまで今後役に立つか分かりませんが(笑)、ROS2のイメージを学ぶにはちょうど良いかと。

2019/5/18時点でのROS2の稼働状況ですが
 ・メッセージ、サービス : 一通りばっちり動いている状況
 ・アクション通信 : 動いているがAPIはDasingで変更になる模様(何!?)
 ・Launchファイル : 大変更(xmlpython)の影響でまだ未実装
 ・Rviz : 一部機能のみ
上記以外のROSで愛用されてきたNavigationなどの汎用パッケージもどこまで動くかは不明なので、正直なところ、ROS同等の機能を実現するまではあと2,3年かかりそうな印象ですね。


とはいえ、2,3年したらROS2移行の流れになりそうな印象なので、今のうちから少しずつ情報キャッチしていくのが良いかも。

インストール

環境

私の開発環境に合わせて以下を入れました
 ・開発PC : Intel Core i5-8250U 1.8GHz
 ・開発OS : Ubuntu16.04 LTS
 ・導入ROS2 : ROS2 crystal

手順

Ubuntu18.04だとaptから入る様ですが、残念ながらUbuntu16.04だとcrystalはaptで入らない様なので、
ソースからビルドする形で立ち上げます。以下のサイトを参考にしました。

gbiggs.github.io
qiita.com

①PC設定変更
ROS 1が起動中の環境(source /opt/ros/kinetic/setup.bash等を実行した環境)でROS 2をインストールするとビルドでコケるっぽいので、まずは .bashrc から ROS1関連のファイルをコメントアウトして再起動しておきます。

②パッケージのインストール

$ sudo apt update
$ sudo apt install curl gnupg2 lsb-release
$ curl http://repo.ros2.org/repos.key | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'

③ツールのインストール

udo apt update && sudo apt install -y build-essential cmake git python3-colcon-common-extensions python3-pip python-rosdep python3-vcstool wget
$ sudo -H python3 -m pip install -U argcomplete flake8 flake8-blind-except flake8-builtins flake8-class-newline flake8-comprehensions flake8-deprecated flake8-docstrings flake8-import-order flake8-quotes git+https://github.com/lark-parser/lark.git@0.7b pytest-repeat pytest-rerunfailures pytest pytest-cov pytest-runner setuptools
$ sudo apt install --no-install-recommends -y libasio-dev libtinyxml2-dev

④ROS2コードの取得

$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws
$ wget https://raw.githubusercontent.com/ros2/ros2/release-latest/ros2.repos
$ vcs import src < ros2.repos

⑤依存関係インストール

$ sudo rosdep init
$ rosdep update
$ rosdep install --from-paths src --ignore-src --rosdistro bouncy -y --skip-keys "console_bridge fastcdr fastrtps libopensplice67 libopensplice69 python3-lark-parser rti-connext-dds-5.3.1 urdfdom_headers"

⑥ビルド

colcon build --symlink-install --packages-ignore qt_gui_cpp rqt_gui_cpp

最後のビルドが時間かかって、だいたい1時間くらいかかりました。

⑦.bashrcへ設定追加
ROS1同様にパス設定が必要なので、.bashrcに追加します。

source /opt/ros/crystal/setup.bash

上記をホームディレクトリ内の.bashrcに追加すればOK

ROS2の動かし方

ROS2に関しては、現時点ではまだ参考書・書籍がありません。なので、勉強する場合は以下のサイトを活用すればよさそうです。
講習会でも、以下のサイトを使って演習を行いました。

gbiggs.github.io

インストール確認

サンプルデモソフトがあるので、そちらを使って動作確認します。

■1つ目のターミナルで以下を入力

ros2 run demo_nodes_cpp talker

すると、以下の様に1秒ごとにメッセージがpublish(送信)されます。

[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [talker]: Publishing: 'Hello World: 2'
[INFO] [talker]: Publishing: 'Hello World: 3'
[INFO] [talker]: Publishing: 'Hello World: 4'

■2つ目のターミナルで以下を入力

ros2 run demo_nodes_cpp listener

すると、以下の様に1秒ごとにメッセージがsubscribe(受信)できればOKです。

[INFO] [listener]: I heard: [Hello World: 1]
[INFO] [listener]: I heard: [Hello World: 2]
[INFO] [listener]: I heard: [Hello World: 3]
[INFO] [listener]: I heard: [Hello World: 4]

ちなみに、ros core(Master)設定は不要です。また同じWifi環境で複数PCで同時に実行すると当然ながら混信するので、混信を避けるには以下のコマンドでID設定を変える必要がある

export ROS_DOMAIN_ID=xxx
ROS2ワークスペースの作り方 & ビルドの仕方

インストール時にビルドして作成したので、実は実行済でした。ポイントとしては、
・ パッケージ単位で管理 (package.xmlがあるフォルダがパッケージとして扱われる)
・パッケージ内に必要なファイル(CMakeLIsts.txt)やディレクトリ構成はROS1とあまり変わらない。
 (記載の仕方は異なっているが)
・ colcon でパッケージビルド
 colcon build
・ビルドし直すたびにアクティベートしなおさないといけない(忘れると更新されないのでハマる)
 source install/local_setup.bash

ROS2 ノードの記載方法

・ノードの実装はヘッダーファイルとソースファイルの2つのファイルにある
・ノードの実装をネームスペースに置く記載の仕方をしている
・独自メッセージ、独自サービスの作成イメージは ROS1と同じイメージ
・ROS2の新機能として、ノードのコンポジションがある。ノードの実行順番を厳密に守ることができる。
executorというオブジェクトの中で実行されるタイマーイベント、データ受信コールバック、サービス等の実行は必ずexecutorが管理できるらしい

ROS2サービスの定義と利用

・サービスのイメージはROS1と変わらない

ROS2アクションの定義と利用

・考え方はROS1と同じ。サービスと違って、アクションは必ず非同期に実行
・記載の仕方は非常に複雑だが、DasingでAPIが変更になるので、ここでは雰囲気を掴んでおく程度でよさそう

ROS2コマンド

msg/srv/node/pkg/run が使えるので基本はROS1と同じ(作法が違うのみ)

launchファイル

ROS 2のシステム起動するツールはROS 1のroslaunchとかなり違うことになるらしい。ROS 2のlaunchフィあるはXMLではなくてPythonで記述される予定だが、まだ未実装なのでここは保留

ROS 1とROS 2のメッセージ通信

ROS 1とROS 2の環境を有効にして、ros1_bridgeパッケージ内のdynamic_bridgeノードを起動する。dynamic_bridgeは定期的にROS 1側とROS 2側に利用中のトピックを探す。 トピックがあったら、そのトピックで流れているデータを反対側で送信するらしい。
どの程度使えるのかはまだ未知数ですが、ROS1での開発資産が活用できる観点では期待したいところですね。

最後に

数カ月前までは 「ROS2とROS1は非互換で全く別ものだ」という噂を聞いていてドキドキしてましたが、いざ勉強してみるとROS1の思想がそのまま継承されているので、ROS1経験者は素直に移行できそうな雰囲気を感じました。
まだ開発途上のROS2ですが、日常世界にロボットを展開していく上では必要なアップデートだと思うので、引き続き情報キャッチしていきたいと思います。

ひとまず、Dasingがリリースされたら再度遊んでみたいと思います

Maker Faire Kyoto 2019 に出展 & プレゼンします

出展情報


5/4(土)~5(日)に京都・けいはんなで開催される
メーカーイベント Maker Faire Kyoto 2019に
個人として出展
します。

日時 :

2019年5月4日(土)12:00~18:00、 5月5日(日)10:00~17:00

場所

京都・けいはんなオープンイノベーションセンター(KICK)
kick.kyoto


決してアクセスの良い場所ではありませんが、都市主要部はGWの時期はどこ行っても混雑が予想されるので、案外ここは穴場かもしれません。
約200もの個人・団体モノづくりをしてる人が出展していて、面白い多種多様な工作品・ガジェットも多数あり、子供のためのモノづくりワークショップもあります。モノづくりに関係く、素直にガチャガチャ楽しい場所やと思うので、予定の空いてる方は是非お越しくださいー!
なお、私は、『家族のためのモノづくり』というテーマで、
昨年から取り組み始めた 息子や家族のために作った自作リハビリ機器・改造おもちゃを多数展示予定です。
アシスティブテクノロジー&キッズ向けのカテゴリーで展示します。
以下が公式サイトでの私のブース説明になります。
ブースは【E-12-04】になります

makezine.jp

そして、今回のMaker Faire Kyoto 2019内のプレゼンステージにて、まさかの『個人プレゼン』の機会を頂きました
【5/5(金) 16:30~16:50】

makezine.jp

個人活動としては、小規模セミナーや限定コミュ内で何度かショートピッチをさせて頂きましたが、展示会という巨大オープンスペースでの20分プレゼンは初チャレンジ!
(エントリー時の勢いでプレゼン公募にも応募したら、見事に採用されてしまいました)
我ながら大それたチャレンジなのではないか、と、今さらながらビビりはじめてます(笑)
普段、息子や家族を巻き込んだモノづくりの奮闘体験を、成功談・失敗談交えて、おもしろ楽しくプレゼン出来たら、と思ってますー(^-^)

展示作品紹介

(1) 歩行リハビリを楽しくするための「歩くと音の鳴る&光る&振動する靴」

動作デモを含めて現物展示予定です。ただし、無線接続は会場では厳しそうなので、有線接続できる様に改造済です。
ogimotokin.hatenablog.com



(2) ワンボタンでじゃんけんが出来るじゃんけん義手

動作デモを含めて現物展示予定です。また、本機器の開発背景などについてはプレゼンでも触れる予定です!


(3) 電動車椅子の操作練習のための自作ジョイスティック+二輪走行ロボット

動作デモはもちろん、操作コントローラ3種類×操作ロボット3種類持っていきます!
操作体験もできますよ!
ogimotokin.hatenablog.com
ogimotokin.hatenablog.com
ogimotokin.hatenablog.com


(4) ボタンを押すと暴走するワンワン

動作デモを含めて現物展示予定です。また、本機器の開発背景などについてはプレゼンでも触れる予定です!



(5)おかん分身ロボット+遠隔説明員

不幸な事に、足をケガして外出困難な妻(おかん)が、自宅から分身ロボットを使って遠隔説明員を行うという取り組みにチャレンジします。
せっかくの機会なので、ロボットに接客される斬新な体験をブースで出来るかも!?(ただし、おかんのやる気次第ですが…)




意気込み

障害を持った当事者や家族をサポートするアシスティブテクノロジー
大事なのは
『当事者に近い位置にいる事』
であると、この1年で強く感じました。そして、一品モノづくりができるメーカーズ活動と、個々の症例に対してカスタマイズが必要な障害支援テクノロジーは本当に相性が良いと思ってますー

・個人の超具体的な課題に対して解決案を考えれる
 (謎解き好きなエンジニアには格好のテーマがたくさん)
・実際に自分が手を動かして仕上げていける
 (モノづくりの楽しさ)
・自分が作ってくれたモノで喜んでくれる、その姿が目の前で見れる
 (エンジニアのやりがい)

エンジニアと当事者が繋がってテクノロジーを作っていく活動・世界をこの1年でたくさん見てきました!
そんな世界がこれからどんどん広がっていく事を願いつつ、自分もその一つのきっかけが出来れば、と考えてます。
そんな、一番身近な人の困り事を解決するモノづくり活動の一例として、何かを一つでも伝えれれば、と思いますー

上記の展示物を見て頂ければ分かる通り、決してすごく難しい技術は使っていません。
なので、Maker Faireというモノづくりのプロが集まる祭典で、難しい技術を求める人にとって弊ブースは少し物足りないかもしれません。
あくまで、幣ブースの特徴は、

「必要とする人のニーズ目線で
 日常的に使える事を目指した
  個人モノづくり活動」

だと思っているので、その視点で暖かい目で見て貰えれば、と思います~


業務で展示会参加する機会はたくさんあったけど、個人として出展する機会は初めて。
色々と不慣れなとこもあるとは思いますが、日常使用を目指した暖かみある自作アシスティブテクノロジー
是非とも触って感想等頂けると嬉しいです!!

M5Stack+Blynkを使って、お父さん帰宅連絡「今から帰る~」を簡易化してみた

f:id:motokiinfinity8:20190413222345j:plain

はじめに

先日作成した『おとんスケジューラ』をキッチン横に導入して、少しずつお父さんのスケジュールが家族と共有できる様になってきました。そこで、その続きとして、お父さんが退社後の帰宅連絡「今から帰るよ~」を簡易化する手段を検討し始めました。

普段の平日、仕事を終えて会社を出る際にLINE等で妻に「今から帰るよ~」を送っていたのですが、メッセージを送付する事を忘れる事が多いんですよね。また、ちょうど妻が子供にご飯を介助している時などはスマホを手放してる事も多く、タイムリーに伝わらない事が多発してました。LINEメッセージを日々送れば済む話なのですが、LINEを開いてメッセージを送るって操作も意外と忘れがち。
特に私の場合、仕事後は結構考え事をしたり明日のアクションを整理しながら帰るので、ついつい連絡メッセージを送る事を忘れてしまうのです。

たかが一言の連絡! されど一言の連絡!

こういう日々のすれ違いが積み重なると色々とトラブルになりかねないので、ここを少し対策してみよう!
  
という事で、忘れんぼうな自分をサポートするため、
「『今から帰る』連絡を簡単にするツール」を作ってみました。



完成品
完成したモノはこちら
f:id:motokiinfinity8:20190413222345j:plain


  
スマホアプリの1ボタンを押すと自宅リビングに設置した液晶ロボットに音声お知らせスマホGPSを連動させて最寄駅に着いたら自動で通知もできる!
・言い出しにくい「今日ごはんいらない」も1ボタンで通知可(笑)

通知先の液晶付ロボットは以前にM5Stackを使って開発した
『お湯張り押しボタンロボット+おとんスケジューラ表示』
を機能拡張する事にしました。

ogimotokin.hatenablog.com
ogimotokin.hatenablog.com


新しく製作する場合でも、M5Stackを購入するだけで作成できるので、とても便利です。

システム全体図

自宅外から自宅のM5Stackへ情報通知するにはいくつか手段があります。
前回の『おとんスケジューラ』では、AWS Lambdaを経由して情報通知しました。最初は前回同様のシステム案を考えていましたが、Web上で調査してみたところ、もっと簡単にスマホ~M5Stack間を連結できるアプリとして『Blink』を見つけたので、今回はこれを使ってみようと思います!

f:id:motokiinfinity8:20190420003404j:plain

結果として、Blynkを使って正解でした!
わずか2時間程度の試行錯誤で、あっさりとスマホからボタン通知が出来たので、本当に驚きました!すごいよ、これ!!

何がすごいかというと……
 ・M5Stack側ソースはほとんどサンプルコードを埋め込んだのみ (Blynkサーバーとの認証のみ)
 ・スマホ側は、Blynkアプリを使ってドラッグ&ドロップ作業程度で通知ボタンを作成できる

という簡単操作で、宅外からのスマホによる遠隔操作を実現できるので、これは本当にすごい!!


スマホ制御は難しそうに見えますが、これは世の中に簡単にマイコンスマホ連結できるツールがあります。(Blynk というアプリを使いましたが、すごく便利!)
  

Blynk導入

Blynkの使用にあたって、基本的に下記サイトに従って試してみました。
www.mgo-tec.com

ざっくりした手順としては
 ①スマホにBlynk アプリをインストール
 ②Blynkアプリにてアカウントの登録
 ③Blynkアプリにてプロジェクト作成
 ④Blynkから自分のメールアドレスに送ってきたメールを
  元にAuthコード入手 & Arduino用ライブラリ入手
 ⑤BlynkライブラリをAruduino開発環境に入れる
 ⑥M5Stack用Arduinoコードを作成する。その際に④で入手したAuthコードを記載する

という流れ。
そして、⑥後にサンプルコードをコンパイル、と思いきや、、、エラー発生しました。。。

C:\***\Arduino\libraries\M5Stack\src/utility/M5Timer.h:34:35: note: previous declaration as 'typedef class std::function<void()> timer_callback'
 typedef std::function<void(void)> timer_callback;

むむむ、とgoogle先生に聞いたところ、どうやらtimer_callbackがかぶっている模様。

M5Stack and Blynk | M5Stack Community

上記サイトを参考にArduino/libraries/M5Stack/src/utility/M5Timer.h 関数を修正してみました

//typedef std::function<void(void)> timer_callback;
typedef void (*timer_callback)(void);
typedef void (*timer_callback_p)(void *);

これで無事に使用できる様になりました。良かった~

M5Stack側コード

以下がBlynkサーバーから通知情報を受信するコード。
簡易化のため、我が家ロボット固有のサーボ動作ソフトや、お父さんのスケジュール通知ソフト(from AWS Lambda)は省略しています。
ちなみに、AWS Lambdaからの通知処理も並列して実行可能です。素晴らしい。

コードのイメージとしては、
 ・仮想ピンV0 : スマホの「今から帰るボタン」を押された通知
 ・仮想ピンV1: スマホGPSが自宅に近づいた事を検知する通知
 ・仮想ピンV2: スマホの「今日ごはんいらないボタン」を押された通知
になります。

#include <M5Stack.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <Avatar.h>
#include "time.h"
#include <BlynkSimpleEsp32.h>

#define BLYNK_PRINT Serial
const char* auth   = "xxxxxxxxxxxxxxxxxxxx"; //Blynkから送られてきたメール内にある Auth コード
const char* ssid     = "xxxxxxxxxxxxx";
const char* password = "xxxxxxxxxxxxxxx";

//M5 Avatar
using namespace m5avatar;
Avatar avatar;

// Audio speaker
#include "AudioFileSourceSD.h"
#include "AudioFileSourceID3.h"
#include "AudioOutputI2S.h"
#include "AudioGeneratorWAV.h"
AudioGeneratorWAV *wav;
AudioFileSourceSD *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;

void setup(){
  M5.begin();
  Serial.begin(115200);
  delay(10);

  // Blink起動
  Blynk.begin(auth, ssid, password );

  // アバター設定
  delay(500);
  M5.update();
  M5.Lcd.clear();
  avatar.init();
}

void loop(){
    // Blynk更新
    Blynk.run();

    M5.update();
}

// BLYNKサーバーから帰宅通知(v0)を受けた場合
BLYNK_WRITE(V0){
  int val = param[0].asInt();
  if(val == 1){
    display_information("return_home"); 
  delay(3000);
  view_change = 1;
  }
}

// BLYNKサーバーからGPSトリガ通知(v1)を受けた場合
BLYNK_WRITE(V1){
  int val = param[0].asInt();
  if(val == 1){
    display_information("return_home");
  delay(3000);
  view_change = 1;
  }
}

// BLYNKサーバーからごはん不要通知(v2)を受けた場合
BLYNK_WRITE(V2){
  int val = param[0].asInt();

  if(val == 1){
    display_information("cancel_dinner");

  delay(3000);
  view_change = 1;
  }
}

void display_information(String str){
  M5.Lcd.drawJpgFile(SD, "/avatar2.jpg");
  Serial.println("お父さん予定音");
  //お父さん情報音再生①(ピンポンパン)
  file = new AudioFileSourceSD("/pinpon.wav");
  wav = new AudioGeneratorWAV(); 
  wav->begin(file, out);
  while(wav->isRunning()){
         if (!wav->loop()) wav->stop();
  }

  //お父さん帰宅音再生
  M5.Lcd.drawJpgFile(SD, String("/" + str + ".jpg").c_str());
  file = new AudioFileSourceSD(String("/" + str + ".wav").c_str()); 
  wav = new AudioGeneratorWAV(); 
  wav->begin(file, out);
  while(wav->isRunning()){
         if (!wav->loop()) wav->stop();
  }
}


かわいいイラストは前回の『おとんスケジューラ』と同様に、
表示画像についてはパワポで作成してJPEG形式で保存&縮小して使用しています。

f:id:motokiinfinity8:20190420002146j:plainf:id:motokiinfinity8:20190420002150j:plain

Blynk側アプリ設定

Blynk側は大きく3つのウィジェットを使いました。
ちなみに、Blynkのウィジェットは2000Point分は無料で使えます。そこから使ったウィジェット分だけ差し引かれてしまい、2000Point以上使いたい場合のみ課金するという仕組みです。一度使ったウィジェットも使わなくなった場合は再度ポイントに還元できるので、お試し導入もしやすく敷居低く始める事ができるのもメリットですね。

①今から帰るボタン
 これは「Styled Button」ウィジェットを使いました。仮想ピンをV0に設定して、「0: まだ帰れない」と「1: もうすぐ帰る」をボタン押すたびに交互にスイッチする仕様としました。

f:id:motokiinfinity8:20190420004521j:plain
f:id:motokiinfinity8:20190420004528j:plain



GPS通知ボタン
 これはGPS Trigger」ウィジェットを使いました。仮想ピンをV1に設定して、「自宅近辺の設定エリア内にスマホGPSが入った場合」に1を通知するスイッチです。(写真上は、大阪の中心場所を自宅と仮定して設定しています)

f:id:motokiinfinity8:20190420004546j:plain
f:id:motokiinfinity8:20190420004550j:plain




③ごはんいらないボタン
 これは①同様に「Style Button」ウィジェットをつかっています。仮想ピンはV2に設定する事で、①とは異なるアクション(音声呼び出し)を実現しています。

最後に

今回は、M5Stack に Blynkアプリを使う事で、自宅内のM5Stackデバイスを自宅外から遠隔操作する手段を実現しました。
同様の手段は、Obnizというデバイスでも実現できますが、液晶&スピーカを活かした遠隔制御をすぐに作れるという観点で『M5Stack+Blynkアプリ』はとても良い組み合わせだと思います。

このBlynkアプリの仕組みを応用すれば、自宅外のM5Stack等のマイコンバイスと、自宅内のM5Stackデバイスを遠隔同期や遠隔制御する事も可能そうです。(既に簡易実験済)
マイコン同士の宅外連携が出来れば応用の幅が一気に広がるので、どんなアプリケーションの応用ができるのか、実際に作りながら試していきたいと思います。既に応用事例に取り組んでいますので、また次回に記載したいと思います。