• 検索結果がありません。

PowerPoint Presentation

N/A
N/A
Protected

Academic year: 2021

シェア "PowerPoint Presentation"

Copied!
35
0
0

読み込み中.... (全文を見る)

全文

(1)

知能システム論

1 (11)

2012.6.20

情報システム学研究科

情報メディアシステム学専攻

知能システム学講座

末廣尚士

(2)

13. ロボットアームの逆運動学

(幾何的解法)

何をしたいか

手首、手先、ツールの3次元空間での位置や姿勢

から、それを実現する関節角度を計算する。

アームソリューション、アームの解とも呼ぶ

何のために

たとえばビジョンで認識された物をつかむ場合、物

の位置・姿勢は3次元空間で表現されることが普

通である。したがってそれに必要な手首、手先、

ツールの位置や姿勢アームの位置や姿勢も3次

元空間の位置・姿勢で与えられる。

逆運動学が不要な制御もあるが、、、。

(3)

- 幾何学的解法

x

z

Base

Base

x

y

x

hand Base

y

hand Base

z

hand Base

手先の位置が

Base

x

hand

y

hand Base

z

hand Base

のときの

関節角度

1,

2,

3

を求める。

(4)

- 幾何学的(解析的)解法

x

z

L1

l3h

l2h

l1h

bh

3

2

z

hand Base

=

bhl1hl2hcos

2



l3hcos

2



3

x

hand L1

=

l2hsin

2



l3hsin

2



3

Base

x

y

1

L1

x

y

y

hand Base

=

L1

x

hand

sin 

1

=

l2hsin 

2



l3hsin

2



3



sin

1

x

hand

Base

=

L1

x

hand

cos

1

=

l2h sin

2



l3h sin

2



3



cos

1

(5)

-   の計算

Base

x

y

1

L1

x

y

y

hand Base

=

L1

x

hand

sin 

1

x

hand Base

=

L1

x

hand

cos

1

y

hand Base

x

hand Base

=

tan

1

1

=

arctan

y

hand Base

x

hand Base

x0

−arctan

y

hand Base

x

hand Base

x0

 /

2

x=0, y0

− /

2

x=0, y0

不定

x=0, y=0

1

これは簡単、

(6)

-   の計算

z

hand Base

=

bhl1hl2hcos

2



l3hcos

2



3

x

hand L1

=

l2hsin

2



l3hsin 

2



3

Z

2

=

l2h

2

cos

2



2

2 l2h l3h cos

2

cos

2



3



l3h

2

cos

2



2



3

X =l2hsin

2



l3hsin

2



3

Z =l2hcos

2



l3hcos

2



3

X

2

Z

2

=

l2h

2

l3h

2

2 l2h l3hcos

2

cos

2



3

sin 

2

sin

2



3



X

2

=

l2h

2

sin

2



2

2 l2h l3h sin 

2

sin 

2



3



l3h

2

sin

2



2



3

X

2

=

Base

x

hand2

Base

y

hand2

3

Z =

Base

z

hand

bh−l1h

X = x

L1 hand

ここで、

とすると、

両辺を

2乗して加えると、

x

z

L1

l3h

l2h

l1h

bh

3

2

X

2

Z

2

(7)

-   の計算

X

2

Z

2

l2h

2

l3h

2

=2 l2hl3h cos

3

cos

3

=

X

2

Z

2

l2h

2

l3h

2

/

2 l2h l3h

3

X

2

Z

2

=

l2h

2

l3h

2

2 l2h l3hcos

2

cos

2



3

sin 

2

sin

2



3



cos−=coscossin sin

ここで

を思い出して

=

2



3

=

2

とすると、

X

2

Z

2

=

l2h

2

l3h

2

2 l2hl3h cos

3

(8)

- の計算

3

=arcsin 

l3hsin

3

X

2

Z

2

=arcsin Z /

X

2

Z

2

2

= /

2−−

2

3

=

arcsin 

l3hsin

3

X

2

Z

2

=arcsin Z /

X

2

Z

2

2

= /

2−−

2

2

3

+」の場合 「-」の場合

実はこの符号が

反転するだけ

(9)

- 結果のグラフィックス表示1

3

=arcsin 

l3hsin

3

X

2

Z

2

=

arcsin Z /

X

2

Z

2

2

= /

2−−

2

(10)

- 結果のグラフィック表示2

3

=arcsin 

l3hsin

3

X

2

Z

2

=

arcsin Z /

X

2

Z

2

2

= /

2−−

2

(11)

- まだ他に解がある

Base

x

y

1

L1

x

y

1

= −arctan 

y

hand Base

x

hand Base

x0



arctan

y

hand Base

x

hand Base

x0

− /

2

x=0, y0

 /

2

x=0, y0

不定

x=0, y=0

を裏に回して、   と   を反対に曲げる。

1

2

3

(12)

- プログラム:arm3dof_draft2.py

def arm_sol(self,trans) : x=trans.vec[0] y=trans.vec[1] z=trans.vec[2] th1_1=atan2(y,x) th1_2=th1_1-pi zz=z-self.bh-self.l1h zz_2=zz**2 xx_2=x**2+y**2 th3=acos((xx_2+zz_2-self.l2h**2-self.l3h**2)/2.0/self.l2h/self.l3h) psi=asin(zz/sqrt(xx_2+zz_2)) phi=asin(self.l3h*sin(th3)/sqrt(xx_2+zz_2)) th2_1=pi/2-psi-phi th2_2=pi/2-psi+phi self.solutions=[[th1_1,th2_1,th3],[th1_1,th2_2,-th3], [th1_2,-th2_1,-th3],[th1_2,-th2_2,th3]] return self.solutions # arm.solve=new.instancemethod(arm_sol,arm,arm.__class__)

(13)

- arm3dof_draft2.pyの使い方

>>> arm.make_shape() >>> arm.mark() >>> create_env() >>> a=arm.solve(box.where(arm.base)) >>> a [[-0.7853981633974483, 0.9019834836554195, 2.140119970115676], [-0.7853981633974483, 3.0421034537710954, -2.140119970115676], [-3.9269908169872414, -0.9019834836554195, -2.140119970115676], [-3.9269908169872414, -3.0421034537710954, 2.140119970115676]] >>> for pp in a: arm.set_joints(pp) sleep(1) >>>

まず

env_arm3dof_draft2.pyを走らせる.

(14)

- 6自由度の場合

位置だけでなく姿勢も指定できる

手首に手先

3自由度が集まった形になっている

場合、位置と姿勢を分離して求めることが出来

る。

まず手先の位置・姿勢から手首位置が決まる。

手首位置について

3自由度の解を求める。

手首姿勢と整合するように手先の

3自由度を求める

そうでない場合、

一般には解くのが難しい

(15)

- 6自由度アームの解の求め方の例

姿勢と先端位置が決ま

るとこの点が決まる。

ここは

3自由度

アームの求め方

根元側

3自由度が決ま

ると残り

3自由度は姿勢

合わせで簡単に求めら

れる

(16)

- 例題:6関節アームの逆運動学

手首座標系が目標座標系

targetに

一致するように関節角 を求めよ。

b

=0.1

1

=0.05

2

=0.5

3

=0.3

4

=.01

5

=0.1

6h

=0.05

=0.1

hand

wrist

base

(17)

- 逆運動学(1)

def arm_sol(self,target) : self.solutions=[] pos=target.vec z_axis=target.mat.col(2) pos=pos-((self.l5h+self.l6h)*z_axis) . .

(1)joint 5の位置を求める。

 ハンド座標の

z軸方向lh5+lh6(-0.15)の位置

target

y

x

(self.l5h+self.l6h)*z_axis pos

(18)

- 逆運動学(2)

def arm_sol_pos(self,pos) : . . .

(2)1,2,3は「前のl3h」=l3h+l4h(0.4)とし

たときの

3関節と同様に解くことが出来る。

pos

ここは

3自由度

アームの求め方

(19)

- 逆運動学(3)

def arm_sol_ori(self,target,th123) : T123=self.fk123(th123) zt=target.mat.col(2) z3=T123.mat.col(2) . .

(3)joint 5の回転軸(y)は、手首z軸

link3z軸に垂直、回転角はそれらの

間の角度

(2方向あることに注意)

target

y

x

x

y

z

T123

zt

z3

y5, th5

(20)

- 逆運動学(4)

def arm_sol_ori(self,target,th123) : T123=self.fk123(th123) zt=target.mat.col(2) z3=T123.mat.col(2) . .

(4)joint 4の回転角は、link5yと

link3yの成す角

target

y

x

x

y

z

T123

y5

y3

th4

(21)

- 逆運動学(5)

def arm_sol_ori(self,target,th123) : T123=self.fk123(th123) zt=target.mat.col(2) z3=T123.mat.col(2) . .

(5)joint 6の回転角はlink5yと

wrist(=target) yの成す角

target

y

x

x

y

z

T123

y5

yt

th6

(22)

- 例題:6関節アームの逆運動学

(1)joint 5の位置を求める。

 ハンド座標の

z軸方向-0.15の位置

(2)1-3はl3h=l3+l4=0.4としたとき

3関節と同様に解くことが出来る。

(3)joint 5の回転軸(y)は、手首z軸

link3z軸に垂直、回転角はそれら

の間の角度

(2方向あることに注意)

b

=0.1

1

=0.05

2

=0.5

3

=0.3

4

=.01

5

=0.1

6h

=0.05

=0.1

hand

wrist

base

(23)

- 例題:6関節アームの逆運動学

(4)joint 4の回転角は、link5yと

link3yの成す角

(5)joint 6の回転角はlink5yと

wrist yの成す角

b

=0.1

1

=0.05

2

=0.5

3

=0.3

4

=.01

5

=0.1

6h

=0.05

=0.1

hand

wrist

base

(24)

- arm6dof_draft2.py(1)

def arm_sol_pos(self,pos) : x=pos[0] y=pos[1] z=pos[2] th1_1=atan2(y,x) th1_2=th1_1-pi lh=self.l3h+self.l4h zz=z-self.bh-self.l1h zz_2=zz**2 xx_2=x**2+y**2 th3=acos((xx_2+zz_2-self.l2h**2-lh**2)/2.0/self.l2h/lh) psi=asin(zz/sqrt(xx_2+zz_2)) phi=asin(lh*sin(th3)/sqrt(xx_2+zz_2)) th2_1=pi/2-psi-phi th2_2=pi/2-psi+phi self.solutions_pos=[[th1_1,th2_1,th3],[th1_1,th2_2,-th3], [th1_2,-th2_1,-th3],[th1_2,-th2_2,th3]] return self.solutions_pos #

(25)

- arm6dof_draft2.py(2)

def fk123(self,th123): T1=FRAME(xyzabc=[0,0,self.bh,0,0,th123[0]]) T2=FRAME(xyzabc=[0,0,self.l1h,0,th123[1],0]) T3=FRAME(xyzabc=[0,0,self.l3h+self.l4h,0,th123[2],0]) return T1*T2*T3 # def arm_sol_ori(self,target,th123) : T123=self.fk123(th123) zt=target.mat.col(2) z3=T123.mat.col(2) . . . . return [th4,th5,th6],[th4_2,-th5,th6_2]

(3)(4)(5)

(26)

- arm6dof_draft2.py(3)

def arm_sol(self,target) : self.solutions=[] pos=target.vec z_axis=target.mat.col(2) pos=pos-((self.l5h+self.l6h)*z_axis) self.solve_pos(pos) for th123 in self.solutions_pos : rslt=self.solve_ori(target,th123) self.solutions.append(th123+rslt[0]) self.solutions.append(th123+rslt[1]) return self.solutions

(1)

(2)

(27)

- arm6dof_draft2.pyの使い方

>>> create_env() >>> arm <larm_w_hand.LinkedArm instance at 0x0350F5F8> >>> arm.solve(box.where(arm.base)*arm.wrist.where(arm.hand)) [[-0.8519663271732721, 0.571657122775781, 1.6628010732898744, 1.1903745009548912e-16, 0.907134457524138, 2.289626326416521], [-0.8519663271732721, 0.571657122775781, 1.6628010732898744, ・ ・ [-3.993558980763065, -2.2344581960656553, 1.6628010732898744, -3.141592653589793, 2.5699355308140124, 2.2896263264165215], [-3.993558980763065, -2.2344581960656553, 1.6628010732898744, 2.6567490098619347e-16, -2.5699355308140124, -0.8519663271732717]] >>> show_all_solutions(arm,box) >>>

まず

env_arm6dof_draft2.pyを走らせる.

(28)

- アームの逆運動学の数値解法

いろいろな場合に応用できる

ニュートン法の応用

1変数:微分

多変数:ヤコビ行列

(偏微分)

解の収束性が問題

良い初期近似があると良い

ロボットアームの場合:軌跡に沿って逐次計算

それでも越えられないところがあるはずだが、、、

ロボットアームの場合、特異点に近寄らなければ大

丈夫なことが多い。

(29)

- 1変数のニュートン法(復習)

関数  の  回りでのテーラー展開を考える

y= f x 

y

x

0

f x

0

f  x≈ f  x

0



f '  x

0



x−x

0

...

f x 

x

0

x

1

近似的に    とする  を求める。

f x =0

x

x

1

0= f  x

0



f '  x

0



x

1

x

0

x

1

=

x

0

f  x

0

/

f '  x

0

これを解いて

これを繰り返すことで、十分に良い

近似解を求めることが出来る

微分を使うと逆が簡単に解ける

ここをもとめたい

(30)

- 1変数の一次近似

テーラー展開

y= f x 

y

x

0

f x

0

f  x− f  x

0

=

f '  x

0



x− x

0

x

f  x≈ f  x

0



f '  x

0



x−x

0

...

y= f '  x

0



x

変形して

つまり、微小な変化は簡単な比例で近

似できるということ

x

y

当然誤差はある

0次

1次

(31)

- ニュートン法で困る例

単純なニュートン法だと極値が零に近くなるとで

発散してしまう

発散しないように用心深くすると停留点を越え

られない

多くの場合、別な初期値からやり直すのが良い

y= f x 

y

x

0

停留点

x

(32)

- ニュートン法で困る例2

解が停留点の場合

微分して

0を使うなど工夫が必要

y= f x 

y

x

0

x

解がここだと工夫が必要

停留点

(33)

- 多変数の場合(アームのヤコビアン)

制御したい

(解を求めたい)パラメタと、制御でき

(関節角度など)パラメタとの、微小変化量の

関係を

(1次偏微分係数で)表した行列を使う。

一般に、このような多変数関数の

1次偏微分係

数行列はヤコビ行列、ヤコビアンなどと呼ばれ

る。

イメージとしては、

(超)曲面の接(超)平面によ

る近似。

一次微分が曲線を接線で近似していたことを思い

出して欲しい。

(34)

- ロボットアームのヤコビアンの例

関節角度を少し動かしたとき手先の位置・姿勢

がどのように変化するか:いわゆる「ロボット

アームのヤコビアン」

関節角度を少し動かしたときカメラ画像中の位

置がどのように変化するか:「ビジュアルヤコビ

アン」などと呼ばれる

(35)

- 次回の予告

参照

関連したドキュメント

2)海を取り巻く国際社会の動向

が多いところがございますが、これが昭和45年から49年のお生まれの方の第二

課題曲「 和~未来へ 」と自由曲「 キリクサン 」を披露 しました。曲名の「 キリクサン

[r]

自由回答でも「廃炉も解決しないうち、とても 安心して住めますか」

意思決定支援とは、自 ら意思を 決定 すること に困難を抱える障害者が、日常生活や 社会生活に関して自

 次に、羽の模様も見てみますと、これは粒粒で丸い 模様 (図 3-1) があり、ここには三重の円 (図 3-2) が あります。またここは、 斜めの線

二院の存在理由を問うときは,あらためてその理由について多様性があるこ