Codamaでお地蔵さん
ユカイ工学でインターンをさせて頂きました!
「Codama」という音声コミュニケーションキットを使ってお地蔵さんのような形をした司会者支援ツールを作ることにした私は、3日目かけてハードとソフトの両方に取り組みました。
まずハードの面では2時間ほどで大まかに設計した後、業務用3Dプリンターで出力させてもらいました。造形時間の関係で修正がいくつかありましたが、出来上がりはすごく綺麗でした。
ソフトの面では、Google Assistantをベースにするため公式サイトの手順に沿って準備しました。私はGoogle Assistant Serviceの方を選びましたが、手順通りとはいえすごく時間がかかりました。
https://developers.google.com/assistant/sdk/guides/service/python/
pushtotalk まで使えるようになったら、pushtotalk.pyの460行目付近を編集して、ウェイクアップワードで起動するようにします。(pushtotalk.pyの階層はgooglesamples-assistant-pushtotalkをctl+cで停止したときのエラー文に表示される)
while True: if GPIO.input(27) == GPIO.HIGH: #if wait_for_user_trigger: # click.pause(info='Press Enter to send a new request...') continue_conversation = assistant.assist() # wait for user trigger if there is no follow-up turn in # the conversation. wait_for_user_trigger = not continue_conversation
次にpushtotalk.py とひたすら睨めっこして、Assistant が認識した音声によって分岐を作ることに取り組みました。
AIY キットを使ったものは試したことがありましたが、1から image を書き換えるわけにもいかないので苦労しました。
どうやらrespというjsonファイルに認識結果を格納しているようですが、150行目付近の%sがそのまま使えそうなので、今回はよく理解しないままここを使いました。
if resp.speech_results: logging.info('Transcript of user request: "%s".', ' '.join(r.transcript for r in resp.speech_results)) word = (' '.join(r.transcript for r in resp.speech_results)) if word == u"今日は": ~
LEDやサーボの機能もcodama ボードで実装出来ているので、気が向いたらGoogle Assistantの分岐先で組み合わせて行こうかと思います!
画像処理入門
周南ロボコンの際ねじやナットが大量に混ざり合い何時間もかけて
分別・収納する期間があります。
メカトロ部の1年生も毎年オフシーズンに苦労するそうです。
というわけで近いうちにねじの分別装置作ろうと思います!
今回はその前段階というわけで先輩の記事を参考にマッチング処理をしてみます。
こちらの後半にあるプログラム、基本どんな画像でもマッチングしてくれます。
今回はマッチするかどうかでON or OFFをさせたいのでその部分を紹介致します。
マッチしているかを判断する方法はいくつかあると思いますが、今回でいうと描画する線の数が気になるところです。
それをどこで判断しているかというと# マッチング精度が高いもののみ抽出のところ。
ratioがマッチング判断の範囲を表しているわけですが、goodという配列を用意して
画素の特徴量を1つずつ検証して高いものだけを追加しているようです。
つまり
good内の要素の数=マッチした画素の数(描画する線の数)
となっていることが分かる。
配列の要素の数はlen関数で求まるので以下のようになる。
# マッチング精度が高いもののみ抽出 MIN_MATCH_COUNT = 8 ratio = 0.8 good = [] for m, n in matches: if m.distance < ratio * n.distance: good.append([m]) if len(good) < MIN_MATCH_COUNT: print("OFF") if len(good) > MIN_MATCH_COUNT: print("ON")
すこし論証みたいになってしまいましたが、あとは基準を決めて線が何個以上ならON(今回は8個)以下ならOFFにするか決めて必要な処理を書いてやるだけです。
ついでにラズパイでのOpenCVのセットアップ方法とラズパイカメラを使ったマッチング処理プログラムを載せておくので参考にしてみてください!
*install of opencv の方だけでopencvは基本動作しますが、Akaze自体の導入は比較的最近なので今回の場合は additional の方も必要になります。
# install of opencv $ sudo apt-get update $ sudo apt-get install libopencv-dev python-opencv # additional install for Akaze $ sudo pip3 install opencv-contrib-python $ sudo apt-get install libatlas-base-dev
#!/usr/bin/env python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time import picamera import subprocess import cv2 import numpy as np from datetime import datetime MIN_MATCH_COUNT = 8 camera = picamera.PiCamera() camera.resolution = (640,480) filename = datetime.now().strftime('assets/img/sample/test.jpg') # 画像読み込み先のパス,結果保存用のパスの設定 template_path = "assets/img/template/" template_filename = "maku.jpg" sample_path = "assets/img/sample/" sample_filename = "test.jpg" result_path = "assets/img/result_AKAZE/" result_name = "perfect.jpg" akaze = cv2.AKAZE_create() camera.capture(filename) # 文字画像を読み込んで特徴量計算 expand_template=2 whitespace = 20 template_temp = cv2.imread(template_path + template_filename, 0) height, width = template_temp.shape[:2] template_img=np.ones((height+whitespace*2, width+whitespace*2),np.uint8)*255 template_img[whitespace:whitespace + height, whitespace:whitespace+width] = template_temp template_img = cv2.resize(template_img, None, fx = expand_template, fy = expand_template) kp_temp, des_temp = akaze.detectAndCompute(template_img, None) # 間取り図を読み込んで特徴量計算 expand_sample = 2 sample_img = cv2.imread(sample_path + sample_filename, 0) sample_img = cv2.resize(sample_img, None, fx = expand_sample, fy = expand_sample) kp_samp, des_samp = akaze.detectAndCompute(sample_img, None) # 特徴量マッチング実行 bf = cv2.BFMatcher() matches = bf.knnMatch(des_temp, des_samp, k=2) # マッチング精度が高いもののみ抽出 ratio = 0.8 good = [] for m, n in matches: if m.distance < ratio * n.distance: good.append([m]) if len(good) < MIN_MATCH_COUNT: print("OFF") if len(good) > MIN_MATCH_COUNT: print("ON")
dualshock3でメカナム制御
メカナムホイールは4つのタイヤにそれぞれ45度傾いたタルを付けることで
全方向駆動を可能にするタイヤである。
今回はそれをPS3用コントローラ「dualshock3」で制御する。
先に参考文献を紹介。
Arduino + USBホストシールドの実験。 - robo8080のブログ
通信周りの構成としては Arduino + USBホストシールド + Bluetoothトングル の組み
合わせが無難であるため真似して作った。モータードライバーにはTA7291Pを使用。
プログラム
今後もdualshock3を使って多方面で遊んでいきます!
再起動を自動起動
今回はラズパイのプログラム自動起動にrebootを書いてしまい
永遠に再起動を繰り返すラズパイを何とかして元に戻す方法を紹介します。
自動起動に関しては上のサイトの最初にある「/etc/rc.local」を編集する
という方法をとりました。
ラズパイは再起動を繰り返すのでrc.localを編集することは出来ず、Windows でSDカードを編集しようにもroots ディレクトリが開けませんでした。
結論から言うとLinux導入しましょうという話。
ラズパイに主として利用されるRasbianと同じLinux環境であればbootやrootsのディレクトリが開けるので後は管理者権限で編集してあげるだけです。
LinuxのインストールについてはGoogle検索してください。
(参考)黒猫はLinux mintを使用。空のUSBが1つあれば導入できる。
環境が整ったら問題のSD cardをLinuxが動作しているPCに差し込んでコマンドプロンプトから
cd /media/user/rootfs/etc/
sudo nano rc.local
を実行し、rebootを取り除いて保存しましょう。
さすれば元通りのRasbianが動くようになるでしょう。
めでたしめでたし!
周南ロボコン
11/3~4に高専祭がありました!
自分は初日にありました、周南ロボコンを部署長として
1年間進めてきて、現在無事に終了したことを
しみじみと実感しているところです☕
<周南ロボコンとは>
- 徳山高専で高専祭初日に行われるロボットコンテスト
- 子供から大人まで誰でも参加できる(景品あり)
- 夏休みに競技を最低限クリアできるサンプルロボットを作る工作教室を実施
- 企画・設計・運営までを現役高専生がすべて行います!
http://www.tokuyama.ac.jp/robocon/2018/robocon2018/top.html
詳細はHPに毎年掲載していますのでそちらをご覧くださいm(__)m
今年の競技はあらゆる障害物を2つのロボットで共にクリアしてもらう
「障害物共走」。
フィールドの盲点をついたロボットが順調に競技をクリアしていく中
今年はメカトロシステム部(OB含む)が活躍し、ベスト4に子供チーム
が残らないという結果になりました( ;∀;)。
しかし、あらゆる技術を駆使したロボットたちは会場を大いに盛り上げてくれました!
↓ 競技後に戯れるロボットたち
参加してくれた子供たちがこれを機に
より高い技術に興味を持ってくれると嬉しいですね!
ロボットダンスシステム
台風21号が接近する中、私は大阪でインターンシップに取り組みました。
4日はリモートでの作業↴
コミュニケーションロボットであるSotaを音楽に合わせて躍らせることを目標に1週間の研究に取り組みました。
Sotaとコミュニケーションを取りながら、音楽プレイヤー役のRaspberry Piを操作します。そして音楽のリズムをセンサで取得し、それに合わせてRaspberry Piから送り返す信号を変えて、Sotaの踊りを変化させます。
Sotaをクライアント。Raspberry PiをサーバーとしたTCP/IP通信を用いました。
開発環境は以下の通りです。
「Vstone Magic」・・・Vstoneが提供するビジュアルプログラミングソフト(Java)
「Thonny Python IDE」・・・RaspbianにデフォルトであるPython IDE。
苦戦しながらも形にはなっていく中、問題となったのはリズムを取得する方法です。
当初、Pythonのモジュールとして「librosa」というものがありました。
見たところすごく優秀なモジュールなのですが、結論から言いますと「Raspberry Piでの実装方法」が期間内に分からず断念しました(泣)。ぜひ誰か分かる方いたら教えてくださると幸せます。
とはいえ、モノは期間内に完成させたい…ということで以下の方法をひらめきました。
今回はデモ用にこれだけにしましたが、②の計測を常に行えば曲のテンポの変化に対応できたり、③の分割も細かくすることで、バリエーションを増やすことができます。
何より、この仕組みはシンプルながら利用シーンにピッタリだということで、良い評価を得られました (*'ω'*)。
最後に今回のプログラム等を掲載しておきます。今後どんなハードウェアにも対応できるようなシステムに改良していこうと考えているので、良いアイデアがあれば、ご教授願います。
Raspberry Pi & Pasori で出欠確認
学寮のMTG時、私たちは人員確認を担当の人が目で見て、
紙の表に書くことで行っています。
しかし、時間がかかる上にアナログ感がすごい!
高専生たるもの学生証を「ピッ」とするだけで済ませようではないか!
ということで
Raspberry Pi と Pasori(RC-S320)を用いて作りましょう。
プログラムはGithubで!!(初めて使う)
16桁のIDを読み取り、名前との対応をtest.csvに登録。
使うときは、カードをタッチした状態でcheck.pyを起動させ
登録済みのIDであればtest.csvを参照して、カードの持ち主が出席したことを
check.csvに記録する。
ここでは3人のカードを登録しており、内2人が出席していることがわかる。
導入することを考えると、"だれが来ているか"より"だれが来ていないか"の方が
知りたいので、そのように改善していきたい。
参考文献