2017年9月29日金曜日

LPC1768で書き込みが出来ない。

私は色々なところに自作のmbedクローンを使っているのですが、初回書き込み時に書き込みがエラーになるという現象にたまに遭遇します。LPC1768はAliexpressから買った怪しい品なのでそれが悪いのかも?
書き込みはlpc21ispを(DDKarmToolというラッパーでGUIにして)使っています。現象としては書き込みのウィンドウが出た後しばらくしたらウィンドウが消えてしまい、書き込みがなされません。
そこで今度はFlash Magicというツールで見てみます。接続が確認された後、ISP→Read Securityで確認したところCode Read Protection (CRP)が掛かっていました。これはマイコン内部のイメージを吸い出しできなくする機能で、簡単に言うとコピー防止ですね。
ISP→Flash All(確か)をするとCRPごと中のイメージが全部消えるので正常に書き込みができるようになります。

2017年9月25日月曜日

次期ロボットSRS004

MFTに出展するなどがあり、今後のロボット製作の方針について考える機会がここ数か月に多くありました。今まで惰性でロボットを作っていて、いわば基礎技術開発のようなことをしていました。しかし結局作っているだけに終わってしまい、ロボットで何かするというところまでたどり着きませんでした。そこで今後は「安く」、「量産できる」、「遊べる」をもっとに新型を作り完成したロボットを使って遊べることを目指します。
とりあえず遊べるロボットを作り、ロボットで遊んだところどうなのか、どうすると良くなるのかについて考えていきたいと思います。
基本設計は実は完了しています。
足回りはオーソドックスに3軸のオムニホイール、しかしエアガンが付きます。個人的にエアガンは気に入っていて、撃ち合い(理想はFPS)が出来るロボットにしたいと思います。緑の板が前に紹介したヒットセンサーでこれを使えばロボット同士で撃ち合いが出来ます。
エアガンの取り付け具のところを試作しました。今まではここをアルミの削りだしで作っていたのでコストが高かったのですが、3Dプリンタとレーザーカッターを使えばいくらでも作れますね。

2017年9月20日水曜日

Maiker Faire Tokyo 2017の電波状況

もう1か月以上たってしまいましたけどMFT2017お疲れさまでした。
MFTの直前で当日の源波状況がとても気になったので、来年のためにレポートしておきます。

WiFiについて

WiFiには十分気を付ける必要があります。WiFiには2.4GHz帯と5GHz帯がありますが、結論から言うと2.4GHzは激混みでしたが、5GHzは普通に使えます。
僕はROS環境でリモートにあるロボットに積んだWebカメラの画像を見るというアプリを動かしていたのですが5GHzで通信したところ2日間何の問題もありませんでした。ただ2.4GHzで試しにつないだところSSHは通ったのですが、画像は送れませんでした。
僕はロボットを出していたので東8ホールだったのですが、一般の電子工作だと東7ホール割り当てられます。そちらの方がWiFiやBluetoothを使っている人が多そうなので、もしかしたらSSHすら通らないかもしれません。

インターネットについて

まずビックサイトにはフリーのWiFiスポットはありません(あっても混んで使えなさそう)。また会場からネット回線を引いてもらうこともできません。しかしdocomoの有料のWiFiがあります。docomoを契約している人なら月300円、契約していなくても日300円ぐらいで使えます。当日使った感じはあまり安定していないけど、調べもの程度なら出来そうな感じでした。

Raspberry Pi で5GHz帯の使い方

Pi 3でも2.4GHz帯しか使えません。家ではこれで大丈夫でも会場ではこれでは動かなくなってしまいます。そこで5Gz帯を使おうと思ってWiFiドングルを調べたのですが、5GHzが使えるものは標準のドライバーで動くものは無く、ソースを落としてコンパイルしたり、物によってはカーネルをバージョンアップする必要があります。なかなか面倒でこんなところで時間を使いたくないので今回はポータブルルーターを使いました(ポケットWiFiではない)。具体的にはエレコムのWRH-583XX2を使いました。ポータブルルーターとは本来はホテルに優先のネットしか着ていないときに、それを無線に変換するもので中身はただのWiFiルーター/APです。ただUSB電源で駆動するようになっているのでロボットに簡単に組み込めます。
またこの製品には子機モードというものがあって、上記の動作の逆で、無線子機として接続するモードがあります。これを使って
Raspberry Pi3<--Ethernet(有線)-->WRH-583XX2-S(子機モード)<--5GHz Wifi-->WRH-583XX2-S(ルーターモード)<--5GHz Wifi-->PC
という構成にしました。Raspberry Piはただ有線でつなげるだけなので特別な設定要りません。

2017年9月12日火曜日

マジックポインター紹介

現実と機械を結ぶデバイス:マジックポインター

従来のジョイスティックを使用した操作では、ロボットの位置や向きを考慮してロボットに移動方向を指示する必要がありました。マジックポインターなら、レーザーポインターで指した位置をコンピューターシステムが認識して自動でロボットを動かします。
今までロボットというと専属のオペレーターが動かすことがほとんどでしたが、マジックポインターを使えばより直感的ににロボットが操縦できるために人とロボットとの新しい共同作業の可能性を秘めています。


ミッション

ロボット技術の進展によりロボットが徐々に身近になってきています。しかし実際に普及しているロボットは工場内での生産用ロボットかせいぜい家庭向けのコミュニケーションロボットぐらいというのが現状です。今後ロボットが様々な場面に入り込み人と協調作業を行うことが予想されます。しかし現状のジョイスティックというインターフェイスではこの協調作業を十分に行うことが出来ません。
今後の人とロボットが協調作業をする未来に向けて新しいロボットインターフェイスが必要です。

システム

マジックポインター

一見ただのレーザーポインターですが、Viveコントローラーを使っていて、ポインター自身の位置、姿勢を取得することが出来ます。このマジックポインターで床を指すと、コンピューターはポインターの位置、姿勢からポインターで指した場所の座標を計算します。
現在の実装では床しか指すことはできませんが、将来的にはレーザー距離計を内蔵し、ありとあらゆるものを指し、座標を取得できるように改良されます。

ロボット

全方向移動ロボットにViveコントローラーを搭載し、ロボットの位置をリアルタイムに取得しています。これによりロボットから見てポインターで指されている位置がどの方向に見えるのかが計算できるために、ロボットを自動的に操縦することが出来ます。


HTC Vive LightHouse & コンピューターシステム

マジックポインター、ロボットの位置、姿勢をリアルタイムにセンシングして、ロボットを自動的に操縦しています。

動画1

説明用の動画です。


動画2

上記の動画1の中での動作デモは実はインチキ(裏で手動で動かしている)なので本当に動いてる様子を載せます。



2017年9月3日日曜日

STmicroのモータードライバ

ロボットを作っていて意外と悩むのがモータードライバです。モータードライバの使い方として
  1. モータードライバモジュールを使う
  2. モータードライバICを使う
  3. トランジスタでHブリッジを使う
僕は自作にこだわるので1は無いのですが、2と3で迷いどころです。最大1AぐらいならモータードライバICはいくらでもあるのですが、表面実装であること、最大4Aぐらい欲しいとなかなかありません。しかしSTmicroからなかなか良いICが出ています。それがVNH3SP30、VNH2SP30、VNH5019です。pololuのページを見れば分かりますが、主な違いを抜き出します。
  • 共通
    • パワー電源: 5.5-16V
    • 1ch
  • VNH3SP30
    • ロジック電源: 5V
    • 最大PWM: 10kHz
    • 最大平均電流: 9A
    • 電流センサー: なし
  • VNH2SP30
    • ロジック電源: 5V
    • 最大PWM: 20kHz
    • 最大平均電流: 14A
    • 電流センサー: あり
  • VNH5019
    • ロジック電源: 3.3V、5V
    • 最大PWM: 20kHz
    • 最大平均電流: 12A
    • 電流センサー: あり
基本的に3.3Vでも使えるのでVNH5019が良いかと思います。IC単体は国内では朱雀技研でしか買えません。1つ1500円ぐらいします。しかしおなじみのAliexpressなら1つ300円台で買えるみたいです。よほどのモーターでない限りはこれで足りますね。

URDFのplanarとfloatingの扱い

ROSでロボットの情報をURDFというファイルで記述します。URDFではロボットをLinkという単位で分けて、それをJointでつなげることでロボットを記述します。ROSwikiにあるようにjointには以下の6種類があります。
  • fixed(固定)
    例えばねじ止めをしている部品同士など固定されているものを表すタイプです。
  • revolute(回転1自由度)
    いわゆるヒンジで、回転できるジョイントですが、回転できる範囲に制限があります。
  • continuous(回転1自由度)
    タイヤの軸などを表すもので、回転するジョイントですが回転範囲に制限がありません。
  • prismatic(並進1自由度)
    リニアガイドやピストンなどの直線的に動くジョイントです。
  • planar(並進2自由度、回転1自由度)
    イメージとしては面と面がくっついている物で、上下左右に動けるのと回転が出来ます。例えば移動ロボットが地面に接触しているのを表すのに使えます。
  • floating(並進3自由度、回転3自由度)
    地面とドローンの関係など、いわば何も拘束が無い状態を示します。
自作ロボットのurdfを製作するブログ記事ではロボットのジョイントを動かす簡易的な方法としてjoint state publisherのGUIを使っています。これは記事を見てもらえばわかるのですが、rvizを起動するとスライダーのウィンドウが出てきて、スライダーを動かすとロボットが動くというものです。
またこのGUIを使わずにプログラムからrviz上のロボットを動かすために/joint_statesというROS topicを通じてjoint_state_publisherにデータを投げることが出来ます。
このようにjoint state publisherによって簡単にrvizでロボットを動作させれるのですが実はjoint state publisherは2自由度以上のジョイント(planarとfloating)に対応していません。joint state publisherではこの2つのタイプの関節はfixと同じものとして扱われます(つまり動かせません)。
ではこの2つのジョイントは使えないのかというとそうではなく、直接tfにデータを送れば動いてくれます。tfの使い方についてはまた別に記事を書きます。
ここで注意としてplanarでジョイントを作ってもtfでは初めに居た平面以外のところの座標も指定できます。またrevolute等の1自由度の関節もtfを使えば、本来設定できない位置を指定することも可能で、警告なども出ません。このあたりの拘束はユーザーの責任で満たさないといけないみたいです。