jus共催 第30回危念シェル芸勉強会の報告

Pocket
LINEで送る

昨日、2017年8月26日、さくらインターネットさんのセミナールームにて第30回のシェル芸勉強会を開催しました。

共催の日本Unixユーザ会さん、さくらインターネットさん、横田さん、宮川さん、常連さん、初参加の方々、参加されたUSP研究所のお二方、ありがとうございました。

そして、午前の講師の鳥海さん。昼食に行くときに置き去りにして、さらに昼食後も置き去りにし、マルエツで買い物袋を運ばせ、大変失礼いたしました。

今回の傾向

今回は前半がテキストファイルの編集でsedを使う問題が中心、後半がパズルや数学でした。いつもと違うのは、Pandocやhubコマンド、LLの虚数計算などの紹介を入れたことでした。問題を解くときにはこれらのライブラリの存在やオプションを調べ、セットアップするのに時間がかかったかもしれません。

また、どちらかと言うとソフトウェアを消費する側にとどまりがちなシェル芸界隈でも、巨大プロジェクトに成長する可能性が皆無ではないプロジェクトが立ち上がりました。

嘘ですスミマセン!いや、皆無ではない。

リンク集

まとめ

サテライト会場の様子

当日の動画

午前

午後

LT(いろいろ際どかったのでカットされてます)

スライドやブログ

福岡、大阪関係のものは当地にお任せします。

↓午前の鳥海さんのスライド。ツイッターやらない(幻のアカウントは持っている)ので代理で石井さんが投稿。

LTは平均的に危険でした。

↓N氏から発表のあったシェルスクリプト製のライフゲーム

💩

宣伝

シェル芸メンバー(そういう概念はあるのか?)で連載してます。よろしくお願いしまーす。

Pocket
LINEで送る

第2回 ラズパイマウスで京急VVVF音(ドレミファインバータ)

Pocket
LINEで送る

以前、ラズパイマウスのブザーで京急し、それを日経Linuxに掲載する暴挙を成し遂げたことがあったのですが、今度はステップモータの音で京急することにしました。

注意: 「京急する」はサ行変格活用の動詞で、意味は京急に励むことです。

次のビデオが結果です。音と速度が比例して加速していますが、わずかなのでわかりづらいかもしれません。

ビデオのとおり、完璧とはいかないまでも、おおかた京急でした。おそらく、ホームに赤い電車でなく、ラズパイマウスが到着しても誰も違いに気づかないのではないでしょうか。

コードはこのような殴り書きですので、後日京急する暇があったら京急して整理します。

寝る。

Pocket
LINEで送る

Jupyter notebookで確率ロボティクスのコードを書いていくプロジェクトを始めた

Pocket
LINEで送る


表題の通りの新プロジェクトを始めました。この前まではプログラミング言語兼シェルのGlueLangを作ってましたが、これは一段落がついてOSCかどこかで発表をするというフェーズに入っています。ユーザがほとんどいませんが、地道に増やして行きたいです。歳をとると(そうでなくても)、やむを得ない理由もないのに手が止まって評論家みたいになっちゃう人たちがいるのは、Facebookで地球マーク持論撒き散らし系を見てるとよく分かるかとは思いますが、自分は死ぬまでそうはならんぞと、一人、誰に頼まれているわけでもなく意気込んでいます。(なんで毒づいているんだろう?)

 

あ、安心してください。ちゃんと研究も履いてますよ!じゃなかったやってますよ!

新プロジェクトでやること

今回やることは、10年前に翻訳したこの本:

のアルゴリズムと、本に掲載されていない新しいアルゴリズムをjupyter notebookで記述することです。ご存知の方も多いはずですが、確率ロボティクス関係のコードの例は@Atsushi_twiさんがMatlabで書いていらっしゃるので、見比べて参考にしていただければと。図が似ちゃってすみません。

目的

  • 講義で使う(予定があるだけでも大学院の後期の講義、とある中部地方の大学での非常勤講師、五月のロボット学会のセミナーと色々)
  • 自分で書いたコードでないと説明が大雑把になるので自分で一通りコードを書く
  • 翻訳本に引き続き日本語のドキュメントを充実してパブリックに晒す

もちろん、最先端ではないのですが、特に日本語話者で基本的なアルゴリズムを知っている人が増えて層が厚くなれば、最先端を目指す人も増えるだろうと考えています。もちろん、自分も早く最先端に追いつきたいのですが、もうちょっと時間がかかりそうですし、教育も重要なのでバランスよく貢献したいと思ってます。

さっそく2つ作った

とりあえずMonte Carlo Localizationgraph-based SLAMを実装しました。リンク先にはコードだけでなく、図も出力されています。jupyter notebookとGitHubの機能はただただ素晴らしいですね。(PCから閲覧しないと、コードや図が見えずにJSONのデータが見えてしまうかもしれません。)

解説はコードの中に書いていく予定(少し書いてありますが、なんとなく英語で書き始めてしまったので日本語にしていきます)ですので、ここでは画像だけ貼ってお茶を濁すことにします。まだ始めて4日目なので、細かい話はご勘弁を。

Monte Carlo Localization

この図は、ロボットがランドマーク(星)の距離と見える向きを測って自己位置推定している様子です。ロボット(赤い矢印)が座標(0,0)の原点からスタートして、ぐるっと円を描いて、今は原点の下あたりにいます。

 

現在の赤い矢印の下に、青い矢印の集団がいますが、この矢印一つ一つはランドマーク観測とデッドレコニング情報から推定されたロボットの候補点(パーティクル)です。灰色の矢印は、デッドレコニングのみで推定したときのパーティクルを比較で表示したもので、青い矢印より拡散して推定がボケているのが分かります。

右下のランドマークに水色の楕円がたくさんあるのは、ロボットのランドマーク計測結果を各パーティクルの位置からプロジェクションしたもので、この楕円がランドマークの位置に近いパーティクルが、次のステップのパーティクルを生成するときに重視されます。

graph-based SLAM

確率ロボティクスになかった(GraphSLAMという似たものはある)ので、新たに説明文を作るには自分で実装するしかなく、このプロジェクトを始めたきっかけになったアルゴリズムです。GraphSLAMとはちょっと違うという認識ですが、どこが違うか(確かデッドレコニングのデータの扱いだったような)はもう一度読まないと思い出せません。解説の文章はこちらにありますが、同様の内容のものが書いたご本人によってアップされているので探してみていただければと。

graph-based SLAMはオフラインの地図生成手法で、ロボットのデッドレコニング情報とランドマーク計測の情報を集めてから、後処理でロボットがたどったパスを求め、そこからランドマークの位置を求めます。図は、上が集めた情報、下が集めた情報からSLAMでパスを求めた結果です。赤の矢印がロボットの真のパス、灰色が推定値で、上の図ではデッドレコニングで求めたパスそのままですが、下では修正されて赤の矢印に近くなっています。なお、ランドマーク計測では、ロボットからの距離と見える向きの他に、ランドマークにも向きがあって、ロボットからそれが観測できるという前提を置いています。ランドマークは互いに識別可能という前提も置いています。

 

水色の楕円は二箇所から同じランドマークを観測したときに、一つの位置からもう一方の位置がどこに推定されて、その信頼性(共分散行列)がどのように広がっているかを示しています。要はこれらの楕円を推定されるパス上に寄せていくことで推定を進めていくのがこのアルゴリズムです。ピンク色の線は推定位置から見えたランドマークの位置を指しており、これも推定が進むと正解の位置に揃ってきます。

 

なお、センサの精度を上げてやるともっとドンピシャで合ってかっこ良いのですが、さすがに都合が良すぎるのでちょっと下げてやってます。

 

とりあえず5月の講演に向けてちまちま作っていく所存。

Pocket
LINEで送る

GlueLangのwhere句の実装

Pocket
LINEで送る

 GlueLangは、その場で使うファイルを次のような書き方で作れます。Haskellから拝借しました。bashの$()がコマンドの引数にあると綺麗に見えないので、whereの中にそういう細かい処理は押し込んでしまおうという意図です。

import PATH

#passwdファイルの一番下のユーザの名前でpasswdファイルをgrepする
grep re '/etc/passwd'
  where
    str re = tail -n 1 '/etc/passwd' >>= awk '-F:' '{print $1}'

bashだとこうなります。

grep $( tail -n 1 '/etc/passwd' | awk '-F:' '{print $1}' ) '/etc/passwd'

 これの実装をするにはスコープを真面目に設計・実装する必要がありますが、GlueLangはシェルなので、基本「スコープはforkしたときに持っていた情報の範囲」で良く、whereのためだけにスコープを作ることになります。これがこれまでグダグダだったので、昨夜遅くコソコソと直してました。具体的には、

  • 変数に、どのジョブに属するのかIDをつける
  • 各要素が解釈されたときに、要素のインスタンスにこれまで分岐してきたジョブのリストを渡す
  • 変数を探すときに、そのリストの逆向きたどる

という処理を加えました。リストを解釈された要素全部に渡すので無駄なのと、ジョブが消えても変数が残ったままになっているという状況ですが、あとから改善します。

Pocket
LINEで送る

GlueLangの仕切り直しメモ

Pocket
LINEで送る

突然情報の学科からロボットの学科に戻ることになって止まっていたGlueLangの開発をちょぼちょぼと再会することにしました。

ただ、ドキュメントがないと開発の指針も立たないし、何やってるか外から分からないので、ドキュメントを作っていくことにしました。

ドキュメントはこちらです。このドキュメントのソースはこっちです。

GlueLangのリポジトリはこちらです。

Pocket
LINEで送る

Python2.7でOpenCVを使ったコードをTravis CI(まだUbuntu 14.04)でテストするときの設定

Pocket
LINEで送る

新年早々ドハマりしたのでメモ。環境はTravisCI標準のUbuntu 14.04(いつになったら16.04になるんでしょうか?!?!?!)。OpenCVはaptで入るバージョンです。

.travis.ymlはこんな感じ。PYTHONPATHを設定するという正解にたどり着くまでに3時間くらいかかりました・・・

sudo: required
dist: trusty

script:
  - sudo apt-get update
  - sudo apt-get install libopencv-dev python-opencv
  - export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages
  - ./test.py

./test.pyというのはこれ。

#!/usr/bin/env python
import cv2
print cv2.__version__

PYTHONPATHの設定がないと

$ ./test.py
Traceback (most recent call last):
  File "./test.py", line 2, in 
    import cv2
ImportError: No module named cv2

となってテスト(といっても何もテストしてませんが)が失敗します。

PYTHONPATHの行を加えてテストを走らせてログを見ると

libdc1394 error: Failed to initialize libdc1394

と出ますが、./test.pyの終了ステータスは0で無事に成功と表示されました。

デスクトップでも「ImportError: No module named cv2」と出るときはPYTHONPATHを疑うということで。

補足

PYTHONPATHで加えるべきディレクトリは

sudo find / | grep -F cv2.so

で検索できるので、.travis.ymlに書いて探すとよいでしょう。

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で送る

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

Pocket
LINEで送る

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

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

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

ぜひ。

寝るっすす。

Pocket
LINEで送る

日記(ロボカップ初日、兄弟本のAWK本)

Pocket
LINEで送る

AWK実践入門の予約が始まったようです

私の「シェルプログラミング実用テクニック」の兄弟本であるところの「AWK実践入門」の予約が始まったようです。私のが酔拳ならこちらは少林寺拳法のような王道だと思われます(まだ見せてもらってないのでなんとも言えませんが)。

続きを読む 日記(ロボカップ初日、兄弟本のAWK本)

Pocket
LINEで送る