Robotics System Toolboxで採用されているDH記法はどこの文献を参考にしたものでしょうか.
13 views (last 30 days)
Show older comments
Robotics system toolbox を用いてロボットツリーを作成しているのですが, このときのDH記法は, 文献 [1] を参考にしています. しかし, 作成したロボットツリーが望みの形になりません. Mathworksが採用されているDH記法のルールはどこに載っているのでしょうか, また, 参考文献があれば教えていただけると幸いです.
[1] 永井清, 土橋宏規 : " ロボット機構学 ", コロナ社, pp.27-28, 2015.
% リンクパラメータ
L1 = 60/10^3; %% 単位はメートル(m)
L2 = 20/10^3;
L3 = 20/10^3;
L4 = 95/10^3;
L5 = 8/10^3;
Lt = 35/10^3;
% 関節角度(とりあえず)
tht11 = 0;
tht12 = 0;
p1 = 0;
% DHパラメータの作成
dhparams =[0 pi 0 0; % ベース座標 ∑B
L1+L3 3*pi/2 Lt tht11; % ジョイント J11(能動関節)
L1 0 0 tht12; % ジョイント J12(能動関節)
L2 pi/2 L3 p1; % ジョイント J13(受動関節)
L4 pi/2 L5 3*pi/2]; % ジョイント C1(ボールベアリング)
% ツリーオブジェクトの作成
robot = robotics.RigidBodyTree;
% ベース座標系
body1 = robotics.RigidBody('body1');
jnt1 = robotics.Joint('jnt1','revolute');
setFixedTransform(jnt1,dhparams(1,:),'dh');
body1.Joint = jnt1;
addBody(robot,body1,'base')
% ジョイントJ11
body2 = robotics.RigidBody('body2');
jnt2 = robotics.Joint('jnt2','revolute');
setFixedTransform(jnt2,dhparams(2,:),'dh');
body2.Joint = jnt2;
addBody(robot,body2,'body1')
% ジョイントJ12
body3 = robotics.RigidBody('body3');
jnt3 = robotics.Joint('jnt3','revolute');
setFixedTransform(jnt3,dhparams(3,:),'dh');
body3.Joint = jnt3;
addBody(robot,body3,'body2')
% ジョイントJ13
body4 = robotics.RigidBody('body4');
jnt4 = robotics.Joint('jnt4','revolute');
setFixedTransform(jnt4,dhparams(4,:),'dh');
body4.Joint = jnt4;
addBody(robot,body4,'body3')
% ジョイントC1
body5 = robotics.RigidBody('body5');
jnt5 = robotics.Joint('jnt5','revolute');
setFixedTransform(jnt5,dhparams(5,:),'dh');
body5.Joint = jnt5;
addBody(robot,body5,'body4')
% 表示
showdetails(robot)
show(robot);
0 Comments
Accepted Answer
Yoshio
on 4 Jan 2019
ご存知かも知れませんが、こちらに簡単ですが、解説があります。
入力引数のところで、
dhparams — Denavit-Hartenberg (DH) parameters
の部分を開いて頂き、剛体ツリー ロボット モデル
をみて頂ければと思います。
なお、参考文献は一番下部の
References
をご覧ください。
なお、修正DH記法の場合は、
mdhparams — Modified Denavit-Hartenberg (DH) parameters
となりますので、こちらも確認願います。
3 Comments
Tohru Kikawada
on 8 Jan 2019
サンプルで使われているPuma 560ロボットのモデルは下記の論文から引用されています。(DHパラメーター表記)
"A search for consensus among model parameters reported for the PUMA 560 robot", P. Corke and B. Armstrong-Helouvry, Proc. IEEE Int. Conf. Robotics and Automation, (San Diego), pp. 1608-1613, May 1994.
別のPuma 560のモデルとして下記の修正DHパラメータを使ったものもあります。
Armstrong, Khatib and Burdick paper in 1986.
https://www-cs.stanford.edu/group/manips/publications/pdfs/Armstrong_1986.pdf
ご参考まで。
More Answers (1)
Yutaka Kaizu
on 14 Dec 2020
Edited: Yutaka Kaizu
on 14 Dec 2020
すでに解決済みだと思いますが、私の調べた範囲で申し上げると、MatlabのsetFixedTransform等のヘルプにある、DHパラメータは、6自由度のPuma560を表現するには不適当だと思います。パラメータの書き方は、[1]に倣うべきですが、実際には[2]の書き方になっており、その結果、6自由度のロボットとは違う形になっています。違いは、1行目に[0 0 0 0]が入っているところです。 ヘルプは修正されるべきだと思われます。[1]の和訳版が[3]にあるので、参照してみてはいかがでしょう。あとは、参考文献[4]でも大丈夫です。[2]と[4]では第4関節の位置が第3関節と同じ場所か、第5関節と同じ場所か変わりますが、ロボット先端の位置は変わりません。
%これは一般的な6自由度のロボットの表現としては間違い
dhparams = [0 pi/2 0 0;
0.4318 0 0 0
0.0203 -pi/2 0.15005 0;
0 pi/2 0.4318 0;
0 -pi/2 0 0;
0 0 0 0];
%こちらが正しい 1行目がリンク0からリンク1への変換
dhparams = [0 0 0 0;
0 pi/2 0 0;
0.4318 0 0 0
0.0203 -pi/2 0.15005 0;
0 pi/2 0.4318 0;
0 -pi/2 0 0;];
%より現代的なロボットの場合(回転軸がオフセットしてない)
dhparams = [0 0 0 0
0 pi/2 0 0;
0.4318 0 0 0
0 -pi/2 0 0;
0 pi/2 0.4318 0;
0 -pi/2 0 0;];
%参考文献[2] P78のロボットを実現するには
dhparams = [0 0 0 0;
0 pi/2 0 0;
a2 0 0 0
0 pi/2 0 0;
0 -pi/2 d4 0;
0 pi/2 0 0;];
%参考文献[4] P56のロボットを実現するには
dhparams = [0 0 0 0;
0 pi/2 0 0;
a2 0 0 0
0 pi/2 d4 0;
0 -pi/2 0 0;
0 pi/2 0 0;];
[1] Craig, John J. Introduction to Robotics: Mechanics and Control. Reading, MA: Addison-Wesley, 1989.
[2] Siciliano, Bruno. Robotics: Modelling, Planning and Control. London: Springer, 2009.
[3] John J. Craig ロボティクス 機構・力学・制御, 共立出版, 1991
[4] 細田耕 実践ロボット制御, オーム社, 2019
3 Comments
Yutaka Kaizu
on 15 Dec 2020
コメントありがとうございます。再度確認しておりますが、私が間違っている可能性もあります。もう少し調べてみます。お願いしたいのは、何もないところからまず、マニピュレータ付きの6自由度のロボットを作成し、各関節の角度を設定するところまでを説明したヘルプです。また、CADデータのインポートまであるとありがたいです。御社のヘルプでは、既存のロボットモデルをインポートするところから始まっているので、自分のオリジナルのロボットを作成するのにはちょっとハードルが高く感じます。
Yutaka Kaizu
on 17 Dec 2020
やはり、setFixedTransform(jnt1,dhparams(1,:),'dh');
の関数には、dhのオプションの際にそもそもバグがあると思われます。DHパラメータをどう書いても、納得行く結果は得られません。setFixedTransform(jnt1,tform); のtformに教科書に則った変換行列を入れれば正しい結果が得られました。以下のような関数をつくって試しました。
function tform = myDH2tform(dh)
%obtain tform transformation matrix from DH parameters
% Detailed explanation goes here
Ta = trvec2tform([dh(1) 0 0]); %a translation along x axis
Talpha = axang2tform([1 0 0 dh(2)]); %alpha rotation around x axis
Td = trvec2tform([0 0 dh(3)]); %d translation along new z axis
Ttheta = axang2tform([0 0 1 dh(4)]); %theta rotation around new z axis
tform = Ta*Talpha*Td; %calculate tform ignoring Ttheta
end
、
See Also
Categories
Find more on Robotics in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!