産業用ロボットの運動学とMatlabの順解法・逆解法アルゴリズム研究ノート(ハートフルセッションのまとめ)(2)


CSDN が、文字数が多すぎて 1 つの記事を投稿できないため、分割する必要があることを通知しました

だいたい

  • スタンダードDHモデル
  • 改良されたDHモデル
  • ロボットの運動学

詳細については、最初の記事を参照してください。

→→→ [産業用ロボット運動学とMatlabの順解法・逆解法アルゴリズム検討ノート(​​全体セッションの概要)(1)]

❤ 2023.6.19 ❤

ここに画像の説明を挿入

ロボットの逆運動学

※代数解、幾何解、解析解(閉解)、数値解の意味とつながり

そういえば、私も初めてこれらの概念に出会ったとき、かなりめまいを感じましたが、他の人とコミュニケーションを取ってみると、めまいを感じていたのは自分だけではなかったことがわかりました。

次に、ChatGPT で最初に回答してください

ここに画像の説明を挿入

それでは要約します

代数解幾何解も解析解(閉じた解)に属し、具体的な方程式を列挙することができ、得られる結果が正確であることが特徴です。違いは、代数的解法は行列の特性に基づいており、等しい特定の要素の方法を通じて方程式系を確立することによって未知数が解決されるのに対し、幾何学的解法は幾何学的関係を通じて方程式系を確立することであるということです。未知を解決するロボット。

特定の構成を持つロボットのみが分析ソリューションを備えていますが、幸いなことに、私たちが通常使用するロボットのほとんどは特定の構成のものです。

数値解は解析解に相当し、演算処理が反復に依存し、得られる結果が近似解となるのが特徴です。特殊な構成と一般的な構成を含むすべてのロボットに適用でき、主に分析ソリューションを持たないロボットで使用されます。


ZK-500 ロボットは後部 3 軸が 1 点で交差する特殊な配置に属しているため、ここでは解析手法を使用してロボットの逆解を求めます。

まず、ポーズ記述行列は次のように書かれます

6 0 T = [ 0 0 0 1 ] = 1 0 T ( θ 1 ) 2 1 T ( θ 2 ) 3 2 T ( θ 3 ) 4 3 T ( θ 4 ) 5 4 T ( θ 5 ) T ( θ 6 ) ) {_6^0}T=\left[\begin{行列}n_x&o_x&a_x&p_x\\n_y&o_y&a_y&p_y\\n_z&o_z&a_z&p_z\\\0&0&0&1\\\end{行列}\right]={_1^0}T\left( \theta_1\ right)\ _2^1T\left(\theta_2\right)\ _3^2T\left(\theta_3\right)\ _4^3T\left(\theta_4\right)\ _5^4T\left(\theta_5 \right) \_6^5T\左(\theta_6\右)60T= n×nはいnz0ああ×ああはいああz0ある×あるはいあるz0p×pはいpz1 =10T(私は1) 21T(私は2) 32T(私は3) 43T(私は4) 54T(私は5) 65T(私は6)

△ θ 1 \theta_1の代数解1θ 2 \theta_22θ 3 \theta_33

※参考資料

→→→ 【MD-Hモデル運動学の順解・逆解と姿勢角の検証】
これは本当にお宝作者です

→→→ロボット工学入門 (ジョン・J・クレイグ)


※なぜatan2()関数を使って解決するのかについて

Atan 2 ( ) \mathrm{Atan2}\left(\right)アタン2( ) 、この関数は A Tan ( ) \mathrm{Atan}\left(\right)と同じです。日焼け( )は逆正接と同じですが、値の範囲は( − π , π ) (-\pi,\pi)( π ,π )を使用すると、角度に対応する象限を取得できます。これは、A Tan ( ) \mathrm{Atan}\left(\right)日焼け( )

詳細は
→→→ atan2()
→→→ atan2 vs atanを参照してください。

なぜこの関数を使うのかというと、この時点では私も非常に混乱していましたが、いくつかのコーナーのsin値またはcos値を計算した後、理論的には、逆正弦/逆余弦関数を使用して対応する角度を計算できます。と cos を同時に計算し、それを分割して atan2() を使用して解決しますか?

情報を調べていたらこんな記事を見つけました

→→→ [ロボット運動学の逆解​​法には、アーク/コサイン関数の代わりに二変数逆正接関数 atan2 を使用する方が良いのはなぜですか?

要約すると、一般的な意味は、アークサイン/アークコサイン関数を直接使用することは不可能ではないが、その値の範囲が比較的狭く、ロボットの関節範囲が( − π , π )に達する可能性があるということです。 (-\pi,\pi )( π ,π )を逆正弦関数/逆余弦関数を使用して解く場合は、さまざまなポーズの値の範囲を十分に考慮して判断する必要があります。また、atan2() 関数の値の範囲は( − π , π ) (-\pi,\pi)( π ,π )の場合、余分な判定処理が省略される場合が多い。

また、arcsin()/arccos() 関数にはいくつかの特別な点で定義が欠けており、計算結果の誤差が増幅されますが、atan2() 関数にはこの問題はありません。

atan2() 関数の定義

ここに画像の説明を挿入

  • atan2() 関数使用時に注意が必要な問題

しかし、記事によると[ロボット運動学の逆解​​法には、アーク/コサイン関数の代わりに 2 変数アークタンジェント関数 atan2 を使用するのが最適な理由は何ですか?] 前述したように、atan2() を使用した後は確実ではなく、いくつかの問題に注意する必要があります。
1. x=0, y=0 のときの定義
2. x または y のときの関数の値のジャンプ0を通過する

具体的な解決策については上記の記事を参照してください


○ θ 1 \theta_1を解く1

まず、上の式にθ 1 \theta_1を含めます。1方程式の左側へのシフトの一部

[ 1 0 T ( θ 1 ) ] − 1 6 0 T = 2 1 T ( θ 2 ) 3 2 T ( θ 3 ) 4 3 T ( θ 4 ) 5 4 T ( θ 5 ) 6 5 T ( θ 6 ) {\left[{_1^0}T\left(\theta_1\right)\right]^{-1}}\ _6^0T={_2^1}T\left(\theta_2\right)\ _3^2T \left(\theta_3\right)\ _4^3T\left(\theta_4\right)\ _5^4T\left(\theta_5\right)\ _6^5T\left(\theta_6\right)[10T(私は1) ]1 60T=21T(私は2) 32T(私は3) 43T(私は4) 54T(私は5) 65T(私は6)

1 0 T {_1^0} T10Tの逆数を求めるには、方程式は次のように書かれます。

[ c 1 s 1 0 0 − s 1 c 1 0 0 0 0 1 − d 1 0 0 0 1 ] [方程式 zpz 0 0 0 1 ] = 6 1 T \left[\begin{matrix}c_1&s_1&0&0\\-s_1&c_1&0&0 \\0&0&1&-d_1\\0&0&0&1\\\end{行列}\right]\left[\begin{行列}n_x&o_x&a_x&p_x\\n_y&o_y&p_y\\n_z&o_z&a_z&p_z\\\0&0&0&1\\\end{行列}\right]={_6 ^ 1}T c1s100s1c100001000d11 n×nはいnz0ああ×ああはいああz0ある×あるはいあるz0p×pはいpz1 =61T

6 1 T {_6^1}Tを解く61Tの後、方程式の両側の行列を観察して、要素 (2,4) を等しくすると、次の結果が得られます。

− s 1 px + c 1 py = 0 -s_1p_x+c_1p_y=0s1p×+c1pはい=0


  • 【この式の求め方】

この解法プロセスは内容が多いので、matlabを使って計算していきます。

  • 方程式の左側の行列 (各角括弧は行を表します)
[nx*cos(Q1) + ny*sin(Q1), 
 ox*cos(Q1) + oy*sin(Q1), 
 ax*cos(Q1) + ay*sin(Q1), 
 px*cos(Q1) + py*sin(Q1)]
 
[ny*cos(Q1) - nx*sin(Q1), 
 oy*cos(Q1) - ox*sin(Q1), 
 ay*cos(Q1) - ax*sin(Q1), 
 py*cos(Q1) - px*sin(Q1)]
 
[nz,oz,az,pz - d1]

[0,0,0,1]

  • 方程式の右側の行列 (各角括弧は行を表します)
[- cos(Q6)*(sin(Q2 + Q3)*sin(Q5) - cos(Q2 + Q3)*cos(Q4)*cos(Q5)) - cos(Q2 + Q3)*sin(Q4)*sin(Q6),   
 sin(Q6)*(sin(Q2 + Q3)*sin(Q5) - cos(Q2 + Q3)*cos(Q4)*cos(Q5)) - cos(Q2 + Q3)*cos(Q6)*sin(Q4), 
 sin(Q2 + Q3)*cos(Q5) + cos(Q2 + Q3)*cos(Q4)*sin(Q5), 
 a1 + a3*cos(Q2 + Q3) + d4*sin(Q2 + Q3) + a2*cos(Q2)]
 
[- cos(Q4)*sin(Q6) - cos(Q5)*cos(Q6)*sin(Q4),
 cos(Q5)*sin(Q4)*sin(Q6) - cos(Q4)*cos(Q6),
 sin(Q4)*sin(Q5),
 0]
 
[cos(Q6)*(cos(Q2 + Q3)*sin(Q5) + sin(Q2 + Q3)*cos(Q4)*cos(Q5)) - sin(Q2 + Q3)*sin(Q4)*sin(Q6), 
 - sin(Q6)*(cos(Q2 + Q3)*sin(Q5) + sin(Q2 + Q3)*cos(Q4)*cos(Q5)) - sin(Q2 + Q3)*cos(Q6)*sin(Q4), 
 sin(Q2 + Q3)*cos(Q4)*sin(Q5) - cos(Q2 + Q3)*cos(Q5),      
 a3*sin(Q2 + Q3) - d4*cos(Q2 + Q3) + a2*sin(Q2)]
 
[0,0,0,1]
 

案の定、θ 1 \theta_1が含まれています。1(ここではQ1 Q_1Q1) 要素 (2,4) のうちの が最良の計算です。


式では、px p_xp×ピピピpはいが既知の場合、θ 1 \theta_11次のように表現できます。

θ 1 = Atan 2 (py, px) \theta_1=\mathrm{Atan2}\left(p_y,p_x\right)1=アタン2( pはいp×)

入力変数は最初にpy p_yであることに注意してください。pはい次にpx p_xp×Tanの場合⁡ θ = pypx \tan{\theta}=\frac{p_y}{p_x
}黄褐色=p×pはいつまり、最初に分子を入力し、次に分母を入力します。

ここには 2 つの解セットがあります:
θ 1 = Atan 2 ( py , px ) \theta_1=\mathrm{Atan2}\left(p_y,p_x\right)1=アタン2( pはいp×)
またはθ 1 ' = Atan 2 ( − py , − px ) \theta_1^\prime=\mathrm{Atan2}\left(-p_y,-p_x\right)1=アタン2( pはい−p _×)


  • Matlab コードの実装
%% theta1求解
%theta1可能的解有两组
theta1_1=atan2(py,px);
theta1_2=atan2(-py,-px);

○ θ 3 \theta_3を解く3

上の方程式の行列要素 (1,4) と (3,4) が次と等しいとします。

c 1 px + s 1 py = a 1 + a 2 c 2 + a 3 c 23 + d 4 s 23 pz − d 1 = a 2 s 2 + a 3 s 23 − d 4 c 23 c_1p_x+s_1p_y=a_1+ a_2c_2+a_3c_{23}+d_4s_{23}\\ p_z-d_1=a_2s_2+a_3s_{23}-d_4c_{23}c1p×+s1pはい=ある1+ある2c2+ある3c23+d4s23pzd1=ある2s2+ある3s23d4c23

等号の周りの二乗の合計は
m 2 + n 2 = a 2 2 + a 3 2 + d 4 2 + 2 a 2 ( a 3 c 3 + d 4 s 3 ) m^2+n^2= a_2^2+a_3^2+d_4^2+2a_2\left(a_3c_3+d_4s_3\right)メートル2+n2=ある22+ある32+d42+2a_ _2( _3c3+d4s3)
そのうち:
m = c 1 px + s 1 py − a 1 n = pz − d 1 m=c_1p_x+s_1p_y-a_1\\ n=p_z-d_1メートル=c1p×+s1pはいある1n=pzd1


このステップの計算プロセスについて:

このコードを使って説明します。

syms a1 a2 a3 d4 theta2 theta3

m=a2*cos(theta2)+a3*cos(theta2+theta3)+d4*sin(theta2+theta3);
n=a2*sin(theta2)+a3*sin(theta2+theta3)-d4*cos(theta2+theta3);

k=m^2 + n^2

% 展开表达式为多项式形式
K1 = expand(m^2 + n^2) 
%K = collect(K, [a1 a2 a3 d4]);  

% 化简多项式
K2=simplify(K1)

% 整理多项式的项
k3=collect(K2)

結果:

k =
(a3*cos(theta2 + theta3) + d4*sin(theta2 + theta3) + a2*cos(theta2))^2 + (a3*sin(theta2 + theta3) - d4*cos(theta2 + theta3) + a2*sin(theta2))^2
 
K1 =
a2^2*cos(theta2)^2 + a2^2*sin(theta2)^2 + a3^2*cos(theta2)^2*cos(theta3)^2 + d4^2*cos(theta2)^2*cos(theta3)^2 + a3^2*cos(theta2)^2*sin(theta3)^2 + a3^2*cos(theta3)^2*sin(theta2)^2 + d4^2*cos(theta2)^2*sin(theta3)^2 + d4^2*cos(theta3)^2*sin(theta2)^2 + a3^2*sin(theta2)^2*sin(theta3)^2 + d4^2*sin(theta2)^2*sin(theta3)^2 + 2*a2*a3*cos(theta2)^2*cos(theta3) + 2*a2*a3*cos(theta3)*sin(theta2)^2 + 2*a2*d4*cos(theta2)^2*sin(theta3) + 2*a2*d4*sin(theta2)^2*sin(theta3)
 
K2 =
a2^2 + 2*cos(theta3)*a2*a3 + 2*sin(theta3)*a2*d4 + a3^2 + d4^2
 
k3 =
a2^2 + 2*cos(theta3)*a2*a3 + 2*sin(theta3)*a2*d4 + a3^2 + d4^2

H = ( m 2 + n 2 − a 2 2 − a 3 2 − d 4 2 ) / 2 a 2 H=\left(m^2+n^2-a_2^2-a_3^2-d_4^2 \右)/2a_2H=( m2+n2ある22ある32d42)/ 2a2
この場合、方程式は次のように表すことができます:
a 3 c 3 + d 4 s 3 = H a_3c_3+d_4s_3=Hある3c3+d4s3=H

得られる結果:
θ 3 = A Tan 2 ( H , ± a 3 2 + d 4 2 − H 2 ) − A Tan 2 ( a 3 , d 4 ) \theta_3=\mathrm{Atan2}\left(H,\pm) \sqrt{a_3^2+d_4^2-H^2}\right)-\mathrm{Atan2}\left(a_3,d_4\right)3=アタン2( H ±ある32+d42H2 )アタン2( _3d4)

正負の符号が存在するため、θ 3 \theta_33解決策には 2 つのセットがあります。


  • ※ 【このステップに至った経緯について】

逆正接への変換の具体的な内容は見つかりませんでしたが、この導出過程は以下を参照できます。

→→→ [acosx+bsinx = c; xの計算方法]


  • Matlab コードの実装
%% theta3求解
%theta1的取值已经确定,但是因为theta1有两组可能得解,所以这里实际上m有两组取值,这里只给出一组
m=cos(theta1)*px+sin(theta1)*py-a1; 
n=pz-d1;
H=(m^2+n^2-a2^2-a3^2-d4^2)/(2*a2);
theta3_1=atan2(H,sqrt(a3^2+d4^2-H^2))-atan2(a3,d4);
theta3_2=atan2(H,-sqrt(a3^2+d4^2-H^2))-atan2(a3,d4);

○ θ 2 \theta_2を解く2

\theta_2$の解決策について、いくつかの方法を試してみました。

・ロボティクス入門の方法(失敗例)

まず、教科書『ロボット工学入門』(John J Craig)に記載されている方法を試してみました。

ご存知のとおり、PUMA560は「ロボット工学入門」の事例として使われており、現在一般的に使われている産業用ロボットの構成とは構造が異なる(主に私が研究しているロボットとは異なる)ため、そのまま使用することはできません。 . . 以下にその手順を踏まえた計算を示します。

最初のステップは、ロボットのエンドポーズ記述行列の計算式を次のように整理することです。

[ 3 0 T ( θ 2 ) ] − 1 6 0 T = 4 3 T ( θ 4 ) 5 4 T ( θ 5 ) 6 5 T ( θ 6 ) [{_3^0}T\left(\theta_2\right) )]^{-1}\ {_6^0}T={_4^3}T\left(\theta_4\right)\ {_5^4}T\left(\theta_5\right)\ {_6^5} T\左(\theta_6\右)\[30T(私は2) ]1 60T=43T(私は4) 54T(私は5) 65T(私は6) 

電圧の範囲 (1.4) と (2.4) を考慮すると、量
( pz − d 1 ) sin ⁡ ( θ 23 ) − a 1 cos ⁡ ( θ 23 ) − a 2 cos ⁡ ( θ 3 ) + . . . . . . . . px cos ⁡ ( θ 1 ) cos ⁡ ( θ 23 ) + py sin ⁡ ( θ 1 ) cos ⁡ ( θ 23 ) = a 3 ( pz − d 1 ) cos ⁡ ( θ 23 ) + a 1 sin ⁡ ( θ ) + a 2 sin ⁡ ( θ 3 ) − . . . . . . . . py cos ⁡ ( θ 1 ) cos ⁡ ( θ 23 ) + px sin ⁡ ( θ 1 ) cos ⁡ ( θ 23 ) = − d 4 (p_z-d_1)\sin(\theta_{23})-a_1\cos( \theta_{23})-a_2\cos(\theta_3)+...\\p_x\cos(\theta_1)\cos(\theta_{23})+p_y\sin(\theta_1)\cos(\theta_{ 23})=a_3\\ (p_z-d_1)\cos(\theta_{23})+a_1\sin(\theta_{23})+a_2\sin(\theta_3)-...\\p_y\cos( \theta_1)\cos(\theta_{23})+p_x\sin(\theta_1)\cos(\theta_{23})=-d_4( pzd1)23)ある1cos (23)ある2cos (3)+...p×cos (1)cos (23)+pはい1)cos (23)=ある3( pzd1)cos (23)+ある123)+ある23)...pはいcos (1)cos (23)+p×1)cos (23)=d4


  • 計算プロセスは次のとおりです

計算プロセス

syms Q1 Q2 Q3 Q4 Q5 Q6  d1 d4 dt a1 a2 a3  nx ny nz ox oy oz ax ay az px py pz

%ZK-500连杆间齐次变换矩阵
T_01 =[ cos(Q1),   -sin(Q1),    0,      0
        sin(Q1),    cos(Q1),    0,      0
        0,          0,          1,      d1
        0,          0,          0,      1];
T_12 =[ cos(Q2),   -sin(Q2),    0,      a1
        0,          0,         -1,      0
        sin(Q2),    cos(Q2),    0,      0
        0,          0,          0,      1];
T_23 =[ cos(Q3),   -sin(Q3),    0,      a2
        sin(Q3),    cos(Q3),    0,      0
        0,          0,          1,      0
        0,          0,          0,      1];
T_34 =[ cos(Q4),   -sin(Q4),    0,      a3
        0,          0,         -1,     -d4
        sin(Q4),    cos(Q4),    0,      0
        0,          0,          0,      1];
T_45 =[ cos(Q5),   -sin(Q5),    0,      0
        0,          0,          1,      0
       -sin(Q5),   -cos(Q5),    0,      0
        0,          0,          0,      1];
T_56 =[ cos(Q6),   -sin(Q6),    0,      0
        0,          0,         -1,      0
        sin(Q6),    cos(Q6),    0,      0
        0,          0,          0,      1];
T_6t=[  1           0           0       0
        0           1           0       0
        0           0           1       dt
        0           0           0       1];

% 计算T_06和T_16的逆矩阵
T_06=[nx ox ax px;ny oy ay py;nz oz az pz;0 0 0 1];
T_03=T_01*T_12*T_23;
T_36=T_34*T_45*T_56;


% 计算T_01的逆矩阵
T_03_inv = inv(T_03);  

%输出结果并化简
T_left=T_03_inv*T_06;
disp("等式左边矩阵:")
%T_left=simplify(T_left)
T_left
disp("等式右边矩阵:")
simplify(T_36)

結果は次のとおりです

T_left =
 
[nz*cos(Q2)*sin(Q3) + nz*cos(Q3)*sin(Q2) - nx*cos(Q1)*sin(Q2)*sin(Q3) - ny*sin(Q1)*sin(Q2)*sin(Q3) + nx*cos(Q1)*cos(Q2)*cos(Q3) + ny*cos(Q2)*cos(Q3)*sin(Q1),

 oz*cos(Q2)*sin(Q3) + oz*cos(Q3)*sin(Q2) - ox*cos(Q1)*sin(Q2)*sin(Q3) - oy*sin(Q1)*sin(Q2)*sin(Q3) + ox*cos(Q1)*cos(Q2)*cos(Q3) + oy*cos(Q2)*cos(Q3)*sin(Q1), 

az*cos(Q2)*sin(Q3) + az*cos(Q3)*sin(Q2) - ay*sin(Q1)*sin(Q2)*sin(Q3) + ax*cos(Q1)*cos(Q2)*cos(Q3) + ay*cos(Q2)*cos(Q3)*sin(Q1) - ax*cos(Q1)*sin(Q2)*sin(Q3), 

pz*sin(Q2 + Q3) - d1*sin(Q2 + Q3) - a1*cos(Q2 + Q3) - a2*cos(Q3) + (px*cos(Q1 + Q2 + Q3))/2 + (py*sin(Q1 + Q2 + Q3))/2 + (px*cos(Q2 - Q1 + Q3))/2 - (py*sin(Q2 - Q1 + Q3))/2]

[nz*cos(Q2)*cos(Q3) - nz*sin(Q2)*sin(Q3) - ny*cos(Q2)*sin(Q1)*sin(Q3) - ny*cos(Q3)*sin(Q1)*sin(Q2) - nx*cos(Q1)*cos(Q2)*sin(Q3) - nx*cos(Q1)*cos(Q3)*sin(Q2),

 oz*cos(Q2)*cos(Q3) - oz*sin(Q2)*sin(Q3) - oy*cos(Q2)*sin(Q1)*sin(Q3) - oy*cos(Q3)*sin(Q1)*sin(Q2) - ox*cos(Q1)*cos(Q2)*sin(Q3) - ox*cos(Q1)*cos(Q3)*sin(Q2),

 az*cos(Q2)*cos(Q3) - az*sin(Q2)*sin(Q3) - ax*cos(Q1)*cos(Q2)*sin(Q3) - ax*cos(Q1)*cos(Q3)*sin(Q2) - ay*cos(Q2)*sin(Q1)*sin(Q3) - ay*cos(Q3)*sin(Q1)*sin(Q2), 

pz*cos(Q2 + Q3) - d1*cos(Q2 + Q3) + a1*sin(Q2 + Q3) + a2*sin(Q3) + (py*cos(Q1 + Q2 + Q3))/2 - (px*sin(Q1 + Q2 + Q3))/2 - (py*cos(Q2 - Q1 + Q3))/2 - (px*sin(Q2 - Q1 + Q3))/2]

[
nx*sin(Q1) - ny*cos(Q1),
ox*sin(Q1) - oy*cos(Q1),
ax*sin(Q1) - ay*cos(Q1),
px*sin(Q1) - py*cos(Q1)
]

[0,0,0, 1]
 
等式右边矩阵:
[
cos(Q4)*cos(Q5)*cos(Q6) - sin(Q4)*sin(Q6),
- cos(Q6)*sin(Q4) - cos(Q4)*cos(Q5)*sin(Q6), 
cos(Q4)*sin(Q5),  
a3
]


[                          
cos(Q6)*sin(Q5),                            
-sin(Q5)*sin(Q6),        
-cos(Q5), 
-d4]

[cos(Q4)*sin(Q6) + cos(Q5)*cos(Q6)*sin(Q4),   
cos(Q4)*cos(Q6) - cos(Q5)*sin(Q4)*sin(Q6), 
sin(Q4)*sin(Q5),   
0]
[0, 0, 0, 1]


次に、ChatGPT を使ってそれを簡略化してみましょう

ここに画像の説明を挿入

最終結果はこれです

(pz - d1)*sin(Q23) - a1*cos(Q23) - a2*cos(Q3) + px*cos(Q1)*cos(Q23) + py*sin(Q1)*cos(Q23)=a3;
(pz - d1)*cos(Q23) + a1*sin(Q23) + a2*sin(Q3) - py*cos(Q1)*cos(Q23) + px*sin(Q1)*cos(Q23)=-d4;

現時点では、方程式中でs 23 s_{23}だけが不明ですs23そしてc 23 c_{23}c23、それを未知として設定すると、(理論的には) θ 2 + θ 3 \theta_2+\theta_3を解くことができます。2+3

m 1 = c 1 px + s 1 py − a 1 m 2 = pz − d 1 m 3 = a 3 + a 2 c 3 m_1=c_1p_x+s_1p_y-a_1\\ m_2=p_z-d_1\\ m_3= a_3
+a_2c_3メートル1=c1p×+s1pはいある1メートル2=pzd1メートル3=ある3+ある2c3

n 1 = − c 1 py − s 1 px − d 1 n 2 = a 1 n 3 = − d 4 − a 2 s 3 n_1=-c_1p_y-s_1p_x-d_1\\ n_2=a_1\\ n_3=-d_4- a_2s_3n1=c1pはいs1p×d1n2=ある1n3=d4ある2s3

方程式系を
m 1 c 23 + m 2 s 23 = m 3 n 1 c 23 + n 2 s 23 = n 3 m_1c_{23}+m_2s_{23}=m_3\\ n_1c_{23}+n_2s_{23 として整理します。 }=n_3メートル1c23+メートル2s23=メートル3n1c23+n2s23=n3

ソリューションは次のことを行う必要があります

x = s 23 = ( m 1 n 3 − m 3 n 1 ) / ( m 1 n 2 − m 2 n 1 ) y = c 23 = − ( m 2 n 3 − m 3 n 2 ) / m 1 n 2 − m 2 n 1 ) x=s_{23}=(m_1n_3-m_3n_1)/(m_1n_2-m_2n_1)\\ y=c_{23}=-(m_2n_3-m_3n_2)/m_1n_2-m_2n_1)バツ=s23=( m1n3メートル3n1) / (メートル1n2メートル2n1)y=c23=m2n3メートル3n2) /メートル1n2メートル2n1)

レベル 23 = 2 (y, x) の場合 \theta_{23}=\mathrm{For2}(y,x )
23=Atan2 ( y ,×

次に、 θ 3 \theta_3に従って、3θ 2 \theta_2の値2

【!? ? 】見た目は問題ないのですが、計算結果が設定値と異なっており、どこに問題があるのか​​分かりませんので、ご覧になれる方がいらっしゃいましたら、ご指摘いただければと思います。


  • Matlab コードの実装
m1=cos(theta1)*px+sin(theta1)*py-a1;
m2=pz-d1;
m3=a3+a2*cos(theta3);

n1=-cos(theta1)*py-sin(theta1)*px+pz-d1;
n2=a1;
n3=-d4-a2*sin(theta1);

x = (m1*n3 - m3*n1)/(m1*n2 - m2*n1);
y = -(m2*n3 - m3*n2)/(m1*n2 - m2*n1);

theta23=atan2(y,x)-pi/2;%这里减pi/2因为在DH参数中theta2补偿了pi/2

· 参照記事内のメソッド (失敗した試行)

先ほど紹介した記事がそれです。

→→→ 【MD-Hモデル運動学の順解・逆解と姿勢角計算の検証】

この記事では、著者は具体的な導出プロセスについては説明せず、MATLAB コードのみを説明しました。コードは次のとおりです。

%theta2
c3=cosd(Theta3);s3=sind(Theta3);
g1=f2-d6*f1;
g2=f3-d6*az;
g3=a4*c3-d4*s3+a3;
Theta2=(atan2(g3,sqrt(g1^2+g2^2-g3^2))-atan2(g2,g1))*180/pi;
————————————————
版权声明:本文为CSDN博主「Vittore-Li」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Vittore_Li/article/details/123185721

【!] この記事の著者の DH パラメータの定義は私のものとは異なることに注意してください。私の a1=彼の a2、私の a2=彼の a3、私の a3=彼の a4、および彼の DH モデルの接続ロッドは私の方向と反対です。それが解決策にどのような影響を与えるかわかりません。

長い間眺めていましたが、これがどのようにして起こるのか理解できませんでした。また、直接実行した結果も正しくありませんでした (DH モデルに対応する変更を加えた後に実行しました)。

作者がどのような方法を使用しているか知っている人がいたら、教えていただければ幸いです。(拳を握り締める)


・修士論文の方法(正しい結果が得られる方法)

そう、先ほどの上司の論文(前回記事)なのですが、実はこれまでの私のプロセスは基本的に(あるいは全部)上司の手順に沿って書いているのですが、そこに私の理解と検証のプロセスを加えてみました。

上司も違いますし、やり方も今まで見たことのないものです。

ロボットの終了位置(座標系 6 の原点)は以下のとおりです。

px = a 1 c 1 + a 3 c 1 c 23 + d 4 c 1 s 23 + a 2 c 1 c 2 py = a 1 s 1 + a 3 s 1 c 23 + d 4 s 1 s 23 + a 2 c 2 s 1 pz = d 1 + a 2 s 2 + a 3 s 23 − d 4 c 23 p_x=a_1c_1+a_3c_1c_{23}+d_4c_1s_{23}+a_2c_1c_2\\ p_y=a_1s_1+a_3s_1c_{23}+d_4s_1s_ {23}+a_2c_2s_1\\ p_z=d_1+a_2s_2+a_3s_{23}-d_4c_{23}p×=ある1c1+ある3c1c23+d4c1s23+ある2c1c2pはい=ある1s1+ある3s1c23+d4s1s23+ある2c2s1pz=d1+ある2s2+ある3s23d4c23

取得するために組織されたもの:

pxc 1 − a 1 = a 3 c 23 + d 4 s 23 + a 2 c 2 pys 1 − a 1 = a 3 c 23 + d 4 s 23 + a 2 c 2 pz − d 1 = a 2 s 2 + a 3 s 23 − d 4 c 23 \frac{p_x}{c_1}-a_1=a_3c_{23}+d_4s_{23}+a_2c_2\\ \frac{p_y}{s_1}-a_1=a_3c_{23}+d_4s_ {23}+a_2c_2\\ p_z-d_1=a_2s_2+a_3s_{23}-d_4c_{23}c1p×ある1=ある3c23+d4s23+ある2c2s1pはいある1=ある3c23+d4s23+ある2c2pzd1=ある2s2+ある3s23d4c23

覚えて

k 1 = pxc 1 − a 1 k 2 = pz − d 1 k_1=\frac{p_x}{c_1}-a_1 {k_2=p}_z-d_1k1=c1p×ある1k2=pzd1

得る:

k 1 − a 2 c 2 = a 3 c 23 + d 4 s 23 k 2 − a 2 s 2 = a 3 s 23 − d 4 c 23 k_1-a_2c_2=a_3c_{23}+d_4s_{23}\\ k_2 -a_2s_2=a_3s_{23}-d_4c_{23}k1ある2c2=ある3c23+d4s23k2ある2s2=ある3s23d4c23

平方和を求めます。

a 3 2 + d 4 2 = k 1 2 + k 2 2 + a 2 2 − 2 k 1 a 2 c 2 − 2 k 2 a 2 s 2 a_3^2+d_4^2=k_1^2+k_2^2 +a_2^2-2k_1a_2c_2-2k_2a_2s_2ある32+d42=k12+k22+ある222k _1ある2c22k _2ある2s2

覚えて

k 3 = ( k 1 2 + k 2 2 + a 2 2 − a 3 2 − d 4 2 ) / 2 a 2 k_3=\left(k_1^2+k_2^2+a_2^2-a_3^2-d_4 ^2\右)/2a_2k3=( k12+k22+ある22ある32d42)/ 2a2

しかし:

k 1 c 2 + k 2 s 2 = k 3 k_1c_2+k_2s_2=k_3k1c2+k2s2=k3
解:
θ 2 = A 2 ( k 3 , ± k 1 2 + k 2 2 − k 3 2 ) − A 2 ( k 1 , k 2 ) の場合 \theta_2=\mathrm{For2}\left(k_3, \ pm\sqrt{k_1^2+k_2^2-k_3^2}\right)-\mathrm{Atan2}\left(k_1,k_2\right)2=アタン2( k3±k12+k22k32 )アタン2( k1k2)


  • Matlab コードの実装
k1=px/cos(theta1)-a1;
k2=pz-d1;
k3=(k1^2+k2^2+a2^2-a3^2-d4^2)/(2*a2);

theta2_1=atan2(k3,sqrt(k1^2+k2^2-k3^2))-atan2(k1,k2);
theta2_2=atan2(k3,-sqrt(k1^2+k2^2-k3^2))-atan2(k1,k2);

θ 2 \theta_2を引くことを忘れないでください。2pi/2 のオフセット


❤ 2023.6.21 ❤

上記は代数解法を用いて最初の3軸の角度を求めるもので、一般的な手順ではこの時点で最後の4軸を求めることになるのですが、まとめ手法の記事としてはこれだけでは満足できませんの実装方法を 1 つ記録します。

弟の方法を学んだ後は、最初の 3 つの軸を解くのにセット法を使用する方が簡単なはずです。少なくとも頭の体操と同じ代数法よりは理解しやすいと思います。

△ θ 1 \theta_1の幾何解1θ 2 \theta_22θ 3 \theta_33

○ θ 1 \theta_1を解く1

ロボットの概略図から、このロボットの構成では、ロッド 1、ロッド 2、およびロッド 3 で構成される機構が同じ垂直面にあり、ロボットの端が共通の原点であることがわかります。ロッド 4、ロッド 5、ロッド 6 の座標系。このことから、既知のロボットの終了座標( px , py , pz ) \left(p_x,p_y,p_z\right) であることがわかります。( p×pはいpz)軸 1 のθ 1 \theta_11

ここに画像の説明を挿入
θ 1 = Atan 2 (py, px) \theta_1=\mathrm{Atan2}\left(p_y,p_x\right)1=アタン2( pはいp×)

複数の解決策がある場合さえ考慮しない


○ θ 3 \theta_3を解く3

ロボットの構造の概略図は以下のとおりです

ここに画像の説明を挿入

図に示すように、点 C' の座標( px , py , pz ) \left(p_x,p_y,p_z\right)( p×pはいpz) ,A 比( a 1 cos ⁡ θ 1 , a 1 sin ⁡ θ 1 , d 1 ) \left(a_1\cos{\theta_1},a_1\sin{\theta_1},d_1\right)( _1コス1ある11d1)

LB ′ C ′ = LBC = BD 2 + CD 2 = a 3 2 + d 4 2 LAC = AD 2 − CD 2 = ( a 2 + a 3 ) 2 − d 4 2 LAB ′ = LAB = a 2 L_{B ^\プライム C^\プライム}=L_{BC}=\sqrt{BD^2+CD^2}=\sqrt{a_3^2+d_4^2}\\ L_{AC}=\sqrt{AD^2 -CD^2}=\sqrt{\left(a_2+a_3\right)^2-d_4^2}\\ L_{AB^\prime}=L_{AB}=a_2LB C」=LBC=BD _2+C D2 =ある32+d42 LAC _=AD_2C D2 =( _2+ある3)2d42 LAB _=LAB _=ある2

点 O、A、C' は同一平面上にあるため、
LAC ' = ( px 2 + py 2 − a 1 ) 2 + ( pz − d 1 ) 2 L_{AC^\prime}=\sqrt{\left(\sqrt) {p_x^2+p_y^2}-a_1\right)^2+\left(p_z-d_1\right)^2}LAC_=(pバツ2+py2 ある1)2+( pzd1)2

コサインの法則によると、
c 2 = a 2 + b 2 − 2 ab cos ⁡ γ c^2=a^2+b^2-2ab\cos{\gamma}c2=ある2+b22腹筋コスγ
得、在Δ AB '' C '' \Delta A\mathrm{B}^\mathrm{'}\mathrm{C}^\mathrm{'}ΔAB _ _ C」'中:
cos ⁡ θ 3 ' = LAB ' 2 + LB ' C ' 2 − LAC ' 2 2 LAB ' LB ' C ' \cos{\theta_3^\prime}=\frac{L_{AB^\prime}^ 2+L_{B^\プライム C^\プライム}^2-L_{AC^\プライム}^2}{2L_{AB^\プライム}L_{B^\プライム C^\プライム}}コス3=2L _AB _LB C」LAB _2+LB C」2LAC_2

Δ ABC \Delta ABCの余弦の法則からも得られます。Δ A BC中:
cos ⁡ θ B = LAB 2 + LBC 2 − LAC 2 2 LABLBC \cos{\theta_B}=\frac{L_{AB}^2+L_{BC}^2-L_{AC}^2 }{2L_{AB}L_{BC}}コスB=2L _AB _LBCLAB _2+L紀元前2LAC_2
幾何学的関係によると、
θ 3 = arccos ⁡ θ 3 ′ − arccos ⁡ θ B \theta_3=\arccos{\theta_3^\prime}-\arccos{\theta_B}3=アークコス3アークコスB
コサインの法則の性質に従って、得られたθ 3 ' \theta_3^\primeに注意してください。3の値は常に 180° 未満であり、θ 3 + θ B \theta_3+\theta_B3+B180°を超える場合もあるので、θ 3 \theta_33値には 2 つのグループがあります。


○ θ 2 \theta_2を解く2

θ 2 \theta_2によると2 θ 3 \theta_3 3異なる値、θ 2 \theta_22この解決策には次の 4 つの状況があります。

ここに画像の説明を挿入

θ 2 = ∠ BAC ’ − ∠ B ’ AC ’ θ 2 = ∠ BAC ’ + ∠ B ’ AC ’ θ 2 = − ∠ BAC ’ − ∠ B ’ AC ’ θ 2 = − ∠ BAC ’ + ∠ B ’ AC ’ ; \theta_2=\angle\math{BA}\math{C}^\math{'}-\angle\math{B}^\math{'}\math{AC}^\math{'}\\ \ theta_2 =\angle\maths{BA}\maths{C}^\maths{'}+\angle\maths{B}^\maths{'}\maths{AC}^\maths{'}\\ \theta_2= - \angle\mathrm{BA}\mathrm{C}^\mathrm{'}-\angle\mathrm{B}^\mathrm{'}{\mathrm{AC}}^\mathrm{'}\\ \theta_2 = -\angle\maths{BA}\maths{C}^\maths{'}+\angle\maths{B}^\maths{'}\maths{AC}^\maths{'}2=∠BAC _ _∠B _ AC」2=∠BAC _ _+∠B _ AC」2=B C∠B _ AC」2=B C+∠B _ AC」

図によると、点Bの座標( a 1 cos ⁡ θ 1 , a 1 sin ⁡ θ 1 , d 1 + a 2 ) \left(a_1\cos{\theta_1},a_1\sin{\theta_1}, d_1 +a_2\右)( _1コス1ある11d1+ある2
点 O、A、B、および C' は同一平面上にあるので、

LBC ' = ( px 2 + py 2 − a 1 ) 2 + ( pz − d 1 − a 2 ) 2 L_{BC'}=\sqrt{\left(\sqrt{p_x^2+p_y^2}-a_1 \right)^2+\left(p_z-d_1-a_2\right)^2}LBC _=(pバツ2+py2 ある1)2+( pzd1ある2)2

∠ BAC ' = β \angle\mathrm{BA}\mathrm{C}^\mathrm{'}=\beta∠BAC _ _=β∠ B ' AC ' = γ \angle\mathrm{B}^\mathrm{'}\mathrm{AC}^\mathrm{'}=γ∠B _ AC」=c

コサインの法則によると、Δ ABC ' \Delta \mathrm{ABC}^\mathrm{'}では、ABC_ _'で:

cos ⁡ β = LAB 2 + LAC ′ 2 − LBC ′ 2 2 LABLAC ′ \cos{\beta}=\frac{L_{AB}^2+L_{AC^\prime}^2-L_{BC^\prime }^2}{2L_{AB}L_{AC^\プライム}}コスb=2L _AB _LAC_LAB _2+LAC_2LBC _2

Δ AB '' C '' \Delta \mathrm{AB}^\mathrm{'}\mathrm{C}^\mathrm{'}ΔAB _ C」'中:
cos ⁡ γ = LAB ' 2 + LAC ' 2 − LB ' C ' 2 2 LAB ' LAC ' \cos{\gamma}=\frac{L_{AB^\prime}^2+L_{AC^\プライム}^2-L_{B^\プライム C^\プライム}^2}{2L_{AB^\プライム}L_{AC^\プライム}}コスc=2L _AB _LAC_LAB _2+LAC_2LB C」2

比率:
θ 2 = ± arccos ⁡ β ± arccos ⁡ γ \theta_2=\pm\arccos{\beta}\pm\arccos{\gamma}2=±アークコスb±アークコスγ
θ 2 \theta_224 組の解が得られます。


○幾何学的手法の概要

幾何学的な方法で最初の 3 つの軸の角度を計算する方法を整理した後、幾何学的な方法はそれほど単純ではないと感じましたが、直感は肯定的ですが、幾何学的な解決策は複数の代数的解決策の状況を改善しません。そして、この多重解は、幾何学的関係による判断が必ずしも代数解より単純であるとは限らないことに基づく必要があります。

計算処理は複雑ではないので、ここでは matlab のコードは記載しません(主に入力しませんでした)。

プロセスに問題がある場合、またはより良い方法がある場合は、お知らせください。(拳を握り締める)


△ θ 4 \theta_4の代数解4θ 5 \theta_55θ 6 \theta_66

CSDN も、文字数が多すぎて 1 つの記事を投稿できないことを思い出させてくれたので、逆アセンブルして逆運動学θ 4 \theta_4で解く必要がありました。4θ 5 \theta_55θ 6 \theta_66、ヤコビ関連コンテンツを参照

→→→ [産業用ロボット運動学とMatlabの順アルゴリズム・逆アルゴリズム学習ノート(全体セッションの概要)(3)]

おすすめ

転載: blog.csdn.net/ooorczgc/article/details/131328330