Post on 21-May-2020
ロボットソフトウェア特論 (2)
2018.4.18
電気通信大学
大学院情報理工学研究科
末廣尚士
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
2. Python入門- Pythonの特徴
インタプリタ インタプリタ v.s. コンパイラ
段付けが構文的に意味を持つ 段付けによるブロック構造
柔軟なデータ型 リスト、辞書
オブジェクト指向
拡張性 C言語インタフェース
内観機能 プログラムの中から変数などの情報を得ることができる
参考:日本Pythonユーザ会 <http://www.python.jp/>
2
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 参考書
オンラインドキュメント http://docs.python.jp/2/
チュートリアル http://docs.python.jp/2/tutorial/index.html
「Python 入門」(オライリー・ジャパン)
「はじめてのPython」(オライリー・ジャパン)
Dive into Python 2
3
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- Python関連のインストール推奨OS: Ubuntu 16.04
python-visual:3Dグラフィックス
numpy:数値演算
matplotlib:グラフ描画
ipython, jupyter :強化版インタラクティブ環境
4
robot:~$ sudo pip install jupyter
robot:~$ sudo apt-get install python-visual
robot:~$ sudo apt-get install python-matplotlib
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- pythonの使い方
スクリプトとして使う エディタでプログラムを書く
pythonコマンドでスクリプトファイルを指定して実行する
モジュールとして使う エディタでプログラムを書く
スクリプトやpython実行環境の中からインポートする
インタラクティブに使う python実行環境の中で一行ずつ入力,実行する
インタラクティブに使いながらプログラムを書く 数行ずつインタラクティブに実行する
最後にまとめてプログラムにできる5
これがロボットを動かす時にとても便利
結果を見ながらデータ処理,グラフを描くのに便利
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- PythonとC++の比較
6
Python
C++
#!/usr/bin/env python
print “hello world!”
include <iostream>
using namespace std;int main() {
cout << “hello world!”<< endl;return 0;
}
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- Python入門Hello World
変数
データ型
演算子
制御構造
関数
モジュール
内観機能
オブジェクト(次回)
7
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- とにかく使う(command-line)
インタラクティブにやるのは、とても簡単
または,
8
$ python...>>> 1+23>>>
$ ipython...In [1]: 1+2Out[1]: 3
In [2]:
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- とにかく使う(idle)
idleはエディタと実行環境を行き来できる統合開発環境
idle のインストール
python idleを使う python idleのアイコンをクリックして起動
この状態はエディットモード
メニューで,[run] → [python shell]を選ぶ
pythonのプロンプトが出たら後はlinuxと同じ
9
$ sudo apt-get install idle
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- Hello World(スクリプトを書く)
エディタを起動(たとえばemacs) 中身を書いてhello.pyとして保存
エディタを抜けてpythonコマンドで実行する
idleを起動 同様に中身を書いてhello.pyとして保存
同時にidleの中で実行して試すことができる
idleを抜けてpythonコマンドで実行することもできる
10
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- jupyterを使う
jupyterを起動
起動したディレクトリーをルートとしてwebサーバとwebブラウザが立ち上がる
webブラウザ上でプログラムを書くことができる
数行単位(cell)で部分ごとに実行して試せる
mark down記法によるコメントが付けられる
実行結果を説明用にhtmlにすることができる
最終結果をpythonプログラムにすることができる11
$ jupyter notebook
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- jupyterの実行画面
12
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- Hello World(スクリプト)
スクリプトファイル hello.py の中身
13
#!/usr/bin/env python# -*- coding: utf-8 -*-
print "Hello World !“
unixの場合のおまじない“#” は一般にはコメント、でもファイルの先頭の“#!”はシェルコマンドを指定する
コメントなどに日本語を使うときのおまじない.出来れば日本語は使わない方が可搬性が良い.windowsだと,cp932
プログラムの本文
windowsの場合はファイル名で判断するので不要だが,unixでもコマンドとして実行したいならおまじないをつけておくと良い.
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- スクリプトの実行(linux)
linuxコマンドシェルでの実行 hello.pyを実行可能にする
Hello World の実行
または,python を呼び出して実行 この場合は実行属性も「おまじない」は不要
14
$ ./hello.pyHello World !
$ chmod a+x hello.py
$ python hello.pyHello World !
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- スクリプトの実行(windows)
コマンドウインドウを開いて実行 xxx.pyは自動的にpythonにバインドされるので実行属性や
おまじないはいらない.
またはwindowsのエクスプローラレベルで, hello.pyをダブルクリック
ただし,今回のスクリプトの場合Hello Worldのメッセ時を出力した後,一瞬で消える.
15
C: ....> hello.pyHello World !
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- スクリプトの実行(idle)
hello.pyをidleで開く メニュー,[Run]→[Run Module]で実行
16
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>> ====================== RESTART ========================>>> hello world!>>>
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 変数
変数は宣言なしで使える
変数にはいろいろな型のデータを代入することができる
17
>>> a=1>>> b=2>>> b=2.0>>> c="abc">>> d="def">>> a+b3.0>>> c+d'abcdef'
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- データ型
数値(整数、実数など)
文字列
リスト
タプル
辞書
真偽
・
・
・18
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 数値
19
>>> 11>>> 1+23>>> 2/100>>> 2/10.00.2>>> 2222222222222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222222222222222222222222222222222222222L>>>
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 文字列
“abc” と ‘abc’ の2つの表現が可能
20
>>> 'abc''abc'>>> "abc"'abc'>>>'abc"d"ef''abc"d"ef'>>> 'ab'+"def"'abdef'>>> 'asdf'[3]'f'>>> 'asdfadafsdfasf'[3:7]'fada'>>> 'ab'*4'abababab'>>>
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- リスト (list)
とてもフレキシブルなデータ構造
まずは単純なリスト
要素の引用
21
>>> a=[1,2,3,4,5,6]
>>> a[2]3>>> a[-1]6>>> a[2:4][3,4]>>> a[4:][5,6]
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- リスト (list)
要素の変更
要素の追加
22
>>> a[2]=5>>> a[1,2,5,4,5,6]>>> a[2:4]=[8,9]>>> a[1,2,8,9,5,6]
>>> a.append(7)>>> a[1,2,8,9,5,6,7]
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- リスト (list)
複雑な構造 要素は異なるデータ型でも良い
配列的な使い方
23
>>> a=[1,2,"abc",3.5,["a",4],4,5]>>> a[1, 2, 'abc', 3.5, ['a', 4], 4, 5]
>>> a=[[1,2,3],[4,5,6],[7,8,9]]>>> a[[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> a[1][4, 5, 6]>>> a[1][2]6
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 代入とコピー3種類のコピー(1)変数への代入
コピーとはいえないが,よく勘違いする.
問題:aの値は?24
>>> a=[1,2,3]>>> a[1, 2, 3]>>> b=a>>> b[1, 2, 3]>>> b[2]=0>>> b[1, 2, 0]>>> a
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 代入とコピー3種類のコピー(1)変数への代入
コピーとはいえないが,よく勘違いする.
25
>>> a=[1,2,3]>>> a[1, 2, 3]>>> b=a>>> b[1, 2, 3]>>> b[2]=0>>> b[1, 2, 0]>>> a[1, 2, 0]>>>
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 代入とコピー
浅いコピー(shallow copy)(1)
問題:aの値は?
26
>>> a=[1,2,3]>>> b=a[:]>>> b[1, 2, 3]>>> b[2]=0>>> b[1, 2, 0]>>> a
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 代入とコピー
浅いコピー(shallow copy)(1)
27
>>> a=[1,2,3]>>> b=a[:]>>> b[1, 2, 3]>>> b[2]=0>>> b[1, 2, 0]>>> a[1, 2, 3]
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 代入とコピー
浅いコピー(shallow copy)(2)
問題:aの値は?
28
>>> a=[[1,2,3],[4,5,6],[7,8,9]]>>> b=a[:]>>> b[[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> b[1]=[]>>> b[[1, 2, 3], [], [7, 8, 9]]>>> a[[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> b[2][2]=0>>> b[[1, 2, 3], [], [7, 8, 0]]>>> a
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 代入とコピー
浅いコピー(shallow copy)(2)
29
>>> a=[[1,2,3],[4,5,6],[7,8,9]]>>> b=a[:]>>> b[[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> b[1]=[]>>> b[[1, 2, 3], [], [7, 8, 9]]>>> a[[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> b[2][2]=0>>> b[[1, 2, 3], [], [7, 8, 0]]>>> a[[1, 2, 3], [4, 5, 6], [7, 8, 0]]
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 代入とコピー
深いコピー(deep copy) copyモジュールをインポートする
copy()とdeepcopy()が使える
copy()の方はshallow copy
¥
30
>>> import copy>>> a=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> b=copy.deepcopy(a)>>> b[[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> b[2][2]=0>>> b[[1, 2, 3], [4, 5, 6], [7, 8, 0]]>>> a[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 3種類のコピーのイメージ図
変数への代入
浅いコピー(1)
31
[1,2,3]
b:
a: >>> a=[1,2,3]
>>> b=a[1,2,3]a:
>>> b=a[:]
b:
[1,2,3]a:
[1,2,3]
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 3種類のコピーのイメージ図
浅いコピー(2)
32
[7,8,9]
a:
>>> a=[[1,2,3],[4,5,6],[7,8,9]]
>>> b=a[:]
b:
[4,5,6][1,2,3]
[ , ]
[7,8,9]
a:
[4,5,6][1,2,3]
[ , ]
[ , ]
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 3種類のコピーのイメージ図
深いコピー
33
[7,8,9]
a:
>>> a=[[1,2,3],[4,5,6],[7,8,9]]
>>> b=deepcopy(a)
[4,5,6][1,2,3]
[ , ]
[7,8,9]
b:
[4,5,6][1,2,3]
[ , ]
[7,8,9]
a:
[4,5,6][1,2,3]
[ , ]
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- タプル (tuple)
変更のできないリスト
34
>>> a=(1,2,3)>>> a[1]=3
Traceback (most recent call last):File "<pyshell#95>", line 1, in <module>
a[1]=3TypeError: 'tuple' object does not support item assignment>>>
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 辞書
キーワードでデータにアクセスできる
35
>>> a={'key1':123, 1:'item1', 3.5:'item2', 'key2':[1,2,3]}>>> a{3.5: 'item2', 1: 'item1', 'key1': 123, 'key2': [1, 2, 3]}>>> a[3.5]'item2'>>> a['key2'][1, 2, 3]>>> a[1]='item1'>>> a[1]={'a1':3, 'a2':5}>>> a{3.5: 'item2', 1: {'a1': 3, 'a2': 5}, 'key1': 123, 'key2': [1, 2, 3]}>>>
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 真偽
基本は True と False
条件分岐では0, None,[], {}は偽、その他は真
True は 1 と同じ 2は真だがTrueではない
False は 0 と同じ []は偽だがFalseではない
36
>>> 1 == TrueTrue>>> 2 == TrueFalse>>>
>>> 0 == FalseTrue>>> [] == FalseFalse
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 演算子
Cなどと似ている
四則:+, - , *, /, ….
論理:==, !=, >, <>,
文字列やリストも演算の対象?
37
>>> [1] + [2][1, 2]>>> >>> [1,1] < [1]+[2]True>>>
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 条件分岐
if と else
38
>>> a=True>>> if a :... print 1... else :... print 2...
1>>> a=False>>> if a :... print 1... else :... print 2
2
ブロックの段付けに注意!
コロン
elseはifと同じレベル!
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 条件分岐(スクリプト)
if と else
39
a=Trueif a :
print 1else :
print 2
a=Falseif a :
print 1else :
print 2
pythonではブロックごとに段付けがそろっていることが重要.
段付けの文字数は同一ブロック内で同じ必要があるが,その数自身は重要ではない.
4文字程度がお勧め.
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 条件分岐 (and と or)
A and B
A式を実行、真ならばB式も実行、偽ならばB式は実行しない。
この分岐を and then と呼ぶ
A or B
A式を実行、偽ならばB式も実行、真ならばB式は実行しない。
この分岐を or else と呼ぶ.
40
>>> a = True>>> a and 11>>> a = False>>> a and 1False
>>> a = True>>> a or 1True>>> a = False>>> a or 11
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 制御構造(ループ)
forループ(for elmt in data-list :) listやtapleの要素を1つずつ取り出して尽きるまで繰り返す
41
>>> range(10)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
sum = 0for i in range(10):
sum = sum + iprint sum
数字のリストを作る関数
ブロックの段付けに注意!
コロン
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 制御構造(ループ)
whileループ(while cond : ) 条件が真である限り続ける
42
i = 0sum = 0while i< 10 :
sum = sum + ii = i + 1
print sum
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 制御構造(ループからの脱出)
breakを使って1つ上のループを抜ける
43
i = 0sum = 0while True :
sum = sum + ii = i + 1if i >= 10 :
breakprint sum
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 関数定義def と return
return がないと値が返らない
44
>>> def test(x, y) :... return 2 * x + y...
>>> test(3 ,2)8
>>> def test(x, y) :... 2*x+y...
>>> test(3,2)>>>
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 引数のdefault値の指定
引数のdefault値の指定
呼び出し例
45
def test(x=0, y=0) :return 2 * x + y
>>> test(3,2)8>>> test()0>>> test(3)6>>> test(y=2)2>>>
default値が指定されていると省略できる
キーワード(変数名)で引数を指定できる.これはdefault値が指定されていなくても可能.
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 複数の値のreturn複数の値のreturn
複数の値の受け取り
46
def test(x,y) :return x, y, 2*x+y
カンマで区切って複数の値を返すことが出来る
>>> a=test(3,2)>>> a(3, 2, 8)>>> a,b,c=test(3,2)>>> a3>>> b2>>> c8
1つの変数でタプルとしてまとめて受け取ることが出来る
対応した個数の変数でばらばらに受け取ることもできる
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 関数についての補足
仮引数はローカル変数
呼び出しは値渡し
変数のアドレスを渡すことはできない 一般には戻り値で結果を返して代入する
どうしても変数に値を入れて戻ってきたいときは,リストや構造体を渡す
47
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- モジュール
システムが用意したライブラリや自分の作ったプログラムをmoduleとして読み込むことができる.
読み込むモジュールのディレクトリにパスが通っていなくてはならない.
システム,インストールしたライブラリ,カレントディレクトリはパスが通っている.
48
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- モジュールの読み込み(import)
読み込み方は大きく2つ
49
>>> import math>>> sqrt(3)
Traceback (most recent call last):File "<pyshell#1>", line 1
sqrt(3)NameError: name 'sqrt' is not defined>>> math.sqrt(3)1.7320508075688772
>>> from math import *>>> sqrt(3)1.7320508075688772
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- モジュールに別名をつける
モジュール名が長いと使いにくい場合は別名を使うと良い.
import module_name as alias_name
50
>>> import math as m>>> m.sqrt(3)1.7320508075688772
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 内観機能
それが何であるかを調べる
dir 関数
51
>>> import math>>> dir(math)['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- オブジェクト
オブジェクトは次回以降,少しずつ
52
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
例題2-1 pythonの練習
階乗を求める関数を作る
入力:n (n=0,1,2,....)
出力:n!=1*2*...*n
(1) 繰り返しで1からnまで掛ける。fact1(n)
(2) 再帰呼び出し。fact2(n)
n=0のとき、1
n>0のとき、n*fact2(n-1)
おまけ:nが定義域以外の場合の処理は?
53
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
課題1:例題2-1をやる
階乗を求める関数を作る
入力:n (n=0,1,2,....)
出力:n!=1*2*...*n
(1) 繰り返しで1からnまで掛ける。fact1(n)
(2) 再帰呼び出し。fact2(n)
n=0のとき、1
n>0のとき、n*fact2(n-1)
おまけ:nが定義域以外の場合の処理は?
54
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 課題1のやり方
エディタやidleで関数fact1, fact2を書く. file名は、report1_学籍番号.py
python を起動して,ファイルをモジュールとして読み込み,関数を試してみて正しく動くことを確認すること.
ファイルを添付してsuehiro@is.uec.ac.jp
メールの表題は「ロボットソフトウェア特論:課題1」
〆切、4月23日(月)
55
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
付2. ロボットRTCのインストールOS: Ubuntu 16.04
講義のHPからRobots.tar.gzをダウンロード
openrtmの下で展開
動作確認
56
robot:~$ cd openrtmrobot:~/openrtm$ tar –zvf Robot.tar.gz
robot:~$ cd openrtm/Robots/arm6dofrobot:~/openrtm/Robots/arm6dof$ python Arm6dof.py
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 次回予告
ロボットアームコンポーネントを動かしてrtc_handle.pyを用いて,python環境から扱う.
rtc_handleの旧バージョンの説明はここhttp://www.taka.is.uec.ac.jp/~suehiro/rtm0.4.2/rtc_handle.html
57
電気通信大学大学院情報理工学研究科情報学専攻 ロボットソフトウェア特論2018年度前学期
- 5/2(水)は休講
5/2(水)は休講にします.
そのかわり7/25(水)まで
講義を行います.
58