MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Pythonの数式処理ライブラリSymPyをWolfram Alpha(Mathematica, Maxima)の代わりに使う方法

目次

 

Wolfram Alphaの問題点

以前、Wolfram Alphaがすごいという記事を書きましたが、

myenigma.hatenablog.com

myenigma.hatenablog.com

不満もあります。

それは複数行のコードを読みこませることができなかったり、

以前の計算の結果を使って、再計算するようなことができないことです。

また、計算されたデータなどを自由にグラフ化することもできません。

 

上記のような問題を解決するためには、

Wolfram Alphaの元になっているMathematicaや、

Mathematicaのフリー版であるMaximaを使うのがいいですが、

それぞれ独自の言語実装なので、

少しハードルが高くなってしまいます。

 

そこで今回おすすめなのが

Pythonの数式処理ライブラリSymPyです。

f:id:meison_amsl:20151121222658p:plain

 

今回はこのSymPyについて説明したいと思います。

 

Sympyとは?

SympyはPython製の数式処理モジュールです。

 

式の展開から、微積分、

方程式の解など、

いわゆるMathematicaやWolfram Alphaができる

代数処理をPythonで実現することができます。

 

また、SymPyはpythonのデフォルト機能のみで作成されており、

他のライブラリに依存していないため、

利用しやすいという特徴があります。

 

ブラウザでSympyを使う

SymPyのHPには、

Sympyを試すことができるブラウザツールがあります。

 

これが非常に便利で、

少し数式を確認したいだけであれば、

このブラウザSympyのみで十分だと思います。

f:id:meison_amsl:20151121205625p:plain

 

ブラウザ内でフルスクリーンモードにしたり、

コマンドラインを初期化したりできます。

一番うれしいのは上記の図のように、

計算された数式をLatexを使って描画してくれるところです。

スクリーンショットを撮れば、

プレゼンなどにも使えるのでいいですね。

 

ちなみにこのブラウザSymPyは

Google App Engine上で動いているみたいです。

 

JupyterでSymPyを使う

下記の記事のように、

Pythonのインタラクティブ実行環境Jupyter Notebookで

SymPyを使うこともできます。

myenigma.hatenablog.com

 

インストール

基本的にはpipでインストールできます。

pip install sympy

 

また、pythonのライブラリをひとまとめにした

Anacondaにもsympyが入っているので、

こちらをインストールしても、SymPyが使えるようになります。

Download Anaconda now! | Continuum

 

Sympyの数式処理の例題

Sympyを使った数式処理の例を説明します。

ちなみに下記のサンプルコードでは、

from sympy import *
x = Symbol('x')
y = Symbol('y')

のようにSymPyがインポートされ、

x,yなどの変数が指定されていることを前提にしています。

前述のブラウザSympyでは、上記のインポートは不要です。  

多項式展開

expandを使うと式を展開してくれます。

expr = (x + y)**5
expand(expr)

f:id:meison_amsl:20151121212823p:plain

 

方程式をある変数で解く

solve関数で、解きたい変数の指定することで、

指定の変数で式を変形してくれます。

expr = cos(x) * ln(y) + 2/y
solve(expr, x)

f:id:meison_amsl:20151122103359p:plain

連立方程式を解く

前述のsolve関数を使うのですが、

複数の連立方程式を解きたい場合は、

それぞれの方程式と、解きたい変数をリストにして

solveに渡すことで解くことができます。

x, y, z = symbols('x y z')
eq1=x * y * z + 234
eq2=x + y + z - 20
eq3=5 * x - y + 2 * z - 85
solve([eq1,eq2,eq3], [x,y,z])

f:id:meison_amsl:20160504215513p:plain

 

数値を代入する

subs関数を使うことで、

変数に数値を代入し、その結果を表示できます。

f = x**2 + 3*x + 2 
f1 = f.subs([(x, 1)])

f:id:meison_amsl:20151122110120p:plain

 

微分

diffという関数を使います。

x,y = symbols('x y')
f = x**2 / y + 2 * x - ln(y)
diff(f,x)

f:id:meison_amsl:20151121221226p:plain

 

積分

integrate関数を使うと積分してくれます。

expr = cos(x) * ln(y) + 2/y
integrate(expr, x)

f:id:meison_amsl:20151122104548p:plain

 

テイラー展開

series関数を使うと、

指定した式のテイラー展開をすることができます。

sin(x).series(x)

f:id:meison_amsl:20151121215124p:plain

 

極限

limit関数を使います。

一つ目の引数が極限を求めたい関数

二つ目の引数が先ほどの関数の中で、極限を求めたい変数

三つ目の引数が、先ほどの変数をどの値に限りなく近づけるかです。

ちなみに無限大∞を表すには、アルファベットのo(オー)を2つ並べて表します。

limit(sin(x)/x, x, 0)
limit(sin(x)/x, x, oo)

f:id:meison_amsl:20151122212422p:plain

 

その他

その他のSymPyの使い方に関しては、

下記のSymPyのドキュメントや

下記のサイトではSymPyの使い方をランダムに表示してくれるので、

使い方の勉強ができます。

 

Sympyを使ったエンジニアリング例題

実際にSympyを使った数式計算をしてみたいと思います。

三次元の回転行列を計算する

下記の記事における三次元の3つ回転行列を掛けあわせた行列を計算してみます。

myenigma.hatenablog.com

 

下記のコードを実行すると、

theta=Symbol("theta")
chi=Symbol("chi")
phi=Symbol("phi")
Rx=Matrix([[1,0,0],[0,cos(theta),-sin(theta)],[0,sin(theta),cos(theta)]])
Ry=Matrix([[cos(chi),0,sin(chi)],[0,1,0],[-sin(chi),0,cos(chi)]])
Rz=Matrix([[cos(phi),-sin(phi),0],[sin(phi),cos(phi),0],[0,0,1]])
print(Rx*Ry*Rz)

下記が表示されます。

Matrix([[cos(chi)cos(phi), -sin(phi)cos(chi), sin(chi)], [sin(chi)sin(theta)cos(phi) + sin(phi)cos(theta), -sin(chi)sin(phi)sin(theta) + cos(phi)cos(theta), -sin(theta)cos(chi)], [-sin(chi)cos(phi)cos(theta) + sin(phi)sin(theta), sin(chi)sin(phi)cos(theta) + sin(theta)cos(phi), cos(chi)cos(theta)]])

先ほどのSymPy Liveを使うとこのように数式が表示されます。

(行列の一つの項が長いので、かぶってしまっていますが。。。)

f:id:meison_amsl:20151121210818p:plain

 

先ほどの記事内での資料と同じ数式になっているのがわかります。

これで三次元空間での回転行列の式が計算できました。

 

SymPyによるCコードの出力

実は、SymPyには、

SymPyで表現された数式で計算を実施する

Cコードを自動生成する機能があります。

Codgenというモジュールを使います。

  

下記がサンプルコードです。

前述のブラウザSymPyで計算するときにも、

モジュールのインポートが必要になります。

 

from sympy.utilities.codegen import *
[(c_name, c_code), (h_name, c_header)] = codegen(("f", sqrt(x*x+y*y+z*z)), "C", "test")
print c_code
print c_header

 

c_codeとc_headerに生成されたCコードが入っています。

表示させると下記のようになるはずです。

f:id:meison_amsl:20151122114204p:plain

f:id:meison_amsl:20151122114210p:plain

  

codegenの二つ目の引数がSymPyによる数式

4つ目の引数がクラス名になります。

 

SymPyはJupyterと一緒に使うとかなり便利

SymPyはターミナル上で実行しても良いですが、

Jupyter Notebook上で実行すると、

計算の過程などがすべて残って非常に便利です。

f:id:meison_amsl:20170513152411p:plain

  

Jupyter Notebookに関しては下記を参照下さい。

myenigma.hatenablog.com

 

一つ注意点として、

Jupyter Noterbook上でSymPyを使用して

計算された数式などをJupyter上に表示させたい場合は、

Jupyter Notebook上で下記のコマンドを実行しておく必要があります。

import sympy
from sympy import init_printing
init_printing()

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

 

ロボットのための慣性計測装置(IMU)入門

目次

Inertial Measurement Unit (IMU)とは?

Inertial Measurement Unit (IMU)は、

角速度と加速度を検出するための

センサ群を一つにまとめたセンサです。

Inertial Navigation Uni: INUや、

Inertial Guidance Unit: IGU

Inertial Rreference Unit: IRUとも

呼ばれることがあります。

 

一般的には、センサの直交する3軸に対して、

3つのジャイロセンサと

3つの加速度センサを取り付けた

ものを1つのセンサとして構成し、

そのようなセンサをIMUと呼ぶことが多いようです。

もしくは、ジャイロや加速度センサの

バイアス誤差を補正するために、

地磁気センサや傾斜センサ、

GPSを取り付ける場合もあります。

 

このIMUセンサは以前は非常に大きいものでしたが、

最近は、それぞれのセンサを小型化する技術

(Micro-Machined Electromechanical Systems:MEMS技術)

が向上したため、

IMUセンサの小型化と軽量化が実現されています。

 

IMUは、ジャイロセンサと加速度センサが搭載されているので、

3軸の角速度と加速度を取得することができます。

また、この値を上手く利用し、計算することで

センサの角度や速度、位置までも計算することができます。

このようにIMUのセンサのみを使って

センサの位置や角度を推定することを慣性航法といいます。

 

ジャイロセンサの原理

本章では、良く使用されるジャイロセンサの

基本的な原理について説明したいと思います。

 

振動ジャイロ(MEMS)の原理

現在、最も一般的なジャイロは、

Micro Electro Mechanical Systems:MEMS技術を使った

振動ジャイロです。

 

このジャイロは、MEMSのシリコン素子を振動させ、

その時にセンサに回転運動が加わると、

シリコン素子にコリオリ力が発生するため、

その力から逆計算をして、角速度を計算するセンサです。

f:id:meison_amsl:20180513171630p:plain

 

MEMSジャイロは下記のような特徴があるため、

現在、非常に広く使われるようになりました。

利点:

  • サイズが小さい

  • 軽量

  • 消費電力が少ない

  • 振動などに強い構造

  • 起動時間が短い

  • 大量生産により、製造コストが低くなる

  • メンテナンスがあまりいらない

  • 対環境性が高い

一方、下記のような欠点もあります。

欠点:

  • 光学式のジャイロと比べて、計測精度が低い

  • 経年劣化がある

近年、MEMSのジャイロの計測性能が向上したことにより、

広く使用されるようになっています。

 

ちなみに、大抵の場合、

ロボットの回転中心とジャイロセンサの測定中心は一致しませんが、

コリオリ力は、回転中心の位置に無関係なので、

問題なく角速度を測定できます。

また、ジャイロセンサに並進の加速度が付加されても、

観測値は影響をうけません。

 

Fiber Optic Gyro(FOG)の原理

Fiber Optic Gyroは下記のように

光ファイバーの中の光が、センサの回転により干渉する現象

(サニャック効果)を検出して、角速度を検出するセンサです。

サニャック効果 - Wikipedia

 

MEMSのセンサと比べて、

計測性能が高いですが、

センサとしてのコストが高いという問題があります。

 

慣性計測装置の名称の意味(IMU, VG, AHRS, GPS/INS)

慣性計測装置は様々な企業で製品化されていますが、

同じセンサを使っていても、それぞれの機能に応じて、

名称を変えていることが多いです。

メーカによりますが、

米国においては下記のような名前で統一されているようです。

 

IMU (Inertial Measurement Unit)

IMUは3軸の加速度計と角速度センサ(ジャイロ)のみで

構成されているセンサです。

下記で説明するストラップダウンによる姿勢情報は出力しないことが多く、

加速度と角速度のみを出力センサをIMUと呼ぶことが多いようです。

VG (vertical gyro)

VGはセンサの構成としては前述のIMUとしては同じですが、

この記事の後半で説明しているストラップダウンという方法で、

重力方向を基準としたロール角とピッチ角を出力します。

 

AHRS (Attitude Heading Reference System)

AHRS(エーハース)はIMUセンサに電子コンパスを搭載し、

VGで出力されるロール角とピッチ角だけでなく、

ヨー角(方位)も出力できるようにしたものです。

電子コンパスとヨー方向のジャイロセンサで、

真北を0度としたセンサの方位を計算するものが多いようです。

GPS/INS

最後に、GPS/INSは前述のAHRSにGPSを加えて、

3次元空間の位置(x,y,z)と姿勢(roll,pitch,yaw)のすべてを出力するシステムです。

前述のAHRSは加速度センサのみしか搭載されていないので、

無理やり位置を計算しても、

位置精度が発散してしまうという問題がありますが、

それをGPSの位置情報で補正することで、

位置をある程度の精度で推定することができます。

名称まとめ

上記をまとめると下記のようになります。

センサ名 ジャイロ 加速度センサ 電子コンパス GPS 角速度出力 加速度出力 ロール角・ピッチ角出力 ヨー角出力 位置出力
IMU
VR
AHRS
GPS/INS

 

ジャイロと加速度センサにおける性能評価項目

市販しているジャイロや加速度計のスペックを見ると、

様々な性能仕様値があります。

ジャイロや加速度計のスペックの内、

代表的なものを下記で説明します。

 

バイアス誤差

バイアス誤差は、

入力が0の時(センサが静止時)に、

出力される値のことです。

実際はセンサは動いていないのに、

出力が出るということは、計測誤差になります。

 

ジャイロの場合は、

このような誤差をドリフト誤差といい、

加速度センサの場合、

このような誤差をバイアス誤差と言うことが多いようです。

ちなみにオフセット誤差は、

センサの電源を入れた時のバイアス誤差のことを言うようです。

 

このバイアス誤差は、

どのような慣性センサにおいても少なからず発生するものであり、

温度変化や振動などにより発生します。

このバイアス誤差は大抵、deg/h(またはdeg/s)という単位で仕様化されます。

これはセンサを静止させた時に、

一時間角速度(or 加速度)を積算した場合の姿勢誤差を表します。

 

現在のMEMSセンサではバイアス誤差が

ジャイロ: 1~10deg/h

加速度センサ: 1-100 μg

であるものが多いようです。

 

直線性(リニアリティ)誤差

f:id:meison_amsl:20151109102530p:plain

スケールファクタ誤差は、

データから最小二乗法で計算した直線に対して、

直線と計測値の最大の差を検出範囲で割った値です。

 

上記の図のように、ジャイロは

ある角速度と出力電力を線形補完して出力しますが、

その近似直線と観測値の最大ずれの値を、

検出範囲で割った値(単位%FS)を性能値として評価します。

例えば、±100deg/sの検出範囲のジャイロで、

最大2deg/sの近似誤差がある場合、

スケールファクタ直線性誤差は、

2 ÷ 200 = 0.01= 1%FS

となります。

この値が良ければ良いほど、

様々な入力角速度を入れた場合でも、

精度が劣化しないことを意味します。

 

スケールファクタ誤差

スケールファクタ誤差(単位%)は、

近似曲線の傾きの振れ幅を表す性能値です。

1%の場合、近似曲線の傾きが1%の幅で変動することを意味します。

 

また、これらのスケールファクタの精度値は%ではなく、

ppm(Parts per million)という単位で表されることもあります。

ppm と % の解説 - 大東医療ガス Daitoh Medical Gas - 埼玉県越谷市で各種ガス販売

このppmは%が100分率である一方、

ppmは100万分率を意味します。

つまり、下記のような変換ができます。

0.0001 % = 1 ppm

 

ランダムノイズ(ホワイトノイズ)

特定の周波数特性を持たない出力値のバラつきを表します。

 

ジャイロにおいては、

このランダムノイズをdeg/hr/√Hzという単位で表すことが多いようです。

これは、ランダムノイズが各周波数によって変化することを意味しており、

√Hzで割ることによって、すべての周波数領域において正規化しています。

 

例えば、ランダムノイズの値が1deg/hr/√Hzのジャイロの場合、

1000Hzの周波数帯域では、

1×√1000=31.6deg/h

1Hzの周波数帯域では、

1×√1 = 1deg/hr

のランダムノイズが発生することを意味します。

 

加えて、

角度のランダムノイズのことをランダムウォークといいます。

角速度のランダムノイズの単位はdeg/hr/√Hzですが、

角度のランダムウォークの単位はdeg/√Hzで表されます。

(角速度を時間積分すると角度になるため)

センサによっては、ランダムウォークの方で性能値を表す場合もありますが、

下記の式で変換することができます。

1deg/√hr = 60 deg/hr/√hr

 

ジャイロ性能の総合的な評価方法であるアラン分散について

前述のように、ジャイロには様々な種類の計測誤差がありますが、

それらの情報を一つのグラフで表現する方法があります。

それがアラン分散です。

 

アラン分散という考え方は、元々周波数安定性を評価するために発明されたのですが、

ジャイロの性能を表すのに便利だったため、ジャイロの性能を表すのに広く使われています。

 

下記の図は、あるジャイロセンサのアラン分散を表したグラフです。

f:id:meison_amsl:20151111174425p:plain

アラン分散は横軸がデータの平均を取る時のサンプリング区間を表しており、

縦軸はサンプリングされたデータによる分散を表しています。

つまり、左に行けば行くほどサンプリング区間が短いため、

瞬間的なデータの分散になります。

前述したジャイロの誤差を考えると、

短い時間ではバイアス誤差は殆ど発生しないため、

グラフの左側の領域の分散値はランダムノイズやスケールファクタ誤差を表します。

 

一方、右側はサンプリング時間が長いため、

沢山のデータの平均を取っていると考えると、

先ほどのランダムノイズなどの誤差の影響は小さくなります。

しかし、長いサンプリング時間を取るとバイアス誤差による影響が大きくなるため、

グラフの右側の分散はバイアス誤差による分散を表しています。

 

上記のアラン分散のグラフを見ると、

左から分散値が下がっているのは、時間平均を取ることによりランダムノイズの影響が小さくなり、

分散の減少が止まって、増大に向かうのは、サンプリング時間が長くなったことで、

バイアス誤差が与える影響が大きくなり分散が大きくなったと考える事ができます。

殆どのジャイロは同じようなアラン分散の形をしているようです。

 

上記のアラン分散のグラフを各ジャイロセンサ同士で比較することにより、

各ジャイロのランダムノイズの影響やバイアス誤差の影響などを

一つのグラフで比較することができます。

 

下記のサイトではジャイロのデータからアラン分散を計算するソフトウェアが公開されています。

Allan Variance Software

 

IMUに使用する三次元幾何学・運動学の基礎知識

IMUは3次元空間での運動や姿勢を観測するものなので、

IMUを使いこなすためには、

3次元空間における幾何学や運動学が重要になります。

そこで、IMUの基本的なロジックに使用する

三次元幾何学・運動学の基礎知識について説明したいと思います。

3次元空間におけるの回転行列 

IMUを使用する場合、

三次元空間におけるベクトルの回転が重要になります。

回転行列の詳しい説明に関しては、下記の記事を参照下さい。

myenigma.hatenablog.com

 

IMU(6軸)センサにおける状態方程式

下記の記事が非常にわかりやすいです。

hamachannel.hatenablog.com

  

IMUによるストラップダウン方式 の姿勢計測

ストラップダウン方式による姿勢計測は、

大きくわけて2つの計測モードで計測されます。

一つ目は姿勢角を初期化するアライメントと、

ジャイロセンサによる姿勢更新を実施するレート積分です。

これらについて簡単に説明します。

 

アライメント(レベリング)

IMUが取り付けられた物体が静止(または定速運動)している時に、

加速度センサや傾斜センサで、姿勢の角度を初期化することを指します。

傾斜センサの場合は、傾斜センサの出力値(またはその時間平均値)をそのまま、

ロール角やピッチ角とすればOKです。

 

一方、加速度センサを使う場合は、

3軸の加速度センサの情報を使えば姿勢を計算できます。

地球上にいる限り、常に物体には重力加速度(9.80665 m / s2)が

地球の中心方向にかかります。

停止中は、IMUにはこの重力加速度のみがかかると仮定できるため、

3軸の加速度センサの値から、重力方向を計算し、

その値からセンサの姿勢(ロール角とピッチ角)を計算することができます。

 

x軸が物体の進行方向と同じ方向に

IMUを取り付けたとすると、

x,y,z軸に沿った加速度値ax,ay,azから、

物体のロール角は下記の式で、

ピッチ角は下記の式で計算することができます。

加速度の生データにはノイズが含まれることが多いため、

大抵は先程の式の結果を時間平均値して、姿勢を求めることが多いようです。

 

上記の方法で、停止時のロール角とピッチ角は計算できますが、

ヨー角(方位角)は加速度センサでは初期化出来ません。

大抵は磁気コンパスや、2GPSにより方位を初期化することが多いですが、

実は、IMUのジャイロのみを使用して方位角を推定することができます。

それがジャイロコンパスです。

 

ジャイロコンパスは、地球の自転を観測することにより、

センサの方位を計算する手法です。

センサが真北を0度として、θの角度を向いている時、

地球の自転と公転によるロール角速度(x軸)とピッチ角速度(y軸)、ヨー角速度(z軸)は、

下記の式で表されます。

ここで、Ωは地球の自転 (15deg/h)と公転 (0.04deg/h)を加えた

Ω=15.04deg/hを意味します。

またλはセンサの緯度です。

上記の計算式から、下記の式で方位を計算することができます。

また、一定速度で回転することができれば、ωxやωyの変化の極値を取ることで方位を計算することもできます。

 

しかし、上記のジャイロコンパスを使って方位を求めるためには、

15.04deg/h = 0.00417deg/sであることから、

0.001deg/s以下の分解能と精度を持つジャイロでなくては、

方位を計算することは難しいという問題もあります。

 

レート積分

前述した加速度計を使った姿勢推定や、

傾斜計を使った姿勢推定は、

加速度が無い静止状態か等速運動をしている時以外は

精密に姿勢を求めることができません。

なぜなら両方とも重力加速度以外の加速度は無いことを仮定しているからです。

もし、物体が加速している場合には、

これらの姿勢推定の結果は精度が悪いものになってしまいます。

 

そこで静止状態以外では、

各軸のジャイロによる角速度を積分することで、

姿勢を推定するのが一般的です。

これをレート積分といいます。

 

下記のように角速度情報を離散積分して角度を推定します。

 

上記のレート積分はジャイロの誤差が積算してしまうので、

適度にセンサが停止した際に、前述の方法でアライメントを実施し、

姿勢情報を補正する必要があります。

 

カルマンフィルタのアルゴリズム

一般的に上記のIMUのストラップダウンなどの計算を

安定的に行うためには、カルマンフィルタが利用されます。

カルマンフィルタの詳細については下記の記事を参照下さい。

myenigma.hatenablog.com

 

その他のロボティクスアルゴリズムのサンプルコードや関連資料

その他のロボティクス関連のアルゴリズムについては、

下記のリポジトリにいくつかサンプルコードを置いているので、

こちらを参照下さい。

github.com

github.com

 

また、その他ロボティクスに関連する資料は下記を参照下さい。

myenigma.hatenablog.com

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

ソフトバンクiPhoneからIIJmioのSIMを使ったSIMフリーiPhoneにMNPを使って鞍替えした話

目次

 

はじめに

これまでソフトバンクiPhoneを3GS, 4GS, 5GSと

計6年渡り歩いてきましたが、

海外でSIMカードを差して使いたいことと、

月々の携帯代を減らすために、

ソフトバンクiPhoneを卒業して、

SIMフリーのiPhoneにチャレンジすることにしました。

 

iPhone契約方法の詳細説明

今回は、ソフトバンクiPhoneから

MVNOの一つであるIIJmioのSIMを使って

SIMフリーiPhoneに鞍替えした方法について

できるだけ詳しく説明したいと思います。

 

1. iPhoneを選ぶ

自分の場合、

iPhone6s, 6s Plusが発売されたらすぐに、

近くにビックカメラに行って、

店頭に並んでいるiPhoneを見て、色とサイズを決めました。

 

自分の場合、できるだけサイズが小さいのがいいことと、

前のiPhoneが32GBでデータ量に不安があったので、

iPhone 6s 64G スペースグレーにすることにしました。

 

2. SimフリーiPhoneを買う

続いて、SimフリーiPhoneを買いました。

日本では下記のApple Stopのオンラインストアで購入できます。

 

自分は10月の末に購入したので、

お届け日が明日になっていました(笑)

値段はiPhone 6s 64G スペースグレーで

10万円弱でした。

 

ネットで購入した次の日、

ヤマト運輸でiPhoneが届きました。

f:id:meison_amsl:20151027135313j:plain

 

付属品は前回iPhone5sと買った時と

殆ど変わってない感じですね。

f:id:meison_amsl:20151027135322j:plain

 

3. IIJmioのSIMカードを手に入れる

続いて、SIMカードを手に入れました。

SIMカードに関しては下記の記事のように、

沢山あって迷いましたが、

 

友人の口コミと、

SIMカードの切り替え時に電話不通の状態が短くなる

おうちでナンバーポータビリティが始まったこと、

そして、複数のSIMカードを使うことができるプランがあることから、

IIJmioのSIMカードにすることにしました。

 

IIJmioの料金プランとソフトバンクの料金プランの比較については、

この記事の後半を参考にしてください。

 

IIJmioのSIMカードを手に入れるのは、

Amazonでスタートパックを購入するのが良いようです。

IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043

IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043

 

上記のリンクから様々なタイプの

SIMカードを購入することができます。

自分の場合、iPhone6sでSIMカードを使いたいので、

音声付き、SMS対応のものを購入しました。

f:id:meison_amsl:20151024122523p:plain

購入した時に、IIJmioのSIMがキャンペーン中だったので、

80%引きの648円で購入できました。

 

このスタートパックは、携帯契約時の新規登録費用のようなもので、

音声SIMの場合、このスタートパックに書かれている

パスワードなどを使って、ネットで契約をすることになります。

この契約の際に料金プランなどを選ぶことができ、

その後にSIMカードが送られてくる形になるようです。

 

Amazonで購入した二日後、

下記のようにスタートパックが届きました。

f:id:meison_amsl:20151027141806j:plain

 

これから先の手続きには、

MNP転出元のソフトバンクの予約番号が必要なので、

予約番号を取得する方法を続いて説明します。

 

4. ソフトバンクからナンバーポータビリティ(MNP)で電話番号を引き継ぐ

続いて、ソフトバンクのiPhoneの番号を引き継ぎたいので、

下記のHPに書いてある電話に電話をかけて、

携帯電話番号ポータビリティ(MNP)の予約番号をもらいます。

ソフトバンクショップに直接行って、予約番号をもらうこともできます。

この予約番号を元に、IIJmioのHPで契約をする形です。

 

一つ注意点として、一般的にMVNOにMNPで番号を引き継ぐ場合は、

引き継ぎ元(ソフトバンク)の携帯の名義名と、

引き継ぎ先(iijmio)の携帯の名義名が同じである必要があります。

ですので、もしソフトバンクの携帯の名義などが、

親などになっている場合、事前に予約番号を受け取る前に、

ソフトバンクショップなどで名義変更をする必要があります。

 

ソフトバンクのMNP予約番号に電話した所、

5分ほど待たされましたが、

意外とすぐに電話が繋がりました。

Y Mobileに変更しないか?

やソフトバンク内で機種変更しないか?

などと聞かれましたが、

きっぱりと断ると、意外とすぐに申請は終わりました。

その後すぐにショートメールで

MNP予約番号が送られてきました。

  

5. IIJmioのホームページでSIMカード契約をする。

続いて、先ほどAmazonで購入した、

スタートパックと、MNP予約番号を使って、

IIJmioのSIMカードの契約をします。

 

スタートパックに書いてる通りに進めればOKでした。

下記のURLから申し込みができます。

ちなみに、上記のURLから申し込みをすることにより、

通常の申し込みよりも二ヶ月間、

10%分高速通信データ量が多い状態で申し込むことができます。

是非、利用してみてください。

  

また、SIMカードのサイズを指定する所がありますが、

iPhone6SはnanoSIMですので、nanoSIMを選びます。

住所やクレジットカードなどの情報を普通にいれればOKでした。

 

また自分の場合、音声通話付きのSIMだったので、

本人確認書類の画像をアップロードする必要がありました。

携帯で運転免許証の写真を取り、それをアップロードすればOKです。

 

その後数日後に、本人確認のメールが入り、

そして、そのまた数日後、家にSIMカードが届きました。 

下記の紙の中にSIMカードが入っていました。

f:id:meison_amsl:20151106213602j:plain

f:id:meison_amsl:20151106213607j:plain

 

あとはSIMカードをiPhoneに装着します。

iPhoneの説明書に付属の金具を使って、

iPhoneの右側の穴をさせば、トレーが出てくるので、

その中にSIMカードを挿せばOKです。

 

SIMカードを挿せば、

後述するナンバーポータビリティの番号変更前に

WifiのみでiPhoneを使用することができます。

自分の場合、何故かはじめにWifiを捉えることができなかった

という問題がありましたが、iPhoneを再起動したら

問題が解決し、Wifiに繋ぐことができました。

 

6. おうちでナンバーポータビリティで番号を移行する

最後に先ほどのSIMカードと一緒に入っている説明書通りに、

IIJに電話をすることで、

電話番号の移行を完了することができます。

このようにSIMカードが届いてから、

電話番号が移行できるため、

電話番号の不通の時間をできるだけ少なくすることができるのが、

iijmioの特徴です。

 

説明書に書かれている電話番号に電話をし、

自動応答の説明通りに、

携帯電話番号と、

SIMカードのケースに書いてるパスコードを入力すればOKです。

 

自分の場合、電話した約2時間後、

ソフトバンクのiPhoneが圏外になりました。

 

その後、IIJmioのiPhoneの通信設定をする必要があります。

下記のiijmioのHPから通信設定用のAPNをダウンロードしても良いですが、

自分の場合、後の章で詳しい説明をしている

IIJmioクーポンスイッチアプリからAPNをダウンロードしました。

 

上記のアプリを起動し、ヘルプボタンを押した後、

一番下にある構成プロファイルのインストールボタンを押すと、

iPhone用の設定をダウンロードすることができます。

 

すると、下記のスクリーンショットのように、

docomo LTEの表示が、左上に表示されればすべての設定終了です。

f:id:meison_amsl:20151107113512p:plain

 

ソフトバンクとIIJmioの速度比較

ソフトバンクiPhone5Sと、

今回のIIJmio iPhone 6Sの速度を比較してみました。

場所はほぼ同じ所で測定しています。

(場所は神奈川の某所です)

 

下記はソフトバンクiPhone5Sです。

f:id:meison_amsl:20151027140725p:plain

 

下記はiijmioのiPhone6Sです。

f:id:meison_amsl:20151107113947p:plain

 

あれ? IIJmioの方が上りも下りも早い。。。。(笑)

嬉しい誤算ですが、おそらく時間なども関係あるので、

少し使ってみて、また追記したいと思います。

 

また、テザリングも試してみましたが、

全く問題なくサクサクブラウジングできました。

 

いずれにせよ、MVNOと言っても

段違いに遅いということは無いみたいですね。

良かったです(^^)

 

iPhoneの保護シールを買う

iPhoneにカバーを付けるのは嫌い派ですが、

iPhoneを高く下取りに出すためには、

液晶を守る必要があります。

 

そこで、いつも保護シールだけは貼るようにしています。

今回は目を守るために、

下記のブルーライトカットのものにしました。

 

SIMカードホルダーを買う

今後はこのSIMフリーiPhoneを使って、

世界各国を旅行する予定なので、

様々な種類のSIMカードを保管できる

下記の商品を買いました。

TSdrena SIMカードケース MBM-CSIM-A

TSdrena SIMカードケース MBM-CSIM-A

 

4枚のSIMカードと、

SIMカード交換用の金具を、

クレジットカード大のホルダーに保管することができます。

パスポートケースのカード入れに

入れることができるので便利です。

f:id:meison_amsl:20151212122822j:plain

f:id:meison_amsl:20151212122913j:plain

  

またMVNOの業者によっては、

解約時にSIMカードを返却することを

義務付けている場合もあるので

このようなホルダーを使って

ちゃんとSIMカードは管理した方が良いです。

 

IIJmioの料金プラン

IIJmioのプランは2015/10の時点で下記の通りです。

f:id:meison_amsl:20151024122954p:plain

 

将来的には、ファミリーシェアプランにして、

iPadなどにも差して使おうと思いますが、

今回は初めてIIJmioを使うので、とりあえず

月5Gで2220円のライトスタートプランにしました。

基本的には、2220円と、

通話料金の和が月額料金になります。

 

ちなみに、下記のURLから申し込みをすることにより、

通常の申し込みよりも二ヶ月間、

10%分高速通信データ量が多い状態で申し込むことができます。

是非、利用してみてください。

 

これまで使ってきたソフトバンクが

月7G、3日で1G以上データ量を使用すると速度制限だったのですが、

月7G使い切ることはなかったのでとりあえず5Gにしました。

どちらかというと、

3日1Gの速度制限の方に苦しめられていたので、

IIJmioはそれが無いのがいいですね。

 

ちなみにSMNの値段は下記のリンクに書いてあります。

料金・仕様 | SMS機能付きSIM | IIJmio

f:id:meison_amsl:20151024125915p:plain

受信は無料で、文字数に応じて値段が変わるようです。

ソフトバンクのSMSの値段は送信が一律3円なので、

SMSを多用する人はちょっと割高なりそうです。

基本月額が5000円ぐらい違うので、その差を埋めるほどではないですが。

SMS/MMS | メール | サービス | モバイル | ソフトバンク

 

通話の値段は下記の通りです。

料金・仕様 | SMS機能付きSIM | IIJmio

f:id:meison_amsl:20151024130359p:plain

30秒20円が基本ですが、

後述するみおふぉんダイアルというアプリを使うと、

30秒10円と半額になります。

みおふぉんダイアルアプリ

みおふぉんダイアルアプリ

  • Internet Initiative Japan Inc.
  • ユーティリティ
  • 無料

ソフトバンクの電話料金を比較すると、

プランにもよりますが、他社への電話料金が30秒20円なので、

そんなに変わらないですね。

ホワイトプラン(i) | iPhone | 料金・割引 | モバイル | ソフトバンク

IIJmioは電話料金も安いようです。

 

IIJmioの特製アプリの使い方

IIJmioのSIMを使う場合、

IIJmioが無料で公開している特製アプリを上手く使うと、

より一層便利にIIJmioを使うことができます。

 

IIJmioクーポンスイッチ

IIJmioクーポンスイッチ

IIJmioクーポンスイッチ

  • Internet Initiative Japan Inc.
  • ユーティリティ
  • 無料

IIJmioクーポンスイッチは、

バンドルクーポンを消費してしまう高速通信のON/OFF設定や、

高速通信の通信料の確認ができるアプリです。

 

高速通信を使い過ぎたなと思った場合は、

このアプリを使うことでデータ量の制御をすることができます。

 

詳しい使い方は下記の記事を参考にしてもらえると良いと思います。

 

みおふぉんダイヤル

みおふぉんダイアルアプリ

みおふぉんダイアルアプリ

  • Internet Initiative Japan Inc.
  • ユーティリティ
  • 無料

前述しましたが、みおふぉんダイヤルは、

IIJmioのユーザが電話をかける時に、

通話料が半額になるアプリです。

 

楽天でんわと同じ方式で、電話番号にプレフィックスをつけて

電話をかけることで通話料を

通常の30秒20円から、

30秒10円と半額になります。

 

また、このアプリを使っても相手側に通知される電話番号は、

プレフィックス無しの通常の電話番号になるので、

通常の電話アプリで電話した場合と同じになるので便利ですね。

 

SkypeやLINEのようなIP電話ではなく、

携帯電話回線を使うので、音声品質も良いようです。

 

また、何故か国際電話も30秒10円と国内と同じ値段なので、

日本国内から海外に電話をかける場合も非常にお得になります。

しかし、注意点としては、

発信できる国が限られていることと、

国際ローミングには対応していないので、

海外からIIJmioのSIMの入ったスマホから電話かけることはできません。

国内 → 海外(一部)のみなので注意しましょう。

対応している国に関しては下記の記事を参考下さい。

   

IIJmio解約時における費用

自分のようにIIJmioの音声SIMを購入した場合、

ソフトバンクのように2年の自動契約&高額解約手数料はありません。

 

IIJmioの場合、下記のように

(12- 契約期間(月)) x 1000円の解約手数料がかかります。

解約時に違約金や手数料が発生することはありますか? | IIJmio

つまり一年契約すれば、その後はいつ解約しても無料ということです。

 

古いiPhone5sを下取りに出す

上記の方法で、新しいiPhone6sはちゃんと動くようになりましたが、

折角なので、ソフトバンクの古いiPhoneを下取りに出して、

お小遣いをゲットすることにしました。

 

ネットで調べて3つの買い取りサービスの

見積もり結果を比較した所、

下記の買い取りサービスが最も買い取り価格が高かったので、

下記の会社にお願いすることにしました。

 

iPhone購入時の外箱や付属品が

すべて残してあったということもありますが、

SoftbankのiPhone5s 32GBで、

約15000円ぐらいになりました(^^)。

嬉しいですね。

 

買い取りは、査定をネット上で行って、

iPhoneと身分証明書のコピーを着払いで送るだけでした。

 

ちなみに一つ注意点として、

一般的な日本のキャリアからiPhoneを購入した場合、

ネットワーク使用制限というものがあります。

これは分割で払ったiPhoneの支払いが終わっていない場合などに、

下取りに出そうとすると、この制限がかかってしまうというものです。

この制限にかかっていると、iPhoneを下取りに出す時に、

買い取り値段が非常に低くなってしまいます。

ですので、下取りに出す前に自分の旧iPhoneが

このネットワーク制限にかかっているかどうかを確認しておきましょう。

 

ソフトバンクの場合は、

下記のサイトに書いてある方法で、

www.softbank.jp

iPhoneの製造番号(IMEI)という値をメモしておき、

下記のサイトでその番号を入力すると、

SoftBank

自分の端末がネットワーク利用制限しているかどうかがわかります。

事前にチェックしておき、

もし制限がかかっている場合は、

ソフトバンクに問い合わせをした方が良いと思います。

 

ANAのマイレージユーザはIIJmioを新規契約するとマイルがたまる

下記の記事のように、

ANAのマイレージユーザは

IIJmioに新規登録すると、月々マイルが貯まるようになりました。

既存ユーザは対象外なので、

自分は無理でしたが。。。

 

iijからおしゃれなモバイルバッテリーとピンバッチ, ワイヤレスイヤホン, Androidスマホをもらいました。

#iijmio からイカしたピンバッジと可愛い携帯バッテリーもらった(^ ^)。ありがとう#iij これからも愛用します♪

f:id:meison_amsl:20161219150201j:plain

タダでAndroid端末ゲットした。初めてのAndroid

 

この記事を見て、iijmioに登録していただける人が増え、

結果として、上記の写真のように

おしゃれなモバイルバッテリーとピンバッチ、

そしてSonyのワイヤレスイヤホン,

Android スマホであるZenfone3をiijから頂きました。

登録して頂いた方々、ありがとうございました。

 

前述の通り、

上記のURLから申し込みをすることにより、

通常の申し込みよりも二ヶ月間、

10%分高速通信データ量が多い状態で申し込むことができます。

是非、利用してみてください(^^)。

 

最後に

ついにSIMフリーデビューしました。

今の所、料金も品質も、乗り換えプロセスも

非常に満足しています。

今後は海外のSIMとかも使ってみて、

いろいろレビューしていきたいと思います。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

東大JSKが公開しているクールなROS可視化ライブラリを使ってみる

目次

はじめに

東京大学情報システム工学研究室は、

日本を代表するロボット系の研究室です.

 

また、いち早くROSを研究で使用し始め、

様々なROSソフトウェアをGithub上で公開しています。

github.com

(ROSに関しては、末尾の参考文献参照)

 

その中でも素晴らしいのが可視化ライブラリです。

rvizのプラグインやrqtのプラグインをいくつも公開しており、

下記の図のように、かっこいい可視化を実現してくれます。

(図は公式ドキュメントから引用)

OverlayText — jsk_visualization 1.0 documentation

Pictogram — jsk_visualization 1.0 documentation

PieChart — jsk_visualization 1.0 documentation

 

今回、この可視化ライブラリを使ってみたので、

その方法についてメモ書きしておきたいと思います。

 

JSK可視化ライブラリをまとめたリポジトリを作った

github.com

 

上記のJSKの可視化ライブラリを使おうとした所、

他のROSパッケージに結構依存しているようだったので、

いくつかの可視化ツールに必要なものだけをForkして、

単体で利用できる一つのリポジトリを作りました。

github.com

 

いくつかの可視化ツールはコンパイルできなかったですが、

主要なツールはこのリポジトリをソフトをチェックアウトし、

git clone https://github.com/AtsushiSakai/jsk_visualization_packages.git

catkin_makeするだけで使えるようになるはずです。

 

ちなみにROSのバージョンはindigoです。

indigo - ROS Wiki

 

可視化用rvizプラグインの使い方

公式のドキュメントはこちらです

jsk_visualization — jsk_visualization 2.1.3 documentation

jsk_rviz_plugins — jsk_visualization 1.0 documentation  

いくつか面白かったものツールを下記で紹介します。

OverlayText

OverlayText — jsk_visualization 1.0 documentation

 

OverlayTextは、rivzの正面に文字を描画するプラグインです。

jsk_rviz_pluginsのカスタムメッセージである、

jsk_rviz_plugins/OverlayTextに描画したい文字などを書き込んで、

送信すると表示してくれます。

jsk_rviz_plugins/OverlayText Documentation

バックグラウンドや文字の色を変えたり、

テキストの位置や、折り返しの位置、

フォントなども変えることができるようです。

 

上記のソフトをビルドしていれば、

下記のコマンドで可視化サンプルを見ることができます。

roslaunch jsk_rviz_plugins overlay_sample.launch

 

Plotter2D

Plotter2D — jsk_visualization 1.0 documentation

Plotter2Dは、std_msg/float32のデータをグラフと一緒に描画してくれる

プラグインです。

電圧値や、速度など、一次元の値の時系列変化を確認したい時に便利です。

こちらのプラグインは、

様々な設定をrvizのDisplay Panelで設定することができます。

f:id:meison_amsl:20151029223043p:plain

グラフの位置、

トピック名の有無、

グラフの線の太さ、

グラフの囲い線の有無など、

様々な設定をすることができます。

また、auto color changeにチェックを入れると、

自動でその値が低くなると、グラフを赤くしたりしてくれます。

 

上記のソフトをビルドしていれば、

下記のコマンドで可視化サンプルを見ることができます。

roslaunch jsk_rviz_plugins overlay_sample.launch

 

PieChart

PieChart — jsk_visualization 1.0 documentation

 

PieChartは先程のPlotter2Dと同様に、

std_msg/float32のデータを円グラフとして表示してくれる

rvizプラグインです。

 

下記のように

最大値と最小値をDisplay Panelで設定することで、

その値に即した円グラフを描画してくれます。

f:id:meison_amsl:20151030214927p:plain

Plotter2Dと同様に、auto color changeを設定することで、

値の変化にあわせてグラフを色を変えることができます。

 

上記のソフトをビルドしていれば、

下記のコマンドで可視化サンプルを見ることができます。

roslaunch jsk_rviz_plugins overlay_sample.launch

  

Bounding Box

f:id:meison_amsl:20151030215557p:plain

 

Bounding Boxはrvizの三次元空間上に直方体を描画する

rivzプラグインです。

 

jsk_recoginition_msg/BoundingBoxに直方体の位置と、

大きさを指定すると、その直方体が描画されます。

jsk_recognition/BoundingBox.msg at master · jsk-ros-pkg/jsk_recognition

このBounding Boxを複数格納したBoundingBox Arrayもあります。

jsk_recognition/BoundingBoxArray.msg at master · jsk-ros-pkg/jsk_recognition

 

SimpleOccupancyGrid

f:id:meison_amsl:20151031205718p:plain

 

SimpleOccupancyGridは、

複数枚のグリッドマップを表示するrvizプラグインです。

 

jsk_recognition_msgs/SimpleOccupancyGrid.msgの

アレイメッセージを送信することで、

複数のグリッドマップを描画することができます。

それぞれのグリッドマップの原点は、

平面の方程式の4つのパラメータを

coefficientsベクトルに入れることで、

様々な方向のグリッドマップを描画することができます。

 

また、auto colorにチェックを入れると、

それぞれのグリッドマップを色分けすることができます。

 

加えて、このグリッドマップはそれぞれx,y,zで与えることになり、

zは先ほどの平面の方程式を基準とした高さとして

グリッドが描画されるので注意しましょう。

f:id:meison_amsl:20151031210737p:plain

 

上記の可視化はsampleフォルダ内で

下記のスクリプトを実行することで

サンプルデータを描画することができます。

python sparse_occupancy_grid_sample.py

 

OverlayMenu

f:id:meison_amsl:20151031213013p:plain

 

OverlayMenuは上記の図のように、

rvizの中央にメニューを表示することができる

rvizプラグインです。

 

下記のメニューで、

メニューのリストと、

選択したメニューのインデックスを渡すことで

メニューを表示することができます。

jsk_visualization/OverlayMenu.msg at master · jsk-ros-pkg/jsk_visualization

Serviceなどで何かモードを選択したりした時に、

このプラグインを使うと、かっこいいかもしれませんね。

 

上記の可視化はsampleフォルダ内で

下記のスクリプトを実行することで

サンプルデータを描画することができます。

python overlay_menu_sample.py

 

PolygonArray

f:id:meison_amsl:20151101085348p:plain

PolygonArray — jsk_visualization 1.0 documentation

 

PolygonArrayは複数のポリゴンデータを表示する

rvizプラグインです。

 

下記のような、geometry_msgs/PolygonStampedで

構成されたデータをpublishすることで、

複数のポリゴンのデータを可視化することができます。

jsk_recognition/PolygonArray.msg at master · jsk-ros-pkg/jsk_recognition

geometry_msgs/PolygonStamped Documentation

ポリゴンデータ以外にも、数値のラベルや、

それぞれのポリゴンの尤度などを設定することができます。

 

DisplayPanelには下記のような様々な設定があります。

f:id:meison_amsl:20151101085405p:plain

coloringがAutoの場合は、

それぞれのポリゴンに個別の色が設定されます。

only borderがONの場合はポリゴンの境界だけが、線で描画されます。

show normalがONの場合は、

ポリゴンの法線ベクトルが矢印で表示されます。

normal lengthで矢印の長さも指定できます。

 

Pictogram, Pictogram Array

f:id:meison_amsl:20151101212403p:plain

f:id:meison_amsl:20151101212415p:plain

PictogramとPictogram Arrayは、

一つ、または複数のピクトグラムを描画するrvizプラグインです。

 

下記のメッセージにをpublishすると、

対応したピクトグラムを表示してくれます。

jsk_visualization/Pictogram.msg at master · jsk-ros-pkg/jsk_visualization

 

使用できるピクトグラムは下記のリンク先にあるものです。

上記のピクトグラムの名前を先ほどのメッセージの

characterの部分に入れ、

mode=PICTOGRAM_MODE

るとピクトグラムを表示してくれます。

 

一方、

mode=STRING_MODE

とすると、characterに入れた文字が

描画されます。

f:id:meison_amsl:20151101214924p:plain

 

また、actionに

JUMPやROTATE_Zなどを設定することで、

ピクトグラムを自由自在に動かすこともできます。

 

FootStep

f:id:meison_amsl:20151109213206p:plain

 

FootStepはヒューマノイドロボット用の

二足の走行軌跡を可視化するrvizライブラリです。

 

下記のFootstep.msgとFootstepArray.msgに

二足の位置データを格納し、Publishすることで、

上記のような足の軌跡を描画することができます。

legに右足(RIGHT=2)か、左足(LEFT=1)を入れて、

あとはposeに足の位置を入れればOKです。

footstep_groupに数値ラベルをつけると、

下記のrvizのdisplayパネルでグループ毎に色を付けることもできます。

show_nameのチェックボックスでそれぞれの足を表すRとLの

ラベルも追加することができます。

f:id:meison_amsl:20151109214207p:plain

 

OverlayDiagnostic

f:id:meison_amsl:20151113143212p:plain

 

OverlayDiagnositcは、ROSのデフォルトツールの一つである、

diagnosticsのデータをかっこ良く描画するrvizプラグインです。

 

diagnosticsは主にロボットのハードウェアエラーをまとめて管理するための

ROSのデフォルトツールですが、

このdiagnosticsのメッセージを分かりやすく表示してくれます。

表示するトピックは、下記のDiagnositicArrayに格納し、

publishすることで表示可能になります。

 

下記のようにDiaplayPanelでDiagnositcArrayのトピック名(Topic)と、

Arrayの中で表示させたいステータス情報(namespace)を指定すると、

diagnosticのステータス(Error, Warn, OK)と、

ステータスメッセージを表示することができます。

f:id:meison_amsl:20151113143235p:plain

また、上記のパネルでステータス表示位置を設定することができます。

 

ステータス情報が色で表示されたり、

ステータスメッセージが流れるように表示されたりするので

非常にかっこいいです。

 

Diagnostic_msgを表示するサンプルコードは下記です。

jsk_visualization_packages/jsk_rviz_plugins/samples/diagnostic_example.py

 

Video Capture

f:id:meison_amsl:20151112082735p:plain

 

Video Captureは名前通り、

rviz画面の動画を簡単にキャプチャすることができるrvizプラグインです。

 

Display PanelでVideo Captureを選択し、

下記のように、動画ファイルの名前とfpsを設定します。

f:id:meison_amsl:20151112082715p:plain

あとは上記のチェックボックスをオンすれば、

動画の撮影が始まり、チェックボックスをオフすれば撮影が終了します。

すると、rvizを起動したディレクトリにavi形式の動画ファイルが作成されるはずです。

 

残念ながら、そのaviファイルはそのままクリックしても

ubuntuのデフォルトビデオプレイヤーでは再生できなかったですが、

VLCをインストールし、VLCで開けば冒頭のように動画を再生することができました。

動画の大きさは10秒で200MBほどでした。

 

可視化用rqtプラグインの使い方

公式ドキュメントは下記です。

 

rqt_histogram_plot

f:id:meison_amsl:20151112184519p:plain

 

rqt_histogram_plotはヒストグラムのグラフを動的の描画するrqtプラグインです。

ヒストグラムの一つのビンのデータを表すHistogramWithRangeBinと、

HistogramWithRangeBin.msgをリストにした、

HistogramWithRangeでメッセージを構成し、

jsk_visualization_packages/HistogramWithRange.msg at master · AtsushiSakai/jsk_visualization_packages

HistogramWithRangeをpublishすることで、

そのデータをヒストグラムとして可視化してくれます。

 

可視化のサンプリングコードは下記です。

jsk_visualization_packages/jsk_rqt_plugins/sample/sample_histogram.launch

 

rqt_2d_plot

f:id:meison_amsl:20151113083550p:plain

 

rqt_2d_plotは、2次元のプロットグラフを描画するrqtプラグインです。

 

デフォルトのrqtプラグインであるPlotは一次元のデータを時系列に描画しますが、

このプラグインは、x-yの二次元のプロットデータを描画できます。

レーザ点の描画や、2つの変数の相関などを

リアルタイムに見たい時に便利だと思います。

 

jsk_visualization_packages/jsk_recognition_msgs/msg/PlotData.msgに、

x-yのプロットデータを格納して、publishすれば

rqtのplugins->Visualizaiton->Plot2Dを選んでトピック名を表示することで

プロットデータを描画することができます。

 

可視化のサンプリングコードは下記です。

jsk_visualization_packages/jsk_rqt_plugins/sample_scripts/sample_2d_plot_2.py

 

トピック関連ツール

上記のパッケージには、

可視化以外便利ツールも含まれています。

本章では、それらのツールについて説明します。

 

bagファイルのデータをcsvに変換するツール: bag2csv.py

f:id:meison_amsl:20151113100740p:plain

 

bag2csv.pyは、bagファイルの中にあるデータをcsvファイルに変換するツールです。

rosbag recordでロギングしたbagファイルのトピックデータを簡単にCSVに変換してくれます。

bagファイルのデータを使って、性能のグラフとかを書きたい時に便利ですね。

 

使い方は、

python bag2csv.py -t /huge/output hoge.bag

と-tの後に出力したいトピック名と、

その後にbagファイルを指定すれば、

Convertedbag.csvという変換されたファイルが冒頭のスクリーンショットのようにできるはずです。

 

bagファイルからグラフを生成するツール: bag_plotter.py

f:id:meison_amsl:20160111112148p:plain

 

bag_plotter.pyはbagファイルから

直接グラフを作成するツールです。

 

yamlファイルにグラフの設定を書いて、

そのyamlファイルとbagファイルを読みこませることで、

データをプロットすることができます。

$ python bag_plotter.py bag_plotter.yaml sampledata.bag

 

設定のyamlファイルは下記のように設定できます。

グラフのタイトルとトピック名を指定するとグラフが表示されます。

また配列形式のデータも表示できるのが非常に便利です。

# sample config yaml file for bag_plotter
global:
  layout: vertical
plots:
  - title: "x"
    topic: [/odom]
    field: ["pose/pose/position/x"]
  - title: "y"
    topic: [/odom]
    field: ["pose/pose/position/y"]

 

このツールの詳しい使い方は下記のリンクを参考にすると良いと思います。

参考資料

github.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

簡単にデータ解析をすることができるPythonライブラリPandas入門

目次

データ解析ライブラリPandas

Pandasは、データ解析を簡単に実行するための

Pythonライブラリです。

 

具体的には、データの読み込みや、

読み込んだデータからの、

目的データの抽出、

データの削除、追加などが

簡単に実行可能になります。

 

元々は統計解析によく使われる

Rという言語で使用されていた

データフレームという考え方を適応し、

Pythonで使用できるようにしたものらしいです。

インストール

基本的にはpipでインストールできるはずです。

pip install pandas

Windowsでpipでpandasをインストールした時にvcvarsall.batが無いと言われた場合

windowsにおいて、

pipでpandasをインストールしようとした時に、

下記のようなエラーが出ることがあります。

error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat)

そんな時は下記の記事の通り、

Mirosoftが提供しているVisual C++ コンパイラをインストールしましょう。

コンパイラはここにあります。

データファイルの読み込みと書き込み

データをファイルから読んだり、

データをファイルに書き込む方法について説明します。

CSVファイルからの読み込み

read_csv関数を使いましょう。

  

この関数が素晴らしいのがcsvにラベルが付いている場合、

自動的にラベル付けをしてデータをpythonの辞書データとして格納してくれる所です。

例えば、下記のようなCSVファイルをread_csv関数で読み込んだ場合、

自動で最初の行をデータフレームのラベルとして読み込み、

その列のデータのラベルになります。

あとは、そのラベルを使ってデータにアクセスすることができます。

下記はそのサンプルプログラムです。

import pandas as pd
data=pd.read_csv("sampledata.csv")

#col3の列のデータを表示
print data["col3"]

この方法でデータを読み、利用することで、

CSVのデータのフォーマットが変わったとしても、

同じラベルが付いているデータは同じコードでアクセスすることができ、

ソフトウェアの再利用性が向上します。

 

また、ヘッダがついてないCSVファイルを読み込む時は、

下記のように、ヘッダ名を指定することができます。

pd.read_csv( 'foo.txt', names=('a', 'b', 'c') )

CSVファイルへの書き込み

to_csv関数を使いましょう。

データフレームをそのままCSVに変換できます。

#csvデータのエクスポート
pd.to_csv("filepatg")

また、上記の方法では

データフレームのインデックスも保存されてしまいますが、

もしインデックスは保存したくない場合は、

下記のようにindex引数をFalseとすればOKです。

#csvデータのエクスポート
pd.to_csv("filepatg", index=False)

 

データフレームの作成

ある時刻毎のデータフレームを作成

data_range関数を使うと、

ある日付から指定した区切り毎の日付のリストを返してくれます。

dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df

 

データフレームの情報を取得する

読み取ったデータフレームの情報を表示したい時は、

下記のサンプルコードで使用している変数や関数を使うと便利です。

import seaborn as sns
iris = sns.load_dataset("iris") #サンプルデータセット

print iris.index

print iris.columns

print iris.shape

iris.info()

print iris.describe()

print iris.head(5)

print iris.tail(10)

index変数

データフレームのデータ番号(行)を表します。

columns変数

データフレームのラベル(列)を表します。

shape変数

データの行と列の数をタプルで返します。

info関数

データフレームの型などの情報を表示します。

describe関数

データの簡単な統計情報を表示します。

返り値をprintする必要があるので注意が必要です。

head関数

データの頭から指定した行数を表示します。

tail関数

データの末尾から指定した行数を表示します。

データの抽出

pandasのデータフレームは、

色んな方法で一部分を取得することができます。

 

インデックスを使う

データフレームはindex名で取得できるので非常に便利ですが、

たまに、行列のように

ある列からある列までデータを取得したい時があります。

 

そんな時はixメンバにアクセスすることで、

行列のインデックスのような形で

部分データを取得することが可能です。

 

df = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])

print df
#    A   B   C   D
#0  A0  B0  C0  D0
#1  A1  B1  C1  D1
#2  A2  B2  C2  D2
#3  A3  B3  C3  D3


print df.ix[:,1:3] #1-3列を取得
#    B   C
#0  B0  C0
#1  B1  C1
#2  B2  C2
#3  B3  C3

print df.ix[1:2,:] #1-2行を取得
#   A   B   C   D
#1  A1  B1  C1  D1
#2  A2  B2  C2  D2

print df.ix[1:2,1:3] #1-2行と1-3列を取得
#    B   C
#1  B1  C1
#2  B2  C2

 

 

インデックスとカラム名を使ってデータを取得する

atメソッドを使うことで、

インデックスの値とカラム名を指定して、

対応するデータを取得することができます。

 

import pandas as pd
from numpy import random
df = pd.DataFrame(random.randn(5,3),columns=list('ABC'))

print df
#          A         B         C
#0  0.256226 -0.261018 -2.246759
#1  1.040020 -0.019676 -0.488064
#2  2.059117  0.080764  0.360490
#3  2.061856 -0.538768  1.015353
#4  0.016484 -0.750428 -0.574846

print df.at[2,"A"]
#2.05911699262

  

条件式を使う

条件文を使って、データを抽出することも簡単です。

フィールドAの値が50以上のデータ行を抽出したい場合は、

下記のようにします。

data.loc[(df["A"] > 50)]

下記のようにすると、条件を満たすB列を抽出できます。

data.loc[(df["A"] > 50), "B"]

 

isin関数を使う

isin関数を使うと、下記のようなデータフレームにおいて、

ある行にある指定した要素を含む行を簡単に取得できます。

df[df['E'].isin(['two','four'])]

 

データフレームの加工

データの欠損値(NaN)の削除

CSVファイルなどを読み込んだ時、

データが無い部分は、欠損値として

NaNが入れられます。

 

NaNが入った行を削除したい場合は、

dropna関数を使います。

data.dropna() #NaNの入った行を削除する
data.dropna(axis=1) #NaNの入った列を削除する
data.dropna(subset=["a"]) #aがkeyの列でNaNが入った行を削除する 

NaNをある値に置き換えたい時は、fillna関数を使い、

NaNかどうかを判断する行列を取得したい場合は、

isnull関数を使います。

df1.fillna(value=5)
pd.isnull(df1)

 

データフレームの連結

データフレームを縦や横に連結する場合は、

concat関数を使います

(concatenate: 鎖状に繋げるという意味です)

 

pd.concat([df1, df2]) # 行方向に連結
pd.concat([df1, df2], axis=1) # 列方向に連結

 

 

データフレームのソート

下記のように、

軸でソートしたり、

df.sort_index(axis=0, ascending=False)

データ列でソートできます。

df.sort_values(by='B')

 

データフレームに関数を適用

データフレームに、ある関数を適用し、

その結果をデータフレームにしたい場合は、

apply関数を使います。

df.apply(np.cumsum)

 

データフレームの追加

下記のようにappend関数を使うことで、

データフレームを追加することも可能です。

df.append(df.iloc[2], ignore_index=True)

 

Pandasでピボット分析

Excelなどでよく実施するピボット分析をpandasで実施する場合は、

pivot_table関数を使うとOKです。

カテゴリデータを元に、集計解析などを実施することができます。

pandas.pydata.org

note.nkmk.me

 

10分で学ぶPandasが初心者にはおすすめ

下記の公式ドキュメントにかかれている

10分で学ぶPandasがPandas初心者にはおすすめです。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

 

簡単に美しいグラフ描画ができるPythonライブラリSeaborn入門

目次

  • 目次
  • PythonライブラリのSeabornとは?
  • Seabornのインストール
  • Seabornの特徴
  • スタイルの変更方法
    • matplotlibのグラフをSeabornのデフォルトスタイルに変更する
    • Seabornのスタイルを変更する
      • whitegrid
      • dark
      • white
      • ticks
    • 右と上のグラフの枠線を無くす
  • グラフ描画機能
    • 折れ線グラフ
    • 棒グラフ
    • 一次元分布データの描画(ヒストグラムや確率密度関数)
      • ヒストグラム表示
    • 二次元の分布データの描画
      • 散布図のプロット
    • データセットの相関分析
    • ヒートマップ
  • Mac OSXでtight_layoutのエラーが出た時の対処法
  • より深くSeabornを学びたい場合は
  • 最後に
  • 参考資料
  • MyEnigma Supporters

 

PythonライブラリのSeabornとは?

SeabornはPythonのグラフ描画ライブラリとして有名な

matplotlibをベースにしたグラフ描画ライブラリです。

myenigma.hatenablog.com

 

Seabornはオープンソースとして、Github上で開発されています。

github.com

 

今回は、このPythonのグラフ描画ライブラリSeabornの

基本的な使い方について説明したいと思います。

続きを読む

本棚の十冊で自分を表現する

目次

はじめに

下記の記事が楽しかったので自分でもやってみました。

 

1. 『確率ロボティクス』

myenigma.hatenablog.com

2. 『ノルウェイの森』

3. 『ΑΩ 超空想科学怪奇譚』

4. 『達人プログラマー』

myenigma.hatenablog.com

5 . 『フェルマーの最終定理』

6. 『すべてがFになる』

7. 『東大で上野千鶴子にケンカを学ぶ 』

8. 『Convex Optimization』

9. 『生物と無生物のあいだ』

10. 『自分を鍛える』

終わりに

また全部の作品を読み返したくなりました。

参考文献

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

初心者のためのNetwork Time Protocol (NTP)入門

目次

Network Time Protocol: NTPとは

Network Time Protocol: NTPは、

ネットワーク上のコンピュータの時刻を同期するための通信プロトコルです。

 

それぞれのコンピュータは大抵、

リアルタイムクロック(RTC)という時計が内蔵されており、

それらは電源が切れている状態でも時間を測ることができます。

 

しかし、このリアルタイムクロックは精度が悪く、

徐々に誤差が蓄積してしまうので、

定期的に補正をする必要があります。

その補正をネットワーク越しに実施するプロトコルがNTPです。

 

NTPはインターネットにおける標準的な通信プロトコルであり、

OSI参照モデルではアプリケーション層に位置します。

(FTPやHTTPなどと同じ層です。)

また、ポート番号に関してはUDPポートの123番を使うことが多いようです。

NTPの仕組み

NTPの仕組みについて簡単に説明します。

NTPの階層構造

NTPは下記の図のように、

stratumという階層構造を持ちます。

f:id:meison_amsl:20150913211837p:plain

stratum0がGPSなどの標準時間を与えるもので、

その下にstratum16までの階層を持つことができます。

NTPでは上位のstratumだけでなく、

下位のstratumにも時刻同期通信を実施し、

それらのデータを元に、精密な時刻同期を実現することができます。

 

NTPの時刻補正計算

NTPはNTPサーバとクライアントの間の通信遅延を考慮した上で、

時刻誤差を計算します。

 

f:id:meison_amsl:20150913103518p:plain

上記のようなサーバとクライアント間の時刻データを取得できた時、

通信の遅延時間は

となり、

サーバとクライアントの時刻誤差(時刻補正量)は

で計算できます。

この時刻誤差は通信遅延が行きと帰りで同じだと仮定しているため、

最大δ/2の分だけは誤差を持つ可能性があるといえます。

 

NTPでは、この時刻補正量と誤差量を

複数回、そして複数種類のサーバークライアント間で計算することで、

最終的な時刻補正量を統計的に決定します。  

Linux NTPサーバツール ntpd

ntpdは、NTPサーバ用のツール兼プロセス名です。

NTPサーバをデーモンとして起動したり、停止したりすることができます。

 

NTPサーバの状態確認

ntpq -p

で現在のコンピュータのNTPサーバの状態を確認できます。 

 

NTPサーバの設定ファイル

ntpサーバの設定ファイルは

/etc/ntp.conf

に書いてあることが多いようです。

Linux NTPクライアントツール ntpdate

ntpdateはNTPサーバと接続し、

クライアントコンピュータの時刻を補正したり、

時刻誤差を計測したりするLinuxツールです。

下記のコマンドでサーバ(ntp.nict.jp)と繋がることができます。

時刻同期させる場合

ntpdate -v ntp.nict.jp

オプションの-vは詳細情報を表示させるものです。

現在の時刻を確認

date

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

Pythonでコマンドラインツールを作る方法

目次

はじめに

データ解析の時など、

コマンドラインツールを作りたくなることがあります。

 

自分だけが、その時だけ使う場合は、

適当にスクリプトファイルを作れば良いですが、

他人に使ってもらったり、

長い期間使用して、メンテする場合は、

ちゃんとコマンドラインツールとして作っておくと

コードの寿命が長くなると思います。

 

pythonにはそのような

自作コマンドラインツールを作るツールなどが、

豊富に準備されているので、

今回はそれらのツールを使った

pythonコマンドラインツールの作り方について説明したいと思います。

コマンドラインオプションツール argparseの使い方

pythonのデフォルトモジュールである

argparseは、コマンドラインツールに

重要なコマンドラインオプションのパーサモジュールです。

unixのツールによくあるハイフン+記号のオプション

のようなオプション指定のシステムと、

その使い方を示したヘルプを自動生成してくれます。

argparseのサンプルプログラム

下記はargparseのサンプルプログラムです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-:q

import argparse

parser = argparse.ArgumentParser(description='argparse sample.')

#bool オプション
parser.add_argument('-e','--error', action='store_true', default=False, help='show error (default: show no error)')
#数値 オプション
parser.add_argument('-d','--data', type=int, help='data number')
#文字列オプション
parser.add_argument('-s','--str', type=str, help='data name')

args = parser.parse_args()

print args

argparseは大きく分けて3つの処理に分けられれるため、

それぞれの処理について説明します。

1 パーサの生成

まずはじめに下記のように、argparseをインポートして、

コマンドラインオプション用のパーサを作ります。

引数のdescriptionは、後述するヘルプ表示をした時の、

スクリプトの概要説明文になります。

import argparse

parser = argparse.ArgumentParser(description='argparse sample.')

2 コマンドラインオプションの追加

続いて、使用するコマンドラインオプションを追加します。

boolや数値、文字列など、基本的なデータを

コマンドラインオプション経由で指定することができます。

bool型のオプション

下記のように設定することで、bool型のオプションを設定できます。

parser.add_argument('-e','--error', action='store_true', default=False, help='show error (default: show no error)')

上記のコードの場合、-eを付けることでerrorという変数をTrueにすることができます。

-eをつけた時に、errorをFalseにしたい場合は、action='store_false'とします。

defaultはオプションを指定しなかった時のerrorの値です。

helpは後述のようにヘルプを表示させた時の、

オプションの説明になります。

 

下記のようにオプションを指定することで

error変数がTrueになっているのがわかります。

$ python argparseSample.py -e

Namespace(data=None, error=True, str=None)

数値型のオプション

下記は数値オプションです。

parser.add_argument('-d','--data', type=int, help='data number')

type引数に型を指定することで、

下記のように型以外の引数を与えた時にエラーを返してくれます。

$ python argparseSample.py -d 20.0

usage: argparseSample.py [-h] [-e] [-d DATA]

文字列型のオプション

最後がコマンドラインオプションのパース文です。

parser.add_argument('-s','--str', type=str, help='data name')

基本的に先ほどの数値と同じです。

下記のように使用できます。

$ python argparseSample.py -s hoge

Namespace(data=None, error=False, str='hoge')

3. コマンドラインオプションのパース

最後は受け取ったコマンドラインオプションをパースします。

args = parser.parse_args()

args変数の要素として、

args.errorやargs.data、args.strが格納され、

コードに使用することができます。

ヘルプの表示

argparseの素晴らしい所は

コマンドラインツールのヘルプを自動生成してくれる所です。

先ほどのサンプルコードを-hのオプションを指定すると、

下記のようにヘルプが表示されます。

$python argparseSample.py -h

usage: argparseSample.py [-h] [-e] [-d DATA] [-s STR]

argparse sample.

optional arguments:

-h, --help show this help message and exit

-e, --error show error (default: show no error)

-d DATA, --data DATA data number

-s STR, --str STR data name

コードをドキュメント化出来て、

すごく便利ですね。

 

コマンドラインツール作成用ライブラリClick

argparseはデフォルトでPythonにバンドルされているので、

使いやすいですが、Clickというライブラリを使いことで、

簡単にデコレータを使って、関数をコマンドラインツール化できます。

 

click.palletsprojects.com

github.com

blog.amedama.jp

qiita.com

 

下記の記事のように、setup.pyを設定することで簡単に

pipでインストールするようにパッケージ化が可能です。

click.palletsprojects.com

こちらのリポジトリは、非常に簡単なサブコマンドを持つCLIツールのサンプルです。

github.com

 

下記のように、シェル補完も可能です。

qiita.com

 

こちらの3rd partyライブラリを使うと、

コマンドラインからロガーのレベルを変更することができます。

click-log.readthedocs.io

f:id:meison_amsl:20211024222503p:plain

 

clickで作ったツールのテスト方法

venvを使って、仮想環境を作ることでかんたんにテストできます。

$ python -m venv venv

$ source venv/bin/activate

$ pip install --editable .

 

Pythonからシェルコマンドを実行する方法

コマンドラインツールを作っていると、

すべてpythonでやるのではなく、

シェルコマンドを使って、

ファイルの検索やコピー、削除などをしたくなります。

そこで自作のpythonコードからシェルコマンドを駆使する方法を説明します。

 

pythonからシェルコマンドを利用する場合は、

osモジュールを使う方法がかつては一般的でしたが、

osモジュールは将来的に廃止される予定らしいので、

現在はsubprocessというモジュールを使います。

このsubprcessは新しいプロセスを生成して処理を実行する

pythonのデフォルトモジュールです。

subprocessを使ってシェルコマンドを実行する方法は

下記のようにいくつかあります。

call関数 シェルコマンドを実行する

シェルコマンドを実行するのみなら、

call関数が便利です。

引数にシェルコマンドを文字列として指定し、

shell=Trueとすればコマンドを実行してくれます。

コマンドが終了するまで待つようになるので注意しましょう。

import subprocess
cmd = "ls"
subprocess.call( cmd, shell=True  ) 

check_output関数 シェルコマンドの返り値を利用する

シェルコマンドの返り値を利用したい場合は、

check_output関数を使います。

import subprocess
cmd = "ls"
ret=subprocess.check_output( cmd, shell=True  ) 
print ret

check_call関数 シェルコマンドの終了を待つ

シェルコマンドの処理が終わったことをチェックしたい場合は

check_call関数を使います。

無事コマンドが終了すれば、返り値は0になるはずです。

エラーの場合は、CalledProcessError例外が出されます。

import subprocess
cmd = "ls"
ret  =  subprocess.check_call( cmd )
print ret

 

Popen:プロセスの終了を待たずに複数処理を並列実行する

上記のサンプルでは、

一つのプロセスが終わるまで

次の処理を行えませんでしたが、

下記の記事でかいたとおり、

Popenを使うことで、

別プロセスで処理を実行させつつ、

別の処理を実施することができます。

myenigma.hatenablog.com

 

例えば重い処理をマルチコアの有効性を利用して

同時処理したい場合は、

下記のサンプルのように、

Popenを使って複数の処理を並列実行することができます。

import subprocess
subprocess.Popen("hoge 1",shell=True)
subprocess.Popen("hoge 2",shell=True)
subprocess.Popen("hoge 3",shell=True)

 

シェルの標準出力に色を付けて文字列を出力する方法

f:id:meison_amsl:20160228210947p:plain

 

コマンドラインツールを作っていると、

エラーやワーニングの情報をユーザに伝えるために、

出力結果の文字に色を付けたくなることがあります。

そんな時は、下記のようにprint文の冒頭と末尾に

フォーマッティングの文字を挿入すれば、

文字に色を付けることができます。

 

しかし、上記のようにフォーマットをするのは面倒なので、

簡単に文字列に色を付けて文字を標準出力できる

モジュールを作りました。

 

下記のモジュールを保存して、

Print関数を使うことで、

冒頭のような色付きの文字列を表示させることができます。

使い方は、main文の中をみればすぐにわかると思います。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:Atsushi Sakai
# license: MIT

def Print(string, color, highlight=False):
    u"""
    Colored print

    colorlist:
        red,green,yellow,blue,magenta,cyan,white,crimson

    """
    end="\033[1;m"
    pstr=""
    if color == "red":
        if highlight:
            pstr+='\033[1;41m'
        else:
            pstr+='\033[1;31m'
    elif color == "green":
        if highlight:
            pstr+='\033[1;42m'
        else:
            pstr+='\033[1;32m'
    elif color == "yellow":
        if highlight:
            pstr+='\033[1;43m'
        else:
            pstr+='\033[1;33m'
    elif color == "blue":
        if highlight:
            pstr+='\033[1;44m'
        else:
            pstr+='\033[1;34m'
    elif color == "magenta":
        if highlight:
            pstr+='\033[1;45m'
        else:
            pstr+='\033[1;35m'
    elif color == "cyan":
        if highlight:
            pstr+='\033[1;46m'
        else:
            pstr+='\033[1;36m'
    elif color == "white":
        if highlight:
            pstr+='\033[1;47m'
        else:
            pstr+='\033[1;37m'
    elif color == "crimson":
        if highlight:
            pstr+='\033[1;48m'
        else:
            pstr+='\033[1;38m'
    else:
        print("Error Unsupported color:"+color)

    print(pstr+string+end)

if __name__ == '__main__':
    Print("Red","red")
    Print("Green","green")
    Print("Yellow","yellow")
    Print("Blue","blue")
    Print("Magenta","magenta")
    Print("Cyan","cyan")
    Print("White","white")
    Print("Crimson","crimson")
    Print("Highlited Red","red",highlight=True)
    Print("Highlited Green","green",highlight=True)
    Print("Highlited Yellow","yellow",highlight=True)
    Print("Highlited blue","blue",highlight=True)
    Print("Highlited Magenta","magenta",highlight=True)
    Print("Highlited Cyan","cyan",highlight=True)
    Print("Highlited Crimson","crimson",highlight=True)

 

参考資料

kohkimakimoto.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

初心者のための正規表現入門

目次

正規表現とは?

正規表現は文字列の集合を表す表現方法で、

文字列におけるパターンマッチングによく使用される方法です。

いわゆる、あいまい検索を実施したい時によく使用します。

 

プログラマの人にとっては、

ある関数がその他のソースコードの

どこで使用されているかを調べる時に

grepを使う人も多いと思いますが、

このgrepで検索する時に正規表現を使うことができます。

 

それ以外にも、

テキストデータをプログラミング言語を使って

検索して制御するような

  

しかし、この正規表現はかなり取っ付きづらい表現方法なので、

わかりやすいようにまとめておきたいと思います。

正規表現の表現方法

正規表現の例について説明します。

ひとつ注意点として、

一般的な正規表現は殆どのツールやライブラリでも

共通で使用できると思いますが、

それぞれのツールにおいて、

独特な記法が追加されていることもありますので

注意が必要です。

 

下記の説明の(python)は

pythonの正規表現ライブラリreの特有の表現です。

詳しくはこちら

行頭

^

行頭がDataという行は、下記のように表現されます。

^Data

冒頭に#があり、それ以降が何でも良い場合は、

^#.*

になります。

行末

$

行末がEndという行は、下記のように表現されます。

End$

任意の一文字

. (ピリオド)

指定の一文字

abcのどれかに一致する場合は、下記です。

[abc]

ひとつ前の文字か正規表現が0個以上繰り返される

*

例えば、.*bc とすると、なにか文字0個以上あり、

そのあと、bcという文字が続くような文字列がマッチします。

 

ちなみに、0個以上繰り返すので、繰り返さなくても良いことを考えると、

なんでも有りな文字列になりますので注意してください。

下記のようにすると、aが含まれなくても抽出されてしまいます。

a*

ひとつ前の文字か正規表現が1個以上繰り返される

例えば、a または aa または、aaaなど、

aが一つ以上繰り返す文字列は下記で表現されます。

a+

ひとつ前の文字か正規表現が0個または1個繰り返される

?

繰り返しの回数が制限されていることに注意が必要です。

例えば、

.?bc

は、何でも良いがなにか文字が0個か、1個あり、その後、bcが続く文字列がマッチします。

また、最短マッチを指定するときにも、最後に?を置くことで利用されます。例) <.*?>

任意の数字

[0-9] or \d (python)

任意の非数字

[^0-9] or \D (python)

任意の空白文字

[\t\n\r\f\v] or \s (python)

任意の非空白文字

[^\t\n\r\f\v] or \S (python)

任意の英数文字および下線

[a-zA-Z0-9_] or \w (python)

任意の非英数文字と非下線

[^a-zA-Z0-9_] or \W (python)

エスケープシーケンス

特殊文字は下記のようなエスケープシーケンスとの

組み合わせで表現できます。

特殊文字 説明
\t タブ
\n 改行
\z End of file
\r キャリッジリターン

グルーピング

一つの文字ではなく、文字列の繰り返しを表現したい場合は、

丸括弧 ()を使います。

例えば、"わい"という言葉が繰り返される場合は、

(わい)+

という正規表現で表現できます。

よく使う正規表現の組み合わせ

一般的に、上記の正規表現を複数組み合わせて

文字列を表現することが多いですが、

よく使用する正規表現の組み合わせをまとめておきます。

空行を表す

^$

ある単語のみを含んだ行を表す

lineという単語のみを含んだ行の場合、

^line$

任意の長さの文字列

.*

これは非常によく使用します。

たとえば、あるCコードのforループの先頭行を取得したい場合は、

下記の正規表現を使うことができます。

for(.*){

指定の桁の数

例えば、3桁の数字をマッチしたい場合は、

[0-9]{3}

のように表現できます。

 

Pythonの正規表現ライブラリreの使い方

Pyhtonには便利な正規表現ライブラリreが、

デフォルトでインストールされています。

本章ではreの使い方の概要を説明します。

正規表現の事前コンパイル

大抵のreライブラリの関数は、

正規表現と検索対象の文字列を入れれば、処理をしてくれますが、

同じような正規表現を何度も使う場合は、

事前に正規表現をコンパイルしておくようにすると、

計算速度が向上します。

 

例えば、

ある文字列strに"abc"が含まれているか

どうかをチェックしたい場合は、

match(".*abc.*", str)

とすればboolで結果が返ってきますが、

この正規表現を頻繁に使う場合は、

下記のように事前コンパイルしておくと

速度が早くなります。

p = re.compile(r'.*abc.*')

p.match(str)

正規表現による文字列検索

matchとsearchという関数を使います。

事前コンパイルをしている場合は、下記のような関数引数を与えます。

match(string [,pos = 0] [,endpos])

search(string [,pos = 0] [,endpos])

posとendposは検索を開始する文字列の位置です。

省略すると文字列全体検索になります。

 

matchとsearchの違いですが、

search() は文字列の中から正規表現と一致する部分文字列を検索しますが、

match() は文字列の先頭から正規表現とマッチングするか調べるだけです。

ですので、正規表現を正確に表現しないとmatchではマッチングしません。

正規表現による文字列置換

subという関数を使います。

sub(hoge, huga, str [,count])

sub(huga, str [,count]) #事前コンパイル済みの場合

上記ように指定すると、str文字列の中のhogeをhugaに変換することができます。

countは文字列置換を実施する回数で、デフォルトは0で回数制限無しです。

置換の回数を制限したい場合は、このcountを指定しましょう。

 

文字列置換例

p = re.compile('abc')

p.sub('aaa', 'abc def abc ghi') # 置換結果 'aaa def aaa ghi'

p.sub('123', 'abc def abc ghi', 1) # 置換結果'aaa def abc ghi'

より詳細な使い方

こちらを参照下さい

Jetbrains IDEで正規表現のテストをする

PythonのIDEであるPycharmや、JavaのIDEであるIntelijである

Jetbrains社のIDEでは、簡単に自分が作成した正規表現を、

テストすることができます。

参考資料

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com