Who is さくふわめろんぱん

さくふわめろんぱん(@skfwMelonpan)はロボットとか人工知能に興味があるパンです。
自分のために調べたことがみんなの役に立ったらいいなぁ。

2015年10月6日火曜日

RaspberryPiをロボットに使うこと

コンテスト用のロボットにLinuxボードを使うことについて


RaspberryPiが登場したとき、当時マイコンに挫折してた僕の目は輝きました。そしてRaspberryPiを使ったロボットで2つのコンテストに参加しました。周囲にLinuxボードを使う人が増えてきたのは感じますが、ロボットのコンテスト界隈に変化は起きていないように感じます。対してArduinoは確実に浸透して、変化をもたらしたように思えます。そこで、なんでRaspberryPiでロボコンが難しいのかを考えてみました。

難しさ1:初期設定の手間


マイコンは基本的に初期設定とかないし、あるとしても決まった手順を行えばいいです。RaspberryPiなどの初期設定は自分の持っている環境にもよるし、そもそもOSが違えば全く別物なわけです。さぁ買って使おうというときにこうやってつまづくのはテンション下がる。調べた通りにやってるけど自分の環境のせいでうまくいかないなんてことがザラです。

難しさ2:起動時間


これがマイコンからRaspberryPiにすんなり移行できない最大の要因です。マイコンは電源を投入したらすぐ動いてくれます。(モノによってはスタートボタンがあったり)RaspberryPiの場合は電源を入れてプログラムが勝手に動くようにもできますが、OSの起動時間がしばらくあるのでコンテストの競技開始時にスイッチを入れる訳にはいかないのです。電源はあらかじめ入れておいて、スイッチか通信でプログラムを実行する他ありません。

難しさ3:できることの多さ


これはRaspberryPiを使う目的でもあるので、はまりがちなところ。ネットで調べれば分かるように何でもできるのですが、すべてを同時にできるとは限らなかったり、重要でない処理のために全体の処理能力に負担をかけたりします。

難しさ4:複数のプログラムの実行


LinuxというかOSというものは、複数のプログラムを実行するために存在しています。その技術の恩恵をうけて複雑なプログラムを機能ごとに分割したりできます。それに対してマイコンでは基本的に大きな1つの(全部入り)プログラムを書き込むという発想しかなかったので、こういった知識が足りず難儀します。(しました)
例えば...
・実行するプログラムが増えると処理が落ちる
・どれか1つのプログラムが異常終了してたりする
・機能を細分化しすぎて無駄ができる

難しさ5:ノウハウ


研究でLinuxベースのロボットを作ってたりとなると、ここに書いたようなノウハウがあるのだろうけどみんながそうではないですよね。そういうのってノウハウが一般的(あたりまえ)なことすぎて教科書レベルのことから勉強しなくちゃいけなかったり、それこそ経験しないと身に付かないものだったり。RaspberryPi用のロボットOSを勉強するのもアリかもしれません。

結論


コンテスト用のロボット制作というのは、プログラムを書いてテストして修正するのを何回できるかが大きく結果に関わります。そのルーチンをどれだけ速く回せるかにかかってるのに、OSの起動時間なんて待ってられません。今のところの経験をまとめると3点。

  • RaspebrryPiは起動した状態で扱うこと
なるべく早い段階からモバイルバッテリーなど駆動用とは別の長時間つかえる電源で開発を進めましょう。
  • 確実な通信を確保すること
有線LANで直接パソコンにつなぐ通信がベスト。代替えとしてシリアル通信もあり。とにかく通信できないのが一番焦る。
  • 操作基板をつくること
スイッチやインジケーターを載せた基板を使って開発する。単独でも機能するのが1番強い。

従来のマイコンの代わりように使うことが必ずしも良いとは限りません。また、RaspberryPiを使いこなせばマイコンなんて要らないということもないでしょう。うまく使っていきたいものです。

2015年10月4日日曜日

ArduinoでのGPSのデータ処理(ver2)

このブログのアクセス解析を見るとArduinoでGPSを使う記事がよく見られています。
だけど昔に書いたコードだし、いろいろプログラムとしては微妙だなぁと心苦しかったので書き直しました。

String型のDataという配列のData[0]から順番にNMEAのデータが入っていくようになっています。緯度と経度と方位を取得したいのでGPRMCのフォーマットを想定して書いてあります。

学部1年生にも理解してもらえるようにしたかったので、本当はString型の変数を使わないで、char型だけで数値まで持ってきたかったのだけど、汚くなるので断念。String型はメモリも消費する気がするので、多用したくないね。便利だけど。
あと、文字を判定するif文はswitch case文にしてもいいかもね。

フローチャートはこんな感じ。
まだ一般性のあるプログラムとも言えないですが、前よりは良くなったと思います。

簡単に説明すると、
・1文字ずつ読み込んで、文字列にしています。
・NMEAデータをカンマ区切りで文字列型の配列に入れています。
・NMEAデータを1行ごとにデータ処理(数値に変換)しています。
・緯度と経度をlong int 型に変換しているけれど、本当に使う下部分だけにすればint型で十分です。

そのタイミングでロボットの制御をすれば取得周期(だいたいのGPSモジュールは1秒)で制御できます。
もっと制御したい場合は工夫してください(丸投げ)