考えたくない人向けWiringPi2導入手順(Raspberry Pi2 Model B, 2015年11月6日現在)

Pocket
LINEで送る

少しずつ情報が古くて一発で行かなかったので。gpioコマンドを使いたくても、Pythonもろともインストールしてしまった方が手っ取り早いようです。

しかしこの情報も、そのうち古くなるのでしょう・・・

2015年11月6日現在です。

$ sudo apt-get install python-dev python-setuptools
$ git clone https://github.com/Gadgetoid/WiringPi2-Python.git
$ cd WiringPi2-Python/
$ sudo python setup.py install
$ cd WiringPi/
$ ./build 

GitHubにもおきました。

一応、連載の関係もあるので、しばらくは不具合の対応をいたします。

Pocket
LINEで送る

(昨日の)日記: LL Ring Recursiveでリングに上がってきた

Pocket
LINEで送る

昨日土曜日はLL Ring Recursiveの観戦に。ロボット学会で慣れない長袖を着て体温調節がおかしくなって風邪ひいてしまい、薬でゴマカして少々遅刻気味で参上。

到着したら(知ってたけど)本当にリングの上で話をしていて笑ってしまうと同時に非日常的な演出に感動しました。

受付あたりは(自分的には)日常だったけど。

トークの内容は最近のブームを反映してIoT、ディープニューラルネットワーク、焼きそばと、それこそ前日までロボット学会で散々聞いてきたことで、ロボット業界チャンスやなあと思って聞いてました。なんでや焼きそば関係ないやろ。

んで、LT枠があるということで、喉痛かったけどやってきました。昼間のテーマに合わせつつ日経Linuxの連載の宣伝(になっているかどうかは不明)。

ソコソコ受けました。それよりリングに上がって嬉しかったという…

風邪ひいてほとんど飲んでないっす。

他、LTでは横田さんと竹迫さんから「危険シェル芸」の言及があり、微妙な感じに感慨深かったです。

実行委員会の皆様、貴重な体験ありがとうございました。

余計なおまけ】

ファイル 2015-09-06 22 57 58

Pocket
LINEで送る

日記 —自己位置推定の実機実装

Pocket
LINEで送る

必要に迫られ、およそ10年数ぶりに実機用のパーティクルフィルタのコードを書いています。売るものではないので公開してますが、ロボットの場合、ハードウェアが違うとコードがそのまま使えないのであまり反響はありません・・・が、ロボットは日経Linuxの連載で使っているRaspberry Pi Mouseで市販品なので、ちゃんとお化粧して教科書書いて小銭を稼ぐ使ってもらうのが目標です。

リポジトリを見ても、「ああC++だなあ(逃げよう)」ということくらいしか分からんのでここに何やってるか書いておくと、次の写真のような環境で、ロボットに地図をもたせて、地図のどこにロボットがいるのか自分で把握させるコードを書いています。センサ情報はロボット前面の四つの赤外線センサから得られます。また、ロボットがどれだけ動いたかはモータへの指令から求めることができますが、壁に接触しながら動くと訳の分からん挙動を示すので大変です。

スクリーンショット 2015-08-09 20.14.35

ロボットは次のような地図を持っています。ロードした地図をテキストで描画する確認用プログラムの出力を示します。シェル芸でしょうか。いいえ、C++です。

uedambp:map ueda$ ./main ./map | head -n 15
+---+---+---+---+
|       |       |   
+   +   +   +   +
|       |       |   
+   +   +   +   +
|       |       |   
+---+   +---+---+
|   |           |   
+---+---+---+---+

この出力をFacebookに貼りつけたら「Rogueみたい」というコメントを書き込むおじさまがたがたくさん釣れたんですが、さあなんのことやら。

今日と明日はロボットのいる大学に行けないのでロボットへの行動指令とセンサの値のログを採取して開発中ですが、とりあえずそれっぽいものができましのでgifアニメをはりつけます。

animation

作っているコードはパーティクルフィルタというものです。地図の上にロボットの分身(ブツブツ)をばら撒いて、行動とセンサの履歴が説明できない分身を殺しまくって、説明できるやつを増やしてロボットの実際の位置に分身の位置を寄せていきます。

上の実行例は実際のロボットの位置を書き込んでないのですが、最終的にはロボットの最後の位置近くにブツブツが固まりました。

まだなんのことかサッパリ分からんと思いますが、続きは某所での講義で。分かってる人には「壁にぶつかったあとのパーティクルの挙動のモデル化が難しかったけど適当な方法でもうまくいった」とお伝えします。

寝る。

Pocket
LINEで送る

例のロボットを今度はHaskellで動かした

Pocket
LINEで送る

今日は某氏が取り仕切るMaker Faire Tokyo 2015に遊びに行きました。大いに啓蒙されたので、帰宅後、俺も何かやろうということで、「Raspberry Pi Mouseはどの言語でも動かせるアピール」の一環としてHaskellでRaspberry Pi Mouseを動かしてみました。

Raspberry Pi Mouseというのは日経Linuxの連載「Raspberry Piで始めるかんたんロボット製作」で作っているロボットです。よく「パソコンのカーソル動かす方のマウス」と間違われるのですが、ここで言っている「マウス」というのはロボット競技のマイクロマウスの「マウス」です。

このロボットをHaskellで動かすわけですが、そのためにはセンサの読み込みとモータの動作を非同期で行う必要があります。私みたいな阿呆でも分かる解説を探していたところ、

Haskellでマルチスレッド処理 – Qiita

が大変分かりやすかったので参考にさせていただきました。

ちゃんとやるにはこの本↓も参考になるかもしれません。(amazonに飛びます。)

コードの前に動いたロボットの様子をお見せすると、

というように、前進して壁を検知したら止まるという動作ができました。たいしたことはやってませんが、滑らかに動きつつセンサの値を読んでいるのがミソです。

このムービーで使ったコードはミニマムなサンプルにして、GitHubにアップしてあります。これで

  • シェルスクリプト(bash)
  • C/C++
  • Python
  • Haskell

と、自分がよく使う4大言語で動きました。デバイスファイルに字を出し入れするだけで動くので当たり前ですが・・・。たぶん、もうやらなくても十分アピールになるかなあ・・・。

Raspberry PiでHaskellを使うときはsudo apt-get install ghcします。

コード

コードは以下のような感じです。もう一度書いておくと、Haskellでマルチスレッド処理 – Qiita のコード(サンプルコードその2)の影響を色濃く受けています。

大雑把な説明ですが、モータを動かすforward関数と、センサ値を読み出すreadSensorという関数がロボットに直接関与しています(デバイスファイルを読み書きしている)。こいつらは両方最後に自分を呼び出していて、readSensorだけ、センサ値が閾値を超えると、その旨をputMVarという関数でrefに反映して処理を終わっています。

forwardとreadSensorを動かしているのはmain関数のにあるforkIOで、これが非同期に上記2つの関数を実行します。watchSensor関数はmainで呼ばれ、refの値を監視してTrueだったらforwardの処理を止め、そうでなかったら再度自分自身を呼び出しています。refの型はMVar Boolで、これは非同期で動くスレッド間で安全に読み書きできるそうです。間違ってたらアレなので、その筋の方のブログや書籍を参考にどうぞ。

import Control.Concurrent
import Control.Monad
import System.Posix.Unistd

-- 単純に前進する関数
forward :: IO ()
forward = do
  -- 車輪を400Hzで0.1秒回す
  writeFile "/dev/rtmotor0" "400 400 100"
  -- 無限ループ(・・・という言い方は不適切か?)
  forward

-- 距離センサを読み出す
readSensor :: MVar Bool -> IO ()
readSensor ref = do
  -- センサを休める
  threadDelay 200000
  cs <- readFile "/dev/rtlightsensor0"
  -- 4つのセンサの値を合計
  let v = sum [ read w :: Int | w <- words cs ]
  -- センサが反応していなかったら再度計測
  if v > 1000 then putMVar ref True else readSensor ref

-- センサに何か反応したらモータのスレッドを止める
watchSensor :: MVar Bool -> ThreadId -> IO ()
watchSensor ref w = do
  tf <- takeMVar ref
  if tf then killThread w else watchSensor ref w

main = do
  ref <- newMVar False
  w <- forkIO $ forward
  _ <- forkIO $ readSensor ref

  watchSensor ref w

この部分だけ見ると、Haskellなのに手続き的なのですが、ここにもっと高度な処理を関数で書いていけるのならば、Haskellで書くメリットも出てくるかもしれません。個人的にはシミュレーションで書いたHaskellの関数が使るという確実なメリットが。

ということでHaskellでロボットが動いたので、後はどなたか関数型言語でロボットを動かす講義をやって欲しい・・・。私はやりません。

参考: Raspberry Pi Mouseって何?

こちらのページで。

Pocket
LINEで送る

Raspberry Pi MouseをC++で動かすとどうなるか(けっこう楽だった)

Pocket
LINEで送る

誰か(たぶんNさん)に書けと言われたような気がするので・・・

日経Linuxで連載中の「Raspberry Piで始めるかんたんロボット製作」では、シェルスクリプトでロボットを動かしています。

まだ連載はモータを動かしたりブザーを鳴らしたりと要素の動作確認の段階ですが、8月発売の号(9月号)からロボットが走ります。こんなふうに・・・地味に・・・

シェルスクリプトで作るのは個人的な特性もありますが、ちゃんとした理由もあります。こんな感じです。

  • 行数が短くて説明しやすいこと
  • プロセスを複数使うことが簡単なこと
  • 良かれ悪かれ誰でもUNIX系のOSをイジる場合、シェルスクリプトを使わなければならないので変にシャレオツな言語を使うよりは無駄にならないこと

といったところです。

また、ロボットは私が無理言ってデバイスファイルで動かすことにしたので、字を読み書きするにはリダイレクトだけで済むようにしました。これもシェルスクリプトだと簡単です。普通の言語だとファイル開いたり閉じたり面倒です。

と言いつつC++

連載はそんな感じでシェルスクリプトでやってますが、限界もあります。

Raspberry Pi Mouseをちょっと本職に使ってみようということで、今度のICRAという学会(ロボット屋にとって一番重要な学会)の実験をやってみました。選んだのはシェルスクリプトでなくC++です。シェルスクリプトを使わない理由で一番大きいのは

  • ロボットの内部状態を表現できない

ことです。複雑なタスクをするロボットのプログラムを書くときは、ロボットが何を考えているかを変数で表現し、その値をコロコロ変えるという方法をとるのが一般的です。しかし、シェルスクリプトを使うとシェルの変数(機能が貧弱極まりない)に書くか、遅いファイル(Raspberry Piの場合はキャッシュがそんなに効かないしファイルはフラッシュメモリ上に書かないといけないので特に遅い)に書くかしないといけないのでちょっと苦しくなります。内部状態を保持してHTTPサーバのようにレスポンスしてくれるサーバのようなコマンドがあればシェルスクリプトから呼び出して使えて便利ですが、わざわざそんなもん作りたくありません。

こうなるとシェルスクリプトで書く旨味は全くないので、何か自分の知っている別の言語を使うことになります。内部状態を表現するということでオブジェクト指向言語を使うということになりますが、遅い言語だと実験がモッサリしたり、計算時間を論文に書く時にえらく損をするので、C++を選びました。

・・・と、いかにも熟慮したかのように書きましたが、ほぼノータイムでC++で、他はありません。こういうときにPython選んで「遅い遅い」言っている研究者が結構いるので、ちゃんと勉強しようよ思いつつ、人のことなので黙っております。

fstreamを使うとそんなに面倒でない

で、上で説明した「普通の言語を使うとファイルに書き込むのが面倒」ですが、C++にはfstreamという強力で素敵なサムシングがあります。例えば、以下は実験用のソース(まだまだ非公開。もちろん自分で書いた。)から、ステップモータにデバイスファイルを通じて周波数を指定するメソッドを抜粋したものです。

void Mouse::putMotorHz(int lvalue,int rvalue)
{
        ofstream r_motor("/dev/rtmotor_raw_r0");
        ofstream l_motor("/dev/rtmotor_raw_l0");
        r_motor << rvalue;
        l_motor << lvalue;
        r_motor.close();
        l_motor.close();
}

ファイル開けて値を書いて閉じるというのはやはりシェルでリダイレクトするより手間ですが、int型の数字をそのまま文字列に変換して「<<」でぶち込んでくれます。(上のメソッド、本当は値のチェックをしないといけないのですがね・・・)

今度は読み込みの例です。距離センサ(値をスペース区切りで4個出力)を読んでいます。これもデバイスファイル(/dev/rtlightsensor0)から読み出した値をintの配列sv(実は厳密にはvector<int>)に直接代入しています。

ifstream ifs("/dev/rtlightsensor0");
if(ifs.bad()){
        ifs.close();
        continue;
}

ifs >> sv[0] >> sv[1] >> sv[2] >> sv[3];
ifs.close();

比較実験はしませんが、FILE型を使うよりはかなり楽で、確か3,4倍くらいFILE型を使うより遅くて済むというくらいのトレードオフだったと記憶しています。また、ファイル処理以外はC言語と比べて最悪でも2倍くらいの減速で済みます。

あと、並列化が必要なら、新しいC++だとPOSIXスレッドがけっこう簡単に使えるので、それも変に凝った言語を使うより(慣れていれば)C++で十分だよなあと思います。たぶん、Raspberry Piのデフォルトのg++は古いので、ココ等を参考に新しいバージョンのgccをインストールして使いましょう。

もちろん、Pythonの例もGitHubに置いているように、特にシェルスクリプトにこだわる必要はなく、研究用の実験をしないならC++にこだわる必要もありません。むしろ言語を選べるように「デバイスファイルで字を読み書きする」という仕様にしましたので、みなさんもいろんな言語でロボットを動かしてみていただければと。個人的にはHaskell希望です。

ところでC++で動かしたロボットの動画はないのかというところですが、実験結果は論文が採択されるまで公表できません。また、どんな言語で動かしてもロボットの動きは一緒ですので、割愛ということで・・・

現場からは以上です。

Pocket
LINEで送る

そういえば日経Linux8月号が発売されてた

Pocket
LINEで送る

連載で使っているロボットを研究で使おうとしてプログラミングに没頭しており、完全に忘れてました。

連載で使うハードはこちらになります。

今回は距離センサを使う&来月以降のためのソフトウェア環境の整備です。シェルスクリプト多めです。

ぜひ。

寝るっすす。

Pocket
LINEで送る

日記(ジュンク堂イベントのまとめ等)

Pocket
LINEで送る

本日はシェル芸ホロン部的なネット工作民でした。

イベントを支えて下さった鎌田さん星さん長田さん今泉さん、そして毎度の事いじってしまった斉藤さんには改めて御礼申し上げます。

ある雑誌のHaskellの記事

最初の校正。あくまで普段使いしている素人の目で書いたけど、例の騒動についても言及。お前が言及すんのかという感じだが、大変残念に思っている一人であり、ああいう自己欺瞞みたいなものとは研究者は絶えず向かい合わなければならない事なので、やはり他人事ではない。

依頼されて査読のようなもの

読んで欲しいとの事で快諾して読んでそのままにしてたら「まだですか?」と催促があり。メール読み返したら確かにフィードバックしなければならなかったようで。内容は秘密だが別分野なのとパラグラフライティングされてなくて読みにくかった。

父の日?

知らんかった。長女と夕飯の買い物の時になにかの宣伝(父の日だから肉食え的な。余計なお世話。)を長女が見つけて「ごめんなにも準備してない」と言ってくれたので、「そんなもの無視して毎日をしっかり過ごしなさい」と返答。心底、そう思う。毎日が父の日であり、娘の日である。

とか言いながら、結婚記念日だけは気にしているな俺と思った。結婚状態を継続することによる緊張感で、脳の当該部分が萎縮しておかしくなっている。

挽肉の脂採取

タコミートを作るために合挽き肉500gを調味料もいれず油もフライパンに敷かずに炒めた。余計な脂は捨てるのだが別の料理に使えるので採取。写真のように湯飲み茶碗に一杯分くらい採取できた。

見かけが番茶っぽいが、一気飲みしたらたぶん死ねる。
  

日経Linux9月号の記事

本日書き出した。いよいよロボットが珍走、いや、暴走、いや、爆走する号。7月号読んでない方はこちらどうぞ。Kindle版。ところで、Kindleという名前は開発者の金銅烈(キムドンヨル)さんの名前からとったらしい。消防署の方から来た消火器売りのおじさんが言ってた。

嘘である。くだらない。実にくだらない。
寝る。

Pocket
LINEで送る

KEIKYUサウンドがこだまする日経Linuxが明日発売なので連載のチラ見せ

Pocket
LINEで送る

日経Linuxがボチボチ発売です。わてくしの連載もなんとか掲載されております。この記事は宣伝です。ええ、宣伝ですとも。士族の商法じゃないんだから書いたら売らねばならんのです。

今回の部品はこちらから購入できます。在庫アリです。

夜露死苦お願い致しやす。

今月の内容

今月の「Raspberry Piで始めるかんたんロボット製作」(まだタイトルが覚えられない)は、ブザーとモータを動かす内容です。まーだまだロボットを動かすところまで行かないのと、部品代が今回からそこそこ大きくなるのが少し申し訳ないのですが、楽しんでいただければと。

今回の個人的な目玉は、ブザーandシェルスクリプトでKEIKYUです。何のことかわからん人はこれを聞いてください。PCの裏にロボットがいます。

記事にも堂々とKEIKYUと掲載する偉業を果たしました。

  

これでも神奈川県と鉄しか分からんと思いますが、要はブザーで演奏するというか、そういう内容です。ただ、それだと単なる趣味になるのでデバイスファイルに字を叩き込む方法についてつらつら書きました。甚だ簡略ながらPWM(pulse width modulation)もデバイスファイルを使ってやってます。

7月号は他にも役に立つ記事満載なので是非買ってちょんまげ頂きたく候。

昨日こんな有様だったので寝不足でテンション高い。

ちなみに先月が連載第一回だったのでチェックしてなかった方は是非前回からどうぞ。

早いけど寝る。あ、やっぱりもうちょっと起きてます。

Pocket
LINEで送る

新連載の日経Linuxが明後日8日に発売されます

Pocket
LINEで送る

追記(5/6): 最初「明日8日」って書いてたけど明日は7日じゃまいか!・・・大変申し訳なく・・・orz

表題の通り、明後日5月8日に私の新連載第1回が掲載される日経Linux6月号が発売されます。

今回のテーマは私の元々の専門のロボットで、ロボットを組み立てていき、Raspberry Pi上でプログラミングして、部品や完成したロボットを動かすというテーマです。

連載の特色は、「ハードをいじらないロボット屋」である私が、ロボットのキットを作る株式会社アールティさんにソフト屋の立場からワガママを言いまくって成り立っている点です。

どっちでも動かせるので、どっちでも検証しなければならないので辛い。
どっちでも動かせるので、どっちでも検証しなければならないので辛い。

続きを読む 新連載の日経Linuxが明後日8日に発売されます

Pocket
LINEで送る