雑食エンジニアの気まぐれレシピ

日ごろ身に着けた技術や見知った知識などの備忘録的なまとめ.主にRaspberry Piやマイコンを使った電子工作について綴っていく予定.機械学習についても書けるといいな.

GoogleCardboardとRaspberryPiを使って視界を共有できるロボットを作る

私の子供のころからの夢の一つに,ロボットに乗って操縦したいというものがありました.人が乗れるロボットを作るのはあまりに大変ですが,視覚が共有できるロボットなら作れそうな気がしたのでやってみました.

 

カギになるのはGoogleCardbordというGoogle謹製のお手軽VR体験装置.

Google Cardboard – Google VR

段ボールだけでそこそこVRを体験できる非常に素晴らしい装置なのですが,今回はこれとRaspberryPiおよびカメラジンバルを組み合わせて,頭の動きとカメラの向きが同期する視覚共有装置の製作を試みました.そのカメラを台車に乗せてPS3コントローラで遠隔操作できるようにすることで疑似的にロボットを操縦している感覚を味わおうという魂胆です.

まだ一次完成版ですが一応形になったので整理を兼ねてまとめたいと思います.そこそこ長くなりそうなので分割で.

f:id:shikky_lab:20160722104559p:plain

外観はこんな感じ.右にあるのがGoogleCardbordのケースです.

動画

視覚共有ロボットの動作確認 - YouTube

 

今回は装置概要をまとめます.接続関係はこんな感じ.

f:id:shikky_lab:20160721062105p:plain

以下詳細

・RaspberryPi3+カメラモジュール

今回の主役その1.周辺機器については過去記事参照のこと(RaspberryPi3の下準備 - 徒然創作記)

カメラ画像の取得と同時にAndroidとはWi-Fi(UDP)通信,コントローラとはBluetooth通信,マイコンとはUART通信と大忙し.マイコンとの通信にはUSB接続のシリアル変換モジュールを使用しました.

・サーボジンバル

フリスクでraspberry piカメラのケースを作る - 徒然創作記 でカメラ雲台といっていたやつです.

・サーボ駆動用マイコン(AVR ATmega88P)

RaspberryPiから直接サーボモータを動かすこともできますが,念のためモータ駆動用には別のマイコンを置きました.

Android端末(Xperia Z3C)

今回の主役その2.ちゃんとGoogleがCardboad用のAPIを用意してくれているのでそれをベースに実装します.ちなみにGoogleiPhone用のAPIもちゃんと出してくれてます.

今回はテザリングを使うことでAndroidとRspberryPiを疑似的に直接接続しました.

・Cardboard対応ケース

ebayで買ったプラ製のケースを使用.ヘッドバンド付きで900円という素晴らしさでした.

・台車

テキトーな板にタミヤさんのギヤボックスをテキトーに取り付けて,テキトーなモータドライバで動かします.モータドライバについては過去に設計したものを流用しましたが,今回の負荷ならモータドライバICで十分そう.

PS3コントローラ

主に台車操作用に使用.

 

概ねこのような構成で作成しました.ここまで書いて思いましたが,ただの台車をロボットというのはかなり無理がありますね.でもまあこれだけで結構楽しめます.

何部構成になるかわかりませんが,次回はRaspberryPiのUDP通信部分について書きたいと思います.

 

 

 

 

 

getter関数のvolatile宣言

AVRの割り込みでクラス内変数を書き替える場合,その変数にgetterでアクセスして値の変更を待つ次のような文がうまく動かなかった.

while(!hoge.getval());

変数自体にvolatile宣言しても変わりがない.どうやら関数自体にvolatile宣言が必要らしい.

int class::getval(void) volatile
{
}

のように宣言すると一応動いた.しかし想定通りの動きとは少し異なってしまい,結局

volatile int temp;
do{
    temp=hoge.getval();
}while(!temp);

と書いたらうまくいった.とはいえただのポーリングに4行も書くのは何かばからしい.何とかならないものか.

RaspberryPi3にopencv3.1を導入してRaspiカメラモジュールを使う

RaspberryPi3で画像処理をするにあたり,とりあえずopencvを導入することに.

せっかくなので最新版のopencv3.1を自前でbuildして入れる.(opencv2.xで構わないという人はapt-getで入れられるのでそっちで入れた方がずっと楽)

 

opencvをbuildするための参考ページはいろいろ探してみたけど

Install guide: Raspberry Pi 3 + Raspbian Jessie + OpenCV 3 - PyImageSearch

ここが環境が完全に一致しているうえ,説明も丁寧で非常に分かりやすかった.結構長い手順だけど途中でpythonとvirtualenvの話をかなりがっつりやっているため,すでに入れている人やPythonを使う気がない人は無視してしまっていいかも.

opencvのmakeは結構重い作業で,二回ほど途中で止まっていた(再開したら何事もなく進むという謎).結局4コアすべて使って合計80分程度かかった.

 

opencvの準備はこれで完了だが,Raspiのカメラモジュールをopencvで使うためにはRaspicam_cvを導入する必要がある.

GitHub - cedricve/raspicam: AVA RaspiCam: C++ API for using Raspberry camera with/without OpenCv

READMEが結構詳しいため導入は割と順調に進んだ.動作確認のためにREADME下部にあるOpenCV Interfaceのサンプルコードをコンパイルしてみる.NetBeansの場合はプロジェクトプロパティのリンカ―タブの追加のオプションの項に

-lraspicam -lraspicam_cv -lopencv_core -lopencv_highgui

を書いてライブラリの指定を行ってからビルド.

f:id:shikky_lab:20160609230159p:plain

(追加のオプションの指定)

 

ところがDSO missingが出て怒られた.どうもimwriteで怒られているらしい.

原因はimwriteの含まれるライブラリで,opencv3からはhighguiではなくopencv_imcodecsが必要らしい.

というわけで先ほどのオプションに-lopencv_imgcodecsを追加してビルドしてみると無事に通った.

RaspberryPiの開発環境の構築

RaspberryPi3の開発を始めるにあたり,ひとまず以前A+の開発に使っていたときの環境をベースに環境構築.

 

基本的に母艦のWindowsベースで開発するので基本操作はVNCSSH経由.

 

SSH

SSHに関してはraspi-configからSSHをenableにするだけで準備は完了するので楽ちん.

windowsからはTeraTermでアクセスしている.

 

VNC

こじ研(Raspberry Pi)

の記事を参考に導入していく.VNCサーバは自動起動させておきたいので

Raspberry Piで遊ぼう [No.5:VNC接続をしよう]:アシマネくんのほんわか日記:So-netブログ

に従って設定.

Windows側はRealVNCを使ってアクセスしている.

あと,VNC接続中にクリップボードの内容を同期できるautocutselは非常に便利なので一緒に導入

raspbian - TightVNC copy/paste between local OS and Raspberry Pi? - Raspberry Pi Stack Exchange

 

ホスト名参照

ラズパイと接続するときにいちいちIPアドレスを調べてられないのでホスト名による参照を導入.

Raspberry Piにホスト名の設定をしたメモ – 1ft-seabass.jp.MEMO

Windows側の準備としてはBonjourを導入する必要があったのだが,Windows10からはデフォルトでホスト名参照できるらしい.なおどちらにせよファイアウォールの登録が必要.受信と送信のどちらにも必要っぽい.

登録の手順

コントロールパネル→システムとセキリュティ→Windowsファイアウォールから詳細設定をクリック.受信or送信の規則→新しい規則 を選び,

規則の種類:ポート

プロトコルおよびポート:UDP,特定のリモートポート:5353

後は適用範囲や名前を適当に決めて完了.

 

以降ホスト名.localでアクセスできるようになる.

 

フォルダ共有

VNCベースで開発を進めていると共有フォルダがほしくなることが多いので,

Sambaのインストールと設定と接続

を参考にSambaでホームディレクトリ全体を共有している.

 

NetBeans

プログラムの開発についてはNetBeansというIDEを使用.NetBeansWindows上で開発しながらコンパイルのみラズパイ上で行うという器用なことができる.

https://netbeans.org/downloads/

から対象のインストーラを入手してインストール.

以降ラズパイとの接続設定.C/C++の例だがたぶん他も同じ.これらはネットワーク上にラズパイが繋がっていることを確認してから行う.

1.ひとまず普通にプロジェクトを作成

2.ツール→オプション→C/C++のビルド・ツールタブをクリック

3.右上の編集ボタンをクリックしてRaspberryPiの情報を追加

4.プロジェクトのプロパティのビルドの項でビルド・ホストを選択

これでラズパイ上でのコンパイルが可能に.

なおデフォルト設定でコンパイルを行った場合,実行ファイルは

~/.netbeans/remote/ホスト名/ユーザー名-Windows-x86_64/Windows上でのプロジェクトのパス/dist/Debug/GNU-Linux-x86

というめちゃくちゃ深いところに作られる.プロジェクトのプロパティのリンカの項目から,出力ディレクトリを

/home/pi/ファイル名

のように指定すれば変更できるが,IDE上での実行やデバッグはできなくなる?

実行やデバッグのパスを合わせればできそうなものだけど,どうもうまくいかないのでSSHVNCで直接起動している.いずれなんとかしたい.

 

今のところの開発環境はこんな感じ.また便利なものを見つけたら紹介する予定.

 

 

RaspberryPi3の下準備

若干時間に余裕ができてきたので,この機にRaspberryPi3をセットアップ.以前に初代A+で開発してたので機材については使いまわせるかと思いきや,Pi3の圧倒的な消費電力のせいで電源回りは総とっかえ.2.5A消費ておいおい...

 

とりあえず最終的に自作ロボットに乗せる予定なので電源はモバイルバッテリーを使いたい.容量はそんなになくてもいいので軽くて2.5A流せるモバイルバッテリーを探していたらTECさんのモバイルバッテリーが見つかった.

 

次に2.5A流せる上で短くて安いUSBケーブルを見繕っていたところ,秋月電子で取り扱ってた.さすが秋月.痒い所に手が届く.

USBケーブル Aオス−マイクロBオス 0.15m A−microB: パーツ一般 秋月電子通商 電子部品 ネット通販

 

ただモバイルバッテリーで本当に使用に耐えるのかはまた別問題.Pi3の電源問題は結構話題になっているらしく,スイッチサイエンスさんが比較検証してくれていた.

http://doc.switch-science.com/support/RaspberryPi3/raspi3power.pdf

これを見るに2.4A対応のACアダプタでぎりぎりといった様子.でもこのグラフを見る限り突入電流でやられてる感じがするからバカでかい平滑コンデンサ乗せればなんとかならないのかなぁ...

それはそれとして,モバイルバッテリーはACアダプタに比べて出力容量が少ないような気がするので低電圧になりやすい気がする.若干不安.

追記

openCVのmake(CPU100%使用で1時間以上かかる)をしたところ,2回ほどエラーで中断された.再開すると何事もなかったかのように進んだので電源に起因する可能性有?

ただmakeにかかった時間は70~80分と他の方の情報と大差ないので実用的には問題なさそうか.

追記終わり.

 

後はmicroSDカードを適当に見繕って...

 いまや16GBでこんなに安いのか.昔は2GBを5000円で買った記憶があるが,すごいもんだ.

ともあれこれで準備完了.A+のときはWifiドングルやらBluetoothドングルやら必要だったのでいろいろ調べた覚えがあるけどPi3は楽でいい.

フリスクでraspberry piカメラのケースを作る

raspberry piカメラを買ったはいいものの,いかんせんむき出しの回路.公式でも静電気に注意しろと言っているのでぜひともケースがほしいところ.

 

そんな折にフリスクを使ってケースを作っている記事を見つけた

ラズパイのカメラモジュール用ケースの自作 | hiro345

ので試してみることに.(ついでにカメラ雲台の存在を初めて知って衝動買いしてしまった)

 

どうにもカメラの寸法図は見当たらなかったので,手元の安物ノギスで適当に寸法を測ってinventorにてモデルを作成してみた.

f:id:shikky_lab:20160603213711p:plain

ケースのほうはこんな感じ.

f:id:shikky_lab:20160603213356p:plain

 

一応図面.寸法は参考値ということで.

f:id:shikky_lab:20160603213400p:plain

購入した雲台の固定部分の幅は30mmだったため,フリスクの29.5mmの幅は実によくフィットする.すごい.

f:id:shikky_lab:20160603214450p:plain

雲台に取り付けてみたところ

 

雲台を使わないときはカバーを付けられるし,このカメラモジュールとフリスクの相性は抜群だと思う.目を付けた人すごいな.

 

ケースには満足できたけど,それはそれとしてカメラケーブルの短さにびっくり.取り回しが悪すぎるでしょうに.

というわけでアマゾンで長いケーブルを探してみたら,見つかりはするけど価格設定にびっくり.コネクタもないただのケーブルなのに.

 

 

さすがに手が出ないのでeBayで探してみると,100円くらいでわらわらと見つかる.

http://www.ebay.com/sch/i.html?_from=R40&_sacat=0&LH_BIN=1&_nkw=raspberry+camera+cable&_sop=15

とりあえず使い勝手のよさそうな30cmと50cmのものを買ってみた.届くまで時間がかかるけどこの安さは正義.とはいえ品質に問題がないかはわからないので届いたらしっかり検証しよう.

AtmelStudio7.0に「RelativeNumber」を導入する

やはりVimを使うなら行番号の相対表示は欲しい.

有名どころでは「RelatveNumber」とか「RelativeLineNumbers」とかあるけど,どちらもそのままじゃAtmelStudioに入ってくれなかった.

 

幸い「RelativeNumber」の方はMITライセンスでソースコードが公開されているので,まだ手が付けられそう.

前回(AtmelStudio7.0に「VsVim」を導入する - 徒然創作記)は有志がAtmelStudio用にBuildしてくれてたけど,今度はそんなのもなさそうだ.

VisualStudioのExtentionなんていじったことないけど,とりあえず手を付けてみるか.

 

まずはソースを

https://github.com/brianschmitt/relativenumber

から入手.RelativeNumber.slnを開こうとすると,SDKがないため正常に開けないと怒られたのでSDK

Microsoft Visual Studio 2013 SDK extension

から入手.

VsVimのQ&Aを参考に,source.extension.vsixmanifestに <InstallationTarget Version="[7.0,]" Id="AtmelStudio" />を追加.

で,buildするとbin\ReleaseにRelativeNumber.vsixができているので前回と同様にVSIXInstallerにドラッグ&ドロップ(.vsixに関連づけられているものはバージョンが一致していない可能性があるため,直接叩いた方が安心).

これで無事に導入できた.