Software Design7月号未掲載部分

Pocket
LINEで送る

本日発売です。bashのマニアック機能について「使うなよ!絶対使うなよ!!」というテイストで書きました。

で、宣伝部分だと味気ないので、調子に乗って書きすぎて掲載できなかった部分をあまり加工せずに貼り付けておきまっす。bash3.2とbash4.4で挙動の違う例、4.0以降の新機能の例です。

数字のブレース展開のゼロ埋め

ブレース展開においてゼロ埋めができるようになっています。

bash-3.2$ echo {01..03}
1 2 3
bash-4.4$ echo {01..03}
01 02 03

Unicodeのコードポイント指定

Unicodeのコードポイントを指定して文字を出力できます。

###UnicodeとUTF-8の16進数を指定してみる例###
bash-3.2$ echo -e '\U1F363' '\xF0\x9F\x8D\xA3'
\U1F363 🍣
bash-4.4$ echo -e '\U1F363' '\xF0\x9F\x8D\xA3'
🍣 🍣

次の例は、
この機能とxxdというコマンドを使ってUnicodeから
UTF-8へ変換するワンライナーです。

bash-4.4$ echo -en '\U1F363' | xxd -ps
f09f8da3

case文で使う「;;&」

次のcase文は、SHELLという変数の文字列がbashで終わっている場合に
「bash」と表示するものです。「\*bash」というパターンにマッチして
echoを実行し、次の「\*」は評価されずに終わっています。

bash-3.2$ case $SHELL in *bash ) echo bash ;; * ) echo defalut ;; esac
bash

バージョン4.0ではこの挙動に加え、
「;;&」を用いて次のパターンも評価させることが可能となりました。

bash-4.4$ case $SHELL in *bash ) echo bash ;; * ) echo defalut ;; esac
bash
bash-4.4$ case $SHELL in *bash ) echo bash ;;& * ) echo defalut ;; esac
bash
defalut

大文字を小文字に強制変更する変数

declare -lで変数を宣言すると、代入した大文字が小文字に変換されます。

bash-4.4$ declare -l yesno
bash-4.4$ yesno=YeS
bash-4.4$ echo $yesno
yes                   #小文字になる

また、例は省略しますが、declare -uで宣言すると大文字に変換されます。

普通の変数に対して後から小文字大文字を変換することもできます。
変数の後ろに「^」や「,」をつけます。

bash-4.4$ y=YeS
bash-4.4$ echo ${y^^} #大文字に
YES
bash-4.4$ echo ${y,,} #小文字に
yes
bash-4.4$ echo ${y,}  #1文字目だけ小文字に
yeS

ということで

買って読んでいただければ幸いです。

こちらもお願いしまっす!

Pocket
LINEで送る

巻尺は死語?

Pocket
LINEで送る

研究室で「巻尺誰か持ってない?貸して?」と言ったら「なんですかそれ?」と一人に言われ、他の人に「メジャーのことですか?」と聞かれて驚愕したので、アンケートをとってみました。

ということで「使わない」が多数派を占めたので、今後なくなっていく単語のようです。猿股とか大八車とかと同じくらいの死にゆく単語なんでしょうか。

いつもそうですが、こういう話題を投げると知らない人からいろいろリプがありますが、知らない人からのは全く必要ない野次であんまり知見は得られませんでした。

あと、「商品名でこういうものを呼ぶオッサンが許せない」みたいな意見も、リプではなく検索か何かでたまたま目に入りましたが、そういう文化もあるんであんまり腹立てるのは健康に悪いと思います。こういう人はアメリカ人がゲーム機を「ニンテンドー」とか言っているとむしろ喜びそうですが。オッサンが気になるんでしょう。

あと、シェルスクリプトをシェルと言うなというのもありますね。論文とかだとダメだけど、普段使う自然言語は文脈依存なのでいいんじゃないですかね。パブリックに言ってもそれこそ文脈がわからんので無駄です。文脈をすっ飛ばしてそんなこと言ってもパブリックには伝わりません。言いたいことが伝わってないのはあなたです。

そう言っている私も、こいつクソだと思う人間については何やってても腹立つので気持ちはよくわかります。なんでこんなに毒吐いてるのか。

巻尺は結局、研究室の人に貸してもらえました。スムージーの具にすると言ったら優しく微笑んでくれました。

ありがとう。

おうちに帰る。

Pocket
LINEで送る

週末のまとめとか今週の告知とか

Pocket
LINEで送る

週末はだいたいウェブ工作員をしているというのがここ数週で、さすがにちょっとは子供連れて遊びに行った方が世間体的にとか思い出した・・・けど、旅行は地理や歴史の知識がついてからでないと無意味だとわりかし確信を持っているので、近所で遊んでればいいとか正直思っており。と言いつつ行くときは行くんだけど。

ROSをUbuntu 17.04にインストールするスクリプト

古いThinkPadに17.04をインストールしたので、16.04用のROSのインストールスクリプトからちょっといじって作りました。今度魔が差したらRaspberry Piでも試したいところです。

確率ロボティクスの講義資料まとめ

中部大学での3回シリーズのものをまとめました。3回目は今週の水曜ですが、火曜に下記のように疲れる仕事が入っているので前倒し。

火曜に古巣で

セミナーに登壇します。大丈夫でしょうか?自分のことが信用できません。

研究

新種のアルゴリズムと思われるものをROS上に実装して、自宅でロボットなしで動かしてみて入出力の確認をしました。明日アサイチで実機で動作確認予定。

家事

ひたすら家族をフィード。アラの味噌汁を完成度高く作れた。全員分のシーツを一気に洗濯して一気に干したら一気に乾いたので気持ちよかった。

シェル芸の問題

必要があるので少し考えました。乞うご期待。

 

現場からは以上です。

寝る。

Pocket
LINEで送る

週末の出来事と作業等

Pocket
LINEで送る

今週末のできごとです。

自己位置推定のサンプルプログラム

 

このリポジトリ大域的自己位置推定誘拐ロボット問題膨張リセットの例を追加。水曜の中部大の非常勤講師で説明する予定です。

 

ビデオの整理

学部生のときから撮りためてある研究関係のビデオシェル芸勉強会のビデオラズパイマウス関係のビデオを整理して一部をYoutubeにアップ。また、以前から置いてあったTeam ARAIBOの動画も、メニューの「映像集」から行けるようにしました。

研究関係のビデオについては古いのは2001年のものがありました。初代AIBOでサッカーやってるお宝動画が出てきましたが、自分がまだペーペーだったこともあって今回は掲載を自重しました。

Amazonの本の売上ランキング

今週は面白い動きだったのでつい何回も確認していました。ラズパイマウス本も確率ロボティクスもROBOMECH効果なのかよく売れて、Amazonのメカトロ・ロボット工学部門で瞬間的にワンツーになりました(健康食品の宣伝で使われるような細分化されたランキングなので1位自体は珍しくありません)。発売が10年違うものが並んで驚きです。

 

Software Design 1月号の打ち上げ

シェル30本ノック企画に参加された皆さんと少し遅い打ち上げを金曜に行いました。編集の吉岡さんに手配いただきました。大阪、福岡でサテライトを主宰されているくんすとさんとぱぴろんさんもわざわざ武蔵小杉まで駆けつけてくださいまして、話すことが尽きない会とあいなりました。

一次会ではしゃぶしゃぶをみんなで食べたのですが、食べ放題でいくつかメニューから選べるのに、最初に持ってこられたノルマのイニシャル肉が多すぎて、イニシャル肉オンリーフィニッシュがキマッてしまいました。店の策略か、ふだん省エネで生きるシェル芸人の習性ゆえなのか。

 

お通し(違う)

もしかしたら、このメンバーでまた何かあるかもやしれません。ないかもしれません。

その他

 

いちおう家事もやってます。

寝る。

Pocket
LINEで送る

第28回基準値を超えるシェル芸勉強会のまとめ

Pocket
LINEで送る

参加者の方々、会場でお手伝いいただいた方々、サテライトの主催・参加のみなさま、会場を提供いただいたさくらインターネットさん、横田さん、午前講師の今泉さん、共催のjusさん並びにりゅうちさん、LT発表者のみなさま、ありがとうございました。

総括的なコメント

最近、会場の半分くらいの人たちのレベルが人間離れしていますが、初心者でも楽しめる雰囲気はキープできたかと・・・。問題は実用的かつ高難易度でした。

今回は募集が早すぎてドタキャンが多くゆったりめでした。

問題はこちらです。

話が前後しますが、午前の部は今泉さんのシグナルに関するレクチャーでした。ありがとうございました。個人的には擬似シグナル0番というのを知らなかったです。

当日の様子

Twitter上での様子

サテライトの様子

大阪のLTのスライドはこちらにあります。

LTやブログのリンク

写真など

昼食
LT

Pocket
LINEで送る

【問題と解答】第28回基準値を超えるシェル芸勉強会

Pocket
LINEで送る

問題のみのページはこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.28

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールの上、gsedをつかいましょう。BSD系の人は玄人なので各自対応のこと。

注意

今回はいつにも増して一般解を出そうとすると死にますので、欲しい出力が得られればそれで良いということを心がけましょう。

イントロ

Q1

Q1.1

contents.txtについて、「\begin{figure}と\end{figure}」で囲まれた部分を全て抽出してください。

Q1.2

次のようなリストを作ってください。

世界座標系とロボットの姿勢 ./figs/coordinate.eps
計測値 ./figs/observation.eps
ランドマークの計測値から2点の相対姿勢を求める ./figs/two_poses.eps
ランドマークの計測値の不確かさを表す共分散行列 ./figs/observation_noise.eps

解答

Q1.1については、次のようにsedの範囲指定を使います。

$ cat contents.tex | sed -n '/\\begin{figure}/,/\\end{figure}/p'
\begin{figure}[htbp]
	\begin{center}
		\includegraphics[width=0.5\linewidth]{./figs/coordinate.eps}
		\caption{世界座標系とロボットの姿勢}
		\label{fig:coordinate}
	\end{center}
\end{figure}
(中略。略していないものも含めて全部で4つ)
\begin{figure}[htbp]
	\begin{center}
		\includegraphics[width=0.8\linewidth]{./figs/observation_noise.eps}
		\caption{ランドマークの計測値の不確かさを表す共分散行列}
		\label{fig:observation_noise}
	\end{center}
\end{figure}

Q1.2については、不要なデータを削って最後に並び替えます。

$ cat contents.tex | sed -n '/\\begin{figure}/,/\\end{figure}/p' |
 grep -e include -e caption | sed 's/.*{//' |
 xargs -n 2 | tr -d '}' | awk '{print $2,$1}'
世界座標系とロボットの姿勢 ./figs/coordinate.eps
計測値 ./figs/observation.eps
ランドマークの計測値から2点の相対姿勢を求める ./figs/two_poses.eps
ランドマークの計測値の不確かさを表す共分散行列 ./figs/observation_noise.eps

Q2

\sectionから始まる部分を章としたとき、第2章の第1文を抽出してみましょう。ただし、各行の%以降はコメントアウトされた文なので無視してください。

解答

最初に段落番号をつけると簡単になります。

$ awk '/\\section/{a+=1}{print a,$0}' contents.tex | grep ^2 |
 grep -v '\\section' | grep -v '%.*' | sed 's/^..//' |
 sed -n '1,/。/p' | sed 's/。.*/。/'

平面上を移動し、向きを持ち、カメラでランドマーク観測ができるロボットで
graph-based SLAMを実行する方法を考える。

Q3

脚注(\footnote{…})の部分を全て抽出してください。一つだけ、脚注の中にも{}で囲まれた部分があるので注意してください。

解答

まずは脚注の終わりが必ず「。」で終わっているのを利用したズル解答から。grep -Pの最短一致を使います。

$ tr -d '\n' < contents.tex | grep -oP '(\\footnote{.+?。})'
\footnote{この仮定は実用上強すぎるが、実際には、後の計算式から分かるように、2つの姿勢間での値$\psi_{c,t}, \psi_{c,t'}$の差だけが分かれば良い。例えば、2点間で得られた画像の向きを画像処理から割り出すなどの処理で、この差は得られる。}
\footnote{$「10$[\%]」は変数にすべきだが、記号が増えて理解の妨げになるので固定値として説明する。}
\footnote{おそらく$\psi$は$\theta$で置き換えられるので$\psi$を使わない実装もできるが、まだ自分自身では検証していない。}
\footnote{小さい角度なので、$\sin(3\pi/180)$は$3\pi/180$に近似しても良い。}
\footnote{固定しないと世界座標系が決まらない。}

そうでない解は、インデントをつけてから抽出する方法しか、今のところ思いついていません。

$ tr -d '\n' < contents.tex | sed 's/[{}]/\n&\n/g' | sed 's/\\footnote/\n&/' |
 awk '{for(a=0;a<i;a++)printf " "}/{/{i+=1}/}/{i-=1}{print}' |
 sed -n '/\\footnote/,/^ }/p' | tr -d '\n' | sed 's/\\footnote/\n&/g' |
 sed 's/ *} */}/g' | sed 's/ *{ */{/g' | awk '{print}'

Q4

各章(\sectionから次の\sectionまでの部分)を、ファイル名にタイトルをつけて個別のファイルに分けてください。ファイル名のスペースはアンダースコアに変えても構いません。

解答

$ cat contents.tex |
 awk '/\\section/{f=gensub(/ /,"_","g",$0);gsub(/\\section{/,"",f);
gsub(/}$/,"",f)}{print $0 > f}'
###このようにファイルができます###
$ ls
contents.tex  graph-based_SLAMの実装例  はじめに  問題

Q5

このテキストには「○○座標系」という用語がいくつか出てきます。○○にはカタカナか漢字の単語が入ります。これらの「○○座標系」を全通り抽出してください。

解答

$ grep 座標系 contents.tex | mecab -O wakati |
 grep -oE '[^ あ-ん]+ 座標 系' | sort -u | tr -d " "
ロボット座標系
計測座標系
世界座標系
$ grep 座標系 contents.tex | grep -oE '[^ あ-ん{、「]+座標系' | sort -u
ロボット座標系
計測座標系
世界座標系

Q6

各段落の頭に全角スペースを入れてください。

解答

空行を見つけてフラグを立て、普通の文頭かどうか判断して全角スペースを差し込みます。

$ cat contents.tex |
 awk '/^ *$/{f=1}
{if(f && !/^ *$|section|begin|end|^%/){print " "$0;f=0}else{print}}'

Q7

本文の余計な改行を取ってください。(段落内の余計な改行を取るということです。)

解答

q6の出力から続ける例を示します。ゴリ押しです。

$ cat q6 | sed 's/^%.*//' |
 awk '/begin/{if(!stop)print "";stop+=1}
  !stop && !/section/{printf($0)}
  stop || /section/{print}/end/{stop-=1}' |
 sed 's/  /n  /' | sed 's/\\[sub]*section/\n\n&/' 

Q8

contents.texについて、次のように章節項のリストを作ってください。

1 はじめに
2 問題
2.1 ロボットの姿勢と座標系
2.2 観測
2.2.1 ランドマークの識別
2.2.2 ランドマークの姿勢計測
2.2.3 計測値の記録
2.2.4 計測値の誤差
2.3 完全SLAM問題
3 graph-based SLAMの実装例
3.1 グラフのエッジを作る
3.1.1 $\V{\mu}_{c,t,t'}, \V{e}_{c,t,t'}$の計算
3.1.2 $\Sigma_{c,t,t'}, \Omega_{c,t,t'}$の計算
3.2 最適化問題を作る
3.2.1 マハラノビス距離
3.2.2 最適化する式
3.3 $\V{e}_{c,t,t'}$の勾配を求める
3.4 問題を解く

解答

awkで章節項のカウンタを作ってうまく制御するのが一番素直な方法です。(二番目以降は思いつきませんが。)

$ grep section contents.tex | sed 's/{/ /' | grep -v ^% |
 sed 's/\\label.*//' | sed 's/}$//' |
 awk '/^\\se/{s+=1;$1=s;ss=0;print}/\\subse/{ss+=1;$1=s"."ss;sss=0;print}/
\\subsub/{sss+=1;$1=s"."ss"."sss;print}'
1 はじめに
2 問題
2.1 ロボットの姿勢と座標系
2.2 観測
2.2.1 ランドマークの識別
2.2.2 ランドマークの姿勢計測
2.2.3 計測値の記録
2.2.4 計測値の誤差
2.3 完全SLAM問題
3 graph-based SLAMの実装例
3.1 グラフのエッジを作る
3.1.1 $\V{\mu}_{c,t,t'}, \V{e}_{c,t,t'}$の計算
3.1.2 $\Sigma_{c,t,t'}, \Omega_{c,t,t'}$の計算
3.2 最適化問題を作る
3.2.1 マハラノビス距離
3.2.2 最適化する式
3.3 $\V{e}_{c,t,t'}$の勾配を求める
3.4 問題を解く
Pocket
LINEで送る

【問題のみ】第28回基準値を超えるシェル芸勉強会

Pocket
LINEで送る

解答例はこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.28

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールの上、gsedをつかいましょう。BSD系の人は玄人なので各自対応のこと。

注意

今回はいつにも増して一般解を出そうとすると死にますので、欲しい出力が得られればそれで良いということを心がけましょう。

イントロ

Q1

Q1.1

contents.txtについて、「\begin{figure}と\end{figure}」で囲まれた部分を全て抽出してください。

Q1.2

次のようなリストを作ってください。

世界座標系とロボットの姿勢 ./figs/coordinate.eps
計測値 ./figs/observation.eps
ランドマークの計測値から2点の相対姿勢を求める ./figs/two_poses.eps
ランドマークの計測値の不確かさを表す共分散行列 ./figs/observation_noise.eps

Q2

\sectionから始まる部分を章としたとき、第2章の第1文を抽出してみましょう。ただし、各行の%以降はコメントアウトされた文なので無視してください。

Q3

脚注(\footnote{…})の部分を全て抽出してください。一つだけ、脚注の中にも{}で囲まれた部分があるので注意してください。

Q4

各章(\sectionから次の\sectionまでの部分)を、ファイル名にタイトルをつけて個別のファイルに分けてください。ファイル名のスペースはアンダースコアに変えても構いません。

Q5

このテキストには「○○座標系」という用語がいくつか出てきます。○○にはカタカナか漢字の単語が入ります。これらの「○○座標系」を全通り抽出してください。

Q6

各段落の頭に全角スペースを入れてください。

Q7

本文のところだけ改行を取ってください。

Q8

contents.texについて、次のように章節項のリストを作ってください。

1 はじめに
2 問題
2.1 ロボットの姿勢と座標系
2.2 観測
2.2.1 ランドマークの識別
2.2.2 ランドマークの姿勢計測
2.2.3 計測値の記録
2.2.4 計測値の誤差
2.3 完全SLAM問題
3 graph-based SLAMの実装例
3.1 グラフのエッジを作る
3.1.1 $\V{\mu}_{c,t,t'}, \V{e}_{c,t,t'}$の計算
3.1.2 $\Sigma_{c,t,t'}, \Omega_{c,t,t'}$の計算
3.2 最適化問題を作る
3.2.1 マハラノビス距離
3.2.2 最適化する式
3.3 $\V{e}_{c,t,t'}$の勾配を求める
3.4 問題を解く
Pocket
LINEで送る

日記 — graph-based SLAMの解説文(書きかけ)、OS不具合尻拭いスクリプト、ますとどん、今週はシェル芸勉強会

Pocket
LINEで送る

今週末のことを重要なことから。

graph-based SLAMの解説書

確率ロボティクスの日本語ドキュメント・サンプル充実プロジェクトとして、先週はコードのサンプルをjupyter notebookに書くということをやっていましたが、今週は数式で解説するための文章を書いてました。うん。10年仕事が遅い。

まだ書きかけで粗いですが、世界で一番簡単に理解できるようにするつもりです。

Raspberry Pi3にUbuntu 16.04 Serverをインストールするときの便利スクリプト

3月以来、device treeのアドレスがアレでOSをアップデートするとクラッシュするというアレな感じになっている https://wiki.ubuntu.com/ARM/RaspberryPi のラズパイ3用Ubuntu 16.04イメージですが、今度はアップデートでwlan0が見えなくなるというアレな状況になりました。いくらサポートしてないからと言ってなんなんでしょう。

ということで、これらの不具合を回避しながらカーネルをアップデートするためのシェルスクリプトをGitHubのryuichiueda/raspimouse_book_ubuntu_initに置きました。このリポジトリにある after_os_install.bashです。ここにも同じコードを貼りつけておきます。 https://wiki.ubuntu.com/ARM/RaspberryPiのイメージをmicroSDに書き込んでOSを立ち上げてsshでログインし、すぐに適用します。

#!/bin/bash
# (c) 2017 Ryuichi Ueda
# This software is released under the MIT License, see LICENSE at https://github.com/ryuichiueda/raspimouse_book_ubuntu_init.

tmp=/tmp/$$

### purge of the cloud-init ###
sudo apt -y purge cloud-init

### remove the bug on the device tree address ###
cat /boot/firmware/config.txt                                           |
sudo tee /boot/firmware/config.txt.org                                  |
sed 's/device_tree_address=0x100/device_tree_address=0x02008000/'       |
sed 's/device_tree_end=0x8000/#&amp;/'					|
sudo tee $tmp-config 

sudo mv $tmp-config /boot/firmware/config.txt

### stop network device update ###
echo linux-firmware-raspi2 hold |
sudo dpkg --set-selections

### update ###
sudo apt update
sudo apt -y upgrade

### install WiFi tools ###
sudo apt -y install wireless-tools wpasupplicant

sudo reboot

このコードを読むと分かりますが、ファームウェアの自動アップデートを止めていますのでご注意ください。このリポジトリにある他のシェルスクリプトは、ラズパイマウス本の各パートのコードをラズパイにインストールして、各章を飛ばしてしまうためのチート的なものです。

ますとどん

遊んでます。

今のところ謎論理を展開する変なおじさんおばさんがいなくて非常に開放的です。多分、スキル的に彼らがやってくるのは当面先の話でしょう。Twitterでよく絡んでいる人たちも、束の間の自由を楽しんでいるご様子でした。自分が小難しいことをTwitterでたまに言ってしまうのは、変なおじさんおばさんを見てイライラして、そっちの側に回ってしまうという一種の集団ヒステリーなんだなーと反省しました。

 

このサービスについていろいろ評論している人がいますが、もし何かあるなら自然淘汰されるだけなので、ブックメーカーが賭けをしない限り、なんの意味もないと思います。そういう人たちは自分の仕事に集中していないだけなので、気にすることはないと思います。管理者さん頑張れ。

今週末はシェル芸勉強会

今回は募集が早すぎたような気がして、ドタキャンが多い予感がします。どうなることやら。内容は「普通のsed」にしました。普通とは。

寝る。

Pocket
LINEで送る

日記 —Kindle版ラズパイマウス本、確率ロボティクスのjupyter notebook

Pocket
LINEで送る

ここ数日の報告を2点。

Kindle版ラズパイマウス本

出ました。

 

確率ロボティクスのjupyter notebook

MCLにもgraph-based SLAMにもコメントをたくさん入れました。数式もsympyで入れようとしましたが、ごちゃごちゃしたので別紙に書きます。これも真面目にやると時間がかかるのでおおごとになってきました・・・

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