2017年5月
  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      

カテゴリー

ブログパーツ

無料ブログはココログ

2017年1月 7日 (土)

3Dプリンターで作る簡単turtlebot(おしまい)

最後はCORAの操作法です。簡単に作ってある代わりにちょっと気をつけることがあるので、そこらへんを。

turtlebotスタックでマッピングやナビゲーションをするにはこの投稿をみてください。CORAはソフト系の人向けに開発したので、この辺は詳しく説明しません。「ROSさんお手やわらかに」のカテゴリにはいろいろな情報がありますが、古い投稿はもう時代遅れの可能性もあります。

●roomba操作法

取説を持っていない場合は用意しておいたほうがいいでしょう。日本語版取説はサービスされていないようなので、英語版を。

充電は付属の充電器を直接接続するのが簡単です。充電中は真ん中のランプがオレンジ色にゆっくり明滅します。ミドリになったら充電完了。バッテリーの状態によってはオレンジに早く点滅する場合があります。これはバッテリーを一旦放電してリフレッシュするプロセスのようです。結構時間がかかります。使わないときには充電器を繋ぎっぱなしにしておくのがよいようです。

Dscn3647

minimal.launchでturtlebotを起動する前に、CLEANボタンを押して電源をオンにします。ランプがミドリに点灯します。ローンチが完了すると(画面で終了してからしばらくかかる場合もあり)ポッという音がしてランプが消えます。この時USBシリアル変換器のLEDが忙しく点滅を始めます。roombaとラズパイが通信しているのです。電源を入れてから何もしないで数分間が経過すると自動的にオフになってしまうので、ローンチの直前に電源オンするのがよいでしょう。

電源オフにするには同じボタンを長押しします。電源オンのときにもう一回CLEANボタンを押してしまうと軽快なサウンドがなって掃除を始めてしまいます。そのときは慌てず騒がずCLEANボタンを長押ししてください。電源を切ることで止まります。

Dscn3646

実験終了後はちょっと気をつけることがあります。roombaは外部コントロールモードになっているので、そのままでは電源も切れませんし充電もできません。この投稿に従ってroombaの電源を切ります。電源が切れたかどうかをCLEANボタンを押して確認します。電源オンになればOKです。反応がなければ外部コントロールモードから抜けてません。どうしてもダメならroombaをリセットします。SPOTとDOCKのボタンを同時に10秒ほど押して放します。一拍置いて「ピロリロリロ」という電子音が出ればリセット完了です。

●モバイルバッテリー操作法

モバイルバッテリーがUSBが2ポートある最初に紹介したものなら問題ありません。バッテリーの電源ボタンでシステム全体の電源を入り切りします。電源の切り方はこの投稿の最後の部分をみてください。

1ポートの普通のモバイルバッテリーを2個使っている場合は、kinectとラズパイを個別にパワーマネジメントできます。下の写真のようにそれぞれにバッテリーを接続します。

Dscn3632

kinect側は使うときだけオンにすればよいので、コードのメンテナンスをしてる時などは切っておいて構いません。バッテリーが倹約できます。オフにできないタイプの場合はコネクターを抜き差しする必要があります。

これでROSに入門する準備が整いました。皆さんの健闘を祈ります。

2017年1月 3日 (火)

3Dプリンターで作る簡単turtlebot(raspberry pi3の取り付け)

今回で組み立ては最後です。ラズパイ3とバッテリーを取り付けます。完成写真はこうなります。

Dscn3633

最初にroombaとUSBシリアル変換器をつなぐケーブルを作ります。これはオスーメスのジャンパーケーブルを使います。この部分の拡大写真です。

Dscn3549

配線図はこちらです。roombaのコネクターをよく見て間違えないようにしてください。roombaの1、2ピンにはroombaのバッテリー電圧が出ています。ここには絶対接続しないでください。変換器ばかりかラズパイを壊してしまう可能性があります。

Usbcable

USBシリアル変換器のジャンパーはVCC-5V間に刺します。おそらく購入時にはこの設定になっていると思います。

ラズパイやバッテリーの固定には写真のようなゲル状の家具固定マットを使います。これはダイソーで求めたものです。ハサミで切って好きな大きさにすることができます。

Dscn3605

今回はこのように配置しました。ラズパイは立ててあります。

Dscn3642_2  Dscn3643

モバイルバッテリーは最初の投稿で説明したものです。これは2系統の電源のオン/オフを同時にできるので使いやすいです。もちろん、手持ちのものを流用しても構いません。その場合、kinect用は2A取れるものを用意してください。計算上1Aくらいはコンスタントに消費します。

turtlebotスタックのみを使うならラズパイ3は1Aで大丈夫です。GPUをほとんど使わないのでそれほど電流は食いません。

ここでラズパイ3のセットアップをしてしまいます。長時間かかるので、バッテリーではなくACアダプターから給電します。ubuntu14.04LTSのインストールはこの投稿、ROS indigoはこの辺りからの投稿を読んでください。僕の投稿はあまり系統立てて書かれていないので、いちど「ラズパイでROS」のカテゴリーを流し読みすることをお勧めします。

次回が最終回の予定です。本機のオペレーションの仕方を説明します。

2017年1月 2日 (月)

3Dプリンターで作る簡単turtlebot(kinectの取り付け)

今回はkinectを取り付けます。まず、モバイルバッテリーの5Vから12Vの電圧を作るDC-DCコンバータの電圧を合わせます。DC-DCコンバータは前の投稿を見てそろえてください。

電圧は多回転型半固定抵抗を回して調整します。写真の青い部品がそうです。これの金色のネジを小さなマイナスドライバーで回すわけです。よくある精密ドライバーセットにはマイナスも入っているのでこれを使うのが良いでしょう。

Dscn3626

下の写真のようにDC-DCコンバータ基板にマイクロBのUSBケーブルで電源を供給します。写真ではモバイルバッテリーを使ってますが、モバイルバッテリーは電流がわずかしか流れないときに数十秒で自動的にオフになってしまうので、ACアダプターかパソコンのUSBから電源を取るのがいいでしょう。

Dscn3541

テスターをOUT+とOUT-の端子に当てて電圧をチェックしながら、半固定抵抗のネジを回して約12Vに合わせます。ネジは右に回すと電圧が上がり、左に回すと電圧が下がります。ラジオのツマミとは違って何回も回して調整します。それだけ精密に調整できるわけですが、設定電圧にはそれほど神経質になる必要はありません。±0.2Vくらいの誤差は問題ないです。一人だとやりにくいので、誰かに手伝ってもらいましょう。

次はkinectの接続ケーブルを改造し、DC-DCコンバータに接続します。この工程はハンダ付けが必要です。ケーブルにはkinectに接続するコネクターからUSBケーブルとACアダプターケーブルの2本が出ています。このうちACアダプターにつながっている方のケーブルを、下の写真のようにコネクターから200mm程のところで切断します。USBケーブルと間違えないようにしてください。(写真は試作機のもので200mmより短いです)

Kdc

切断した部分から20mm程の被覆をむいて、白と茶色の電線2本をむき出しにします。下の写真のマス目は5mmです。

Dscn3536

黒い細い線も出てきますが、これは強度確保か隙間埋めのための樹脂線で、切ってしまって構いません。下の写真のようにカッターをあてがい、ケーブルを回しながら少しずつキズを入れていけば、比較的楽にできます。自信のない向きには、切り離したACアダプターの部分は使わないので、そちらのケーブルで練習してから本番に臨めば良いでしょう。

Dscn3624

次にこの茶色と白の電線を剥いてDC-DCコンバータにハンダ付けします。ここはどうしてもハンダ付けでないと信頼性が保てません。茶色の線をOUT+に白の線をOUT-に接続します。

Dscn3544

ハンダ付けは次の手順で行います。

1:電線の被覆を3mm程剥く(外皮と同じくカッターを使うと簡単です。本番前に練習しておきましょう)

2:剥いた導線にハンダをつけて「ハンダメッキ」する

3:基板の端子にもハンダを盛る(少し盛り上がるくらいにハンダを載せます)

4:導線を端子に載せてハンダごてで加熱。両方のハンダが溶けて融合したら完了

被覆を剥く時の力加減は大事です。導線まで切断してはどうしようもありません。電子工作に興味が出てきたら、ワイヤーストリッパーを買うのをお勧めします。

kinectに接続する前に接続のチェックをしておきます。電源につなぎ、コネクターのLEDが点灯することを確認してください。点灯しない場合は接続をチェックします。

Dscn3591

最後に基板を12にはめ13を上から被せれば完成です。13は真ん中が少し膨らみますが、このバネで外れないようにしているためです。

Dscn3593  Dscn3598

最後にkinectをホルダーの中央に載せます。ケーブルはホルダー下部の凸部分のあいだに軽く巻きつけて捌きます。巻きつけはあくまで軽くしてください。きつく巻くと甲羅が歪みます。

Dscn3635

これでほぼ完成です。次回はラズパイやバッテリーを搭載します。

2016年12月29日 (木)

3Dプリンターで作る簡単turtlebot(パーツの組み立て2)

前回まででこのような甲羅が完成しました。

Dscn3613  Dscn3614

ポリバケツのフタみたいにしっかりはしてませんが、まあ一体感のある構造にはなっていると思います。これはroombaにピッタリとはめるために、調整シロとしてパーツ間に多少遊びをもたせているからです。この段階で接合部分をチェックして、接着できてない部分には裏から接着剤を塗りこんで補修します。補修した場合はまたroombaに載せて重しをして固定します。

Dscn3610

次にkinectを乗せるサポーターを組み立てます。まずは下の写真のように1、6、9、11の穴に3mmナットを押し込みます。指で押し込めば入ると思いますが、押し込みが甘いと斜めになったりすることもあるので、最後はドライバーの柄の部分などでしっかり押し込んでください。

Dscn3583

8〜11の部品は下のように組み合わせます。9と11の方向に気をつけてください。これがkinectのサポーターになります。サポーターの上下は3mm X 10mmのビスで固定します。ここがビス止めになっているのは、将来別の3Dセンサーに取り替えられるようにしているからです。面倒な人は接着しても構いません。

Ki1

これを甲羅にビス止めします。10を1に、8を6に取り付けます。下の写真のように出っ張りが二つある方が後ろになるように取り付けます。

Dscn3582

これで完成です。次回はラズパイなどの電装品を取り付けます。

Dscn3602

2016年12月25日 (日)

3Dプリンターで作る簡単turtlebot(パーツの組み立て1)

いよいよプリントしたパーツを、前回の投稿の最後で説明した接着剤とビスナットを使って組み立てます。その前にroombaの準備をしておきましょう。この投稿に従って化粧パネルを外し、この投稿のようにブラシとダストボックスを外します。roombaの分解法はこのサイトが分かりやすいです。

完成するとこのようになります。後部に乗っている黒いものはモバイルバッテリーです。kinectを載せないと、後部が軽いので、タイヤのテンションスプリングで車体が持ち上がってしまうため、重りとして一時的に載せているだけです。

Dscn3600 Dscn3602

まず、1〜7までのパーツをroombaに載せて仮組みをしてみます。端っこになる1と6は下の写真のように凸部をroombaの溝に差し込んで位置決めします。

Attachpos

最初に1と6を置いてから2〜5をぐるりとはめ込み、最後に7を載せます。継ぎ目に大きな段差はないか、軽く押してみてガタツキはないかなどを確認します。前の投稿のパーツ写真のように並べます。パーツ2と5は間違えやすいので気をつけてください。

Dscn3581

これから各パーツを組み合わせて接着し「甲羅」にしますが、「甲羅」とroombaは接着しません。roombaに載せて接着するのは、roombaにぴったりはまるよう、現物あわせをするためです。接着剤が流れ出してパーツとroombaがくっつかないように気をつけてください。

最初に外周部分の1〜6を接着します。下のそれぞれのパーツの下の写真の点線で囲ったタブ(他のパーツに潜り込む部分)に接着剤を塗り、roombaに載せて組み立てます。タブのある部分ならパーツの側面に接着剤を塗っても構いません。そのほうがしっかりします。ただ、タブのない部分の側面には塗らないでください。接着剤が滴れてroombaについてしまう危険があります。

Adh

ABSの接着剤は少し粘りのある液体で、ABSを溶かして接着します。下のような状態で3時間程度放置し、しっかり接着します。部品にはラフトを剥がしたときの凹凸があり、また積層時の歪みがどうしても出るので、接着箇所が密着しない場合もあります。ということで、接着剤はなるべくたっぷりつけたほうが有効です。固まるまで右の写真のように本などを載せて重しとするとよいでしょう。(実際のところもう少し本を載せたほうがいいくらいです)

Dscn3574  Dscn3612

リング部分が形になったら、最後に7を接着します。下の写真の点線で囲った部分に接着剤を塗って、7を載せます。写真上のほう二箇所の小さなタブも忘れずに接着剤を塗ってください。固定するまでまた重しをして3時間ほど放置します。

Adh2

接着剤が固まると一枚の円盤としてそこそこの強度になります。

Dscn3524

次回はkinectのサポーターを組み立てます。

2016年12月21日 (水)

3Dプリンターで作る簡単turtlebot(パーツのプリント)

今回作るロボットはCORAと名付けました。Controller-On-RoombAという意味です。と、いうのはコジツケで、本当はroombaの甲羅です。それから、ロボット亀の大先輩にあやかったところもあります。ELMER、ELSIEというロボット亀を作ったグレイ・ウォルターが、「条件反射するロボット」として作ったのがCORAというロボットでしたからね。

下記から全部品のSTLデータをダウンロードしてください。全部で13パーツあります。

「CORA1.0_STL.zip」をダウンロード

ファイル名がパーツ番号です。全てをプリントすると次の写真のパーツが出来上がります。材料はABSです。

Allp

ウチのAfiniaでプリントすると、1〜8と10のパーツはそれぞれ2時間以上かかります。とても1日では済みません。じっくり取り組んでください。

2と5のパーツは同じに見えますが、違うパーツです。下の写真で黄色で示したリブの長さが違います。エンピツでパーツ番号を書き込んでおくとよいでしょう。

Diff

穴を開けたり、形状を変えたり、CORAをモデファイしたい人のために、123Dのデータを提供します。下記からダウンロードしてください。

「CORA1.0_123D.zip」をダウンロード

次回は組み立てます。ABS用の接着剤と3X10のビスナットを8個、用意しておいてください。接着剤はプラモデル用のものが入手しやすいでしょう。

Dscn3579  Dscn3585

2016年12月20日 (火)

3Dプリンターで作る簡単turtlebot(部品の準備)

まずは主要部品集めです。

メインになるroomba500シリーズとkinectはこの投稿を参考にあつらえます。生産は終了していますが、中古ならまだまだ入手は可能なので安心してください。Hanabot2ではroombaの電源を外部からもらってますが、本機ではその改造はしません。roombaにセットされているバッテリーを動力源として使います。中古品を入手した場合、バッテリーが弱っていることが多いので、新品のバッテリーも用意したほうが無難です。Amazonで互換品を購入できます。

搭載するのはRaspberry pi3です。ケースと16GのマイクロSDも忘れずに用意します。

Imgres

ubuntuではラズパイ3の内蔵無線LANは(いまのところ)使えないので、USB接続の無線LANも必要です。本機ではPLANEXのGW-USNano2を使いました。

51epybjpsl_sl1000_

roombaとの接続にはUSBシリアル変換器を使います。USBからロジックレベルのシリアルに変換するアダプターです。おすすめはこれです。仕事用も含めて5台くらいテストしましたが、ラズパイで問題なく使えてます。黄色いジャンパーピンを5V,Vcc間に刺して、ロジックレベルを5Vにして使います。

616w6gztnhl_sl1100_

この変換器とroombaの接続は、本来なら7PのMINI DINプラグを使うところですが、今回はハンダ付けの工程を減らすために、オスーメスのジャンパーワイヤをroombaのコネクタに差し込んで接続しました。これならプラグへのハンダ付けがいりません。なるべく長いワイヤのほうが使い勝手が良いので、このようなワイヤを割いて使いました。モチロン、ハンダ付けを厭わなければ、MINI-DINを使ったほうが確実です。

713hsj2zdol_sl1100_

ラズパイ3とkinectの電源はスマホ充電用のモバイルバッテリーを使います。ラズパイとkinectの2系統が必要なので、バッテリーを2個用意するか、このような2系統の出力が取れるものを使います。電源ボタンでON/OFFできるもののほうが使い勝手が良いですが、スペックに記載がないことが多いですね。これはON/OFFできました。

61iraqyvohl_sl1500_

ラズパイ3の電源は5V/2.5Aとなっていますが、これはグラフィックなどをフルパワーで使った時のようで、turtlebotでは1Aもとれれば十分のようです。このバッテリーは1Aと2Aのポートが用意されているので、1Aのポートをラズパイ用、2Aのポートをkinect用としました。モチロン、両方2Aのほうが安心なのは言うまでもありません。

kinectの電源は12Vなので、モバイルバッテリーからの5Vそのままでは給電できません。DC-DCコンバータで5Vを12Vに変換します。Amazonでよく見かけるこれを使いました。おなじみマイクロBのUSBケーブルでモバイルバッテリーに接続できます。出力電圧は多回転ポテンショメータ(青い部品)で設定します。

Dcdc

このコンバータにkinectの電源ケーブルを接続します。本機で唯一ハンダ付けが必要な工程です。写真右のOUT+とOUT-というパッドにワイヤーをハンダ付けするだけなので、初心者でも容易だと思います。

接続用のUSBケーブルは30cmくらいの短いものが使いやすいようです。たとえばこのようなものを2本用意します。

C09313

次回は3Dプリンタでroombaに乗せるボディを作ります。

2016年12月 3日 (土)

生き物らしく動くロボットを作りたい

僕はもっぱら自分の好奇心の趣くままにロボットの研究をしています。興味の対象はその時々で変わりますし、僕は飽きっぽい方なので、やってることはバラバラです。

でも、漠然とした目標はあり、それは「ロボットと暮らしたい」ということです。
それを実現するためには色々な要素があります。自律性とか知能化もそうですが、もう少し感性的なこともあります。つまり、一緒に暮らしていて苦にならないという性能です。ざっくりしてますが、猫を飼っている経験からすると、「ふるまいが生き物らしく見えるロボット」というのはその解決法の一つかもしれません。たとえばこれはそれに対するアプローチの一つです。

サブサンプションで赤いボールを追いかけるだけのロボットですが、「早い」というだけで、生き物らしく、つまり何らかの知性を感じる動きになっているのではないかと思います。このように振る舞うロボットならば、ルンバのように機械的に(まさに機械ですから)動き回るロボットより、一緒に暮らしやすいのかもしれません。

こういうことを積み上げていけば、いつか一緒に暮らしても苦にならない、そんなロボットが生まれるかもしれませんね。

2016年12月 2日 (金)

3Dプリンターで作る簡単turtlebot(プロローグ)

久しぶりの投稿です。

今まで僕が投稿してきたHanabot2は、簡単に安く作れるよう工夫をしてきました。実際のところ、少しの木材とラジオ工作程度の電子回路、ノコギリやドリルなんかの基本的な工具のみで組み立てられるようになっているので、中学生でも製作可能、と思ってました。

ところが、ある人と会ってお話しした際に、「情報系の研究室にはノコギリはまずない」という事実が判明しました。するってえと木工はできないんですかと聞くと「昭和じゃないんだから」。なるほど、僕の判断基準は昭和の「模型とラジオ」なわけですから、ギャップがあって当然ですね。当時の模型雑誌はこういうのを少年に作らせるんですから。

Dscn3560  Dscn3561

これはラジコンカーキットの解説ではなく、ベニヤ板とかブリキから部品を切り出してボディもファンもサーボも自作する記事です。どうです、これに比べたらHanabot2の自作なんて屁でもないでしょう。

まあ、そんなコトを威張っていてもしょうがありません。情報系の研究室でも簡単に作れるようなturtlebotコンパチ機を開発するコトにしました。中身はHanabot2と同じkinectとroomba500シリーズを使ったものです。

まず基本的に、ノコギリを使わないでボディを作れるようにします。つまり木材は使いません。全て小型3Dプリンタで分割製作します。こんな感じです。ミドリのパーツがプリンタで製作したボディパーツです。

Dscn3524  Dscn3525

各パーツは120X120mmのサイズに収まっており、家庭用の3Dプリンタで出力できます。僕はAfiniaを使っています。これを組み合わせて接着し、roombaに乗せるわけです。これでroombaの上面が空母の甲板のようにフラットになり、ここにラズパイなどを自由に配置することができます。組み上げた形がこの写真です。

Dscn3633

Hanabot2は全体の電源を1個の大型バッテリーに集約していましたが、そのため、電圧変換や充電回路を搭載した「電源基板」を製作する必要がありました。そこそこの数を部品をハンダ付けし、ワイヤーで接続するので、ハンダ付け初心者には大変なところがありました。そこで、今回のモデルでは、スマホの充電に使う「モバイルバッテリー」を使い、電源基板や接続ケーブル作らなくて済むようにしました。

また、バッテリーやラズパイの固定には、ダイソーなどで手にはいる「家具の転倒防止」のゲル状シートを使うので、付け外しが簡単にできます。普段使っているモバイルバッテリーをロボットの実験用として一時的に使うことも簡単です。写真で四角いのがシートです。これの上にバッテリーなどを乗せると、ロボットの走行程度の振動では、簡単に外れたりずれたりしません。

Dscn3531

ハンダ付けは2ヶ所しかありません。モバイルバッテリーの5Vからkinect用の12Vを作り出すDC-DCコンバータの部分のみです。ハンダが苦手な人でもこれなら安心です。

現在、成形品の最終確認中です。帰宅後の作業だと、2パーツくらいしかプリントできないので結構時間がかかってます。奥さんに頼んで昼間プリントしてもらおうかとも思いましたが、信頼性の問題があり断念しました。まだ年賀状なみに気楽にプリントできるものではありません。次でTエンドの予定ですので、近いうちに公開できると思います。

続きはこちら

2016年11月 6日 (日)

ROSを使ってイベント用ロボットを試作したハナシ

ここのところ、Hanabot2を使った、イベント用ロボットの原理試作(機能確認用の試作品)を作っていました。本業絡みなので写真や詳細な情報は載せられないのですが、Hanabot2そのもののアッパーデッキに追加の装置を乗っけてシステムアップしたものです。メインの機能は、パーティ会場のような人の多いところで、人間を見つけると近づいて簡単なゲームをし、人間が勝つと景品を渡すというものです。まあ、だれでも思いつくような凡庸なロボットです。

新たに追加したのは、PIC24Fを使ったスマートインターフェイス基板(赤外線リモコン信号の受信、熱センサアレイ、サーボ4個のドライブ、LEDドライブ、幾つかのスイッチIFなど)、これはUSBシリアルでラズパイにつながります。小型のパソコン用スピーカー、サーボモーターによるパンチルトユニット、幾つかの押しボタンやメカセンサやLEDランプなんかです。ラズパイのI/Oは使っていません。

試作品ではminimal.launchと3dsenseor.launchのみを立ち上げ、マップを使用しないでロボットを制御しました。kinectと熱センサアレイで近くの人を探してゲームをねだります。持っている景品がなくなると、ロボットはベースステーションまでもどりますが、そのナビゲーションにはリモコンの赤外線を使ったビーコンを利用しています。音声合成(Open jtalk)で喋りますが、音声認識は使っていません。全体のシーケンスを司るノードをはじめとし、数個のpythonプログラムで構成されています。

追加のハードウェアはサーボも含め、すべてHanabot2のバッテリーから給電しています。9時から13時まで4時間の連続デモンストレーションで、バッテリー電圧は11.2Vまで下がりました。終端電圧の10Vまではまだ余裕があります。思ったより長持ちすることがわかりました。

こんなロボットでも、実際に作って運用してみると、いろいろと気がつくことがあります。折に触れてブログで紹介できればと思ってます。

2016年10月12日 (水)

ubuntuラズパイ3のシリアルターミナルを有効に

前回作ったラズパイ3用のubuntu14.04は、シリアルターミナルを有効にしてありませんでした。ここでやってしまいます。

基本的にはここでやったのと同じですが、内容がちょっと違います。

/boot/cmdline.txtの内容は下記にします。(1行です)

net.ifnames=0 dwc_otg.lpm_enable=0 console=ttyS0,115200 kgdboc=ttyS0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

シリアルコンソールがttyS0になってますので、新規に作成するのは/etc/init/ttyS0.confです。内容は下記にします。コピペしてください。

start on stopped rc or RUNLEVEL=[12345]
stop on runlevel [!12345]
respawn
exec /sbin/getty -L 115200 ttyS0 vt102

これでrebootするとシリアルターミナルからログインできるようになります。ラズパイとシリアル変換器の接続はここを見てください。

2016年9月29日 (木)

ラズパイにOpen-Jtalkを入れる

ROSが動いているubuntuラズパイにフリーの日本語TTS、Open-Jtalkをインストールして、ロボットが喋れるようにしましょう。まず最初にwavファイルが再生できるようにセットします。下記でインストールしますが、僕の場合はすでにインストールされていました。念のためにやっておきます。

$ sudo apt-get update
$ sudo apt-get install alsa alsa-utils

これだけではダメで、/boot/config.txtの最後に下記の1行を追加し、オーディオ機能をONにします。

dtparam=audio=on

さらに自分をaudioグループに追加します。ぼくはhanaokacyanなのでコマンドは下記になります。ここでrebootしてここまでの設定を反映させます。

$ sudo adduser hanaokacyan audio

最後に下記のコマンドでオーディオ出力をミニジャックに設定します。ここでrebootしてここまでの設定を反映させます。

$ amixer cset numid=3 1

ラズパイのミニジャックはビデオ信号入りの4極ですが、普通のステレオミニプラグを差し込むとオーディオだけが取り出せる(ビデオはGNDにショートされますが、直列抵抗が入っているので故障はしません)ので、ヘッドフォンや外部スピーカーなどがそのまま使えます。今回は写真のように折りたたみ式の外部スピーカーを使いました。

Dscn3513

サンプルwavファイルがalsaとともにインストールされてるので、下記のコマンドで音("front center"という音声)がでます。

$ aplay /usr/share/sounds/alsa/Front_Center.wav

音量の変更は次のコマンドでミキサーを表示して行います。↑↓キーで音量を変更できます。ただ、僕の環境では設定音量を保存できませんでした。電源を落とすまでは設定音量ですが、再起動すると初期の音量に戻ってしまいます。保存する方法もあるようですが、うまくいきませんでした。

$ sudo alsamixer

もっともミキサーを表示することなく、音量を変更できるコマンドもあります。最後の数値(%)で音量を指定しますが、リニアではないので70~100くらいで大幅に音量が変わります。ともあれ、このコマンドで起動する度にシェルスクリプトや.bashrcなどで音量を再設定してやれば実用上は問題なさそうです。

$ amixer sset 'PCM' 80%

肝心のJTalkのインストールは例によって他の方のインストール法をそのままやってみました。こちらのサイトです。この手順のとおりでpythonで喋らせることができました。次回はその応用でROSを使って喋らせてみます。

2016年9月27日 (火)

ラズパイubuntuの日本語化

Hanabot2で日本語音声合成を使ってみたくなりました。音声合成はOpen-JtalkというフリーのTTSを使うことにしましたが、そのためにはraspberry pi3に載せたubuntu 14.04LTSを日本語化しなければなりません。

あちこちのサイトにあるように、まず日本語パッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get install language-pack-ja-base language-pack-ja ibus-mozc

あとは下記コマンドで日本語設定します。

$ sudo update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"

念のためrebootして再度ログインしてみます。nanoを起動して日本語化されてればOKですが・・・

Japanedit

僕は一発ではダメでした。色々調べたところ/etc/default/localeの中身を下記のようにする必要がありました。

LANG=ja_JP.UTF-8
LANGUAGE=ja_JP:ja
LC_ALL=ja_JP.UTF-8

最後のLCは表示されるメッセージのどこを日本語化するかを細々設定できるモノのようで、ALLですべてが日本語化されます。僕の場合はこれがPOSIXとかになってました。さらに、僕の場合はsshのターミナルに問題があって(ROS用のThinkpad T61のメニュー表示などを英語化している関係で)日本語表示がターミナル上で文字化けしてしまいました。こちらはターミナルの問題なので、そっちで対応しました。

現状ではモニタを接続して起動すると文字化けしてます。多分、日本語フォントをインストールしてシステムフォントをそっちに切り替えれば良さそうですが、いまのところプライオリティが低いので、後回しにします。

次回、日本語TTSのOpen JTalkをためします。

2016年9月19日 (月)

pythonでturtlebotコンパチ機を人物追跡させる

ROSさんお手やわらかに:ROS青雲編

turtlebotのサンプルにkinectを使って人間追跡をするデモがある。これと同様のモノをpytonで書いてみる。もっとも、お手本になりそうなコードを探して、ちょっと手を入れただけだ。これのおかげでpythonでのリスト処理のテクニックのごく一部がつかめた。機械学習のように大規模なデータ処理を扱う言語として、最近注目を集めているpythonだけど、なるほどなという感じだ。

リスト処理はその昔、Lispでデータ構造を構築するまねごとをやったことがあるけど、たぶんpythonもそういうことが得意なんだろうとおもう。10年以上前になるが、アメリカの画像認識とロボティクスをやってるベンチャーの人と仕事をしたことがあった。彼が日本にきたとき、秋葉原で接待した帰り、「あなーたはロボットつくるのに、なんちゅう言語をつかってまちゅか」(おそらく僕の英語はこんなふうに聞こえているんだろう)という質問に、「python」と言われ、なんだかわからず綴りを書いてもらったのを覚えている。後日オライリーの本を探して読んだけど、あまり魅力が分からなかった。

肝心のコードはこちらのサイトが元ネタ。動画にあるように、人を検知すると追跡しながらわんわん吠えたり、おもちゃのミサイルを発射したりする物騒なロボだ。ここからfollower.pyを拝借して改造した。最初の方のコメントは残したが、他のノードと連携する部分(わんわん吠えたりする部分)は削除して単純化した。わかりやすいと思う。

「follower.py」をダウンロード

これの実行前にminimal.launchと3dsensor.launchを実行しておく。肝心のパフォーマンスは、ラズパイ3のHanabot 2でも、かなりスムーズだった。

2016年9月 5日 (月)

turtlebotをリモコンしやすくする

ROSさんお手やわらかに:ROS青雲編

turtlebotをリモコンするのには、この投稿にあるようゲームパッドを使っているが、スティックのききが良すぎてゆっくり動かすのがむずかしい。そこでゆっくり動かせるよう、teleoperationのlaunchファイルを修正する。

以降はlogitech.launchを使用している場合。

$ sudo nano /opt/ros/indigo/share/turtlebot_teleop/launch/logitech.launch

nanoで開いて下記の部分を直す。

param name="scale_angular" value="1.5"

param name="scale_linear" value="0.5"

scale_angularは旋回速度のスティック角度への係数。つまり最大に倒して1.5rad/s。これを1.0に。scale_linearは走行速度のスティック角度への係数。最大で0.5m/sなので、これも0.3に変更する。これでスティックが少し鈍感になり、ゆっくり動かしやすくなる。

この値は実際に操縦してみて、操縦しやすい値にすればよい。例によってアップグレードで元にもどる可能性があるので、バックアップを忘れずに。

2016年9月 4日 (日)

turtlebotの自律移動速度を変える

ROSさんお手やわらかに:ROS青雲編

turtlebotのスタックを改造し、自分の実験環境で使いやすくしていく。まずは自律移動の速度を遅くする。

roombaをベースにしたturtlebotは、ラズパイ2などの遅いプロセッサで制御している時には、プランナーが作った計画経路を正確にたどれないことが多い。rvizを見ているとよく分かる。これはプロセッサが遅いので制御周期が計画より遅く、制御が間に合わないため。もちろん、ある程度ずれると再計画するので最終的に目的地には到達するのだが、そのたびにギクシャクするし、カーブでオーバーシュートしたりすると家具のかどなんかにぶつかることがある。なるべく計画の経路をとらせるには、簡単には移動速度を制限すればいい。

自律移動での速度を制限するには /opt/ros/indigo/share/turtlebot_navigation/param/dwa_local_planner_params.yaml をいじる。これはdwa_local_plannerがロボットの経路を立てる時に使う情報をまとめたもの

$ sudo nano /opt/ros/indigo/share/turtlebot_navigation/param/dwa_local_planner_params.yaml

nanoでファイルを開き、下記の部分を手直しする。

max_trans_vel: 0.5 # choose slightly less than the base's capability

max_rot_vel: 5.0  # choose slightly less than the base's capability

max_trans_velは直線方向の移動速度の最大値で単位はm/sだ。ラズパイ2ではこれを0.3にした。同様にmax_rot_velは旋回方向の最大速度で単位はラジアン/sだ。πで180度だから、これも3.0にした。最大速度は180度/sくらいになる。

これくらいにするとウチの環境ではスムーズに移動できた。例によって、これはapt-get upgradeをすると上書きされてもとにもどる可能性があるので、どこかにバックアップを作っておく。

2016年8月27日 (土)

raspberry Pi3でubuntu14.04のまとめ

だいぶドタバタしましたが、ようやく現時点でのturtlebot学習用のubuntu 14.04環境をラズパイ3に載せることができました。もっとも参考になったのはこちらのサイトです。

基本的にはこの一連の投稿をなぞっていますが、参考にしたサイトにしたがい、apt-get upgradeできるようにしてあります。ただ、前の投稿と違うのは、ラズパイ3用の起動ファイルを抜き出すのをUbuntuMateではなく、こちらのサイトにあるラズパイ3用の16.04からやりました。ラズパイ2に入れた14.04と同じ系列(?)なので、いままでいろいろやってきた経験が生きるのではないかとおもいます。インストール方法は、下記のメモにまとめました。

「rp3ubuntu1404memo.txt」をダウンロード

このブログの以前の投稿や参考サイトを読みながらみてもらえば分かると思います。

また、参考までに製作したイメージを公開します。上記のメモで作成したモノです。モニタとキーボードをつなぎ、ユーザー名ubuntuパスワードubuntuでログインできます。ddファイルなのでhome直下におけば下記のようなコマンドでsdカードに展開できるとおもいます。(ubuntuでです)hanaokacyan,sdbなどは自分の環境にあわせてください。イメージは2GBになってますのでSDカードに合わせgPartedで拡大して使ってください。

$ sudo dd if=/home/hanaokacyan/rp3ubuntu1404.dd of=/dev/sdb

ddファイルのダウンロード

Hanabot2をラズパイ2から3に換装し、今後はこれで実験を進めるつもりです。写真ではわからないですけどね。

Dscn3498

2016年8月25日 (木)

sudoなしで最新のWiringPi-Pythonを使うには

前回、インチキをしてpythonで書いたROSのノードからWiringPi-Pythonを使わずにGPIOにアクセスしてみました。「電子計算機の仕事としてはめちゃくちゃ遅い」という点を除けば、まあナントカなるという結論でした。でも、どうもモヤモヤします。以前はWiringPi-Pythonからちゃんとsudoなしでできてたのになんでだろ、ということですね。

不通だったWiringPiのHPが復活したので、WiringPi-Pythonでエラーになっているあたりをチェックしたところ、初期化関数にヒントがありました。このページでは初期化関数として、wiringPiSetup (void) ;wiringPiSetupGpio (void) ;wiringPiSetupPhys (void) ;wiringPiSetupSys (void) ;という4種類をあげています。先の3つはルート権限で実行する必要があると書いてありますが、wiringPiSetupSys (void) ;だけはルートでないユーザーが実行できるとあります。ただ、gpioコマンドも併用してシェルから使用するピンを設定する必要があるとのこと、これは今まで僕がやってきた方法と同じです。その他いろいろと制約もあるみたいですが、これをラップしているWiringPi-Pythonの関数を探せば良さそうです。

ということでWiringPi-PythonのGitHubを改めて読み直してみて、愁眉を開くことになりました。なるほど使い方が変わっています。インストール方法が変わっていることには気がついていたのですが、そっちはノーチェックでした。以前はこの投稿でやっているように、初期化関数にパラメータを与えて、インスタンスを生成するようになっていたのですが、ごくシンプルに関数を呼ぶだけになっています。これでは以前のコードが動くはずもありません。WiringPi-Pythonの仕様変更が今回のドタバタの原因だったみたいです。というわけで動作したROSでLチカのコードです。

#!/usr/bin/env python
import roslib
import rospy
import time
import subprocess
import wiringpi

#main
if __name__ == '__main__':
    ### init io port ###
    subprocess.check_call('gpio export 17 out',shell=True)
    ###
    rospy.init_node('iotest')
    wiringpi.wiringPiSetupSys()
    wiringpi.pinMode(17,1)  # Setup pin 17 to OUT

    while not rospy.is_shutdown():
        wiringpi.digitalWrite(17,1)
        time.sleep(0.5)
        wiringpi.digitalWrite(17,0)
        time.sleep(0.5)
    print('\rStopped')

GPIO 17につないだLEDを1秒周期で点滅させます。sudoの必要はありませんからROSで普通にノードとして実行できます。sleepをコメントアウトしてコマンドの実効速度をオシロで計測したところ、ポートの書き換えにはわずか3usほどしかかかっていません。古いバージョンをラズパイ2で実行させたときより早いです。ラズパイ3のせいでしょうか。

なおこれはROSで使うようになっているので、roscoreを起動しておくのを忘れないでください。ROSを使わないで試してみるには、roslibとrospyのimportをやめるのとrospy.init_node('iotest')を削除、while not rospy.is_shutdown():を普通のwhile(1):で無限ループさせればよいと思います。

2016年8月22日 (月)

ROSでラズパイのGPIOをちゃんと使うには

【後日追加】WiringPi-Pythonを使ってsudoなしで実行する方法がわかりました。こちらの投稿をみてください。

前回の続きです。このバージョンのWiringPi-PythonではsudoなしではGPIOが使えないのがはっきりしたので、WiringPiを入れるともれなく付いてくるgpioコマンドをpythonから使ってみました。入力ポートで押しボタンの状態を読んで、押されたらLEDを点灯するROSノードです。

#!/usr/bin/env python
import roslib
import rospy
import time
import subprocess

#main
if __name__ == '__main__':
    ### init io port ###
    subprocess.check_call('gpio export 17 out',shell=True)
    subprocess.check_call('gpio export 18 in',shell=True)
    ###
    rospy.init_node('swtest')

    while not rospy.is_shutdown():
        sens = subprocess.check_output('gpio -g read 18',shell=True) 
        if '0' in sens:
            subprocess.check_output('gpio -g write 17 1',shell=True)
        else:
            subprocess.check_output('gpio -g write 17 0',shell=True)
    print('\rStopped')

GPIO18にプルアップされたボタンSWを押すと0になるように接続、GPIO17にLEDを1で点灯するよう接続します。roscoreを起動しておくのを忘れないでください。ボタンを押すとLEDが点灯するはずです。

Dscn3486

これで一件落着と言いたいところですが、まだ問題が残ります。それは実行速度です。下の写真はポートに1を書いてすぐ0を書くという無限ループを走らせた時のポートの波形です。つまりポートに書く関数の実行速度を測定したものです。

これは以前ROSでWiringPi-Pythonを使った場合です。(クリックで拡大します)

Dscn3493 #ラズパイ2で実行

時間軸は5us、1回の入出力にかかる時間は8us程度です。これならモーターの回転数を読んだり、簡易的なPWMを行ったりすることも可能です。しかし、今回のgpioコマンドを使った方法ではそうはいきません。

Dscn3497 #ラズパイ3で実行

一見前の写真と変わりませんが、時間軸が違います。時間軸10ms、波形から読み取れる1回の入出力の時間はなんと16msです。まさに桁違いに遅くなっています。これはシェルコマンドを呼び出している関係でどうしてもしょうがありません。1回の読み書きにこれだけなので、例えば4個のボタンをチェックするには4倍の64mSかかる計算になります。

押しボタンでのUIとか、以前作った「光を追いかけるロボット」くらいのレスポンスなら充分ですが、積極的に制御に使うのはちょっと苦しいですね。前の投稿で書いたようにセンサやモーターが簡単に接続しやすいため、ROSが身近になるという効果は大きいので、この辺は我慢することにしましょう。

2016年8月21日 (日)

WiringPi-Pythonでつまづく

最近はラズパイ3のubutu14.04の再検討でいろいろやっています。ラズパイのI/OにアクセスするWiringPiとそのPythonのラッパー、WiringPi-Pythonでちょっとつまづいたので、投稿しておきます。

そもそもWiringPiを採用したのは、ルート権限での実行が難しいROSのノードからラズパイのGPIOを使いたいからでした。実際、以前の投稿()のようにROSからGPIOにアクセスできていたのですが、新たにインストールしたWiringPiとWiringPi-Pythonだとエラーが出て実行できませんでした。いろいろ調べた結果、定数の名前が変更になっているのと、pythonから呼び出したときに、基本root権限が必要になってしまったというのがわかりました。

これではなんにもなりません。「WiringPi-Pythonからならルート権限なしで使える」と書いてあった英文のサイトもなくなっています。いくつかそういう記事もありますが、いずれも古い内容のようです。それから本日(2016年8月21日)現在WireingPiのサイトhttp://wiringpi.com/に、なぜかアクセスできなくなっています。気がついたのが数日前で、長期メンテにでも入っているのでしょうか。【後日追加】復帰しました

以前ブログで紹介したHanabot2では、現在も問題なく動いています。新たにインストールするとダメなようです。インストールしたバージョンによるようですが、おそらくルート権限なしでアクセスできるのが、そもそもバグだったのではないかと思います。でもこれでは困ります。

幸い、WiringPiをインストールすると使えるようになるgpioシェルコマンドは、新たにインストールしたモノでもsudoすることなしに使えます。こんな感じでポートに出力できます。

$ gpio export 11 out
$ gpio -g write 11 1  #ポート11に1を出力

これをpythonからsubprocessで呼び出せばできそうです。次回は実際にやってみます。

«raspberry Pi3でubuntu14.04の新しい情報