スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

キネクト無双 #1

遅くなりましたが、MakerFaireTokyo2014で出展した"キネクト無双"の動画と解説をUPします!

★ 概要

犬型ロボットがアフロ人形を次々となぎ倒すというモノです。
KinectとOpenCVを使ってアフロを画像認識し、アフロ人形が倒れたことを検知して叫び声を上げさせる仕様。全部倒すと"You win"という声と勝利のBGMが流れます。

★ 詳細
KinectMuso.jpg
左上にKinectがあり、斜め下を見下ろしています。下のノートPCで処理を行い、出力画像をモニターに映し出しています。アフロを検出して赤い丸をモニター上に表示しています。ちなみに人形を動かすとリアルタイムに追従します。右にある黄色い物体が犬型ロボットです。中央にあるAndroidタブレットを用いてBluetoothで遠隔操作します。人形が倒れているのかいないのかは、アフロの高さを検出して自動判定しています。
画像処理はPCソフトウエア、遠隔操作はAndroidアプリ、ロボットはハード改造とファームウエアから構成されていますので、1つずつ解説します。

★ PCソフトウエア
KinectMuso2.jpg
Visual Studio C++を使って書きました。まず、アフロを検出するためにOpenCVを利用します。HSV変換を行い赤色のみを抽出、Hough変換を行い丸い形のモノのみを抽出。複数の赤丸を1つ1つのアフロと認識させるためにラべリング処理を行います。このままでは3次元座標位置が分からないのでKinectの登場です。Kinectは赤外線を利用したDepthセンサーを有しているため、物体までの距離を検出することが可能です。この距離とカメラ2次元座標の位置から、実空間の3次元座標が計算できる訳です。ただしKinectは傾いているため、Knectの加速度センサーから得られる角度などを使って、先ほど得られた座標に回転行列を掛け合わせます。このようにすることで、アフロの床からの高さが分かり、人形が倒れているか倒れていないかを自動判定できる仕組みです。
Bluetooth通信に関しては.NETを使っていないためちょっとややこしく、Win32APIを使ってシリアルの受信を行いました。マルチスレッド化して非同期で動かしています。

★ Androidアプリ
device-2014-12-29-192532.png
Eclipseを使いJAVAで作成しています。BluetoothChatというGoogleのサンプルアプリを改造しました。UUIDを変更し、XMLにボタンや画像、テキストを追加して画面レイアウトを構成しています。

★ ロボットのハードウエア
131102_ChaserRobot.jpg
ロボットはタミヤのロボクラフト"メカドッグ"を改造して作っています。
ユニバーサル基板上にマイコン、Bluetooth通信用USBドングル、Bluetooth-UART変換モジュール、モータードライバ、サーボモーター、フォトリフレクタ、レギュレーターIC、昇圧DC-DCモジュール、電池を搭載したモノを追加しました。素のメカドックは本体に付いているスイッチで前に進むか後ろに進むかしかできません。Bluetoothとモータードライバを使って、遠隔操作で前進と後退とストップ、ブレーキを出来るようにしました。またサーボモーターを駆使することにより、メカドッグの片足を浮かせ、回転させる動作を加えています。また前と後ろにフォトリフレクタを付け、黒い線を検出できるようにしています。中央にLEDがありますが、これは使用していません。前回はこの赤外線LEDを発光させ、Kinectで生の赤外線映像を取得していましたが、今回はKinect本来のDepthセンサーを活用しています。なお、アフロ人形は赤丸の発泡スチロールを頭にかぶっているだけで、電気的な仕掛けはありません。

★ ロボットのファームウェア
マイコンはArduino UNO上で書き込みを行い、引っこ抜いたモノを使っていますので、ソフトはArduino IDEを使って書いています。Bluetoothで受信したコマンド通りにモーターを動かしています。コマンドは前進、後退、停止、ブレーキ、回転移動、サーボ回転です。また、フェールセーフのため、前後のフォトセンサーで片側で黒を検出したら逆方向に進む、両方検知したら停止させるという自動制御も組み込んでいます。

★ 感想
当初はロボットが自動で人形を倒す予定でしたが、間に合わな・・・いや、MakerFaireに来場されている人たちに直接動かして体験してもらおうという趣旨で、Androidタブレット操作に仕様変更しました。おかげで子供たちにも人気で、たくさん遊んでくれました。また倒れると悲鳴を出すという分かり易さから、子供にも外国の方にも言葉で説明することなく理解してもらえ、笑顔をたくさんいただきました。

more...

キネクト無双 #0

Maker Faire Tokyo 2014 申し込みました。

140824_MakerFaireImage_small.jpg

ロボットがアフロな奴らを次々となぎ倒します!
Kinectを使ってアフロとロボットを画像認識し、ロボットの動作を制御。
昨年から爽快感アップ間違いなし!(予定)

がんばります!

家庭用インクジェットプリンタで基板が作れちゃう AgIC

先日、実物を見る機会があったため、まとめを書きます

概要
家庭用のインクジェットプリンタで基板が作れるProduct
プリンタを使用せず手書きもできるペンタイプもあり

銀ナノインクを使っているのがポイント

作成方法
インクジェットプリンタにAgICのインクを装着し、用紙は光沢写真用紙か透明プラスチックシートを使う
基板パターン図を何かしらのソフト(EagleでもイラレでもペイントでもOK)で描いて印刷する
部品を付けたいところに導電性の接着剤か導電性テープを付ける
部品を載せて完了

活動内容
東大発のベンチャー企業でクラウドファウンディングkickstarterにて目標資金3万ドルに対し、約8万ドルを調達
WEB販売も始めており、2014/6月~8月に発送予定

競合品
(1)導電インクペン
http://www.switch-science.com/catalog/1529/
一言でいうと絵の具。
ぐにゃっとしていて、厚みがあり、乾くまで時間がかかる

(2)テクノペン
http://akizukidenshi.com/catalog/g/gT-06356/
一言でいうと修正液
厚みはないが、乾くまで時間がかかる

(3)Circuit Scribe
http://jp.techcrunch.com/2013/11/22/20131121circuit-scribe/
一言でいうとボールペン。すぐ乾く
ペンだけで言うとほぼAgICと同じ
AgICはプリンタのインクとしても提供しているところに優位性がある

(4)3DプリンタEx1
http://jp.techcrunch.com/2013/11/12/20131111ex1/
基板パターン作成専用の3Dプリンタ。
木材、ガラス、プラスチック等、紙以外の素材にも印刷可能。
AgICは専用プリンタではなく、家庭用の汎用的なプリンタで作成できるところに優位性がある

部品もプリントアウトできないの?
一部は可能。
ただし、部品そのものをプリントアウトするのではなく、パターンの形を工夫することにより部品と同じ特性にします
140417_InstantInkjetCircuits2.png
YouTube"https://www.youtube.com/watch?v=V0AHc3CA9NU#t=162" 2:42より引用

・抵抗(画像左上)
抵抗値は、抵抗率をρ、パターン長をL、 厚さt、パターン幅w とすると以下のような式で書けます
R = ρ × L / (w × t)
ここで、抵抗率と厚さは一定値Aとすると
R = A ×L / w
つまり、抵抗値は、パターン長が長いほど大きく、パターン幅が長いほど小さいため、その値を調整することにより抵抗に置き換えることが可能です。

・コンデンサ(画像下)
一例としてinterdigital Capacitorと呼ばれる配線を描けばコンデンサになります。
ただし、高周波向けで容量は非常に小さいため、一般的な電子工作では不向きだと思われます

・コイル(画像右上)
一例としてmeander line Inductorと呼ばれる配線を描けばコイルになります。
ただし、同様に高周波向けです

・アンテナ
通常のプリント基板と同じようにパターンアンテナを描けば、アンテナになります。

・スイッチ
紙を折り曲げることにより、スイッチの代替えとして使うことができます。これはペラペラの紙ならではでユニーク!

感想
現段階で使えそうなのは、LEDを使った簡易アート、子供の教育用や、ガーバーデータを基板屋へ出す前の確認などですが、工夫すれば従来無かった面白いモノができる可能性を秘めています。


以上、AgICのまとめでした

ポインタ変数の参照渡し

ポインタはややこしい
"func(int *&p)" って何だよ?

分かったのでメモします。

★基本
まず、関数の引数の渡し方には2種類ある。ここ重要。
・値渡し・・・変数の中身をコピーして渡す
・参照渡し・・・変数そのものを渡す


★C言語
C言語の関数では値渡ししか出来ない。
ただし、変数のアドレスやポインタ変数を引数にしてポインタ変数で受け取れば、参照渡しと同じ効果が得られる
main側:func(&x);
関数側:func(int *p){...}
もしくは
main側:func(*p);
関数側:func(int *p){...}


★C++
C++も値渡しについては同様であるが、参照渡しも可能
"変数"を引数にして、"&変数"で受け取れば、参照渡しになる
main側:func(x);
関数側:func(int &x){...}

故に、C++では以下のようなことが可能となり混乱する
ポインタ変数の参照渡し
main側ではfunc(*p);
関数側ではfunc(int *&p){...}


以上

組み込みボーカロイド eVY1(NSX-1) #1

YAMAHAのeVOCALOID音源LSI"NSX-1"搭載のArduino用シールド"eVY1"を早速試しました!



"かえるの歌"の1フレーズの歌詞をずっと繰り返すだけですが、
タクトスイッチを1つだけ付けて、押下に応じて音階をランダムに鳴らしています。
途中から、鳴っているドラム音は別の機器から鳴らしています。
多分、eVY1からも鳴らすことは可能だと思います。

音はなかなか良い感じ。"さしすせそ"など一部発音に違和感のあるところもありますが、それも1つの味です。
あと、ちょっと遅延があるかな~って感じです。
でも使い方次第で、色々楽しめそうです!

02 | 2015/03 | 04
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
プロフィール

エレクトリックバカ

Author:エレクトリックバカ

ポケコンでプログラミングに目覚め、PICマイコンで電子工作に希望を抱き、来たるべきUGDの時代を夢見て眠る。
そんな うだつが上がらないサラリーメン。
先生、電子工作はおやつに入りますか?




Electric Baka

最新記事
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。